Permanent memory layer for AI coding agents
Project description
corvid
A permanent memory layer for AI coding agents.
Save what matters with /remember. Retrieve it from any project with search. Stop re-solving the same problem twice.
Works with Claude Code, Codex, Gemini CLI, or any agent that can run a shell command. One Python file, zero required dependencies.
Why
The expensive part of working with AI is not writing things down. It is re-learning the same thing three months later in a different project.
Built-in AI memory is per-project, short, and has no search. You solve a hard problem on Monday, start a new project on Friday, and your agent has no idea it ever happened.
corvid fixes that. Every project feeds one shared knowledge base. Search finds things by meaning, not just keywords. A 33MB local model runs the semantic search on your CPU in milliseconds. No server, no API calls, no GPU.
Who this is for
The full-stack vibe-coder
You just spent an hour figuring out why Google OAuth works locally but fails after deploy. The callback URL is case-sensitive, localhost vs 127.0.0.1 matters, and the consent screen needs the exact redirect URI or it silently 400s.
You: /remember the Google OAuth deploy gotchas
corvid writes:
~/corvid/wiki/auth/google-oauth-deploy-gotchas.md
# Google OAuth Deploy Issues
Three things break after deploy that work locally:
1. Callback URL must match EXACT casing in Google Console
(localhost:3000 != 127.0.0.1:3000)
2. Consent screen redirect URI must include the production
domain with https, not just the path
3. Cookie SameSite=None + Secure required behind reverse proxy
Symptoms: silent 400 on redirect, no error in server logs.
Next project, same auth setup. Your agent finds the article before you even hit the bug.
The lawyer vibe-coding a legal tool
You are building a contract review feature and just learned that limitation-of-liability clauses come in five flavors that your parser needs to handle differently: hard caps, consequential damages waivers, exclusive remedies, limitations periods, and super-caps with carve-outs.
You: /remember the five types of liability caps we found during testing
corvid writes:
~/corvid/wiki/contracts/liability-cap-types.md
# Five Types of Liability Caps
| Type | Pattern | Example |
|------|---------|---------|
| Hard cap | "shall not exceed $X" | Fixed dollar amount |
| Consequential waiver | "no indirect damages" | Excludes lost profits |
| Exclusive remedy | "sole remedy shall be..." | Limits recourse type |
| Limitations period | "no action after X months" | Time-based bar |
| Super-cap with carve-outs | Cap + exceptions for IP/breach | Hybrid structure |
Parser must check for ALL five, not just the explicit "cap" keyword.
Next time you build anything that touches contracts, your agent already knows the taxonomy.
The solo builder shipping across side projects
One month it is a Next.js app with Supabase auth. Then a Python CLI with Stripe billing. Then a mobile app with push notifications. Each stack has quirks that took real time to figure out.
You: /remember how we got Supabase row-level security working with the service role key
corvid writes:
~/corvid/wiki/backend/supabase-rls-service-role.md
# Supabase RLS with Service Role Key
RLS policies block the service role by default in edge functions.
Fix: use supabase.auth.admin methods, not the regular client.
The service_role key bypasses RLS only when using the admin API.
Regular supabaseClient.from('table') still respects RLS policies
even with the service key in headers. This is by design.
Six months later, different project, same stack. You do not re-learn it. You do not re-Google it. Your agent searches corvid and gets the answer in seconds.
What people actually save
- The auth fix that works locally but breaks after deploy
- The database query that needed a specific index to stop timing out
- The CSS layout trick that finally worked after three Stack Overflow answers
- The contract clause taxonomy the parser needs to handle
- The API rate limit workaround that is not in the docs
- The architecture decision and why you made it
- The config that makes CI pass after it randomly started failing
How it compares to built-in memory
| Built-in agent memory | corvid | |
|---|---|---|
| Scope | Per-project | Cross-project |
| Size | Truncates at ~200 lines | Unlimited articles |
| Search | None | Keyword + semantic (finds by meaning) |
| Control | Agent decides what to save | You decide with /remember |
| Retrieval | Only in that one project | Any project, any session |
| Format | Short notes | Full articles with tables, numbers, reasoning |
Setup
pip install corvid-remember
corvid install
That is it. Two commands. pip install gets the CLI and all dependencies (semantic search included). corvid install auto-detects your agents (Claude Code, Codex CLI) and installs the /remember skill for each.
$ corvid install
✓ Claude Code → ~/.claude/skills/remember/SKILL.md
✓ Codex CLI → ~/.codex/skills/remember/SKILL.md
Wiki: ~/corvid
Semantic search: enabled (BAAI/bge-small-en-v1.5)
Done. Use /remember in your next session.
Open any project. Say /remember. Done.
Alternative: install via npx skills
npx skills add juraxis/corvid
pip install fastembed sqlite-vec # for semantic search
corvid init # or: python3 ~/.claude/skills/remember/corvid.py init
Keyword-only mode (no heavy dependencies)
pip install corvid-remember[lite]
corvid install
Keyword search works out of the box via SQLite FTS5. Semantic search requires the full install.
Search
Keyword search works out of the box via SQLite FTS5 with Porter stemming and BM25 ranking. "Finetuning" matches "fine-tuned."
With fastembed + sqlite-vec installed, semantic search activates automatically. Searching "concurrent writes deadlock" finds your article about a "race condition" even though it never uses those words. The embedding model (bge-small-en-v1.5) is 33MB, runs on CPU in ~50ms per article, and needs no GPU, no PyTorch, no server.
Both modes run together. Falls back to keyword-only silently if the packages are not installed.
corvid search "oauth redirect"
corvid search "supabase row level security" --json
corvid stats
What gets saved
Your agent writes markdown articles organized by category. You never touch the structure.
~/corvid/
corvid.py # one file, Python stdlib + optional fastembed/sqlite-vec
corvid.db # search index (disposable, rebuildable from articles)
INDEX.md # table of contents your agent maintains
wiki/
auth/
google-oauth-deploy-gotchas.md
backend/
supabase-rls-service-role.md
contracts/
liability-cap-types.md
Real articles. Tables, exact values, specific commands, reasoning. Not chat logs.
Inspired by Karpathy's LLM Wiki
Karpathy's llm-wiki pattern builds knowledge bases by ingesting external docs into a wiki. corvid borrows the core idea but changes the entry point: your source is the conversation, not external files.
| Karpathy's LLM Wiki | corvid | |
|---|---|---|
| Source | External docs, papers, repos | Your conversation with the agent |
| Ingest | Copy to raw/, LLM compiles |
/remember distills in real-time |
| Search | qmd (BM25 + vector + re-ranking) | Hybrid: FTS5 keyword + semantic vector |
| Best for | Research knowledge | Working knowledge |
His system is a research librarian. This is a working notebook. They compose if you want both.
Under the hood
corvid is one Python file. The search index is SQLite FTS5 for keyword search and sqlite-vec for vector search, both inside the same SQLite database. Embeddings come from fastembed (ONNX Runtime, CPU-only, 33MB model). No external services. Everything runs locally.
The database is disposable. Delete it and run corvid index-all to rebuild from the markdown files. The articles are always the source of truth.
Commands
| Command | What it does |
|---|---|
corvid install |
Detect agents, install skill, init database |
corvid init |
Create the database and wiki directory |
corvid index <file> |
Index one markdown file |
corvid index-all |
Re-index all files in wiki/ |
corvid search <query> |
Search (human-readable) |
corvid search <query> --json |
Search (JSON for agents) |
corvid stats |
Show article counts |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file corvid_remember-0.1.0.tar.gz.
File metadata
- Download URL: corvid_remember-0.1.0.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ccfc971f6a0ac5671eb760cbec395a9ece82da5df2fcf7644bd72be5cb363645
|
|
| MD5 |
c7512949110e70b3cade0e109580180d
|
|
| BLAKE2b-256 |
6e807bf79c467b173b464b8a62ea60867fd66cf3002d304cfcdbcaf3c2d85a53
|
File details
Details for the file corvid_remember-0.1.0-py3-none-any.whl.
File metadata
- Download URL: corvid_remember-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96f36f5fb144fee7df6b36f07565e67925bb173a3c58530107299654efbbe14d
|
|
| MD5 |
7749192022b60c50f2219913cc9a3c83
|
|
| BLAKE2b-256 |
7d0187e75b23dc06d0045c1c217fadaf2d3891ba467c4d913d8e9144a1c86f60
|