Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@ Open-source Pocket AI companion — pulls recordings via API, analyzes with Clau
- **Dashboard**: React + TypeScript + Vite + Tailwind v4 + shadcn/ui (base-ui)
- **Mind maps**: @xyflow/react (React Flow)
- **Pull script**: Python 3 (stdlib only, no deps)
- **Orchestration**: Bash
- **Orchestration**: Bash (xargs -P for parallelism)
- **Analysis**: Headless Claude Code
- **API server**: Express (TypeScript)
- **Landing page**: Vite + React + Magic UI + shadcn/ui (separate app in `landing/`)

## Project structure

- `scripts/pocket_pull.py` — pulls recordings from Pocket API, writes to `.seam/recordings/`
- `scripts/pocket-run.sh` — orchestration: pull → analyze (5 parallel) → stage people → rebuild manifest
- `scripts/build-manifest.py` — aggregates all recordings + analyses into `public/manifest.json`
- `scripts/stage-people.py` — scans analyses for speaker names, stages for user review
- `scripts/seed-people.py` — seeds people.json from existing analyses (contributed via PR)
- `prompts/analyze.md` — prompt template for Claude analysis (includes speaker inference)
- `server/index.ts` — Express API (sync, people, pending people, actions, speakers, delete)
- `src/` — React dashboard
- `landing/` — landing page (separate Vite app, builds to `docs/landing/`, deployed via GitHub Pages)
- `.seam/` — local data directory (gitignored)

## Commands
Expand All @@ -29,12 +32,16 @@ Open-source Pocket AI companion — pulls recordings via API, analyzes with Clau
- `npm test` — run all tests (vitest + pytest)
- `npm run test:ts` — TypeScript tests only
- `npm run test:py` — Python tests only
- `npm run lint` — ESLint
- `npm run format` — Prettier (write)
- `npm run format:check` — Prettier (check only)
- `./scripts/pocket-run.sh` — full sync (pull + analyze + rebuild)

## Config

- `.env` — `POCKET_API_KEY=pk_xxx`
- `.pocket-last-sync` — timestamp of last successful sync (auto-managed)
- `.seam/generic-speakers.txt` — user-defined speaker exclusion list (one per line)

## Practices

Expand Down Expand Up @@ -84,10 +91,11 @@ Tests must pass before committing. No feature code without tests.

### Git

- No direct pushes to main — PRs only
- No direct pushes to main — PRs only, squash merge
- **NEVER use `--no-verify`** — pre-commit hooks exist to catch issues before CI
- Pre-commit hook (husky) runs: `format:check` → `lint` → `test`
- **Before every commit**, verify locally: `npm run format:check && npm run lint && npm test`
- If any of these fail, fix them before committing — do not bypass
- Branches: `feature/`, `fix/`, `chore/`
- Commit messages: imperative, describe the "what" and "why"
- `landing/` and `docs/landing/` are excluded from root prettier and eslint (separate project)
18 changes: 13 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
Pull your recordings via the API, analyze them with Claude, and browse everything in a local dashboard — no Pro subscription needed.
</p>

<p align="center">
<a href="https://yoaquim.github.io/seam/">Website</a> · <a href="https://github.com/yoaquim/seam">GitHub</a>
</p>

## Screenshots

| Home | Summary | Actions |
Expand Down Expand Up @@ -115,26 +119,30 @@ After each sync, `stage-people.py` scans analysis results for new speaker names
```
seam/
├── scripts/
│ ├── pocket_pull.py # Pulls recordings from Pocket API
│ ├── pocket-run.sh # Orchestration: pull → analyze (5 parallel) → rebuild
│ └── build-manifest.py # Aggregates data for the dashboard
│ ├── pocket_pull.py # Pulls recordings from Pocket API (with retry + pending-fetch)
│ ├── pocket-run.sh # Orchestration: pull → analyze (5 parallel) → stage people → rebuild
│ ├── build-manifest.py # Aggregates data for the dashboard
│ ├── stage-people.py # Stages inferred speakers for review
│ └── seed-people.py # Seeds people from existing analyses
├── prompts/
│ └── analyze.md # Claude analysis prompt template
├── server/
│ └── index.ts # Express API (sync, people, actions, speakers, delete)
│ └── index.ts # Express API (sync, people, pending people, actions, speakers, delete)
├── src/ # React dashboard
├── landing/ # Landing page (separate Vite app, deployed to GitHub Pages)
├── .seam/ # Local data (gitignored, created on first sync)
│ ├── recordings/ # Structured recording data
│ ├── analysis/ # Claude analysis output
│ ├── people.json # Known people registry
│ ├── people-pending.json # Staged speakers awaiting review
│ └── sync-history.json # Sync run history
└── .env.example
```

## Tests

```bash
npm test # Runs vitest (TS) + pytest (Python) — 52 tests
npm test # Runs vitest (TS) + pytest (Python)
npm run test:ts # TypeScript only
npm run test:py # Python only
```
Expand Down
Loading