Claude, Copilot, Gemini, Codex, OpenCode, the shell, git — each tool keeps its own history and none of them share it. Urchin runs locally, collects events from every tool into a single append-only journal, and exposes that journal over MCP and HTTP so any agent, IDE, or script can read what every other tool did. Urchin does not own your tools. It connects them.Documentation Index
Fetch the complete documentation index at: https://docs.orinadus.com/llms.txt
Use this file to discover all available pages before exploring further.
What it does
- Collects — passive pull collectors for shell history, git commits, Claude, Copilot, Gemini, Codex, OpenCode, and local models. Read-only. No write-back to source tools.
- Stores — events land in an append-only JSONL journal at
~/.local/share/urchin/journal/events.jsonl. Events are never mutated. - Exposes — an MCP server (stdio, JSON-RPC 2.0) for IDE integrations, and an HTTP intake server for SDK and script ingestion.
What it does not do
- It does not replace or wrap your tools.
- It does not modify your shell config, git hooks, or IDE settings automatically.
- It does not send data anywhere by default. Cloud sync requires an explicit
cloud_token.
Architecture overview
Crate structure
| Crate | Role |
|---|---|
urchin-core | Pure types: Event, Journal, Config, Identity. Zero I/O except journal reads/writes. |
urchin-intake | Axum HTTP daemon. POST /ingest, GET /health. Binds 127.0.0.1:18799. |
urchin-mcp | MCP stdio server. 10 tools over JSON-RPC 2.0. |
urchin-collectors | Shell, git, Claude, Copilot, Gemini, Codex, OpenCode, local-model collectors. |
urchin-vault | Projects events into ~/brain daily notes inside marker-guarded blocks. |
urchin-agent | ReAct reflection loop: load context → synthesise → write Agent event back. |
urchin-sdk | HTTP client for urchin-intake and Orinadus cloud hub. |
urchin-cli | Single binary urchin. All subcommands. |
Event model
Every unit of memory is anEvent:
| Field | Type | Required | Notes |
|---|---|---|---|
id | UUID v4 string | Yes | Generate client-side. Deduplication key. |
timestamp | ISO 8601 UTC | Yes | RFC 3339 format. |
source | string | Yes | claude, copilot, shell, git, mcp, cli, etc. |
kind | enum string | Yes | conversation / agent / command / commit / file / decision |
content | string | Yes | The memory payload. Must not be blank. |
workspace | string | No | Absolute path to repo or workspace. |
session | string | No | Session identifier. |
title | string | No | Short display title. |
tags | string[] | No | Free-form tags. Omitted from JSONL when empty. |
actor | Actor object | No | { account, device, workspace } — all optional. |
brain | string | No | Vault identifier for multi-brain setups. |
None/empty optional fields are omitted from the JSONL output. No null values are written to disk.