Skip to content
yalt8826.com
← projects/
projects/eudaimonia/in progressandroidself-hosted

Eudaimonia

A personal life OS: my plans, habits, inbox and AI agents in one place, running on a server at home.

Built solo · Oct 2026 – ongoing

01 / overview

Everything I'm keeping track of, in one place, shaped around me.

My day was spread across a calendar, notes, reminders and a handful of AI agents. Eudaimonia pulls them into one app that knows my plan for today, what I'm waiting on, and what my agents have been doing.

Eudaimonia is Greek for a life lived well. The app is a small step toward that: one server on olympus, my home server, holds a log of everything that happens, and thin clients read it. The agents run on the server through hermes, my agent runner. The phone never schedules anything itself.

330+automated tests across server, web and mobile
20routes in the app shell
M5of 8 mobile milestones done and verified on a phone
0cloud services: it runs on my own hardware
02 / screens

Matte black, torn paper.

The design language is called "Matte & Torn": a textured black surface with sheets of coloured paper torn open beneath it. Each sheet is one area of life. Swipe one up and it becomes a plan you can act on.

01The Plaza: one torn sheet per area
02Today's plan
03What's happening now
04A focus session with a timer
03 / architecture

One server, thin clients, a private network.

The data never leaves my network. The API is only reachable over my Tailscale tailnet, so it needs no login screen: being on the network is the authentication.

clientsthin, no business logic
Expo app (Android)React PWA (reference)offline outbox
networkTailscale
tailnet-only APIno public port
serverFastAPI on olympus
one ingest doorappend-only event logSQLite
agentshermes
one chokepoint moduleper-profile lockstimeouts
stack
  • Expo SDK 57, React Native 0.86, Skia, Reanimated
  • Python 3.13, FastAPI, SQLite
  • React + Vite PWA, kept as the reference render
04 / the six laws

Rules every part has to obey.

Before building anything I wrote down the laws the system must keep, and each one has a test or a lint that checks it.

01Append-only

Every change is a new event. Corrections are new events too; nothing is ever updated or deleted.

02Fresh isn't finished

A source counts as read only when what it produced passes a check, not just because it ran recently.

03A missing day is data

If nothing was recorded, the app says so. It never shows a zero it can't vouch for.

04One way to call an agent

Only one module may start an agent. A lint fails the build if anything else tries.

05The wake tap always works

No navigation, works offline, and keeps the time I actually tapped it, even if it reaches the server hours later.

06One writer per status

Each status has exactly one part of the system allowed to change it.

05 / details

The parts that took the longest.

surfaceTorn paper, painted in Skia

The tear edges are hand-authored contours, with a fibre texture and a dark fringe. Text padding follows the measured tear, and a test recomputes every colour contrast ratio.

navigationA radial gesture menu

Hold for about 150 ms or drag 10 px and the options fan out around your thumb; pick one by angle and release. A plain tap still opens quick capture. The logic is a pure state machine with its own tests.

offlineTaps that arrive exactly once

Actions queue on the phone with their original time and a device-made key. When the server comes back they're replayed, and the server's unique key makes a double send harmless.

06 / measured on the phone

Checked on a real device, not in an emulator.

CheckResult
Cold start to the home screen (target 2 s)373 ms worst of 3
Open in airplane mode and log the wake tap221 ms, queued
Deep link straight to the wake screen250 ms cold
Tap queued, then the app is updated before it syncsArrived 9 minutes later, once, with its original time
07 / what's next

The app is ahead of the server.

The phone app is built through milestone 5 of 8. Next come a home-screen widget, push notifications and the switch-over from the web version. On the server, the adapters that pull in each area of life (calendar, email, habits, the agents' work) are still to be built.