Skip to content

AetherLite

AetherLite is a deployment mode for Aether that replaces all external services with embedded in-process alternatives. There is no Redis, no RabbitMQ, and no PostgreSQL to install or manage. Everything runs inside a single process backed by Badger (KV and messaging) and SQLite (relational data).

ScenarioAetherLiteFull Aether
Local development and testingRecommendedPossible but heavier
Single-node productionSupportedOverkill unless you need Redis/RabbitMQ for other reasons
Edge or embedded deploymentsRecommendedUsually impractical
Prototyping / demosRecommended—
Multi-node horizontal scalingNot supportedRequired
High-throughput (thousands of msg/s)Evaluate carefullyPreferred

AetherLite is production-ready for single-node workloads. It is not a development-only toy — data is durable on disk and message replay works correctly.

The aetherlite binary combines the gateway, workflow server, and messaging bridge in one process and always runs in lite mode. No flag is needed.

Terminal window
cd server
go build -o aetherlite ./cmd/aetherlite
# Development (no auth, CORS wildcard)
AETHER_ALLOW_DEV_MODE=true ./aetherlite --dev --insecure-admin
# With a custom data directory
AETHER_ALLOW_DEV_MODE=true ./aetherlite --data-dir /var/lib/aether-lite --insecure-admin

Flags:

FlagDefaultDescription
--config <path>—Optional YAML config file
--data-dir <path>./aether-lite-dataDirectory for SQLite and Badger storage
--port <n>50051gRPC server port
--admin-port <n>31880Admin UI port
--devfalseDevelopment mode (relaxed security)
--insecure-adminfalseAllow admin API without auth key (requires AETHER_ALLOW_DEV_MODE)
--workflowtrueEnable embedded workflow server
--workflow-admin-port <n>31881Workflow admin API port
--msgbridgefalseEnable embedded messaging bridge
--msgbridge-admin-port <n>31882Msgbridge admin API port
--version—Print version and exit

Option 2: Individual binaries with --lite flag

Section titled “Option 2: Individual binaries with --lite flag”

The --lite flag (or mode: lite in config) switches any standard binary to lite mode:

Terminal window
go build -o gateway ./cmd/gateway
./gateway --lite --data-dir ./aether-lite-data --insecure-admin

This is useful when you want only the gateway component without workflow or msgbridge.

AetherLite stores all persistent state under a single directory:

aether-lite-data/
aether.db — SQLite: tasks, ACL rules, audit log, agent registry, orchestration profiles
badger/ — Badger: sessions, KV store, checkpoints, tokens, message log, consumer offsets
workflow.db — SQLite: workflow rules, definitions, executions, schedules, state machines
msgbridge.db — SQLite: messaging bridge state (only present when msgbridge is enabled)

The data directory is created automatically on first run. Back it up like any other database directory.

AetherLite uses the same YAML configuration format as the full gateway. When using ./aetherlite, mode: lite is always forced. When using ./gateway --lite, add mode: lite to your YAML.

Minimal production config example:

mode: lite
lite:
data_dir: /var/lib/aether-lite
gateway:
port: 50051
gateway_id: "aetherlite-prod-1"
admin:
enabled: true
port: 31880
api_key: "your-secret-api-key-at-least-16-chars"
audit:
enabled: true
event_types: [connection, auth, message, kv, admin, acl]
log_level: info
YAML KeyDefaultDescription
mode"full"Set to "lite" to activate AetherLite mode
lite.data_dir"./aether-lite-data"Directory for all persistent storage

In lite mode, the postgres, redis, and rabbitmq configuration blocks are ignored. Validation of those fields is skipped.

AetherLite uses the same gateway code as full Aether. The only difference is which backend implementations are wired in at startup.

┌───────────────────────────────────────────────┐
│ AetherLite Process │
│ │
│ ┌─────────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Gateway │ │ Workflow │ │MsgBridge │ │
│ │ gRPC :50051│ │ (opt-in) │ │(opt-in) │ │
│ └──────┬──────┘ └────┬─────┘ └────┬─────┘ │
│ └──────────────┴──────────────┘ │
│ │ │
│ ┌────────────┴────────────┐ │
│ │ │ │
│ ┌───────▼────────┐ ┌───────────▼────────┐ │
│ │ Badger DB │ │ SQLite DB │ │
│ │ │ │ │ │
│ │ sess: sessions│ │ Tasks │ │
│ │ kv: KV store│ │ ACL rules │ │
│ │ ckpt: checkpts│ │ Audit log │ │
│ │ tok: tokens │ │ Orchestration │ │
│ │ msg: messages│ │ Agent registry │ │
│ │ off: offsets │ │ │ │
│ └────────────────┘ └────────────────────┘ │
└───────────────────────────────────────────────┘

Backend substitution table:

Full Mode ComponentAetherLite ComponentInterface
Redis session registryBadgerSessionRegistrySessionManager
Redis KV storeBadgerKVStoreKVReadWriter
Redis checkpoint storeBadgerCheckpointStoreCheckpointManager
Redis token storeBadgerTokenStorestate.TokenStore
RabbitMQ Streams routerBadgerRouterMessageRouter
PostgreSQL task storeSQLite task store*tasks.TaskStore
AMQP task dispatcherMemoryTaskDispatcherTaskDispatcher
Redis quota countersMemoryQuotaManagerQuotaChecker

The gateway server (internal/gateway/server.go) is identical in both modes.

PropertyAetherLiteFull Aether
External dependenciesNoneRedis, RabbitMQ, PostgreSQL
Horizontal scalingSingle-node onlyMultiple instances supported
Message durabilityDurable (Badger on disk)Durable (RabbitMQ Streams)
Message replay on reconnectSupportedSupported
Quota persistence across restartsNo (in-memory)Yes (Redis)
Operational complexityLow (one process, one dir)Higher (3 external services)
Throughput ceilingLimited by local disk I/OHigher (distributed)
PostgreSQL featuresVia SQLite (same schema)Native PostgreSQL

If you start with AetherLite and later need to scale horizontally, you can migrate:

  1. Export task data from aether.db using standard SQLite tools (sqlite3 aether.db .dump > tasks.sql). The schema matches the PostgreSQL schema (the sqlite_compat driver bridges syntax differences); import the dump into PostgreSQL after adjusting any SQLite-specific syntax.
  2. KV and checkpoint data in Badger has no direct export path to Redis. For most deployments these are regenerated automatically when agents reconnect. If you require migration, write a small Go program using the Badger reader and Redis writer.
  3. Reconfigure the gateway with Redis, RabbitMQ, and PostgreSQL connection details and remove mode: lite.
  4. Restart — clients reconnect automatically and their state is re-established.
  • Single-node only. Badger and SQLite are local files; they cannot be shared across multiple gateway processes.
  • Quota counts reset on restart. The in-memory quota manager does not persist connection counters across restarts. Workspace connection limits are re-enforced from zero after each restart.
  • Back-pressure on message channels. Under extreme back-pressure, the live subscriber delivery channel may drop messages. Those messages remain durably stored in Badger and are replayed on the subscriber’s next reconnect.
  • SQLite concurrency. SQLite is configured in WAL mode with a 5-second busy timeout. Very high write concurrency may cause transient SQLITE_BUSY errors on the audit log or task store. If you hit this consistently, consider the full PostgreSQL deployment.
  • No PG NOTIFY. The task dispatcher uses polling rather than PostgreSQL NOTIFY/LISTEN. Task assignment latency may be slightly higher than in full mode (typically under a second).
  • Quick Start — getting started with AetherLite in minutes
  • Architecture — full architecture with AetherLite backend details