Max MorrishBack to projects

Ivanna

A personal AI operations system on my Mac: voice requests, one shared memory and scheduled jobs.

Running on my Mac. Architecture last revised in September 2026.

12 recent entries replayed into the next voice job, written by the bridge, not the agent

Architecture diagram. A voice bridge and a schedule of 46 background jobs feed agent jobs and local models. Both read context from and write results to a shared memory layer of notes, a vector index and past transcripts, which feeds a morning briefing, a decision queue and a change ledger.
The whole system on one page.
Where
Personal project
Role
Design and build
Built with
Python, Ollama, SQLite vector search, launchd

What I made

I built a voice bridge in standard-library Python. Quick questions get a read-only answer; longer requests become coding-agent jobs, and anything that looks like a delete, push, deploy or send waits for my yes.

Background jobs run on a schedule, local models handle private text that stays on the machine, and every job reads from and writes to one shared memory.

  1. Requestby voice or from a scheduled job
  2. Voice bridgeread-only answers; risky jobs wait for a yes
  3. Memorykeyword, vector and episodic search, merged
  4. Jobsagent jobs, and local models for private text
  5. Decision queuewhat needs my call, answered daily
How a request moves through the system. I merge every change myself.

46background jobs defined under launchd

3memory layers: semantic, episodic, procedural

11architecture decision records

What came out of it

Memory the bridge writes

After every job the bridge, not the agent, logs the result and replays the last 12 entries into the next run. Search reaches further back, across notes, a vector index and past transcripts.

Detail of the architecture diagram: agent jobs and local models take context in and send results out through one memory box, a notes vault, a vector index and past agent transcripts, with keyword, vector and episodic results fused into one ranking.
Every job reads from and writes to the same memory.

Where it's going

The full version runs on its own and keeps improving: one memory across every agent, scheduled work, and a loop that proposes, tests and builds its own upgrades. Anything that needs my call reaches one queue, and I merge every change.

  1. NowRunning on my MacVoice requests, one memory, scheduled jobs and two agents that review each other.
  2. Health checksEvery service reports in, so a silent failure gets noticed.
  3. Local by defaultAnything private is handled only by models on the machine.
  4. Self-improvingIt learns from each run and builds its own upgrades; I merge them.