AstroEleventyPortfolioBlog

aether-themes — Astro Portfolio Template

By robeshell

Aether is a personal site theme toolkit with AI-guided setup and fully swappable CSS themes. It provides seven themes and a semantic markup contract, with Astro as the default starting workflow.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-13View source

What stands out

A quick read of the recorded project description.

01

Seven switchable themes share one semantic markup contract and switch via the html data-theme attribute

02

The theme layer is framework-agnostic CSS and works with Astro, Eleventy, plain HTML, and other static site tools

03

Provides AI-guided setup and update prompts, plus discoverable Skill entry points in the repository

04

Supports generating an import bundle by configuration so only the themes the site actually offers are packaged

05

The npm package has no runtime dependencies; Persona headings and SVG markup are provided as native ESM snippets

06

Background images for the cyber, terminal, and wilds themes are enabled via optional CSS variables and load no assets by default

Template Details

Maintained by robeshell and released under the MIT license, Aether is a theme toolkit for personal sites, not a complete blog theme, site generator, or CMS. It has two layers: a framework-agnostic CSS theme layer with design tokens, a semantic markup contract, and optional vanilla JS snippets; and an AI build layer that uses in-repo Skills and prompts to ask for site name, description, author, sections, language, and theme, then creates or updates editable templates and validates the result. The theme layer is extracted from W.Site and includes seven switchable themes: minimal, magazine, terminal, cyber, island, wilds, and persona. All operate on the same semantic hooks, and the visual system switches by changing the data-theme attribute on the html root element.

For usage, Aether installs as an npm package. Import foundation.css first, then import specific themes as needed; alternatively, configure the desired themes in aether.config.mjs and generate an import bundle so only the themes the site actually offers are packaged. The package has no runtime dependencies and provides no routing, content model, or admin panel. The default guided starting workflow uses Astro, but the package does not depend on the Astro runtime. Any framework or static site generator that can load global CSS, output HTML, and adopt the theme contract can integrate; Eleventy or plain HTML can use the CSS directly, while other frameworks require mapping templates to the contract first. Existing CMS or blog markup cannot be applied directly and requires a template adapter layer or local overrides.

The site itself is responsible for content collections and frontmatter, routing and page structure, theme selector state and persistence, site copy and labels, and asset licensing and site-level overrides. The Persona theme's per-character headings, divider SVG paths, and list arrow paths are provided as native ESM and can be imported in non-Astro environments; the cyber, terminal, and wilds themes expose background images through optional image variables, defaulting to none, so they work without additional assets. The repository does not include scraped or IP-specific image assets.

AstroEleventyPortfolioBlog

Is it right for your project?

Use Cases

  • Build portfolio or blog pages for a personal site with multiple switchable visual styles
  • Generate a site template from scratch in an Astro project using the guided workflow and connect the themes
  • Import Aether's CSS theme layer directly in an Eleventy or plain HTML site
  • Add a theme selector to an existing site and package only the themes you need to offer
  • Use an AI agent to create or update site templates according to the semantic contract and validate the result

Suitable For

  • Personal site developers who can directly edit templates and styles
  • Astro users who want an AI agent to assist with site setup
  • Portfolio or blog projects that need one markup set to support multiple visual themes
  • Site maintainers willing to handle content, routing, theme selector, and asset licensing themselves

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Install via npm install aether-themes, import foundation.css first, then import theme CSS as needed

  2. 2

    Configure themes and defaultTheme in aether.config.mjs, and generate the import bundle with npx aether-themes

  3. 3

    For AI-guided setup, work in a separate site directory; do not use the Aether theme repository as the site working directory

  4. 4

    The site must implement the theme selector UI and state persistence, and call applyThemeEnhancements when data-theme changes

  5. 5

    Background image variables for cyber, terminal, and wilds default to none; add only assets you own or have the right to distribute

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope is the code of this version and does not mean external services or third-party assets are free.

Must comply with when using

  • You may use, modify, commercialize, and distribute the code of this version for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their own licenses; the code's MIT license alone does not determine this.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
  • The default guided starting workflow uses Astro; if your site does not use Astro, you must map templates to the theme contract yourself.
  • Existing CMS or blog markup cannot be applied directly; you must write a template adapter layer or local overrides.
  • No routing, content model, admin panel, or ready-made templates for blog platforms are provided; the site must implement these itself.
  • The site is responsible for its own markup, content, routing, and interaction logic.
  • The theme selector UI and state persistence must be implemented by the site.
  • Optional background images for cyber, terminal, and wilds must be provided by you, and you may add only assets you own or have the right to distribute.
  • When using AI-guided setup, do not use the Aether theme repository as the site working directory; create a separate site directory.
  • When the working directory is the Aether theme repository, the starting prompt will refuse to create files.
  • Asset licensing and site-level overrides are the responsibility of the user.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

The guided starter workflow uses Astro by default.

Original README

Existing CMS or blog markup | Not drop-in; requires a template adapter or local overrides

