aether cms

A modern, elegant content management system designed for developers and content creators who value simplicity and power.

39
0
JavaScript

Aether CMS

A lightweight, file-based CMS built with vanilla JavaScript and LiteNode that generates blazing-fast static sites.

✨ Features

Content Management

  • File-based storage - Content stored as Markdown files with YAML frontmatter
  • Posts & Pages - Full support for blog posts and static pages
  • Categories & Tags - Organize content with taxonomies
  • Custom Pages - Create nested page hierarchies with custom templates
  • Rich Editor - Built-in Markdown editor with live preview
  • Media Library - Upload and manage images and documents

Theming & Customization

  • Theme System - Theme system architecture with template hierarchy
  • Theme Marketplace - Install themes directly from GitHub repository
  • Hook System - Extensible plugin architecture for developers
  • Custom Templates - Support for page-specific templates
  • Menu Management - Global navigation menu system

Performance & SEO

  • Static Site Generation - Generate ultra-fast static sites
  • SEO Optimized - Automatic sitemap, RSS feeds, and meta tags
  • Clean URLs - Beautiful, SEO-friendly URL structure
  • Image Optimization - Automatic image metadata and alt text management

User Management

  • Role-based Access - Admin and editor user roles
  • Secure Authentication - Argon2 password hashing with rate limiting
  • Session Management - Secure session handling

πŸš€ Quick Start

Prerequisites

  • Node.js 18+
  • npm or yarn

Installation

  1. Create a new project

    npx create-aether-cms my-cms-site
    cd my-cms-site
    
  2. Install dependencies

    npm install
    
  3. Start the development server

    npm start
    
  4. Access the admin dashboard
    Open http://localhost:8080/aether in your browser

    • Default credentials: admin / admin

πŸ“ Project Structure

aether/
β”œβ”€β”€ content/            # Content storage
β”‚   β”œβ”€β”€ data/           # Posts, pages, and settings
β”‚   β”‚   β”œβ”€β”€ posts/      # Blog posts (.md files)
β”‚   β”‚   β”œβ”€β”€ pages/      # Static pages (.md files)
β”‚   β”‚   └── custom/     # Custom pages (.md files)
β”‚   β”œβ”€β”€ themes/         # Theme files
β”‚   β”‚   └── default/    # Default theme
β”‚   └── uploads/        # Media files
β”œβ”€β”€ core/               # Core CMS functionality
β”‚   β”œβ”€β”€ api/            # REST API endpoints
β”‚   β”œβ”€β”€ lib/            # Core libraries
β”‚   β”œβ”€β”€ routes/         # Frontend routes
β”‚   └── admin/          # Admin interface
└── assets/             # Static assets

🎨 Themes

Aether uses a flexible theme system with template hierarchy:

Template Hierarchy

  1. Custom templates - themes/theme-name/custom/page-name.html
  2. Content-specific - themes/theme-name/templates/post.html
  3. Generic content - themes/theme-name/templates/content.html
  4. Layout fallback - themes/theme-name/templates/layout.html

Theme Structure

theme-name/
β”œβ”€β”€ theme.json           # Theme metadata
β”œβ”€β”€ assets/              # CSS, JS, images
β”‚   β”œβ”€β”€ css/
β”‚   └── js/
β”œβ”€β”€ templates/           # Core templates
β”‚   β”œβ”€β”€ layout.html      # Base layout
β”‚   β”œβ”€β”€ post.html        # Single post
β”‚   β”œβ”€β”€ page.html        # Single page
β”‚   └── taxonomy.html    # Categories/tags
β”œβ”€β”€ partials/            # Reusable components
└── custom/              # Custom page templates

πŸ“ Content Management

Creating Content

Posts are stored in content/data/posts/ as Markdown files:

---
id: "1234567890"
title: "My Blog Post"
slug: "my-blog-post"
status: "published"
author: "admin"
category: "Technology"
tags: ["javascript", "cms"]
createdAt: "2024-01-15T10:00:00.000Z"
---

# My Blog Post

This is the content of my blog post written in Markdown.

Custom Pages support nested hierarchies:

---
id: "1234567891"
title: "API Documentation"
slug: "api-docs"
pageType: "custom"
parentPage: "documentation"
status: "published"
---

# API Documentation

Documentation content here...

πŸ”§ Static Site Generation

Generate a static version of your site:

# Generate with default settings
npm run build

# Custom output directory
npm run build -- --output dist

# Custom base URL
npm run build -- --base-url https://yourdomain.com

# Disable clean URLs
npm run build -- --no-clean-urls

Configuration Options

  • --output, -o - Output directory (default: _site)
  • --base-url, -b - Base URL for the site
  • --no-clean-urls - Use .html extensions instead of clean URLs

πŸ”Œ Hooks & Extensibility

Aether includes a hook system for extensibility:

// Add a filter to modify posts
hookSystem.addFilter("api_posts", (posts, req) => {
    // Modify posts data
    return posts.filter((post) => post.featured)
})

// Add an action after post creation
hookSystem.addAction("post_created", (post) => {
    console.log(`New post created: ${post.title}`)
})

πŸ› οΈ Development

Environment Variables

Create a .env file:

PORT=8080
NODE_ENV=development

API Endpoints

Content API

  • GET /api/posts - List posts
  • POST /api/posts - Create post
  • PUT /api/posts/:id - Update post
  • DELETE /api/posts/:id - Delete post

Media API

  • GET /api/media - List media files
  • POST /api/media/upload - Upload file
  • DELETE /api/media/:id - Delete file

Theme API

  • GET /api/themes - List themes
  • POST /api/themes/switch/:name - Switch theme
  • POST /api/themes/upload - Upload theme

File Structure Conventions

  • Posts: Use descriptive slugs (my-awesome-post.md)
  • Pages: Organize by hierarchy (about.md, contact.md)
  • Custom Pages: Use parent-child relationships for nesting

🚦 Deployment

Static Deployment

  1. Generate static site: npm run build
  2. Deploy the _site folder to any static host β€” here are a few common choices:

Node.js Deployment

  1. Set NODE_ENV=production
  2. Configure reverse proxy (nginx/Apache)
  3. Use process manager (PM2, forever)

Environment Configuration

NODE_ENV=production
PORT=3000

πŸ“„ License

This project is licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later) - see the LICENSE file for details.
It also uses third-party packages, primarily licensed under the MIT License and retrieved via npm.
Each dependency retains its own license, which can be found in the respective package folders under node_modules/ after installation.

🀝 Contributing

Hi there! πŸ‘‹
Aether CMS is an open-source project maintained by one person (that’s me!), and I want it to be a respectful, inclusive space for everyone.

Please be kind and constructive in all interactions β€” whether you’re opening issues, submitting pull requests, or joining discussions. Disrespectful, abusive, or unhelpful behavior won’t be tolerated.

If someone behaves inappropriately, I may block them from the project and report them to GitHub if necessary. Let’s keep things friendly and welcoming for everyone!

How to Contribute

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Reporting Issues

If you see something off or just need to reach out, feel free to contact me via the Q&A category or by opening a new discussion in the Reports category.

This helps keep our Issues focused on bugs and features.

Thanks for being a good human πŸ’™
β€” LebCit

πŸ“ž Support

🎯 Roadmap

  • Scheduled Publishing
  • Search functionality
  • Advanced user permissions
  • Page caching with duration
  • Plugin system expansion
  • Comment system with moderation
  • Advanced SEO tools
  • Editor enhancements
  • New themes added to the marketplace
  • Simplify update system
  • And that’s just the beginning…

Aether CMS - Content in Motion. Powered by simplicity.