A self-hosted personal operating system for managing knowledge, goals, and resources across everyday life.
Altair integrates three primary domains:
+-------------------+
| PostgreSQL |
| (source of truth) |
+--------+----------+
|
+--------+----------+
| PowerSync |
| (sync layer) |
+--------+----------+
|
+------------+------------+
| |
+--------+--------+ +--------+--------+
| Web Client | | Android Client |
| SvelteKit 2 | | Kotlin/Compose |
| (SQLite/OPFS) | | (SQLite/Room) |
+---------+--------+ +--------+--------+
| |
+------------+------------+
|
+--------+----------+
| Axum Server |
| (REST API) |
+--------+----------+
|
+-------------+-------------+
| |
+--------+--------+ +--------+--------+
| Zitadel (OIDC) | | RustFS (S3) |
| (auth/identity) | | (attachments) |
+-----------------+ +-----------------+
| Component | Technology | Purpose |
|---|---|---|
| Web | SvelteKit 2 / Svelte 5 / TypeScript | Browser client |
| Android | Kotlin / Jetpack Compose | Mobile client |
| Server | Rust / Axum | REST API |
| Database | PostgreSQL | Primary data store |
| Sync | PowerSync Open Edition | Offline-first sync |
| Auth | Zitadel (OIDC) | Identity and authentication |
| Storage | RustFS (S3-compatible) | Attachment and file storage |
| Search | PostgreSQL FTS + pgvector | Keyword and semantic search |
Copy the example env file and fill in credentials:
cp infra/compose/.env.example infra/compose/.env
# Edit infra/compose/.env — set POSTGRES_PASSWORD, ZITADEL_MASTERKEY (≥32 chars),
# GARAGE_RPC_SECRET, GARAGE_ADMIN_TOKEN, and update DATABASE_URL to match
See infra/compose/.env.example for all required variables and their descriptions.
mise install # installs Bun, Rust (stable), and Java 17 (temurin)
cargo install sqlx-cli --no-default-features --features postgres
cd infra/compose && docker compose up -d
# First run: allow ~30s for Zitadel to initialize
# From repo root — set DATABASE_URL to match your infra/compose/.env values
DATABASE_URL=postgres://altair_user:yourpassword@localhost:5432/altair_db \
sqlx migrate run --source infra/migrations
psql $DATABASE_URL -f infra/scripts/seed.sql
Open separate terminals for each:
# Rust API server — listens on port 8000
cd apps/server
DATABASE_URL=postgres://altair_user:yourpassword@localhost:5432/altair_db cargo run
# SvelteKit web client — listens on port 5173
cd apps/web && bun install && bun dev
# Android — open apps/android/ in Android Studio, then run on emulator or device
altair/
apps/
web/ SvelteKit 2 web client
android/ Kotlin/Compose mobile client
server/ Rust/Axum API server
packages/
api-contracts/ Shared API type definitions
design-tokens/ Design system tokens
infra/
docker/ Dockerfiles
compose/ Docker Compose configurations
migrations/ PostgreSQL migrations (sqlx)
scripts/ Deployment and seed scripts
docs/ PRDs, architecture specs
specs/ Generated spec templates
Context/
Decisions/ Architecture Decision Records
Features/ Feature specs and implementation plans
Backlog/ Ideas and bugs
Reviews/ Code review findings
Key decisions are documented as ADRs in Context/Decisions/:
| ADR | Decision |
|---|---|
| 001 | Desktop (Tauri) deferred to v2 |
| 002 | Deployment: 4GB min, 8GB recommended |
| 003 | Sync: LWW with conflict logging |
| 004 | Search: Postgres FTS + external embeddings |
| 005 | Storage: S3-compatible abstraction |
| 006 | Auth: OAuth 2.0 / OIDC via Zitadel |
| 007 | Monorepo layout |
| 008 | Notifications: server-owned + client fallback |
Manage goals through a hierarchy of initiatives, epics, quests, and routines. Track focus sessions and daily check-ins. Routines automatically spawn recurring quests.
Capture and connect information with markdown notes, [[wiki-links]], backlinks, and automatic snapshots. Search across all content with full-text and optional semantic search.
Monitor household inventory across locations and categories. Log consumption, purchases, and moves. Get low-stock alerts. Manage shopping lists linked to inventory.
All three domains connect through a shared entity relation system. Tag anything. Link notes to quests, items to initiatives, or any entity to any other. Search spans all domains.
Altair uses conventional commits and a spec-driven development workflow. See CLAUDE.md for development conventions and DESIGN.md for the design system.