repo for storing the second brain project
Go to file
Travis Herbranson fbbb1a13a0 Merge branch 'claude/laughing-shirley-52f4a6': Postgres + dashboard + tower split + web deploy
Squashed summary of the 13 commits on the branch:
- Postgres + pgvector migration (SQLite → second_brain schema; alembic
  stood up; shared public.embeddings; file-based wiki untouched).
- Embeddings module mirroring vault-mcp's recipe — extraction summaries
  chunked → nomic-embed-text → delete-before-insert upsert, with
  graceful degradation. Live retrieval verified.
- pipeline_settings table + Settings ORM + settings_store helper.
- Web dashboard + HTMX settings editor (no SSO/CSRF — gated LAN-only at
  the Traefik layer for now). Pipeline observability: status counts,
  recent activity, settings snapshot card.
- Scheduler honors pipeline_settings (extraction_enabled, active hours
  with DB overriding settings.toml window, max_items_per_run).
- Pipeline split for the two-machine setup: claim queue
  (FOR UPDATE SKIP LOCKED on claimed_by/claimed_at columns), tower-side
  faster-whisper transcribe worker daemon (large-v3/cuda by default,
  cpu/int8 fallback), dev-side `process` restricted to articles.
- deploy/tower: systemd unit, env example, EndeavourOS install README.
- deploy/web: Dockerfile (slim, uv, drops to uid 1000), compose.yml
  (joins the homelab docker net, publishes 10.0.21.207:8080 for the
  off-box Traefik VM), env example, runbook with Knot + Traefik
  snippets Travis applies manually. Web container brought up and
  live-verified.
2026-05-25 12:02:05 -04:00
alembic pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
config postgres migration: schema, models, embeddings, alembic 2026-05-24 22:46:48 -04:00
deploy deploy/web: containerized FastAPI UI on the homelab docker network 2026-05-25 11:48:37 -04:00
prompts project init 2026-05-22 19:08:22 -04:00
reviews docs: update CLAUDE.md + migration plan to reflect shipped Postgres design 2026-05-24 22:57:31 -04:00
src/second_brain pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
tests gauntlet: fix lint — drop unused subprocess/shutil/tempfile/Path imports 2026-05-25 10:34:54 -04:00
.gitignore add .gitignore 2026-05-24 21:10:53 -04:00
alembic.ini postgres migration: schema, models, embeddings, alembic 2026-05-24 22:46:48 -04:00
CLAUDE.md docs: update CLAUDE.md + migration plan to reflect shipped Postgres design 2026-05-24 22:57:31 -04:00
postgres-migration-planning.md docs: update CLAUDE.md + migration plan to reflect shipped Postgres design 2026-05-24 22:57:31 -04:00
pyproject.toml pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
README.md updates to project files 2026-05-24 22:23:59 -04:00
uv.lock pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00

second-brain

A personal knowledge system built on a video/article extraction pipeline and an LLM-maintained wiki (inspired by the Karpathy LLM Wiki pattern).

What it does

  1. Pull — download YouTube videos or fetch web articles
  2. Transcribe — extract transcripts via Whisper (videos) or trafilatura (articles)
  3. Extract — single-shot Claude call produces structured notes per source
  4. Review — web UI to accept or reject extractions
  5. Compile — wiki compiler folds accepted extractions into a living Obsidian vault

Quick start

# Install dependencies
uv sync

# Copy and edit config
cp config/settings.toml config/settings.local.toml

# Queue a source
uv run second-brain add https://www.youtube.com/watch?v=...

# Run the pipeline
uv run second-brain process

# Review in the web UI
uv run second-brain serve

# Compile to wiki
uv run second-brain compile

Domains

Extractions are tagged by domain so the right prompt template is used:

Domain Focus
development Software, programming, systems
content Content creation, video production
business Entrepreneurship, marketing, ops
homelab Self-hosted infra, networking, DevOps

Extractor backends

Two backends, selectable via [extractor].backend in config/settings.toml:

  • cli (default) — shells out to claude -p --output-format json --json-schema .... Runs under your Max OAuth subscription, no per-token billing. The wrapper spawns the CLI in a throwaway tempfile.TemporaryDirectory and strips ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN from the env so host CLAUDE.md, hooks, and settings don't leak in, and the subscription is used instead of the API key.
  • api — uses the anthropic Python SDK, requires ANTHROPIC_API_KEY. Install with uv sync --extra api (the SDK is an optional dependency).

Requirements

  • Python 3.12+
  • Either the claude CLI on PATH (default backend) or ANTHROPIC_API_KEY (api backend)
  • ffmpeg (for Whisper audio extraction)

In-flight work

  • Postgres + pgvector migration — SQLite is the current backing store but the project is moving to Travis's Postgres instance. Planning questions live in postgres-migration-planning.md; nothing has been migrated yet.