A local-first command center for developers who build many projects with LLM coding tools.
If you run Claude Code, Cursor, Copilot, or any agent across dozens of repos, you lose the mental map every time you start a fresh session. Atlas rebuilds it: one screen for every project, every scattered todo, what moved, what is going stale, and what to do next. Your data never leaves your machine.
git clone https://github.com/thebenignhacker/atlas.git
cd atlas
npm install
cp atlas.config.example.json atlas.config.json # point it at your project roots
npm run setup-db && npm run scan # scan your repos + todos
npm run dev # open http://localhost:3000That is the whole setup. The dashboard reads a local SQLite snapshot, so it loads instantly and works offline.
- Portfolio map — every repo as a card: language, public/private/fork, last-commit recency (color-coded), open PRs and todos, and actionable flags (uncommitted work, unpushed commits, behind upstream). Search, filter, and sort across all of them.
- Todo command center — every scattered todo markdown file, parsed and unified. Filter by priority (P0-P3), status, repo, or staleness. One click opens the source file in your editor.
- Activity feed — a cross-repo commit timeline and contribution heatmap, so you can see where your energy actually went.
- AI digest (optional) — a grounded briefing on what moved, what is stalling, and a short suggested-focus list. Built on measured facts, never invented.
- Context Store — verified facts about each project that flag themselves when they go stale, so you stop re-deriving "what's the status of X" every session. See below.
Notes, indexes, and ledgers decay. An index says "last updated April"; a session trusts it and acts on a fact that shipped weeks ago. Context that isn't trust-tagged is worse than none — it misleads with confidence.
The Context Store fixes the part that actually matters: freshness. Each fact is a small card pinned to the source files it came from (content-hashed) plus a one-line re-check command. Read a project's cards at the start of a session instead of re-reading the repo. When a card's sources change, it shows up flagged re-verify — it never silently asserts something that has since become false.
# write a fact when you verify it (the source files are hashed for you)
atlas-context add --project nanomind --subject "classifier version" \
--claim "classifier published at 0.5.0" \
--source nanomind/nanomind-models.json \
--verify 'jq -e ".models[\"nanomind-security-classifier\"].huggingface.publishedVersion==\"0.5.0\"" nanomind/nanomind-models.json' \
--stale-after 30
# read it back next session — in one call, not a repo re-read
atlas-context get --project nanomind
# [FRESH] classifier version nanomind classifier published at 0.5.0
# [DRIFTED] training corpus nanomind re-verify: jq -e '...' nanomind-models.jsonThe dashboard's Context view turns this into a panel: the hero number is stale facts caught before they misled a session (counted from an event log — measured, not estimated), alongside a freshness-coverage gauge and a conservative tokens-saved estimate (labeled as an estimate, always). Cards default to private and live in the gitignored database; only cards you explicitly mark public reach the public demo, with their source paths and commands stripped. Full guide: docs/CONTEXT_STORE.md.
your filesystem + local git + GitHub API + (optional) an LLM
| npm run scan
v
SQLite (data/atlas.db) <- single source of truth, stays on your machine
v
Next.js dashboard <- reads the snapshot, renders instantly
npm run scan walks the roots in atlas.config.json, reads local git (last commit,
branch, dirty state, ahead/behind, recent commits), parses your todo markdown, and
enriches each repo with GitHub data (visibility, stars, forks, open PRs). GitHub
enrichment uses GITHUB_TOKEN if set, otherwise falls back to the gh CLI, otherwise
skips cleanly. Re-run it anytime, or schedule it.
Edit atlas.config.json (copied from the example):
| Field | What it does |
|---|---|
scanRoots |
Directories to scan for git repos |
scanDepth |
How many levels deep to look for a .git folder |
todoDirs |
Directories holding your todo markdown files |
github.user / github.orgs |
Your GitHub identity, used for enrichment |
ai.enabled |
Turn the AI layer on or off (default: off) |
ai.provider |
anthropic, openai, or ollama |
ai.optInRepos / ai.allowPrivate |
Which repos may have content sent to an LLM |
Atlas is fully usable with no API key. When you enable AI:
- Pluggable — Anthropic (default), OpenAI, or a local Ollama model.
- Private by default — only public (or explicitly opted-in) repos ever have content sent to a provider. Private repos are excluded unless you opt in. The Settings page shows exactly what gets sent.
- Cheap — results are cached by content hash, so re-scanning never re-spends tokens unless the underlying content changed.
- Grounded — AI output is built from measured facts, clearly marked as generated, and never mixed with your real git data.
- Self-learning — when you correct something the AI got wrong, Atlas records the correction and feeds it back into future prompts, so it stops repeating the mistake. This is a local feedback loop, not model training. See it in Settings.
To enable: set ai.enabled to true and provide a key
(ANTHROPIC_API_KEY, OPENAI_API_KEY) in your environment or a .env file.
| Command | What it does |
|---|---|
npm run setup-db |
Create the local SQLite schema |
npm run scan |
Scan your repos and todos into the database |
npm run snapshot |
Generate the sanitized public snapshot (for a public demo) |
npm run snapshot:owner |
Generate the full owner snapshot (for a private remote view) |
npm run dev |
Start the dashboard (full local view) |
npm run build / npm start |
Production build and serve |
Atlas runs in three modes from one codebase, selected by ATLAS_MODE:
- Local (default): reads the full SQLite database. You see everything. No login, because it is your machine.
- Public (
ATLAS_MODE=public): reads onlypublic-snapshot.jsonand serves a sanitized, read-only view. Private repos, forks, local file paths, todos, and settings are never present. The full database is never deployed, so it cannot leak. - Owner (
ATLAS_MODE=owner): readsowner-snapshot.json(your full data) behind a GitHub login locked to a single account. Use it to reach your complete dashboard from any device. The snapshot is never committed; it is uploaded only to the login-gated deployment.
- Choose which owners are public in
atlas.config.jsonviapublicOwners(empty means all public repos; list specific orgs/users to scope it). - Run
npm run snapshot. It writespublic-snapshot.jsonand aborts if any private data (your username, local paths, private or fork repo names) is detected. - Deploy with the environment variable
ATLAS_MODE=public(for example on Vercel). The committedpublic-snapshot.jsonis the data source; no database is needed.
Re-run npm run snapshot and redeploy whenever you want to refresh the public view.
A second, login-gated deployment that shows your full data from any device. Only one GitHub account can sign in.
- Create a GitHub OAuth app (Settings → Developer settings → OAuth Apps). Set the
callback URL to
https://<your-owner-deployment>/api/auth/callback/github. - On the owner deployment, set these environment variables (never commit them):
ATLAS_MODE=ownerGITHUB_CLIENT_ID,GITHUB_CLIENT_SECRET(from the OAuth app)AUTH_SECRET(openssl rand -base64 32)OWNER_GITHUB_LOGIN(your GitHub username, the only account allowed in)
- Run
npm run snapshot:ownerto writeowner-snapshot.json(gitignored, full data). - Deploy as a separate project with the snapshot present in the working directory
(for example
vercel deploy --prod). The snapshot ships via the CLI upload, never through git.
Unauthenticated visitors are redirected to GitHub sign-in; anyone other than
OWNER_GITHUB_LOGIN is denied. Owner mode is read-only (the host has no database), so AI
generation runs locally, so re-run npm run snapshot:owner and redeploy to refresh.
Everything stays local. The SQLite database, your config, and .env are git-ignored.
Local git facts are never sent anywhere. The only outbound calls are to GitHub (for repo
metadata) and, if you enable it, your chosen LLM provider for eligible repos only.
MIT