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.
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.
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.
- Expo SDK 57, React Native 0.86, Skia, Reanimated
- Python 3.13, FastAPI, SQLite
- React + Vite PWA, kept as the reference render
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.
Every change is a new event. Corrections are new events too; nothing is ever updated or deleted.
A source counts as read only when what it produced passes a check, not just because it ran recently.
If nothing was recorded, the app says so. It never shows a zero it can't vouch for.
Only one module may start an agent. A lint fails the build if anything else tries.
No navigation, works offline, and keeps the time I actually tapped it, even if it reaches the server hours later.
Each status has exactly one part of the system allowed to change it.
The parts that took the longest.
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.
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.
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.
Checked on a real device, not in an emulator.
| Check | Result |
|---|---|
| Cold start to the home screen (target 2 s) | 373 ms worst of 3 |
| Open in airplane mode and log the wake tap | 221 ms, queued |
| Deep link straight to the wake screen | 250 ms cold |
| Tap queued, then the app is updated before it syncs | Arrived 9 minutes later, once, with its original time |
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.