An automation layer for your Obsidian vault. Capture from anywhere, synthesize every night, wake up to a brief that actually knows what happened yesterday.
You take notes in Obsidian. You have a system. But at 11 PM, nothing connects on its own β yesterday's half-finished action item is buried, your Telegram idea never made it to the right place, and tomorrow's focus is a blank page.
vault-os runs while you sleep. It reads your inbox, checks your git repos, synthesizes your captures, carries over unfinished work, and writes tomorrow's morning brief β all automatically. Every night, at 23:00.
| What you get | |
|---|---|
| π© Telegram capture | Send a message, voice note, or URL from your phone β it lands in the right section of today's daily note, tagged and timestamped |
| ποΈ Local voice transcription | Voice messages transcribed by whisper.cpp on your machine β no audio ever leaves your network |
| π€ 12-phase nightly agent | Runs at 23:00 via Task Scheduler: syncs inbox, calls Claude, writes tomorrow's brief, archives processed files, lints wiki, runs weekly pattern analysis |
| βοΈ Morning digest API | One endpoint returns your daily brief + yesterday's evening synthesis + wiki hot context β ready for a dashboard or phone widget |
| βοΈ ContentPipeline feed | The "Content Angle" from each evening review is auto-copied into your content pipeline inbox |
| π§ Decision intelligence | Pre-decision endpoint draws on your full decision archive and business-edge notes before you commit to anything |
Your phone
β
β Telegram message / voice note
βΌ
server.js βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
(port 3777) β
β tag routing (#idea / #signal / #link / plain / voice) β
βΌ β
50_DAILY/YYYY-MM-DD-morning.md β
βββ ## Captures β
βββ ## Content Ideas β
βββ ## Research Signals β
βββ ## Links to Process β
β
ββββββββββββββββ 23:00 every night ββββββββββββββββββββββββββββ β
β
nightly-agent.ps1 β
βββ FAZ 1 Observe β reads 00_INBOX/, git status β
βββ FAZ 2 Vault Sync β updates project overview pages β
βββ FAZ 3 Think β Claude: risks, connections, priorities β
βββ FAZ 4 Learn β appends to MEMORY/LEARNING β
βββ FAZ 5 Wiki Update β refreshes wiki/hot.md β
βββ FAZ 6 Morning Briefβ writes tomorrow's daily note + carry-over
βββ FAZ 7 Verify β checks all outputs exist β
βββ FAZ 8 Archive β moves INBOX β 70_ARCHIVE/YYYY/MM/ β
βββ FAZ 9 Patterns β Sunday: decision pattern analysis β
βββ FAZ 10 Connect Tour β Sunday: Claude finds new wiki links β
βββ FAZ 11 Evening Reviewβ synthesizes today's captures β
βββ FAZ 12 Wiki Lint β Sunday: broken links, orphan, stale β
β
Dashboard (browser) βββββββββββββββββββββββββββββββββββββββββββββ
http://localhost:3777
βββ Morning digest panel
βββ Project git status
βββ Service health
βββ Vault stats
βββ JARVIS AI chat
- Prerequisites
- Quick Start
- Configuration Reference
- Nightly Agent β 12 Phases
- Telegram Bot
- Dashboard API Endpoints
- Vault Folder Structure
- Using with Claude Code
- Windows-Only Notice
- Contributing
- License
| Requirement | Version | Install |
|---|---|---|
| Node.js | 18+ | nodejs.org |
| PowerShell | 7+ | github.com/PowerShell |
| Obsidian | any | obsidian.md β your vault must exist before first run |
| Claude CLI | latest | npm install -g @anthropic-ai/claude-code |
| ffmpeg | any | ffmpeg.org β must be on PATH; required for voice transcription |
| whisper.cpp binary | any | Releases β optional; enables local voice transcription |
Windows only. The nightly agent uses
wmicand Windows Task Scheduler. The dashboard server is cross-platform, but the full automation stack requires Windows.
1. Clone and install
git clone https://github.com/sabahattink/vault-os.git
cd vault-os
./setup.sh2. Configure
# .env was created by setup.sh
# Minimum required: VAULT_PATH, TELEGRAM_BOT_TOKEN, ANTHROPIC_API_KEY
notepad .env3. Fill in CLAUDE.md
cp CLAUDE.md.template CLAUDE.md
# Edit: YOUR_NAME, VAULT_PATH, your projects and org context4. Start the dashboard
cd dashboard
node server.js
# Open http://localhost:37775. Register the nightly agent (optional β run once as Administrator)
pwsh -File scripts/install-scheduler.ps1
# Agent runs automatically at 23:00 every nightManual trigger at any time:
pwsh -File scripts/nightly-agent.ps1 -VaultPath "C:\your\vault\path"Copy .env.example to .env and set your values. The dashboard loads .env on startup. The nightly agent reads from system environment β set variables in your PowerShell profile or pass via $env:VAR = "value".
| Variable | Required | Default | Description |
|---|---|---|---|
VAULT_PATH |
β | β | Absolute path to your Obsidian vault root |
TELEGRAM_BOT_TOKEN |
β | β | Bot token from @BotFather |
ANTHROPIC_API_KEY |
β | β | API key from console.anthropic.com |
CONTENT_PIPELINE_DIR |
β | β | Path to your ContentPipeline directory |
PORT |
No | 3777 |
Dashboard server port |
WHISPER_CLI |
No | β | Full path to whisper-cli.exe β omit to disable voice |
WHISPER_MODEL |
No | ggml-small.bin |
Model filename (in models/ next to the binary) |
WHISPER_LANG |
No | en |
Transcription language code (tr, de, fr, β¦) |
NOTION_TOKEN |
No | β | Notion integration token for inbox sync |
DATA_SCAN_PATHS |
No | β | Semicolon-separated paths to scan into INBOX |
VPS_IP |
No | β | Server IP shown in the dashboard sidebar |
MONITORED_SERVICES |
No | β | Name|URL pairs, comma-separated, for uptime monitoring |
N8N_URL |
No | http://localhost:5678 |
n8n URL for status check |
DB1_PORT β DB3_PORT |
No | 5432β5434 |
TCP ports checked in the MCP status panel |
Runs every night at 23:00, completes in roughly 2β5 minutes depending on inbox size and Claude response time.
| Phase | Name | What it does |
|---|---|---|
| 1 | Observe | Runs Notion sync + disk sync; reads all files in 00_INBOX/; collects git status for every project |
| 2 | Vault Sync | Creates or updates 20_PROJECTS/<id>/<id> Overview.md and wiki/entities/<id>.md for each project |
| 3 | Think | Sends inbox summary + git statuses to Claude; receives JSON with critical items, connections, risks, opportunities, priorities |
| 4 | Learn | Appends today's learnings to MEMORY/LEARNING/learnings.md |
| 5 | Wiki Update | Prepends fresh project status table + open blockers + pipeline counts to wiki/hot.md; appends to wiki/log.md |
| 6 | Morning Brief | Writes tomorrow's daily note with morning brief; extracts uncompleted - [ ] items from today β ## Carry-over; appends empty capture scaffold |
| 7 | Verify | Checks all expected output files were written; logs WARN for any missing |
| 8 | Archive | Moves all processed 00_INBOX/ files to 70_ARCHIVE/YYYY/MM/ |
| 9 | Pattern Analysis | Sundays: reads decision archive β Claude writes weekly pattern report to 60_ACTIONS/patterns/; updates BUSINESS-EDGE.md |
| 10 | Connect Tour | Sundays: reads wiki skill files + sample pages β Claude discovers cross-domain connections not yet wikilinked |
| 11 | Evening Review | Reads today's four capture sections β Claude produces BEST CAPTURE Β· CONTENT ANGLE Β· CONNECTIONS Β· TOMORROW FOCUS; appends as ## Evening Review; copies CONTENT ANGLE to ContentPipeline inbox |
| 12 | Wiki Lint | Sundays: scans all vault .md files for broken wikilinks, orphan wiki pages, and stale notes (>90 days); writes wiki/lint-log-YYYY-MM-DD.md |
Start the dashboard server with TELEGRAM_BOT_TOKEN set β the bot activates automatically.
| Message format | Target section |
|---|---|
| Plain text | ## Captures |
#idea <text> or #fikir <text> |
## Content Ideas |
#signal <text> or #research <text> |
## Research Signals |
#link <text> or bare URL |
## Links to Process |
| Voice message | Transcribed β routed by detected tags in transcript |
Multi-line messages are supported β each line is routed independently.
The bot replies with a confirmation showing exactly which sections received entries and which daily note file was updated.
Requires WHISPER_CLI set to a whisper.cpp release binary, a downloaded model, and ffmpeg on PATH. The pipeline is:
OGG (Telegram) β ffmpeg β 16kHz mono WAV β whisper-cli β text β route β daily note (π€ prefix)
Recommended model: ggml-small.bin (466 MB) β good accuracy across English and other languages. For English only, ggml-base.en.bin (142 MB) works well.
The dashboard server exposes a REST API and a WebSocket on the same port.
| Method | Endpoint | Description |
|---|---|---|
| GET | /health |
Server liveness check |
| GET | /api/morning-digest |
Today's brief (6 sections) + yesterday's evening review + wiki hot snippet |
| GET | /api/morning |
Today's daily note as HTML |
| GET | /api/stats |
Note counts per vault folder |
| GET | /api/actions |
Pending and completed action items |
| POST | /api/action-toggle |
Toggle a checkbox in 60_ACTIONS/actions.md |
| POST | /api/quick-capture |
Write a note directly to 00_INBOX/ |
| GET | /api/pipeline |
ContentPipeline stage counts |
| GET | /api/pipeline-files/:stage |
File list for a pipeline stage |
| GET | /api/social |
Content items grouped by platform and stage |
| GET | /api/projects |
Project list with file counts |
| GET | /api/ops/projects |
Projects with live git status |
| GET | /api/ops/github |
Recent repos via gh CLI |
| GET | /api/ops/n8n |
n8n reachability check |
| GET | /api/vps |
Uptime check for MONITORED_SERVICES |
| GET | /api/sysload |
CPU and memory usage (Windows only β uses wmic) |
| GET | /api/intel/alerts |
Consolidated health alerts |
| GET | /api/intel/ai-brief |
Claude-generated daily priority brief (1-hour cache) |
| GET | /api/brain-data |
Hot nodes from wiki/hot.md + MEMORY file list |
| GET | /api/search?q= |
Filename search across inbox, notes, actions, wiki, pipeline |
| GET | /api/opportunities |
Items from 60_ACTIONS/product-opportunities.md |
| GET | /api/decisions/count |
Decision archive stats |
| POST | /api/decisions/save |
Save a new decision record |
| POST | /api/pre-decision |
Claude-generated pre-decision brief from decision history |
| POST | /api/ask |
JARVIS AI chat with full vault context |
| GET | /api/system |
Last nightly agent log entry |
WebSocket on the same port: pushes vault_change events (file watch via chokidar) and ping every 30 seconds.
vault-os expects (and gradually builds) this folder layout inside your Obsidian vault:
VAULT_PATH/
βββ 00_INBOX/ β nightly agent entry point; all incoming files land here
βββ 10_NOTES/ β atomic notes
βββ 20_PROJECTS/ β project hub pages (auto-created by FAZ 2)
βββ 50_DAILY/ β YYYY-MM-DD-morning.md (brief + capture sections)
βββ 60_ACTIONS/
β βββ actions.md β master action list
β βββ decisions/ β decision records (YYYY-MM-DD-topic.md)
β βββ patterns/ β weekly pattern reports
β βββ BUSINESS-EDGE.md β known strengths and weaknesses
βββ 70_ARCHIVE/ β processed inbox files (YYYY/MM/)
βββ wiki/
β βββ hot.md β always-fresh context (updated every night)
β βββ index.md β vault map
β βββ log.md β nightly agent history
β βββ entities/ β per-project/person entity pages
β βββ skills/ β ingest Β· connect Β· synthesize rule files
βββ MEMORY/
βββ WORK/
βββ KNOWLEDGE/
βββ LEARNING/
The nightly agent creates missing directories on first run. You do not need to set all of this up manually β start with an empty vault and let the agent build the structure.
vault-os ships a CLAUDE.md.template that gives Claude Code full context about your vault structure, commands, and automation behavior. Copy it and fill in your details before opening the project in Claude Code.
cp CLAUDE.md.template CLAUDE.md
# Edit: YOUR_NAME, VAULT_PATH, your organization and active project context
claude # Claude Code reads CLAUDE.md automatically on startupThe following components require Windows:
/api/sysloadβ useswmic cpu get loadpercentageandwmic OS get FreePhysicalMemoryinstall-scheduler.ps1β registers a Windows Task Scheduler jobnightly-agent.ps1β written for PowerShell 7 on Windows
The dashboard server (server.js) and the Telegram bot are cross-platform. Only the wmic endpoint and Task Scheduler integration are Windows-specific. Linux/macOS users can run the dashboard and trigger the nightly agent manually.
See CONTRIBUTING.md for development setup, code style, and the PR process.
MIT β see LICENSE
