precision, the Advocate runs warm (0.5) for creativity.
Challenges we ran into
- CORS & Auth Token Flow — Getting Better Auth JWTs to flow correctly from the Next.js frontend through to the FastAPI backend across different origins required careful cookie/header handling and a custom demo-token signing endpoint
- SQLAlchemy Async Session Management — The dependency injection for auth needed the user object to live in the endpoint's database session, not a detached one. We had to override verify_token instead of get_current_user to keep the ORM session graph intact
- SSE Streaming Reliability — Server-Sent Events through Cloud Run's proxy required specific headers (
X-Accel-Buffering: no,Connection: keep-alive) and a 120-second timeout guard to prevent dangling connections - Pydantic v2 Dependency Hell — clerk-backend-api required Pydantic ≥2.11.2 while we had pinned 2.10.3. The entire auth migration to Better Auth partly stemmed from wanting to drop this vendor lock-in
- OpenCV in Docker — Adding receipt scanning required opencv-python which needs libgl1 and libglib2.0 system libraries not present in python:3.12-slim, causing silent container crashes on Cloud Run
Accomplishments that we're proud of
- The Multi-Agent Architecture — Five AI agents deliberating in real time with SSE streaming, each with distinct personalities, temperature settings, and system prompts. The Mentor synthesises everything into actionable advice. It genuinely feels like having a financial advisory council
- 78-Endpoint E2E Test Suite — Every non-AI database endpoint tested against a real PostgreSQL instance in CI. The test bypasses auth cleanly by overriding the JWT verification dependency
- The Card Engine — Seven specialised generators that analyse your transactions, detect ghost subscriptions, calculate opportunity costs, and generate prioritised daily nudges — all without any LLM calls
- The UI — Dark, calm, intentional. Decision cards with real Unsplash photography, animated XP counters, staggered agent loading animations. It doesn't feel like a banking app
- Deep Onboarding → Personalised AI — The 6-step profiling feeds directly into every agent prompt, so the AI knows your income, debts, goals, spending weaknesses, and preferred communication style
What we learned
- Uvicorn + async SQLAlchemy — Building a fully async Python backend with proper session lifecycle management
- Bun — Using Bun as the JavaScript runtime for the Next.js frontend
- SSE Streaming Patterns — Implementing server-sent events for real-time multi-agent orchestration
- Better Auth + JWKS — Provider-agnostic JWT verification without vendor SDKs
- FastAPI Dependency Injection — How to cleanly override auth dependencies for testing without breaking the ORM session graph
- Cloud Run Deployment — Container health checks, PORT env var handling, Artifact Registry workflows
- Prompt Engineering for Agent Diversity — Getting five agents to genuinely disagree and debate rather than echo each other requires carefully differentiated system prompts and temperature tuning
What's next for Skint
- Stock Market Integration — Real-time portfolio tracking with Alpha Vantage, teaching users about investing through their own holdings
- Price Comparison Engine — Automated comparison for phone contracts, broadband, energy bills, and insurance — surfaced as actionable cards ("Switch to Voxi and save £8/month")
- Bank Feed Integration — Plaid/TrueLayer integration to replace mock transactions with real spending data via Open Banking
- Receipt Scanning — OCR-powered receipt capture to catch cash spending that doesn't show up in bank feeds
- Expanding the Agent Council — Specialist agents for tax, student finance, and career decisions
- Scale — Multi-currency support, regional expansion beyond the UK, and enterprise partnerships with universities and employers
Built With
- anime.js-python
- bun
- docker
- make
- next.js
- react-typescript
- tailwind
- uvicorn
Log in or sign up for Devpost to join the conversation.