← Back to portfolio

Personal project

Sparrow

A personal AI assistant, not a coding tool — general-purpose, general-use. It's made of two things: an MCP server that holds memory, skills, and connectors, and a desktop app that runs a coordinator persona on top of it. That coordinator is running this exact conversation right now.

Active, in daily personal use — not a demo, not archived.

The two pieces

Server

The MCP server — the brain. Holds memory and skill search, and exposes connectors for email, calendar, Drive, Slack, and Linear as tools a model can call.

The app

The desktop client — the exact app this conversation is running inside. It hosts the coordinator persona that triages requests and dispatches into focused working modes.

Architecture, in action

The coordinator never does the implementation work itself — it triages, then hands off. Each working mode (plan, build, review, research) is a fresh worker with its own prompt and a narrow job. When a worker finishes, only its final handoff survives back to the coordinator; the tool calls and reasoning that got it there are discarded. This page was drafted, revised, and built through exactly that loop over the course of this conversation.

Capabilities

Hybrid memory & skill search

Keyword search (FTS5) merged with a vector similarity index via reciprocal-rank fusion, backed by an on-device embedding model. If the embedding step is unavailable, search fails open to keyword-only instead of failing outright. Every query is logged (mode, hit counts, timing) so the fusion weighting can be retuned from real data.

One coordinator, versioned worker roles

A single coordinator persona per conversation thread declares a working mode — plan, build, review, or research — at a chosen complexity. Each mode dispatches into a worker with its own prompt, versioned in code rather than configured in a database. This exact page was produced through that loop.

Multi-provider model routing

Chat requests route across multiple LLM providers with rate-limit-aware rotation — including telling an account-specific quota error apart from a shared upstream pool error, so one throttled account doesn't wrongly bench the rest. Embeddings and lightweight classification run locally on-device.

A deliberately small data model

Only the records Sparrow actually uses: memory, skills, and connectors. An earlier, more complex "agents" entity was designed, shipped, and retired the same day once it proved unnecessary — a collapse, not an accretion.

Skills that schedule themselves

A skill can carry a schedule. The desktop app polls for due skills and claims them with optimistic concurrency, so multiple running instances can't double-fire the same job — a daily "memory hygiene" skill runs this way.

Real-world connectors, gated by default

Email, calendar, Drive, Slack, and Linear are exposed as MCP tools. Anything that sends, deletes, or otherwise changes external state requires an explicit confirmation step — reading is unrestricted, writing is not.

Screenshots

Three screenshots tell the story for now. Click any shot to open a larger preview and step through them with prev/next.