Original README

It does not provide routes, a content model, an admin panel, or ready-made templates for every blogging platform.

Original README

The consuming site remains responsible for its markup, content, routes, and interactions.

Original README

The site still owns the theme picker UI and persistence.

Original README

Only add imagery that you own or have permission to redistribute.

Original README

Do not open the Aether theme repository as the website's working directory

Original README

It refuses to create files when the current workspace is the Aether theme repository.

Original README

asset licensing and site-specific overrides.

Original README
https://github.com/robeshell/aether-themes/blob/main/LICENSEhttps://github.com/robeshell/aether-themes/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-13. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 85 / 100
Technologies
Astro · Eleventy
Website type
Portfolio · Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-08-28
Screenshot last checked
2026-10-13

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Astro as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: [email protected] · 2026-10-13

Inspect the recorded source material

SHA-256: b55944904628652956533383fc4af921d148e5028fcf1ae98e61210dad32ba6a

2026-10-13T00:57:48.654Z

Source file / repository
# Aether

[English](./README.md) · [简体中文](./README.zh-CN.md) · [日本語](./README.ja.md)

[![npm version](https://img.shields.io/npm/v/aether-themes?logo=npm)](https://www.npmjs.com/package/aether-themes)
[![npm downloads](https://img.shields.io/npm/dm/aether-themes?logo=npm)](https://www.npmjs.com/package/aether-themes)
[![Check package](https://github.com/robeshell/aether-themes/actions/workflows/check.yml/badge.svg)](https://github.com/robeshell/aether-themes/actions/workflows/check.yml)
[![License](https://img.shields.io/npm/l/aether-themes)](./LICENSE)

**An AI-first, template-driven theme kit for customizable personal sites.**

Aether combines a swappable CSS theme layer with AI-guided setup and maintenance workflows. It helps an agent create or update editable site templates without coupling the visual system to one person's content, routes, or framework. The theme layer was extracted from [W.Site](https://robeshell.github.io/).

[Browse the demo site](https://robeshell.github.io/) · [Read the AI starter prompt](./STARTER_PROMPT.md) · [View the npm package](https://www.npmjs.com/package/aether-themes)

## What Aether is (and is not)

Aether is an AI-first, template-driven theme kit, not a complete blog theme, site generator, or CMS. It combines two layers:

1. **Theme layer** — framework-agnostic CSS, optional vanilla JS snippets, design tokens, and a semantic markup contract.
2. **AI builder layer** — prompts and a Skill that ask for the site's requirements, create or update editable templates, configure themes, and validate the result.

It does not provide routes, a content model, an admin panel, or ready-made templates for every blogging platform. The generated site remains a normal project that can run without an AI service at runtime.

Aether is intended for sites whose templates can be edited by an AI agent or a developer. It is not a universal adapter that can restyle arbitrary hosted-blog markup without template access.

The guided starter workflow uses Astro by default. The package itself has no Astro runtime dependency and can be integrated with any framework or static-site generator that can load global CSS, emit HTML, and add the semantic hooks documented in [`THEME_CONTRACT.md`](./THEME_CONTRACT.md).

| Environment | Integration level |
| --- | --- |
| Astro | First-class starter and template workflow |
| Eleventy or plain HTML | Direct CSS integration |
| Other HTML-producing frameworks or static-site generators | Compatible after mapping templates to the contract |
| Existing CMS or blog markup | Not drop-in; requires a template adapter or local overrides |

In other words, Aether is portable, but it is not universally plug-and-play. The consuming site remains responsible for its markup, content, routes, and interactions.

## Why Aether

- **Seven swappable themes** using one semantic markup contract.
- **Selective loading** so a site only ships the themes it offers.
- **Framework-agnostic CSS** that works with Astro, Eleventy, plain HTML, and other static-site tools.
- **AI-first setup and maintenance** through a repository-discoverable Skill and copy-and-paste prompts.
- **No npm runtime dependencies.** Optional vanilla JS snippets cover Persona titles and shared SVG markup. No bundled franchise artwork or scraped assets.

## Themes

| Theme | Direction |
| --- | --- |
| `minimal` | Quiet whitespace and editorial order |
| `magazine` | Paper, columns, and print rhythm |
| `terminal` | Phosphor green, grids, and command-line cues |
| `cyber` | Hazard yellow, cyan diagnostics, and hard panels |
| `island` | Bright island life and soft rounded surfaces |
| `wilds` | Earth tones, ruins, and wide landscape space |
| `persona` | Red-black cut-paper poster composition |

All themes style the same semantic hooks. Change the root attribute to switch the visual system:

```html
<html data-theme="persona">
```

## Quick start

Install the package in your site:

```sh
npm install aether-themes
```

Import the foundation first, then the themes you want:

```css
@import 'aether-themes/foundation.css';
@import 'aether-themes/themes/minimal.css';
@import 'aether-themes/themes/persona.css';
```

If your site offers every built-in theme, use the convenience bundle:

```css
@import 'aether-themes/all.css';
```

The package only provides the visual layer. Your site owns the HTML, content, routes, theme picker, and interaction logic.

## Load only the themes you need

Copy [`aether.config.example.mjs`](./aether.config.example.mjs) to your site as `aether.config.mjs`, then remove themes you do not want:

```js
export default {
  themes: ['minimal', 'persona'],
  defaultTheme: 'minimal',
};
```

Generate an import bundle for that configuration:

```sh
npx aether-themes \
  --config aether.config.mjs \
  --output src/styles/aether-themes.css
```

The generator validates theme names, duplicate entries, and `defaultTheme`. Use the same `themes` array for your theme picker so disabled themes are not offered in the UI. Keep labels and descriptions in the consuming site so Aether stays content-agnostic.

## Build a site with an AI agent

For a guided, from-scratch setup, open an empty directory that will become your website and give the AI agent this repository as a reference. Do not open the Aether theme repository as the website's working directory: Aether is the dependency and visual layer, while your website owns its files, content, routes, and configuration.

The agent's job is to create or modify the site's editable templates so they use Aether's semantic hooks. Aether does not infer arbitrary markup or rewrite a locked-down hosted blog automatically.

The root [`AGENTS.md`](./AGENTS.md) and [`skills/aether-blog/SKILL.md`](./skills/aether-blog/SKILL.md) make the setup entry point discoverable in agents that support repository conventions.

If you are new to terminal-based development, copy [`STARTER_PROMPT.md`](./STARTER_PROMPT.md). It asks a short setup questionnaire about the site name, description, author, sections, language, and themes, then creates the formal website directly in the current workspace after you confirm the plan. It refuses to create files when the current workspace is the Aether theme repository.

The shortest handoff message is:

```text
Read https://github.com/robeshell/aether-themes/blob/main/STARTER_PROMPT.md. Ask me the setup questions first, wait for my confirmation, then create and start the formal website directly in the current workspace. Do not create `aether-ai-smoke-test` or any other test directory. If the current workspace is the `aether-themes` repository, stop and ask me to switch to a separate website directory.
```

If you are maintaining the Aether package itself, use [`SMOKE_TEST_PROMPT.md`](./SMOKE_TEST_PROMPT.md). It creates an isolated `aether-ai-smoke-test/site` inside the repository for package and generator checks; it is not a user-site setup workflow.

If you already have an Aether site, use [`UPDATE_PROMPT.md`](./UPDATE_PROMPT.md). It gives the agent a one-line update command plus a cautious full workflow that preserves content, configuration, local snapshots, and uncommitted work before rebuilding and checking the site.

## Markup contract

Aether styles semantic hooks rather than page-specific routes. Read [`THEME_CONTRACT.md`](./THEME_CONTRACT.md) for the required hooks, rich-content hooks, and optional runtime snippets.

The consuming site owns:

- content collections and frontmatter;
- routes and page structure;
- theme-picker state and persistence;
- site copy and labels;
- asset licensing and site-specific overrides.

Persona per-character titles, divider SVG paths, and list-arrow paths live in vanilla ESM so any site can import them without an Astro component:

```js
import { applyThemeEnhancements } from 'aether-themes/scripts/persona-titles.js';
import { createDivider, ENTRY_ARROW_PATH } from 'aether-themes/scripts/markup.js';

applyThemeEnhancements(document.documentElement.dataset.theme);
```

Call `applyThemeEnhancements` whenever `html[data-theme]` changes. The site still owns the theme picker UI and persistence.

## Optional imagery

Aether does not ship scraped or franchise-owned imagery. The `cyber`, `terminal`, and `wilds` themes expose optional image variables instead:

```css
:root[data-theme="cyber"] {
  --aether-cyber-dots-image: url('/assets/cyber/dots-yellow.png');
}

:root[data-theme="terminal"] {
  --aether-terminal-rain-image: url('/assets/terminal/matrix-rain.svg');
}

:root[data-theme="wilds"] {
  --aether-wilds-header-image: url('/images/wilds-header.png');
}
```

These variables default to `none`, so the themes work without extra assets. Only add imagery that you own or have permission to redistribute.

## Development

The package has no runtime dependency. Review the publish contents locally with:

```sh
npm pack --dry-run
```

The same check runs in [GitHub Actions](https://github.com/robeshell/aether-themes/actions/workflows/check.yml) for every push and pull request.

## Contributing

Changes should target the semantic hooks in [`THEME_CONTRACT.md`](./THEME_CONTRACT.md), keep the foundation content-agnostic, and preserve the consuming site's ability to opt into only the themes it needs. Before opening a pull request, run `npm pack --dry-run` and check the generated package contents.

For release steps, see [`PUBLISHING.md`](./PUBLISHING.md). Every published change needs a version bump.

## License

MIT. See [`LICENSE`](./LICENSE).
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.