{"id":48692859,"url":"https://github.com/vanities/docvault","last_synced_at":"2026-06-14T22:01:23.150Z","repository":{"id":350246413,"uuid":"1151525556","full_name":"vanities/docvault","owner":"vanities","description":"Self-hosted personal finance and document workspace — multi-entity tax records, net worth across brokers/crypto/metals/real estate, Claude-parsed PDFs, Apple Health + DNA ingest, macro + crypto quant dashboards, and AI-generated strategy notes. One container, one volume, zero telemetry.","archived":false,"fork":false,"pushed_at":"2026-05-29T19:12:49.000Z","size":73253,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T19:18:29.186Z","etag":null,"topics":["anthropic","apple-health","bun","claude-api","crypto-portfolio","docker","document-management","genomics","ghcr","net-worth-tracker","personal-finance","portfolio-tracker","privacy-first","quant","react","self-hosted","tax-records","typescript","vite"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vanities.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-06T15:20:49.000Z","updated_at":"2026-05-29T19:12:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vanities/docvault","commit_stats":null,"previous_names":["vanities/docvault"],"tags_count":153,"template":false,"template_full_name":null,"purl":"pkg:github/vanities/docvault","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vanities%2Fdocvault","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vanities%2Fdocvault/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vanities%2Fdocvault/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vanities%2Fdocvault/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vanities","download_url":"https://codeload.github.com/vanities/docvault/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vanities%2Fdocvault/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33755369,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"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":["anthropic","apple-health","bun","claude-api","crypto-portfolio","docker","document-management","genomics","ghcr","net-worth-tracker","personal-finance","portfolio-tracker","privacy-first","quant","react","self-hosted","tax-records","typescript","vite"],"created_at":"2026-04-11T06:05:06.003Z","updated_at":"2026-06-14T22:01:23.131Z","avatar_url":"https://github.com/vanities.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DocVault\n\n![DocVault — self-hosted personal finance, health, and tax workspace](./docs/docvault-hero.png)\n\nSelf-hosted personal finance and document workspace. One container holds your tax records, tracks net worth across brokers / crypto / metals / real estate, parses financial PDFs with Claude, ingests Apple Health data from an iOS Shortcut, and surfaces macro + crypto quant signals alongside AI-generated strategy notes — all without sending data off your machine.\n\n![DocVault tax year overview](./docs/screenshots/tax-year.png)\n\n_Screenshots in this README are captured against the included `demo-data/` fixtures — the numbers, entities, and Strategy entry are fabricated._\n\n## Try It Locally (Demo Mode)\n\nWant to poke around before connecting real data? The repo ships with a `demo-data/` directory and a second Vite config that points the dev server at it.\n\n```bash\nbun install\n# Terminal 1 — demo backend on port 3006, reading demo-data/\nDOCVAULT_DATA_DIR=./demo-data \\\n  DOCVAULT_PORT=3006 \\\n  DOCVAULT_PASSWORD=demo \\\n  DOCVAULT_MASTER_KEY=$(openssl rand -base64 32) \\\n  bun run server/index.ts\n# Terminal 2 — demo frontend on port 5174, proxying /api to :3006\nvp dev --config vite.demo.config.ts\n```\n\nOpen \u003chttp://localhost:5174\u003e and sign in with `admin` / `demo` — full app, fake data. Your `./data/` stays untouched.\n\n## Features\n\n### Documents \u0026 Taxes\n\n- **Multi-entity organization** — separate spaces for personal, LLCs, property, military, etc.\n- **AI document parsing** — Claude Vision extracts structured data from W-2s, 1099s, K-1s, receipts, bank statements (~$0.003/page).\n- **Auto file naming** — uploads are renamed to `{Source}_{Type}_{Date}.ext`.\n- **Type-specific parsers** — 15 document-type parsers (W-2, 1099-NEC, K-1, statement, receipt, 1098, Koinly, Schedule C, etc.) normalize results into a single analytics module.\n- **Federal tax summary** — Schedule C, K-1, capital gains, withholdings aggregated across all entities per year.\n- **Solo 401(k) calculator** (IRS Pub 560 worksheet), estimated quarterly tracker, TN state view, mileage log, sales ledger, invoice tracking.\n- **CPA package export** — one click to bundle an entity/year into a ZIP for your accountant.\n\n![Federal tax consolidation](./docs/screenshots/federal-tax.png)\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/solo-401k.png\" alt=\"Solo 401(k) contribution calculator\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/estimated-tax.png\" alt=\"Estimated quarterly tax tracker\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Net Worth \u0026 Portfolio\n\n- **Unified portfolio view** across every account — brokerage, crypto, banks, metals, real estate.\n- **Automatic daily snapshots** with a historical net worth chart.\n- **Broker aggregation via SnapTrade** (Fidelity, Vanguard, Robinhood, etc.) with per-account history.\n- **Crypto exchange balances** (Kraken, Coinbase, Gemini) + **Etherscan wallet scanning** across mainnet, Arbitrum, Optimism, Polygon, and Avalanche.\n- **Precious metals** with live spot prices.\n- **Real estate** with cost basis, equity, and property-level notes.\n- **Bank balances + transactions** via SimpleFIN Bridge (16,000+ US institutions).\n\n![Portfolio overview](./docs/screenshots/portfolio.png)\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/crypto.png\" alt=\"Crypto holdings\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/brokers.png\" alt=\"Brokerage aggregation\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/banks.png\" alt=\"Bank balances and history\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/gold.png\" alt=\"Precious metals tracker\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd colspan=\"2\"\u003e\u003cimg src=\"./docs/screenshots/property.png\" alt=\"Real estate with equity and mortgage amortization\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Quant Dashboards \u0026 Strategy\n\n- **Quant section** with 28 endpoints powering dashboards for crypto (BTC risk, hash ribbons, drawdown), macro (Sahm rule, yield curve, NFCI, fed stance, recession probability), housing, GDP \u0026 growth, commodities, VIX term structure, global markets, and an auto-generated macro event calendar.\n- **Strategy history** — AI-generated investment strategy notes authored by Claude Code via a `/strategy` skill that reads your portfolio + current quant signals and saves a regime-aware recommendation. Entries render as expandable cards with a signal grid and full markdown analysis (tables, allocations, action plans). Dollar amounts and percentages in the markdown are obscured when \"Blur financial numbers\" is on.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/quant-crypto.png\" alt=\"Crypto quant dashboard — BTC risk metric\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/quant-macro.png\" alt=\"Macro quant dashboard — Fed policy and business cycle\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd colspan=\"2\"\u003e\u003cimg src=\"./docs/screenshots/strategy.png\" alt=\"AI-generated strategy card\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Politics \u0026 Congressional Trading\n\nIn-house ingest of congressional and executive-branch disclosures — no external service, and **no API key for the trading data** (it's all public government filings).\n\n- **Politician stock trades** — House \u0026 Senate Periodic Transaction Reports plus Trump's OGE-278-T disclosures, parsed into one normalized feed. Scanned / hand-filed PTRs that `pdftotext` can't read are recovered by **checkbox-form OCR** (gridline detection + per-cell pixel reading; poppler + tesseract are baked into the Docker image).\n- **Options contract detail** — strike, expiry, call/put, and contract count are pulled from the filing's free-text `DESCRIPTION` field (e.g. Pelosi's _\"Purchased 20 call options, strike $150, exp 1/15/27\"_), not just the underlying ticker.\n- **Consensus clustering** — surfaces when several members buy (or sell) the same ticker in the same direction within a window.\n- **Copy-trade backtest** — a performance leaderboard: _\"if you'd mirrored each politician's stock buys at the disclosed size, where would you be now?\"_ Stock buys get real P\u0026L (exact share counts when the filer states them, else estimated from the amount range and flagged); options report the underlying's move (the contract isn't priced). Recomputed daily; prices via yahoo-finance2 (keyless).\n- **Filings archive** — every fetched PDF + extracted text + metadata is saved under the data dir, searchable and re-parseable without re-fetching.\n- **Full-screen browse** — click a dashboard metric to search/filter/see-all of trades, bills, executive actions, or archived filings.\n- **Bills \u0026 executive actions** — recent Congress.gov bills (the one piece needing a free [Congress.gov API key](https://api.congress.gov/sign-up/), set in Settings) + presidential executive actions (keyless, via the Federal Register).\n- **Self-hosted member headshots** — portraits downloaded once and served from DocVault, not hot-linked.\n\n**Populate it:** the feed refreshes daily on a forward-only schedule (new filings only). To pull the current year's history in one pass, `POST /api/politics/backfill` — it runs server-side (poll `/api/politics/feed` for progress). Everything except the Bills stream works with zero credentials.\n\n\u003e ⚠️ Disclosures carry a ~45-day legal reporting lag and report dollar **ranges**, not exact sizes — the backtest is honest about both (estimates flagged, options labeled as the underlying's move).\n\n### AI Chat\n\nHeavily inspired by [t3.chat](https://t3.chat) — a multi-thread Claude chat that can read across your entire vault. The sidebar lists every thread; the active conversation streams in the main panel with markdown rendering, image/PDF attachments, and tool calls shown as collapsible cards.\n\n- **Claude OAuth subscription token** — paste the token from `claude setup-token` and chats are billed to your Claude.ai subscription instead of the API. Falls back to an API key if you'd rather pay per-token.\n- **Voice input via Parakeet (or any OpenAI-compatible transcription service)** — point Settings → Chat \u0026 Voice at a `/audio/transcriptions` endpoint such as [parakeet-mlx](https://github.com/senstella/parakeet-mlx), faster-whisper-server, or lightning-whisper-mlx running on your LAN. Push-to-talk in the composer; audio never leaves your network.\n- **Multi-thread sidebar** — threads persist locally; switch, rename-by-derivation, delete, or start fresh without losing context.\n- **Tool-using agent** — Claude can list entities, read files, search documents, compute tax summaries, and tag/note files. Each tool call renders as an expandable card in the response.\n\n![AI Chat — multi-thread conversation with tool calls and markdown rendering](./docs/screenshots/chat.png)\n\n### Health (Apple Health)\n\n- **iOS Shortcut daily sync** — a one-tap shortcut pushes HealthKit data to DocVault's `/api/health/ingest` endpoint.\n- **Multi-person support** — each member of the household gets their own snapshot.\n- **Overview + per-segment dashboards** — activity, heart, sleep, workouts, body composition.\n- **Automatic illness detection** — rolling baseline over wrist temperature, heart rate, and HRV flags probable illness windows.\n- Running ROI (vs BTC/SPX), workout segment insights, sleep quality scoring, recovery scoring.\n\n![Health overview](./docs/screenshots/health.png)\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/health-activity.png\" alt=\"Activity — steps, energy, exercise, recovery score\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/health-heart.png\" alt=\"Heart — resting HR, HRV, recovery\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/health-sleep.png\" alt=\"Sleep — stages, quality score, duration\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"./docs/screenshots/health-workouts.png\" alt=\"Workouts — counts, distance, streak\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd colspan=\"2\"\u003e\u003cimg src=\"./docs/screenshots/health-body.png\" alt=\"Body composition — weight trend, BMI\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Backup, Sync, Observability\n\n- **Encrypted backup/restore** — AES-256-GCM zip of all config + parsed data, downloadable on demand.\n- **Scheduled auto-backup** runs before each Dropbox sync.\n- **Dropbox sync** — rclone-based one-way push of every entity folder on a configurable schedule (default 15 min).\n- **Custom sync paths** — drop `.docvault-dropbox-map.json` to map entities to specific Dropbox folders.\n- **Portfolio snapshot scheduler** + **Dropbox sync scheduler** configurable from Settings.\n- **System Status panel** (Settings → System Status) — scheduler timers, next-run times, last error, and a live log viewer.\n\n### Privacy\n\n- **Blur financial numbers toggle** (Settings → Preferences) — obscures every dollar amount and percentage across the UI, including AI-generated markdown in the Strategy section.\n- **Your data never leaves your machine** — no telemetry, no analytics, no remote database. One volume mount, one container.\n\n### Other\n\n- Mileage log with address autocomplete.\n- Filing deadline reminders with recurring support.\n- Username/password auth with session cookies.\n- Docker-ready: single container, auto-published to GHCR (amd64 + arm64).\n\n## Quick Start\n\n```bash\nbun install\nbun start\n```\n\nFrontend: `http://localhost:5173` — Backend: `http://localhost:3005`\n\n### Storage Setup\n\n```bash\nmkdir -p data/personal data/my-llc data/property\n# or symlink existing folders\nln -s ~/Documents/taxes data/personal\n```\n\n## Docker\n\n```bash\ndocker run -p 3005:3005 \\\n  -v /path/to/documents:/data \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -e DOCVAULT_PASSWORD=yourpassword \\\n  ghcr.io/vanities/docvault:latest\n```\n\n### Docker Compose\n\n```yaml\nservices:\n  docvault:\n    image: ghcr.io/vanities/docvault:latest\n    ports:\n      - '3005:3005'\n    volumes:\n      - /path/to/documents:/data\n    environment:\n      - ANTHROPIC_API_KEY= # Required for AI parsing\n      - DOCVAULT_USERNAME=admin # Default: admin\n      - DOCVAULT_PASSWORD= # Required\n    restart: unless-stopped\n```\n\n## Environment Variables\n\n| Variable                         | Required       | Description                                                               |\n| -------------------------------- | -------------- | ------------------------------------------------------------------------- |\n| `ANTHROPIC_API_KEY`              | For AI parsing | Claude Vision API key                                                     |\n| `DOCVAULT_USERNAME`              | No             | Login username (default: `admin`)                                         |\n| `DOCVAULT_PASSWORD`              | Yes            | Login password; server startup fails closed without this unless opted out |\n| `DOCVAULT_ALLOW_UNAUTHENTICATED` | No             | Explicit local/demo-only opt-out (`true`, `1`, or `yes`)                  |\n| `DOCVAULT_DATA_DIR`              | No             | Data directory path (default: `./data`)                                   |\n| `DOCVAULT_PORT`                  | No             | Backend port (default: `3005`)                                            |\n\nAll integrations (SimpleFIN, SnapTrade, Etherscan, Kraken, Coinbase, Gemini, Dropbox) are configured through Settings and stored in `data/.docvault-settings.json`.\n\n## Data Files\n\nEverything lives in `DOCVAULT_DATA_DIR` as `.docvault-*.json` — mount one volume and the install is portable:\n\n| File                                   | Purpose                           |\n| -------------------------------------- | --------------------------------- |\n| `.docvault-config.json`                | Entity definitions                |\n| `.docvault-settings.json`              | API keys and integration config   |\n| `.docvault-parsed.json`                | Cached AI parse results           |\n| `.docvault-metadata.json`              | Document tags and notes           |\n| `.docvault-reminders.json`             | Filing deadline reminders         |\n| `.docvault-portfolio-snapshots-*.json` | Yearly portfolio snapshot history |\n| `.docvault-broker-cache.json`          | Cached brokerage aggregation      |\n| `.docvault-crypto-cache.json`          | Cached crypto balances            |\n| `.docvault-simplefin-cache.json`       | Cached bank balances              |\n| `.docvault-gold.json`                  | Precious metals holdings          |\n| `.docvault-property.json`              | Real estate portfolio             |\n| `.docvault-strategy-history.json`      | Saved Strategy entries            |\n| `.docvault-health.json`                | Apple Health ingested data        |\n| `.docvault-sync-status.json`           | Dropbox sync status               |\n\n## Tech Stack\n\n| Layer    | Technology                                   |\n| -------- | -------------------------------------------- |\n| Frontend | React 19 + TypeScript + Tailwind CSS (Vite+) |\n| Backend  | Bun native server (`Bun.serve()`)            |\n| Storage  | Local filesystem                             |\n| AI       | Anthropic Claude Vision API                  |\n| Health   | iOS Shortcuts + HealthKit ingest             |\n| CI/CD    | GitHub Actions → GHCR                        |\n\n## License\n\n[GNU General Public License v3.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvanities%2Fdocvault","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvanities%2Fdocvault","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvanities%2Fdocvault/lists"}