Project memory for Claude Code, wired in at the hook layer.
Five Claude Code hooks ship every prompt, every mutating tool call, and every dialog turn into telemetry_raw. An extraction worker distils them into typed memory_blocks — rules, patterns, decisions — keyed to your project and embedded with pgvector. Your next prompt does a similarity search and pulls the relevant ones back into context. The agent stops re-asking; you stop re-typing.
Free while we're in early access. Pricing tiers are placeholders until billing ships — your account keeps working through the transition.
# one command — wires 5 hooks into ~/.claude/settings.json $ contextify install Installed Contextify hooks (appended=[ "SessionStart", # project upsert, identity from cwd "UserPromptSubmit", # every prompt, before Claude sees it "PostToolUse", # Bash | Edit | Write | WebFetch | Task "Stop", # dialog turn envelope "SessionEnd" # flush spool, clear local state ]) hooks dir: ~/.contextify/hooks settings: ~/.claude/settings.json project_id derives from cwd at fire-time: CONTEXTIFY_PROJECT_ID → .contextify.json → git remote → realpath
The pipeline
Capture — 5 hooks, scoped matchers
contextify install merges hooks into ~/.claude/settings.json once per machine. PostToolUse uses a matcher (Bash|Edit|MultiEdit|Write|WebFetch|Task) so read-only inspections (Read, Grep, Glob, LS) never leave your box. Payloads land in telemetry_raw with a tenant_id + project_id.
Extract — LLM + pgvector
A worker drains telemetry_raw, runs your configured extractor (DeepSeek, Qwen, or Gemini) against dialog turns, and writes typed memory_blocks (kind: rule | pattern | decision | …). Each block is embedded with pgvector. Tool-use and prompt-only rows stay in telemetry for visibility but skip the extractor.
Retrieve — similarity search in your draft
POST /api/prompt/generate with a draft. searchSimilar() top-K's memory_blocks against your project_id, splices them into an XML envelope with GStack directives, and returns the prompt ready to paste. Same agent, less re-explaining.
What leaves your machine — and what doesn't
We capture
- • UserPromptSubmit text (verbatim, before Claude sees it)
- • PostToolUse summaries: Bash commands, Edit/Write file paths, WebFetch URLs
- • Stop dialog turns: user prompt + assistant text + actions in between
- • SessionStart / SessionEnd lifecycle + project identity from cwd
We don't
- • File contents — only the paths from Edit/Write/MultiEdit tool inputs
- • Bash stdout / stderr — the command string only
- • Read-only tool calls — filtered at the matcher; never fire the hook
- • Environment variables, .env files, or anything outside the hook scope
Delete from the dashboard and it's gone from your account immediately — listings, exports, prompt generation, similarity search, all stop seeing it. Account-wide erasure is available on request; full breakdown on the privacy page.
Under the hood
- Postgres + pgvector — single database, row-level tenant isolation, 1536-dim embeddings.
- Drizzle migrations — schema is forward-only;
memory_blocks,telemetry_raw,prompts_generatedare the three tenant-data tables. - Hashed API keys — keys are HMAC'd with a server secret before storage; even with full DB access the bearer tokens are unrecoverable.
- Tenant-scoped queries — every read goes through a project-scoped query layer with row-level isolation, so one tenant's rows are unreachable from another's code path.
- BYO LLM keys — DeepSeek, Qwen, or Gemini, with a key-pool that rotates on failure (no-balance 60m, unauthorized 24h, rate-limit 30s exp, transient 10s exp).
- Open CLI —
@furkankoykiran/contextify-clion npm, source readable, hooks are bash scripts you can audit.
Set it up once. Ship the next thing.
Free while we're in early access. No credit card. Revoke any API key from the dashboard at any time — your data stays under your control.