What It Does

Cypher is a mobile banking platform like Monzo that turns raw transaction data into personalised, mathematically focused financial guidance. The Home screen shows your balance, budget pots, and an adjustable safe spend. You rate purchases 1-5 on satisfaction, and those ratings feed a utility optimiser that allocates your ‘safe-to-spend’ budget across categories to maximise your total happiness, not just minimise your total spending. A conversational AI assistant powered by Claude reasons over your full financial context balance, ML forecasts, satisfaction scores, utility allocations, and remembered goals, to give advice that actually knows your numbers. Voice mode via ElevenLabs lets you communicate to the AI chatbot hands free.

Inspiration

We analysed over 200 one and two star Monzo reviews and kept seeing the same frustrations, basic budget limits with no reasoning behind them, no way to distinguish spending you value from spending you regret, and AI features that felt ‘bolted on’ rather than integrated. We wanted to build what those users were actually asking for: a system where budget limits come from statistical simulation rather than round numbers, where the app learns which spending brings you joy and allocates accordingly, and where the AI assistant has genuine access to your financial data rather than just being a generic uninformed chatbot.

How We Built It

The ML pipeline is built in Python and uses a LightGBM for spending forecasts with quantile regression at five confidence levels, plus a Monte Carlo engine that runs 5,000 cashflow simulations per horizon to find the maximum safe spend via binary search over a chance constraint. That outputs a JSON file that the frontend uses.

The frontend is coded in React with Vite. A utility optimiser on the client takes user satisfaction ratings, applies a James-Stein shrinkage to avoid overfitting on small sample sizes, sharpens preferences with a temperature parameter, and solves a constrained log-utility maximisation using a water-filling algorithm to split the safe-to-spend budget optimally across categories.

Claude (Sonnet) receives every message with full financial context, balance, category breakdowns, ML forecasts, Monte Carlo confidence intervals, satisfaction scores, utility allocations, and persistent memory. ElevenLabs handles speech-to-text and text-to-speech for voice conversations. Miro was used for ideation and task tracking during the 30-hour build.

Challenges We Faced

Voice mode was the trickiest integration. ElevenLabs' speech-to-text needed silence detection tuned correctly, too aggressive and it cut users off mid-sentence, too lenient and the conversation stalled. We settled on a 1.5-second silence threshold with automatic stop, which gives a natural conversational rhythm. We also hit edge cases where the transcription completed but the response pipeline didn't trigger, which we traced to async state management between the recording, transcription, and Claude API stages. We were also concerned with exploitation possibilities of the chatbot via prompt injections which may cause serious data leakage issues and ought to be as secure as possible in a real life scenario.

On the ML side, getting the Monte Carlo simulations to produce stable safe-to-spend values required careful stratification of daily spending draws by day of the week and mean shifting to preserve variance structure while satisfying the candidate spending cap.

What We Learned

Neither of us had built a React app before this weekend as we come from Biomedical Engineering and Pure Mathematics background. The biggest lesson was the maths and problem solving skills we know from our degrees, as it translates directly into product features when you have the right tools. We also learned how much context injection matters for LLMs as Claude's advice went from generic to genuinely useful the moment we started feeding it satisfaction scores and utility allocations alongside raw transaction data. The model reasons better when it has structured, quantitative context, not just conversation history.

Built With

Share this project:

Updates