RaiApps
A budgeting app and a climbing training tracker, both Flutter on Supabase, with LLM reports that never compute numbers or act alone.
RaiBudget is a budgeting app fed by bank and card transactions through Plaid, and RaiClimbing is a training tracker for climbing. Both hand part of the work to an LLM, which is risky around money and training loads. So code computes the figures, the model judges what they mean, a server-side validator decides what reaches the screen, and anything binding waits for my approval. I built both in 2026 for my own use.
RaiBudget
RaiBudget runs on macOS, iOS and Android from one Flutter codebase and syncs in real time. Each category gets a monthly limit, and recategorizing a transaction once can save a rule for the next one.
The back end is Postgres with row-level security on every table. The Plaid integration runs in edge functions, and its secrets sit in a table the app can’t read. The first version took about three days and 184 commits.
The Analysis tab is written by a scheduled Claude Code cloud routine, not by the app. It pulls transactions and budgets through an edge function and writes back a report on anomalies, forecasts, recurring charges and trends. The server computes every figure the report cites, and the routine’s search queries never include an amount or an account.
Investments
A portfolio view gets its own read-only report with no buy or sell advice, so nothing happens to an account unless I do it.
RaiClimbing
RaiClimbing is the training tracker I use on Android. Its plan adjusts to how sessions actually went, which only works if the logging is exact.
Each session type owns a roster of exercises dosed per week, and every logged set records its load, count and whether it was done. A pain check-in before each session is scored for red flags, which trim the next loading session. Climbs come in from the Tension Board API and feed a grade pyramid.
History syncs to Supabase as one versioned document, so a reinstall or an older build can’t overwrite newer data.
An LLM reads an aggregate of my plan, sessions, climbs and pain check-ins and returns strict JSON with up to eight recommendations. Some carry a one-tap change to the plan, like a new load for an exercise. A server-side validator rejects any recommendation that doesn’t state its proposed values in its own text, so a tap only applies what I already read.













