CEChibuzor Ezeamaku

ChiOS.

The app I run my life on, and the workspaces around it: tasks, money, health, calendar, projects and the books, on my phone and in a browser. An agent can use every part of it, but only inside limits I set.

RoleSole designer and engineer
WhenJune to September 2026, 1,271 commits
StackHono, Cloudflare Workers, D1, Durable Objects, Drizzle, Expo, SQLite
StatusPublished · runs my life daily
200MCP tools behind one OAuth gateway, scoped per module and per verb
6,929automated tests across six packages, green at the release build
~590klines of TypeScript, about a quarter of them tests

What it is

The personal side holds the parts of a life that usually live in ten apps: tasks, money, health and training, notes and a journal, goals, meals, faith and travel, with a full calendar over all of it and my Google calendars connected.

A workspace is a company or a team: projects of items with their own statuses, custom fields, and list, board, calendar and timeline views. It also has comments and an inbox, a CRM on the same kit and, for a company, the books and the corporate record.

It runs on Android and in a browser from one data layer that knows nothing about either platform. The phone keeps an encrypted local copy and works offline. The browser runs SQLite compiled to WebAssembly in a worker.

Agents are first-class users

Everything a person can do, an agent can do through one MCP gateway: 200 tools behind OAuth, granted per module and per verb. An agent helping with meal planning never sees the finance tools. An agent drafting an invoice can read the ledger without being able to change it.

The built-in agent runs on my own model connections, as sessions and automations. It works within an autonomy level I choose, but some things wait for me at every level: moving money, sending an invoice, deleting, sharing or sending anything outside the app, changing roles, reading the vault, and spending over a run’s cap. That list lives in code, not in a prompt, so no setting or instruction can switch it off.

Decisions

Split it, then merge it back.

In September I split the app into two products, one for life and one for business, because the two kinds of data need different rules. Running two apps cost more than it saved, so I merged them back into one within two weeks. The difference in rules survived the merge as an architecture choice, not a product boundary.

Two write authorities, one database.

Personal rows sync both ways and resolve offline edits, which is right for a habit log. Workspace rows are read-only on the device. The phone queues an intent, and the server replays it where roles, validation and money live. Last-write-wins over a ledger is how you lose a payment.

One schema, two databases.

A single schema generates both the on-device tables and the cloud migrations, and a check fails the build if they drift. The phone and the server cannot disagree about the shape of the data.

Edge first.

The API, the agent gateway and the web app are Workers, and the agent runtime lives in Durable Objects. There is no server to patch and no region to pick, which suits a project run by one person.

Where it stands

It is published, and it is how I run my life: my tasks, money, health, calendar and projects live in it, on my phone and in the browser, every day. Sign-in is locked to my account. It is still a side project. I build it to learn offline-first sync, edge platforms, and how to give an agent real access without giving it the keys, and using it daily is what keeps it honest.