CLI Reference
Usage
aether [flags]
Aether opens an interactive session. No subcommands needed — everything happens through slash commands once it's running.
Flags
| Flag | Description |
|---|---|
--no-animation | Skip startup animation |
--version, -v | Show version |
Interactive Commands
Once inside the session, use slash commands (case-insensitive: /CONFIG, /Genesis, etc. all work):
| Command | Description |
|---|---|
/help | Show available commands |
/config | Configure your AI provider and model |
/genesis | Analyze the project and generate documentation |
/sync | Update existing docs incrementally |
/clean | Manage global data (caches, configs, projects) |
/clear | Clear the screen |
/exit | Exit Aether |
Every command also accepts help, --help, or -h for detailed usage — e.g. /config help.
/config
Configure the AI provider used by /genesis. Config is stored globally in ~/.aether/config.json — never in the repo, so your API key stays out of version control.
Each project keeps its own provider/model in that file, with a shared default the rest inherit — so one machine can drive many projects. Prefer not to store the key at all? Set AETHER_API_KEY in your environment and it overrides whatever's in the config file — handy for CI or shared machines.
/config # show current config
/config gemini # quick setup — free tier
/config openai
/config anthropic
/config openrouter # one key, access to many models (incl. free ones)
/config set <key> <value> # set a specific field
set keys: provider, model, url (or baseurl), key (or apikey).
/config set model gpt-4o
/config set key AIza...
/config set url https://openrouter.ai/api/v1
If you point url at a recognized host (OpenRouter, OpenAI, Anthropic, Gemini), provider is automatically re-synced to match — so the label never drifts from what you're actually calling.
| Provider | Default model | Notes |
|---|---|---|
gemini | gemini-2.0-flash | Free tier: 15 RPM, 1M tokens/day |
openai | gpt-4o | Paid — ~$0.01/10k tokens |
anthropic | claude-sonnet-4-20250514 | Paid — ~$0.003/1k tokens |
openrouter | openrouter/auto | Proxy for many models with one key — override the model freely |
/genesis
/genesis # analyze the current directory
/genesis <path> # analyze a specific directory
/genesis --force # regenerate even if .aether/docs already exists
What it does:
- Scans the entire project — configs, entry points, and every source file that fits the context budget (no arbitrary file-count cap). The default budget is sized for large-context models, so a typical project goes in whole; anything it does have to leave out is listed explicitly, never dropped silently.
- An AI planning pass decides which docs actually make sense for this project. Always generated: the human guides (
getting-started,onboarding), the architecture set (system-overview,folder-structure,tech-stack), andAI_CONTEXT.md. Everything else (contributing,coding-standards,modules,api,business,diagrams,glossary) is only included with real evidence — a frontend or devops project won't getapi/endpoints.mdjust because it's on the list. - The AI can also propose a handful of custom docs beyond the fixed catalog when something project-specific deserves its own page (e.g. an unusual build pipeline).
- Docs are written to
.aether/docs/, generated concurrently with retry + backoff on failures, plus adocs/README.mdindex that links everything.
Each doc is generated from a single shared project context built once before generation starts. If the whole project fits the model's budget, it's sent as real code; when it doesn't, Aether distills the entire project once into factual notes and reuses them for every doc — so nothing is dropped, the expensive pass runs a single time, and all docs stay consistent with each other. Requests stream under the hood with an idle timeout, so a slow model that keeps responding is never cut off mid-answer.
If .aether/docs/ already exists, /genesis won't regenerate it by default — it'll point you to /sync instead. Use --force to fully regenerate anyway.
Tuning the scan budget
The defaults fit most projects into a large-context model without omitting anything. You can open them up further for a very large repo, or tighten them for a small local model, via environment variables:
| Variable | Default | Controls |
|---|---|---|
AETHER_MAX_TOTAL_CHARS | 2000000 | Total characters of project content sent to the model |
AETHER_MAX_FILE_SIZE | 128000 | Per-file size cap in bytes — larger files are skipped |
AETHER_MAX_FILES_WALKED | 10000 | How many files the scanner will visit |
AETHER_MAX_WALK_DEPTH | 12 | Maximum directory nesting the scanner descends into |
AETHER_DOC_CONTEXT_CHARS | 48000 | Per-document context budget. Above this, the relevant code is distilled chunk-by-chunk instead of sent verbatim — raise it for a large-context model, lower it for a small local one |
Two audiences, two contracts
Genesis writes for both people and AI, and they don't get the same treatment:
- Human guides (
guides/) lead with the why and explain how the pieces connect. They read like onboarding, not an index. If your repo already has author-written context (aREADME,CONTEXT.md, …), they lean on it for intent — but you don't have to write anything; they're generated from the code either way. - AI & architecture docs (
AI_CONTEXT.md,architecture/, etc.) stay strict and traceable — every claim maps to a file, so an assistant can trust them without hallucinating.
Both share the same accuracy floor: nothing invented, and a planned feature is never described as already built.
Output structure
.aether/docs/
├── README.md (always — index of everything below)
├── guides/
│ ├── getting-started.md (always — install & run, for humans)
│ ├── onboarding.md (always — mental model & the why)
│ └── contributing.md (if there's a real contribution process)
├── architecture/
│ ├── system-overview.md (always)
│ ├── folder-structure.md (always)
│ ├── tech-stack.md (always)
│ └── coding-standards.md (if applicable)
├── modules/overview.md (if applicable)
├── api/endpoints.md (only with an actual API/CLI to document)
├── business/rules.md (if applicable)
├── diagrams/system.md (if applicable)
├── AI_CONTEXT.md (always)
├── glossary.md (if applicable)
└── ... (+ custom docs the AI proposes for this project)
/sync
/sync # sync the current directory
/sync <path> # sync a specific directory
Refresh docs after the project changed — without regenerating everything.
How it works:
- Diffs the project against the last
/genesissnapshot (stored in.aether/settings/context.json) - Asks the AI which docs are affected by what changed
- Refreshes only those docs in place — existing sections are patched, nothing is deleted
- Adds new docs if the changes warrant them (e.g. you added an API layer that didn't exist before)
If no snapshot exists yet, /sync will point you to /genesis first.
Concurrent generation
Both /genesis and /sync generate multiple docs in parallel. The default concurrency is 4; override with:
| Variable | Default | Controls |
|---|---|---|
AETHER_GEN_CONCURRENCY | 4 | How many docs are generated simultaneously |
AETHER_DISTILL_CONCURRENCY | 4 | How many files are distilled concurrently (large projects) |
/clean
/clean # list all projects and global status
/clean cache # remove all cached data (keep configs)
/clean cache <n> # remove cache for project #n from the list
/clean <n> # remove project #n entirely (config + cache)
/clean config # delete ~/.aether/config.json (API keys)
/clean all # delete everything in ~/.aether/
Manage global data stored in ~/.aether/. Use /clean with no arguments to see what's stored — all configured projects, their cache sizes, and provider info.
What lives in ~/.aether/
| Path | Contents |
|---|---|
config.json | API keys, provider/model per project + shared default |
cache/<project>/ | Distill cache (condensed source notes for large projects) |
Project storage in the repo
| Path | Contents |
|---|---|
.aether/docs/ | Generated knowledge base (safe to commit) |
.aether/settings/context.json | Snapshot for /sync — do not delete or sync loses its baseline |
Error Handling & Retries
All API calls retry automatically with exponential backoff:
| Error type | Retries | Backoff | Behavior |
|---|---|---|---|
| Rate limit (429) | Up to 6 | 15s, 30s, 60s, 120s... | Respects provider's retry-after hint if present |
| Server errors (5xx) | Up to 3 | 2s, 4s, 8s | Standard exponential backoff |
| Timeouts | Up to 3 | 2s, 4s, 8s | Idle timeout (no data for 2 min), not total time |
Rate limits from free tiers (Gemini's 15 RPM, for example) are handled automatically — the CLI waits and retries instead of failing. During generation, each step shows its retry status inline.
Dropdown Navigation
Type / to see all commands. Use ↑↓ arrows to navigate, Enter to select, Tab to autocomplete.
Coming Soon
/ask— Context-aware Q&A about your codebase- Dedicated Anthropic provider (currently routed through the OpenAI-compatible client)
- MCP Server — Expose knowledge base to Claude, Cursor, Gemini