An agent reads a repository and knows what the code does and where it lives. What it cannot know is which approaches were rejected and why, which limits are real, and where someone already got burned. Ariadne stores that part: decisions, notes and session summaries, each with its origin attached, searched by meaning instead of by keyword, and handed to whichever agent opens the next session. The point is to stop paying for the same context twice. Agents connect over an MCP server, authenticate with a token, and see only the spaces that token belongs to. Isolation has two locks: the service layer filters, and row-level security refuses anyway, so one space stays unreadable to another even if the filter disappears from the code. Search is hybrid, pgvector for meaning plus Postgres full-text for the exact word, and that combination is the part that actually changed answer quality. Backend is Hono on Node 22 with Drizzle over Postgres 17, embeddings run on Gemini with the user's own key, and the desktop app is a static Next.js export inside a Tauri window. v0.1.0 is out with a Windows installer.
Case study
While designing the search I ran into a question guessing wouldn't answer: whether the second arm, the one matching on names, helps at all. I built a golden set, measured three variants, and the aggregate number turned out to be the average of two opposite swings. I wrote up what I measured and what I cut.
Read the case study