Inspiration
A student's week lives in too many places: assignments in Canvas, meetings in Outlook and Teams, deadlines buried in email, workouts in a notes app, event flyers on a hallway wall, money in your head. None of them talk to each other, so one change quietly breaks everything else. When a lab moves to Friday, nothing tells your gym plan, your shift or your budget. We wanted one app that connects those pieces and shows what a change actually affects before you commit to it.
What it does
Habits: a student starter pack is an iPhone assistant that pulls your classes, Canvas deadlines, calendar events, email (including Teams notices), habits and spending into one daily plan.
Ripple Mode: say "my lab moved to Friday evening" or ask "what if I go to the concert?". You see what it collides with, real free slots and what it costs against your weekly budget, then accept or reject the revised plan.
Campus Capture: photograph an event flyer. It reads the details, checks your calendar, your interests and that week's budget, and points out what the flyer leaves out, like the price.
Habits and classes: tick a habit and it slides away, cancels today's reminder and is remembered. Classes show on the day and the day before, for the whole term.
Money: log spending by voice, text or receipt photo. You get a weekly budget, upcoming bills, planned shift pay and an 8-week trend.
Ask: chat or talk to it. It answers from your agenda, email, budget and history, so "when did I submit my normalization lab?" gets an actual date. It reads replies aloud.
Memory Inspector: tap Why? on any suggestion to see the memories it used, then correct or forget them. The suggestion updates.
Spoken briefing: one tap reads today's plan out loud.
How we built it
The app is native SwiftUI. It talks to one FastAPI server on Vultr, behind Caddy HTTPS and token auth. On the server:
Gemini understands messy text, voice notes, flyer and receipt photos and email, and writes summaries and answers. It falls back across six models when one is busy or out of quota.
Tiger Data (Postgres + TimescaleDB) stores cached summaries and time-series hypertables for voice logs and spending. A time_bucket query powers the spending trend, and a history table answers "when did I…" questions.
Backboard holds long-term memory that the user can inspect and edit.
ElevenLabs voices the briefing and chat replies.
The Gmail API, with read-only scope, brings in email and Teams notifications.
Conflict detection in Ripple is plain, deterministic overlap code with a self-check. The model only parses the input and has to list its assumptions.
Challenges we ran into
Gemini's free-tier quota ran out mid-testing, and the SDK's silent retries made one request hang for over 4 minutes. We built a six-model fallback chain with a 25-second timeout per model.
Our school blocks direct Teams access, so Teams arrives the way students actually see it: as notification emails read through Gmail.
Keeping AI honest about dates and money. The model kept wanting to guess. We enforced "read, never guess" on the server: no amount means the app asks "How much was it?", and no date in the email means no date in the app.
iOS gotchas:
- a launch crash from two singletons initializing each other;
- the microphone staying on after dictation, which also silenced playback;
- code signing breaking because the project lived in an iCloud-synced Desktop folder;
- a Stats screen taking 19.5 ms per render, which we cut to 2.5 ms.
Backboard's free tier doesn't include its LLM, so we used it purely as a memory store and kept reasoning in Gemini.
Accomplishments that we're proud of
Ripple Mode works end to end on real data, and every link in a ripple traces back to a fact rather than a model's guess.
The memory is visible: correcting a memory in the Memory Inspector really changes the next recommendation in front of you.
Every sponsor service does a real job in a deployed, working system, not a demo stub.
Ask answers "when did I…" with real dates, and says "I don't have any record" instead of making one up.
It's a polished, native app running on a real phone: swipeable tabs, dark mode, reminders that work offline, and a bright new identity.
What we learned
Let models parse and deterministic code decide. Trust comes from showing assumptions and computing conflicts, not from asking an LLM to be careful.
Separate recorded, planned and hypothetical data. Money and schedules get confusing fast if you don't.
Free AI tiers need resilience by design: caching, fallbacks and timeouts mattered as much as prompts.
Small UX details decide whether people trust an assistant: a mic that stops by itself, a check that slides away, a button that says "Loading…".
What's next for Habits
Canvas API sync, so submissions are recorded automatically.
A home-screen widget for today's plan.
A side-by-side What-If view to compare two versions of your week.
An offline queue, so nothing gets lost without signal.
Smarter budgets from your real spending patterns.
Production: paid Gemini quota, verified Google sign-in and a TestFlight beta for classmates.
Inspiration
A student's week is split across Canvas, Outlook, Teams, email, notes and flyers on the wall. When one thing changes, like a lab moving to Friday, nothing tells the rest of your plans. We wanted one app that connects them.
What it does
Habits: a student starter pack puts your classes, deadlines, email, habits and spending into one daily plan.
Ripple Mode: shows what a change collides with and what it costs before you accept it.
Campus Capture: checks an event flyer photo against your schedule, interests and budget.
Money and history: log habits and spending by voice or photo. Ask questions like "when did I submit my lab?" and get a real date.
Memory Inspector: see what the assistant remembers about you, and correct it.
How we built it
App: native SwiftUI.
Server: FastAPI on Vultr.
Gemini understands text, voice and images.
Tiger Data stores the time-series history and spending.
Backboard holds the memory.
ElevenLabs speaks the replies.
Gmail API reads email, read-only.
Conflicts are computed by plain code, not guessed by the model.
Challenges we ran into
Gemini's free quota ran out mid-testing, and a stalled request hung for minutes. We added a six-model fallback with timeouts.
Our school blocks direct Teams access, so we read Teams notifications through Gmail instead.
The AI wanted to guess dates and amounts. We made the server ask instead.
iOS bugs: a launch crash, a mic that wouldn't turn off, and code signing that broke in an iCloud-synced folder.
Accomplishments that we're proud of
Ripple Mode works end to end on real data, and every result traces back to a fact.
Correcting a memory visibly changes the next suggestion.
Every sponsor service does a real job in a deployed app running on a real phone.
What we learned
Let the model parse and plain code decide; that's what makes the assistant trustworthy.
Free AI tiers need caching, fallbacks and timeouts built in from the start.
Small touches, like a mic that stops by itself, decide whether people trust it.
What's next for Habits
Automatic Canvas submission sync.
A home-screen widget.
A side-by-side "what if" comparison of two weeks.
An offline queue so nothing is lost without signal.
A TestFlight beta for classmates.
Built With
- apple-speech-framework
- avfoundation
- backboard
- caddy
- canvas-lms
- elevenlabs
- eventkit
- fastapi
- gmail-api
- google-gemini
- google-oauth
- ios
- postgresql
- python
- swift
- swift-charts
- swiftui
- tiger-data
- timescaledb
- ubuntu
- usernotifications
- uvicorn
- vultr
- widgetkit
Log in or sign up for Devpost to join the conversation.