A lightweight, file-based CMS built with vanilla JavaScript and LiteNode that generates blazing-fast static sites.
Note
If you find value in Aether or want to help it grow, your support — whether it's feedback, sharing, contributing, or funding — can make a real difference. The long-term goal is to build a sustainable open-source project that stays fast, independent, and truly community-driven. If you'd like to support Aether, giving it a star would be greatly appreciated and genuinely helpful.
- 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
- 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
- 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
- Role-based Access - Admin and editor user roles
- Secure Authentication - Argon2 password hashing with rate limiting
- Session Management - Secure session handling
- Node.js 18+
- npm or yarn
-
Create a new project
npx create-aether-cms my-cms-site cd my-cms-site
-
Install dependencies
npm install
-
Start the development server
npm start
-
Access the admin dashboard Open
http://localhost:8080/aether
in your browser- Default credentials:
admin
/admin
- Default credentials:
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
Aether uses a flexible theme system with template hierarchy:
- Custom templates -
themes/theme-name/custom/page-name.html
- Content-specific -
themes/theme-name/templates/post.html
- Generic content -
themes/theme-name/templates/content.html
- Layout fallback -
themes/theme-name/templates/layout.html
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
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...
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
--output, -o
- Output directory (default:_site
)--base-url, -b
- Base URL for the site--no-clean-urls
- Use.html
extensions instead of clean URLs
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}`)
})
Create a .env
file:
PORT=8080
NODE_ENV=development
GET /api/posts
- List postsPOST /api/posts
- Create postPUT /api/posts/:id
- Update postDELETE /api/posts/:id
- Delete post
GET /api/media
- List media filesPOST /api/media/upload
- Upload fileDELETE /api/media/:id
- Delete file
GET /api/themes
- List themesPOST /api/themes/switch/:name
- Switch themePOST /api/themes/upload
- Upload theme
- Posts: Use descriptive slugs (
my-awesome-post.md
) - Pages: Organize by hierarchy (
about.md
,contact.md
) - Custom Pages: Use parent-child relationships for nesting
- Generate static site:
npm run build
- Deploy the
_site
folder to any static host — here are a few common choices:
- Set
NODE_ENV=production
- Configure reverse proxy (nginx/Apache)
- Use process manager (PM2, forever)
NODE_ENV=production
PORT=3000
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.
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!
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
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
- Documentation: Visit Aether Docs
- Issues: Report bugs
- Discussions: Community forum
- Resources: Articles
- Scheduled Publishing
- Search functionality - Implemented in v1.2.0
- Advanced user permissions
- Page caching with duration
- Plugin system expansion
- Comment system with moderation
- Advanced SEO tools
- Editor enhancements - Implemented in v1.1.0
- New themes added to the marketplace
- Simplify update system
- And that’s just the beginning…
Aether CMS - Content in Motion. Powered by simplicity.