Constella is a private, open source, local-first desktop command center for your files, memories, agents, and workflows. It syncs folders you choose, builds a searchable local knowledge substrate, and uses local analysis jobs to turn scattered notes into connected concepts, themes, reminders, and recommendations.
The goal: one shared brain for your personal knowledge and agentic workflows.
Download here — a curated UI based on our daily use testing, plus:
Active desktop prototype. The core Electron/React shell, agent runner, local source registry, sync loop, SQLite/vector store, knowledge graph scheduler, and JARVIS-style UI are in place. Some surfaces are still evolving — especially the full constellation graph view, reminders, and automatic recommendation workflows.
Use it as a work-in-progress foundation for local-first personal AI tooling, not a polished production app yet.
Three layers compose into a complete local AI backend:
1. Local source sync
The main process owns a JSON-backed source registry. Each source maps to a folder — Obsidian vault, Downloads, Documents, agent folder, or any custom path. The app periodically checks enabled sources, extracts text from PDF/DOCX/MD/images, chunks the content, and embeds it into LanceDB using a local embedding model (EmbeddingGemma 512-dim, runs fully offline).
2. Search and memory substrate
Indexed content lands in LanceDB (vectors) and SQLite (metadata + full text). Searches run across all sources or a subset. The renderer calls into the main process via IPC — private files never leave your machine.
3. Knowledge graph synthesis
A scheduler runs clustering and synthesis passes so raw chunks become concept pages, themes, and edges. The graph lives in a local SQLite database. A scheduled LLM pass (local or cloud, your choice) connects related material across sources.
Local folders
→ file indexer (chunk + embed)
→ LanceDB vectors + SQLite metadata
→ scheduled graph pass
→ concept pages, themes, edges
→ UI: insights, alerts, agents, workflows
→ MCP: Claude Code reads/writes directly
┌─────────────────────────────────────────────────────┐
│ Renderer (React UI) │
│ — swap with any interface you want │
└───────────────────────┬─────────────────────────────┘
│ IPC / MCP bridge
┌───────────────────────▼─────────────────────────────┐
│ Main process │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
│ │ File indexer │→ │ Knowledge │ │ MCP │ │
│ │ │ │ graph │ │ bridge │ │
│ │ PDF DOCX MD │ │ │ │ │ │
│ │ images txt │ │ concepts │ │ Claude │ │
│ └──────┬───────┘ │ themes edges │ │ Code ↔ │ │
│ │ └──────┬───────┘ │ your data │ │
│ ▼ ▼ └───────────┘ │
│ ┌──────────────────────────────┐ │
│ │ LanceDB (vectors) │ │
│ │ SQLite (graph + notes) │ │
│ └──────────────────────────────┘ │
│ │
│ ┌──────────────────────────────┐ │
│ │ AI pipeline │ │
│ │ step → recipe → task │ │
│ │ local LLM or cloud │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
| Layer | Location | What it does |
|---|---|---|
| File indexer | src/main/file-index/ |
Watches folders, extracts text, chunks and embeds into LanceDB |
| Knowledge graph | src/main/file-graph/ |
Scheduled LLM pass → concepts, themes, edges in SQLite |
| Local database | src/main/main-db/ |
SQLite supervisor in a worker_thread, generic CRUD |
| AI pipeline | src/utils/ai-pipeline/ |
Step/recipe orchestration engine — pure composable functions |
| MCP bridge | src/main/mcp/ |
Exposes local knowledge as MCP tools for Claude Code |
| Embeddings + LLM | src/main/ai/ |
EmbeddingGemma 512-dim (offline) + local/cloud provider dispatch |
git clone https://github.com/Tej-Sharma/constella
cd constella
npm install
cp .env.example .env.local
Fill in .env.local — only Firebase is required:
# Required: your own Firebase project (free Spark tier works)
FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_PROJECT_ID=
FIREBASE_STORAGE_BUCKET=
FIREBASE_MESSAGING_SENDER_ID=
FIREBASE_APP_ID=
# Optional: leave empty to disable
POSTHOG_TOKEN=
MIXPANEL_TOKEN=
SENTRY_DSN=
SENTRY_AUTH_TOKEN=
CONVERT_API_TOKEN=
Firebase setup (3 steps):
1. Create a project at console.firebase.google.com — free Spark plan is fine
2. Add a Web app → copy the config values into .env.local
3. Enable Authentication → Sign-in method → Email/Password + Google
npm start
The renderer entry is src/components/open-source/OpenSourceApp.tsx. Replace it with anything — the six core layers run in the main process regardless of what the renderer shows.
IPC surface:
// Semantic + keyword search
window.electron.ipcRenderer.invoke('mcp:request', {
op: 'search_local_notes',
params: { query: 'your query', limit: 10 }
})
// List / add indexed sources
window.electron.ipcRenderer.invoke('file-index:sources:list')
window.electron.ipcRenderer.invoke('file-index:sources:add', {
path: '/Users/you/Documents/notes', label: 'My notes'
})
// Trigger sync
window.electron.ipcRenderer.invoke('file-index:sync-all')
// Knowledge graph
window.electron.ipcRenderer.invoke('file-graph:concepts')
window.electron.ipcRenderer.invoke('file-graph:themes')
Ideas:
db:upsert, indexer picks up changes automaticallyfile-graph:concepts, notes become structured recordsmcp:request, full local RAG in a terminalOnce the app is running, Claude Code can call your local knowledge base directly. Add to your MCP config:
{
"constella": {
"command": "node",
"args": ["/path/to/constella/dist/main/main.js", "--mcp-only"]
}
}
Available tools: search_local_notes, list_sources, recent_notes, add_thought.
~/Library/Application Support/constella-core/ (macOS)npm start # dev server + Electron
npm run build # production build
npm run package # package for local testing
npm run release # package + publish (requires .env.local with all secrets)
npm test # jest
npm run lint # eslint
src/main/ Electron main process
src/main/file-index/ File watcher, chunker, extractors, LanceDB upsert
src/main/file-graph/ Knowledge graph engine (concepts, themes, edges)
src/main/main-db/ SQLite worker_thread supervisor
src/main/mcp/ MCP bridge + server + tools
src/main/ai/ Embedding service, LLM runners
src/utils/ai-pipeline/ Step/recipe orchestration engine
src/components/ React UI (replace with your own)
assets/ Icons and entitlements
tasks/ Working notes and roadmap
Issues, ideas, and pull requests are welcome. The project moves quickly — small focused changes are easiest to review.
Before opening a pull request:
npm run lintnpm testConstella reads local files from folders you configure. Be careful when adding large private directories, secrets folders, or workspaces containing credentials.
Agent execution can run external CLI tools. Treat prompts, tool permissions, and bypass modes with the same care you would use for any local automation running against your filesystem.
Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
See LICENSE and the official Creative Commons legal code.
Commercial use is not permitted without separate permission.
$ claude mcp add constella-desktop \
-- python -m otcore.mcp_server <graph>