umi
GitHub →

Local-first personal AI

A personal AI that
lives on your machine.

Knows your calendar, notes, email, and habits. Reasons over them locally — no cloud, no subscriptions, no data leaving your machine. The only ceiling is your hardware.

how we got here

i didn't start with "let me build a desktop app in Rust." i started with a problem — every AI tool i tried was stateless. every knowledge tool was passive. nothing connected anything. and i kept losing threads i'd been pulling for weeks.

Jan 2026

the original idea

a Figma component. the concept was context management as the interface — what if the UI itself told you what the AI was thinking about, instead of hiding it behind a token counter? just a sketch. no code.

Feb — Mar 2026

the obsidian phase

tried to build this inside Obsidian — Claude as a knowledge agent wired into a vault. the question was: how does an associative brain actually work? you follow threads. one thing leads to another leads to another. every idea lives in your head for a week then fades. nothing connects.

the insight: the problem isn't the tool. it's that no tool was designed for how a curious, non-linear brain actually moves. capture had to be effortless or it wouldn't happen. the AI needed to be the thing that remembered.

Spring 2026

the spatial canvas vision

explored AFFiNE and BlockSuite. built a workspace. then wrote a brief for something wilder: an infinite canvas where content units (working name: "Grains") knew where they lived spatially — because location is meaning on a canvas. and the canvas background would bruise when the LLM was active: a stain from inside, bleeding organically around the active thread. color = context fill state. green (room) → red (full). no token counter. just a living material.

i wanted to build it in PIXI.js + Tauri. the canvas was going to be the context management UI — you'd see the fill state, you'd manage it spatially. this was the most important architectural idea in any of the iterations.

May 10, 2026

umi proper — first commit

dropped the PIXI canvas (too much to build alone), picked up Rust, rig, and SurrealDB. the idea stayed the same: build a local-first personal AI that keeps a semantic graph of your life and reasons over it with a local LLM. no cloud. no subscriptions. the database is the user model.

May 29, 2026 — now

19 days in

calendar, email, habits, goals, a full plan page with CalDAV two-way sync to iCloud, a graph-flow agent pipeline with pluggable domain agents, Discord gateway with tunnel support, a knowledge browser, a media library, and a canvas the agent can write to. 38 database migrations. still building.

built and running

honest list. if it's not here, it's not done.

local agent

streaming, multi-turn, tool-calling agent powered by rig-core. knows your calendar, habits, goals, and notes. answers questions by reading the live context before calling any tools.

knowledge browser

file tree, wikilink graph, smart filters. built-in readers for markdown, PDF, video, audio, images, and EPUB. heading-aware semantic index with hybrid BM25 + vector search.

plan page

Today, Week, Month, Habits, Goals, Reviews, Areas, Routines, Energy views. two-way CalDAV sync to iCloud. drag-to-move events. 38 migrations of schema.

agent canvas

tldraw v5 canvas the agent can write to. structured action extraction — the model outputs a batch of canvas actions, the frontend applies them live.

inbox

iCloud IMAP. connect dialog, folder navigation, message list and reading pane. background sync every 5 minutes.

memory extraction

every turn, a fire-and-forget rig Extractor writes structured facts to SurrealDB + embeds them. the agent remembers what you've told it across conversations.

how it works

every message runs through a graph-flow DAG. triage routes trivial messages fast. for complex ones, the strategist decides which domain agents to call, then context is fetched in parallel, history is loaded, and the agent loop executes step by step.

user message (IPC)
triage
trivial →
─────────────────┐
complex ↓
strategist sets domains, steps, canvas flag
context_fetch parallel: map_refresh + rag_search
load_history SurrealDB transcript → rig with_history
↓ ←──────────────────────────────┘
execute_strategy direct_answer or domain_agent_node
↓ (loops until steps done)
synthesize streams chat-chunk events to UI
memory_extraction fire-and-forget → SurrealDB

pluggable domains

a new domain agent is one registry.register(...) call. plan is the reference domain. inbox, health, and finance are next.

billboard system

each domain maintains a live summary. the agent reads the full map — [UMI_CONTEXT]…[/UMI_CONTEXT] — before deciding whether to call any tools. most questions get answered without a single tool call.

local-only inference

default: LM Studio at localhost:1234. qwen3.5-9b for chat, nomic-embed-768 for embeddings. switch to any OpenAI-compatible endpoint in settings. no cloud required.

what it's built with

Tauri v2desktop shell, IPC, FS access
Rust + Tokiobackend, async runtime
rig-core 0.37agent framework, tool-calling, extractors
graph-flow 0.5DAG task orchestration
SurrealDB 3.0embedded graph DB (SurrealKV)
fastembedlocal embeddings, 768d
React 19frontend
tldraw v5agent canvas
Zustand 5frontend state
Tailwind 4styling