Weave your time, money, rituals and rest into one picture.
Four things most people track in four different places, held in one local database — so the observations that sit between them have somewhere to come from. What an hour of work actually paid once the unbilled hours around it are counted. What you spend on the days you keep a ritual, and the days you don't.
Runs in the browser. No account needed to start, and nothing leaves the device until you choose to sign in.
Local-first
Offline is not an error stateIt works with no connection, and it is not pretending to.
Every read and every write is local. A write lands in IndexedDB on web and desktop, or SQLite on the phone, and returns. The network is a background reconciliation the interface never waits for, which is why there is no spinner, no “saving…”, and no difference in speed between a plane and an office — in both cases the write already happened before the network was consulted.
Being offline is a queue that hasn't drained yet. When a connection comes back the queue drains on its own, and two devices that were both edited while apart settle on the same answer without needing to talk to each other first.
Money
Two modes, switchable at any timeGoals are optional. Nothing is scored unless you ask for it.
Give a category a monthly budget and it behaves like one: a pace mark, an over-budget state, a share of the daily allowance. Leave the budget empty and the expense is still recorded, categorised, tagged, given a payee and a payment method, and reported on — it is simply never scored. No bar, no pace, no red. A category moves between the two at any time and nothing stored has to change.
The daily allowance is derived rather than stored: the sum of the monthly budgets that aren't committed, divided by the days in the month. Rent and subscriptions sit outside it, so a payment landing on the 1st can't swallow the figure. Budget nothing at all and there is no allowance to show, so the screen reports what you spent instead of what's left.
The day
Planned beside what actually happenedAn unmet plan is never a failure.
Plan the day in two kinds at once: blocks with a time on them — the call at 13:00, the two hours you want for the thing that matters — and a loose list underneath of what just needs doing today. Most days are honestly a mix, and forcing a clock time onto the second kind only makes people invent one. Moving something between the two lists is one tap either way.
Braid already knows how the day went, because timers wrote the sessions and ticks wrote the logs. So the only new fact a plan adds is the intention, and the only honest thing to do with it is put the two side by side: two hours planned, forty minutes tracked. There is no red, no percentage score and no streak of days you planned well. Planning is a guess about a future you don’t control, and an app that marks you wrong for guessing badly just teaches you to stop guessing.
Routines are the other half, and deliberately simpler than they sound: a card holding the things you do together in the morning, showing how many you kept. No sequence, no stopwatch, no wizard walking you through steps. Ticking a chip on the Morning card is exactly ticking that habit anywhere else in the app — one record of whether you stretched, not two that can disagree.
Not built
Named, rather than left to be discoveredWhat Braid doesn’t do yet.
Two things are genuinely missing, and a third list matters more: the parts that are written and have never run. “Untested” and “absent” are different claims, and only one of them is safe to round off.
-
Over-the-air updates
The app asks the server for one and is told there isn’t one, which is the honest answer rather than a placeholder. Shipping real ones needs an export pipeline and key management; a subtly wrong update doesn’t fail, it hands a phone a version that won’t start. New releases are still announced in the app.
-
Acting on a web notification without opening the app
Taken, Skip and Snooze work as buttons on the notification itself only in the installed apps. In a browser tab the reminder arrives and opens Braid.
-
Anything on iPhone or iPad, run
The iOS app, its home-screen widgets and its reminders are all written and have never been compiled — Apple’s tools only run on a Mac, and this was built on Linux. Expect the first real build to be the first real review.
-
A notification that has actually fired
The Android app schedules them, and the parts that do it are tested against the same rules on every platform. But there is no phone here: nothing has ever arrived on a lock screen, and no home-screen widget has been tapped.
-
Bank sync, calories, social, AI chat
Out of scope on purpose. Every expense is typed, which is the app’s biggest ongoing cost to you and the reason subscriptions post themselves and payees autocomplete.
Get it
One shared core, four surfacesSix places to run it, in three states of readiness.
The web app is deployed and the desktop and Android builds exist as files you can download. Two platforms have no artefact yet and are marked as such rather than promised.
-
Web
Runs in any modern browser and installs from it as a PWA, with the same offline behaviour as the packaged builds.
— Open Braid -
Android
Release APK for arm64, signed with a generated keystore for sideloading. Packaged and verified to contain the real app — but never launched, because there is no device or emulator on the build machine.
28 MB APK -
Windows
NSIS installer. It is unsigned, so SmartScreen will warn you on first run until it is signed with a real certificate.
79 MB Installer -
Linux
AppImage. Make it executable and run it; there is nothing to install.
81 MB AppImage -
macOS
The same Electron shell as Windows and Linux, but Apple's toolchain only runs on macOS, so no build has been produced here yet.
— No build yet -
iOS and iPad
One React Native codebase with Android, covered by the same tests. Nothing is distributed — there is no TestFlight build and no App Store listing.
— Not distributed
Roughly 80 MB is close to the floor for a desktop build that ships its own browser engine. If the size bothers you, install the web app instead — it is the same application and the same offline behaviour.
Privacy
An account is optionalNothing leaves the device unless you sign in.
Braid runs with no account at all. Everything you enter is written to the database on your device first, and that local copy is what the interface reads — not a cache of something held elsewhere.
Signed out, the sync engine asks for a token, finds none, reports itself idle and makes no request. That is a supported permanent state rather than a degraded one, and there is a test whose only job is to assert the server received zero requests while everything was still saved locally.
Signing in is a link emailed to you — there is no password. It exists so a second device can catch up: from then on, your rows are copied to the sync API so both devices can converge. Conflicts resolve to whichever edit was made last, and deleted rows leave a tombstone so a device that was offline can't resurrect them.
Open Braid.
It opens straight into today, with nothing to fill in first. Signing in happens inside the app, later, and only if you want a second device.
Open Braid