{"id":31698841,"url":"https://github.com/getaltair/altair","last_synced_at":"2026-04-30T08:33:54.159Z","repository":{"id":350967239,"uuid":"1208875194","full_name":"getaltair/altair","owner":"getaltair","description":"Self-hosted personal OS for knowledge, goals, and resource management. Offline-first, sync-aware, AI-optional.","archived":false,"fork":false,"pushed_at":"2026-04-20T21:01:52.000Z","size":1548,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-20T22:39:58.874Z","etag":null,"topics":["axum","jetpack-compose","kotlin","offline-first","postgresql","powersync","rust","self-hosted","svelte","sveltekit"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/getaltair.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-12T21:18:45.000Z","updated_at":"2026-04-20T21:01:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/getaltair/altair","commit_stats":null,"previous_names":["getaltair/altair"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/getaltair/altair","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaltair%2Faltair","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaltair%2Faltair/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaltair%2Faltair/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaltair%2Faltair/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getaltair","download_url":"https://codeload.github.com/getaltair/altair/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaltair%2Faltair/sbom","scorecard":{"id":1245967,"data":{"date":"2025-11-10T09:26:39Z","repo":{"name":"github.com/getaltair/altair","commit":"5b11cb559429780654fa273c9c272b96350f23f5"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/15 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:75","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:124","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:179","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:19","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security.yml:36","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security.yml:37","Info: topLevel 'contents' permission set to 'read': .github/workflows/build.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/mobile.yml:11","Warn: topLevel 'actions' permission set to 'write': .github/workflows/mobile.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/pr-validation.yml:8","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/security.yml:13","Info: topLevel 'contents' permission set to 'read': .github/workflows/test.yml:10"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":6,"reason":"dependency not pinned by hash detected -- score normalized to 6","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:117: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/mobile.yml:123: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:148: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/mobile.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mobile.yml:93: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/mobile.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:89: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr-validation.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/pr-validation.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/getaltair/altair/security.yml/develop?enable=pin","Info:  21 out of  35 GitHub-owned GitHubAction dependencies pinned","Info:  10 out of  15 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: all commits (29) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.1.0 not signed: https://api.github.com/repos/getaltair/altair/releases/256188835","Warn: release artifact v0.1.0 does not have provenance: https://api.github.com/repos/getaltair/altair/releases/256188835"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'develop'","Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'develop'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'develop'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Info: 'stale review dismissal' is required to merge on branch 'develop'","Info: 'stale review dismissal' is required to merge on branch 'main'","Warn: branch 'develop' does not require approvers","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'develop'","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'develop'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'develop'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'develop'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'develop'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Contributors","score":0,"reason":"project has 0 contributing companies or organizations -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"21 out of 21 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2026-04-13T03:14:16.065Z","repository_id":350967239,"created_at":"2026-04-13T03:14:16.065Z","updated_at":"2026-04-13T03:14:16.065Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32459420,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["axum","jetpack-compose","kotlin","offline-first","postgresql","powersync","rust","self-hosted","svelte","sveltekit"],"created_at":"2025-10-08T19:11:12.372Z","updated_at":"2026-04-30T08:33:54.154Z","avatar_url":"https://github.com/getaltair.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Altair\n\n[![CI](https://github.com/getaltair/altair/actions/workflows/ci.yml/badge.svg)](https://github.com/getaltair/altair/actions/workflows/ci.yml)\n\nA self-hosted personal operating system for managing knowledge, goals, and resources across everyday life.\n\nAltair integrates three primary domains:\n\n- **Guidance** -- Goals, initiatives, routines, quests, and focus sessions\n- **Knowledge** -- Notes, linked information, snapshots, and semantic search\n- **Tracking** -- Household inventory, locations, categories, and shopping lists\n\n## Principles\n\n- **Offline-first** -- Clients work independently and sync when connected. No internet required for core functionality.\n- **Self-hosted** -- You own your data. Runs on a Raspberry Pi (4GB+) or any small VPS.\n- **Sync-safe** -- Conflicts are detected and surfaced, never silently overwritten.\n- **AI-optional** -- AI features enhance the experience but are never required. The app works fully without them.\n\n## Architecture\n\n```\n                  +-------------------+\n                  |    PostgreSQL      |\n                  |  (source of truth) |\n                  +--------+----------+\n                           |\n                  +--------+----------+\n                  |    PowerSync       |\n                  |   (sync layer)     |\n                  +--------+----------+\n                           |\n              +------------+------------+\n              |                         |\n     +--------+--------+      +--------+--------+\n     |   Web Client     |      | Android Client  |\n     |   SvelteKit 2    |      | Kotlin/Compose  |\n     |   (SQLite/OPFS)  |      | (SQLite/Room)   |\n     +---------+--------+      +--------+--------+\n               |                         |\n               +------------+------------+\n                            |\n                   +--------+----------+\n                   |   Axum Server      |\n                   |   (REST API)       |\n                   +--------+----------+\n                            |\n              +-------------+-------------+\n              |                           |\n     +--------+--------+        +--------+--------+\n     | Argon2id + JWT   |        |  RustFS (S3)    |\n     |  (built-in auth) |        |  (attachments)  |\n     +-----------------+        +-----------------+\n```\n\n## Tech Stack\n\n| Component | Technology | Purpose |\n|-----------|-----------|---------|\n| Web | SvelteKit 2 / Svelte 5 / TypeScript | Browser client |\n| Android | Kotlin / Jetpack Compose | Mobile client |\n| Server | Rust / Axum | REST API |\n| Database | PostgreSQL | Primary data store |\n| Sync | PowerSync Open Edition | Offline-first sync |\n| Auth | Argon2id + JWT (built-in) | Password hashing and session tokens |\n| Storage | RustFS (S3-compatible) | Attachment and file storage |\n| Search | PostgreSQL FTS + pgvector | Keyword and semantic search |\n\n## Requirements\n\n### Minimum (1-2 users)\n\n- 4GB RAM (Raspberry Pi 4 or $5/mo VPS)\n- 4-core ARM64 or x86_64\n- 32GB storage + external for attachments\n- Docker and Docker Compose\n\n### Recommended (3-5 users)\n\n- 8GB RAM (Raspberry Pi 5, NAS, or $15/mo VPS)\n- 64GB+ storage\n\n## Local Development Setup\n\n### Prerequisites\n\n- Docker and Docker Compose v2\n- [mise](https://mise.jl.dev) — manages Bun, Rust, and Java toolchains\n- sqlx CLI for running migrations\n\n### Environment Setup\n\nCopy the example env file and fill in credentials:\n\n```bash\ncp infra/compose/.env.example infra/compose/.env\n# Edit infra/compose/.env — set POSTGRES_PASSWORD, JWT_PRIVATE_KEY,\n# RUSTFS_ACCESS_KEY, RUSTFS_SECRET_KEY, and update DATABASE_URL to match\n```\n\nSee `infra/compose/.env.example` for all required variables and their descriptions.\n\n### Install Toolchains\n\n```bash\nmise install    # installs Bun, Rust (stable), and Java 17 (temurin)\ncargo install sqlx-cli --no-default-features --features postgres\n```\n\n### Start Infrastructure\n\n```bash\ncd infra/compose \u0026\u0026 docker compose up -d\n```\n\n### Run Migrations\n\n```bash\n# From repo root — set DATABASE_URL to match your infra/compose/.env values\nDATABASE_URL=postgres://altair_user:yourpassword@localhost:5432/altair_db \\\n  sqlx migrate run --source infra/migrations\n```\n\n### Apply Seed Data (optional, for local dev)\n\n```bash\npsql $DATABASE_URL -f infra/scripts/seed.sql\n```\n\n### Start Applications\n\nOpen separate terminals for each:\n\n```bash\n# Rust API server — listens on port 8000\ncd apps/server\nDATABASE_URL=postgres://altair_user:yourpassword@localhost:5432/altair_db cargo run\n\n# SvelteKit web client — listens on port 5173\ncd apps/web \u0026\u0026 bun install \u0026\u0026 bun dev\n\n# Android — open apps/android/ in Android Studio, then run on emulator or device\n```\n\n## Project Structure\n\n```\naltair/\n  apps/\n    web/              SvelteKit 2 web client\n    android/          Kotlin/Compose mobile client\n    server/           Rust/Axum API server\n  packages/\n    api-contracts/    Shared API type definitions\n    design-tokens/    Design system tokens\n  infra/\n    docker/           Dockerfiles\n    compose/          Docker Compose configurations\n    migrations/       PostgreSQL migrations (sqlx)\n    scripts/          Deployment and seed scripts\n  docs/               PRDs, architecture specs\n    specs/            Generated spec templates\n  Context/\n    Decisions/        Architecture Decision Records\n    Features/         Feature specs and implementation plans\n    Backlog/          Ideas and bugs\n    Reviews/          Code review findings\n```\n\n## Architecture Decisions\n\nKey decisions are documented as ADRs in `Context/Decisions/`:\n\n| ADR | Decision |\n|-----|----------|\n| [001](Context/Decisions/ADR-001-defer-desktop-to-v2.md) | Desktop (Tauri) deferred to v2 |\n| [002](Context/Decisions/ADR-002-deployment-targets.md) | Deployment: 4GB min, 8GB recommended |\n| [003](Context/Decisions/ADR-003-sync-protocol-conflict-resolution.md) | Sync: LWW with conflict logging |\n| [004](Context/Decisions/ADR-004-search-embedding-strategy.md) | Search: Postgres FTS + external embeddings |\n| [005](Context/Decisions/ADR-005-attachment-storage.md) | Storage: S3-compatible abstraction |\n| [006](Context/Decisions/ADR-006-auth-session-model.md) | Auth: OAuth 2.0 / OIDC (superseded by ADR-012) |\n| [007](Context/Decisions/ADR-007-monorepo-structure.md) | Monorepo layout |\n| [008](Context/Decisions/ADR-008-notification-ownership-delivery.md) | Notifications: server-owned + client fallback |\n\n## Domains\n\n### Guidance\n\nManage goals through a hierarchy of initiatives, epics, quests, and routines. Track focus sessions and daily check-ins. Routines automatically spawn recurring quests.\n\n### Knowledge\n\nCapture and connect information with markdown notes, `[[wiki-links]]`, backlinks, and automatic snapshots. Search across all content with full-text and optional semantic search.\n\n### Tracking\n\nMonitor household inventory across locations and categories. Log consumption, purchases, and moves. Get low-stock alerts. Manage shopping lists linked to inventory.\n\n### Cross-Domain\n\nAll 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.\n\n## Contributing\n\nAltair uses conventional commits and a spec-driven development workflow. See [CLAUDE.md](CLAUDE.md) for development conventions and [DESIGN.md](DESIGN.md) for the design system.\n\n## License\n\n[GNU Affero General Public License v3.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetaltair%2Faltair","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetaltair%2Faltair","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetaltair%2Faltair/lists"}