Thanks for your interest in contributing. This guide covers everything you need to get up and running.
- Search existing issues and discussions before opening a new one.
- Issues = confirmed bugs and actionable feature work.
- Discussions = setup help, ideas, questions, feedback.
- For larger changes, open an issue first so we can align on direction before you invest time.
- For security vulnerabilities, follow SECURITY.md — do not file a public issue.
- Rust 1.85+ (
rustup update stable) cargo(comes with Rust)- Optional:
cargo-watchfor incremental dev
git clone https://github.com/vit0-9/transcriptd.git
cd transcriptd
# Build all crates
cargo build --all
# Run tests (all platforms)
cargo test --all
# Format check
cargo fmt --all -- --check
# Lint (zero warnings policy)
cargo clippy --all --all-targets -- -D warnings# Ingest from your local IDEs (uses actual data)
cargo run -- db ingest
# Search
cargo run -- search "something"
# Start the watcher daemon
cargo run -- service up
# TUI dashboard
cargo run -- dash
# MCP stdio server
cargo run -- mcp stdioRun these — CI will enforce them:
cargo fmt --all
cargo clippy --all --all-targets -- -D warnings
cargo test --allAll three must pass clean. CI runs RUSTFLAGS="-Dwarnings" so even deprecation warnings are failures.
Keep PRs focused on one problem. Don't mix unrelated cleanup or refactors. A good PR includes:
- What changed and why — brief summary in the description
- Which IDE source paths were tested if you touched an extractor (Zed, Claude, VSCode)
- Exact commands you ran to verify the fix
- Screenshot or terminal output if you changed CLI output or the TUI dashboard
- Docs update if you changed a CLI command, config option, or user-facing behavior
- Prefer small, reviewable PRs over large sweeping ones.
- If a fix requires refactoring, do the refactor in a separate PR first.
- If you're unsure about scope, open a draft PR and ask.
transcriptd/
├── src/ # Main binary (CLI + daemon + dashboard + MCP)
├── crates/
│ ├── transcriptd-core/ # Shared types + TranscriptExtractor trait
│ ├── transcriptd-store/ # SQLite + FTS5 storage
│ ├── transcriptd-zed/ # Zed AI thread extractor
│ ├── transcriptd-claude/ # Claude Code JSONL extractor
│ ├── transcriptd-vscode/ # VSCode Copilot extractor
│ ├── transcriptd-codex/ # OpenAI Codex extractor
│ └── transcriptd-cursor/ # Cursor AI extractor
└── docs/ # Architecture, ADRs, roadmap
See docs/ARCHITECTURE.md for a full data-flow diagram and design rationale.
- Create a new crate under
crates/transcriptd-<name>/ - Implement the
TranscriptExtractortrait fromtranscriptd-core - Register in
all_extractors()insrc/main.rs - Add test fixtures under
crates/transcriptd-<name>/tests/
- Follow the patterns in the file you're editing.
- No reformatting of unrelated code.
- Keep comments concise and useful — prefer self-documenting code over inline prose.
unwrap()is acceptable in tests; prefer?withanyhow::Resultin production paths.
Use conventional commits format: type(scope): description
feat(extractor): add Cursor AI transcript support
fix(store): correct canonical ID generation for claude-code source
docs(readme): add Homebrew install instructions
Types: feat, fix, docs, refactor, test, ci, chore.
Open a Discussion — don't open an issue for questions.