Inspiration
Two of us almost missed exams last semester. Not because we were lazy — because our calendars kept telling us we had time we didn't. A calendar says "free from 11 to 2:30." It doesn't say that eighteen minutes of that is the walk up Castle Point, that lunch is in there somewhere, that you never actually start anything for the first twenty minutes after a class. So we'd plan against thirteen hours and get nine, the plans would collapse, and every app we tried responded with the same thing: a red number, a broken streak, a little "you missed 3 tasks" that made us close the app for a week.
We wanted the planner that starts from the truth. One that counts the commute and the meals and the settling-in, tells you what you actually have, puts one thing in each real window, and — this was the rule we wrote down first — never counts what you failed to do.
What it does
Orbit reads your real timetable and your Canvas deadlines and computes your day honestly. The first thing you see is the calendar's number crossed out and the real one underneath: 13h 35m becomes 9h 07m, with the missing 268 minutes drawn as four rings — class, walking, meals, settling in.
From there it finds the real windows between classes and puts one task in each, chosen by deadline and by how long that kind of work actually takes you. It tells you exactly when to stand up for the train: Hudson-Bergen Light Rail from Marin Boulevard, leave by 13:36, at Babbio by 14:21, nine minutes before class — the same numbers on the card, on the map and in the voice, because they come from the same place.
You talk to it. "The problem set took ninety-five minutes" logs the session, awards XP, and nudges the calibration for that course, so next week's estimate is closer. "When do I need to leave?" and "Why?" both get real answers with their sources. Week by week it learns what you're like — big assignments take you about 52% longer than you think; you're 19% faster before noon — and says so in plain words. It points you at hackathons and competitions that fit your load, drafts the email to your professor when the week genuinely won't fit, and ranks you against your friends on a board where being behind is a distance to close, not a verdict. Three modes — Chill, Normal, Crisis — change what the day asks of you without ever changing the arithmetic.
How we built it
One server, two clients, one rule. The backend is Next.js and TypeScript with a pure, framework-free core (323 tests) that does every calculation. A React web app and a SwiftUI iPhone app render what it produces. The rule that shapes everything: no client and no model ever computes a number. Every minute, XP value and departure time arrives already worded. That's why the phone, the page and the voice can never disagree — there's only one arithmetic, and it's tested.
Nemotron runs behind five jobs, none of them chat. It plans the day under a schema that only allows moving a task or booking a room, with every id it returns checked against the real windows and tasks. It estimates how long tasks take, anchored to a simple heuristic and clamped in code to half-to-double that baseline. It parses syllabus PDFs into deadlines with page and bounding-box provenance. It acts as a critic over the other agents' autonomous actions, able to lower trust but never raise it. And it learns the student one week at a time — in context, carrying a memo it writes to its own future self, across eleven aspects of how someone works. We measured every job. Zero-shot estimation lost to a ten-line heuristic, 35.3 against 16.3 minutes of error; the anchor and clamp brought it to 15–20. The learner wins on assignment length and catches seven of eight blown deadlines where a running average catches two. Nothing was fine-tuned, and the eval page shows the losses next to the wins.
ElevenLabs is the voice: a Conversational AI agent with nine server tools registered as webhooks. Each tool returns a finished spoken sentence — "Leave in sixteen minutes. The HBLR is scheduled for one forty-seven." — and the agent reads it back. Open questions are answered from an enumerable factsheet, and any answer containing a number the facts didn't license is rejected before anyone hears it. The agent waits when you pause, opens with a line composed from your real day, and on the iPhone runs push-to-talk over WebRTC through the Swift SDK. The app never holds a key; even the offline briefing is an MP3 the server renders in the same voice.
Transit data is real and keyless — NJ TRANSIT rail and PATH GTFS, PATH departures live from the Port Authority board — with each trip's direction proven from its own stop sequence. Canvas is real: one feed URL. Claude Code was the engineering partner throughout, and every decision we made, over a hundred and thirty of them, is in an append-only DECISIONS.md with the reason.
Challenges we ran into
The model lied politely. Given the fact "your next class starts at 9:05, so there's nothing to leave for," Nemotron said "You need to leave at nine oh five." Every number was licensed; the meaning was inverted. Our checker catches invented numbers, not true numbers in false sentences. We took the model off the spoken path entirely — the facts are already sentences, and rewording them is the one job it isn't trusted with.
"Nemotron is slow" turned out to be two bugs and neither was the model. A strict JSON response_format made the endpoint emit tab characters for fifteen seconds; the same request without it answered in 800 milliseconds. And Node's pooled keep-alive sockets hung where fresh connections didn't. We found both with eight-call benchmarks and fixed them with a race between two models and a cache that serves the last plan the model gave while a fresh one runs behind it.
The voice went dead silently. The tunnel behind the webhooks rotated, and the agent kept calling a hostname that no longer existed — it didn't fail, it improvised, which is the exact behaviour the design exists to prevent. The supervisor now probes its own public URL and re-points all nine tools when it changes.
We were offering trains going the wrong way, filtered by route instead of by trip, discovered only because a list of calling points came back empty and we asked why instead of shipping an empty array. Four palette changes in thirty hours. An iOS project that wouldn't compile because five new files were on disk and in no target. All fixed, all logged.
Accomplishments that we're proud of
A voice agent that structurally cannot hallucinate a number — not by prompting it nicely, but because it never computes one — proven by a bank of 24 questions that ran every ten minutes all night and stayed at 24 out of 24, including the hours when the honest answer was "there's nothing to catch."
An eval page that shows our own model losing to ten lines of code, and exactly how a clamp in the pure core fixed it, with a property test that runs with no key and no network.
A learner that credits its own work honestly: every learned fact on screen says whether Nemotron or the rules produced it, depending on who actually did that week's review.
One journey object feeding three surfaces — leave 13:36, train 13:47, arrive 14:21, nine minutes to spare — identical on the card, the map and in the voice.
And DECISIONS.md: every bug, every number, every reversal, in the order it happened.
What we learned
Diagnose before building. The worst bugs of the night — the wrong-direction trains, the map opening in Pittsburgh, the voice resetting to a default — were all found by asking why something looked slightly off, not by writing features. Measure the model instead of trusting it: "it lost, here's why, here's the fix" is a better story than any number you could make up, and judges can tell the difference. And gamification only works when it can't shame. The board people come back to is the one where being behind is a distance to close.
What's next for Orbit
A campus pilot at Stevens, so real logged sessions replace the synthetic calibration history and the learner's eleven aspects fill in from real weeks. NJ TRANSIT developer access for live light-rail positions. Transfers and the Stevens shuttle in the journey planner. A persistent store. Then the commuter campuses across the river, where the commute is the biggest lie the calendar tells.
Built With
next.js · react · typescript · swiftui · node.js · nvidia-nemotron · elevenlabs · claude-code · gtfs · openstreetmap · leaflet · mapkit · cloudflare-tunnel · vitest · tailwind
Built With
- claude
- elevenlab
- nemotron
- python
- typescript
Log in or sign up for Devpost to join the conversation.