Every morning is a departure. Doorbound is a live departure board for the household morning on Alexa+: each person's real chance of making the door, and an exact re-plan the moment someone slips.
Code (MIT): github.com/nika619/Doorbound · Try the board, nothing to install: nika619.github.io/Doorbound · Film (2:48): watch

Inspiration
Every household has a daily departure: the school run, the commute, the bus. And everyone misjudges how long things take, even things they do every day. Psychologists call it the planning fallacy: in Buehler, Griffin and Ross's 1994 study, only about 3 in 10 people finished by the time they had predicted.
In a family it compounds. One long shower holds up the bathroom, the next person's teeth, the parent who waits to drive, and the whole household misses the door.
Timers and checklists don't help with that. A timer doesn't know that Isha's "eight-minute" shower takes twelve. And it can't answer the only question that matters at 7:26: will we make 7:52, and if not, what do we change?
The kitchen already has the right screen and the right assistant. Alexa+ hears everyone, from any room, with their hands full. So we built the departure board an airport would build, for a family.
What it does
- A live board on the Echo Show. One row per person in split-flap letters: what they are doing, how many minutes are left on it, ON TIME / TIGHT / LATE, and their chance of being ready by the gate, drawn as a live curve. Below it, a runway of everyone's remaining steps to the gate.
- It learns. Each "Alexa, I'm done" is a real duration. After a few mornings the plan uses what actually happens ("Isha's shower takes 12 minutes, not 8"), and it corrects the household's own habit of underestimating.
- It re-plans, gently. When someone slips, it finds the cheapest set of changes the family allowed (breakfast to go, Dad packs her bag, the dishwasher waits) that still gets everyone out with at least 85% confidence. Alexa says what changed; "undo" puts it back.
- It notices a slow morning, a shared bathroom (a live queue, anticipated before it forms) and which weekdays run slow.
- The evening before: "We leave at 7:40 tomorrow, when should everyone be up?" gives each person an alarm time, staggered around the bathroom.
- Fewer words: "I'm done" without a name works out who it was. A TV remote's OK, an NFC tag by the bathroom door, a smart button or a door sensor can say it instead.
- It keeps score of itself: every chance it gives is checked against what happened, and "how accurate have you been?" answers from your own mornings.
- One add-on for every family: account linking gives each household its own private data, TV link and time zone. "Delete everything" erases it, along with every link and sign-in it had.
Everything is one sentence to Alexa
| You say | Doorbound |
|---|---|
| "Alexa, start the school run. We leave in 40 minutes." | Opens the board and gives everyone's chance |
| "I'm done." | Marks the step and works out who said it |
| "Isha's still in the shower, ten more minutes." | Re-plans if anyone is at risk |
| "We need to leave five minutes early." | Moves the gate and re-plans |
| "Dad can pack Isha's bag." | Allows a handoff the re-planner may use |
| "Undo that." | Puts the old plan back |
| "We leave at 7:40 tomorrow. When should everyone be up?" | Gives alarm times at an 85% chance |
| "How accurate have you been?" | Reads back its own kept score |
| "We're out the door!" | Ends the morning and scores every chance it gave |
One real morning
Mum: "Alexa, start the school run. We leave in 40 minutes." Alexa: "School run started. Everyone is on time. Leave at 7:52, in 40 minutes. Isha is the tightest, with about a 9 in 10 chance."
At 7:26, Isha's shower runs over. If nothing changes, her chance of making the door is 48%.
Mum: "Alexa, Isha's still in the shower. Ten more minutes, she says." Alexa: "Re-routed: Isha has breakfast to go and Dad takes over pack bag for Isha. Everyone still leaves at 7:52, and Isha is back on track, with about a 9 in 10 chance."
After the re-plan she is at 92%. The family is out the door at 7:49, three minutes to spare.

How we built it
Architecture
"Alexa, I'm done."
|
Alexa+ --- Streamable HTTP, OAuth 2.1 ---> Doorbound MCP server (TypeScript, MCP SDK v2)
| | 17 tools, one per thing a family says
| | one core model: statistics, learning, re-planner
| | one clock, one store per household
| v
+<----- ui://doorbound/board ------ MCP App: the board, a card in the conversation,
full screen on a tap, a TV on its own link
- A self-hosted MCP server over Streamable HTTP: 17 tools, each with an output schema, plain speakable text, and error results that say what to say instead (following Amazon's add-on design guide). It negotiates protocol 2025-11-25 and 2026-07-28 from the same endpoint and passes the official MCP conformance suite.
- The board is an MCP App (a
ui://resource): one self-contained 93 kB file. Our 2 kB view bridge replaces a 455 kB SDK and is tested against the official host-sideAppBridge. - Built for real Alexa+:
- OAuth 2.1 client credentials and account linking (authorization code with PKCE S256);
- tokens signed with a key only the server knows;
- per-household revocation;
- a CloudFormation stack for AWS (Graviton, Secrets Manager, hourly snapshots, automatic recovery);
- a ready listing kit.

The maths: honest chances, not guesses
1. A step is a distribution, learned. Each step's length is log-normal (always positive, can run long). What the person said is the prior, worth \( k = 2 \) mornings; every real morning pulls the estimate towards what happens. With stated time \( s \), real durations \( x_1 \dots x_n \) and prior spread \( \sigma_0 = 0.35 \):
$$\mu = \frac{k \ln s + \sum_i \ln x_i}{k + n} \qquad \sigma^2 = \frac{k\left(\sigma_0^2 + (\ln s - \mu)^2\right) + \sum_i (\ln x_i - \mu)^2}{k + n}$$
2. A step already under way keeps a realistic remainder, not "any second now". With \( z = (\ln e - \mu)/\sigma \) after \( e \) minutes:
$$\mathbb{E}[T \mid T \gt e] = e^{\mu + \sigma^2/2} \cdot \frac{\Phi(\sigma - z)}{\Phi(-z)}$$
3. A whole morning is a sum, matched by one log-normal with the same mean \( M \) and variance \( V \) (Fenton–Wilkinson), which gives each person's chance of being ready by the gate \( g \) in closed form:
$$\sigma^2 = \ln\left(1 + \frac{V}{M^2}\right) \qquad \mu = \ln M - \frac{\sigma^2}{2} \qquad P(\text{ready by } g) = \Phi\left(\frac{\ln g - \mu}{\sigma}\right)$$
4. A slow morning is slow all the way through. A person's steps share today's pace \( Z \), with \( \rho \) (learned from the household's own mornings) setting how strongly they move together:
$$\ln X_j = \mu_j + \sigma_j\left(\sqrt{\rho}\ Z + \sqrt{1 - \rho}\ E_j\right) \qquad \mathrm{Cov}(X_i, X_j) = \mathbb{E}[X_i]\ \mathbb{E}[X_j]\left(e^{\rho \mathrm{Var}[Z] \sigma_i \sigma_j} - 1\right)$$
Every finished step is a reading of \( Z \) (a conjugate update), and the step still running counts as censored evidence ("longer than 12 minutes so far"). The double sum is kept as running power sums \( \sum_k \frac{c^k}{k!}(A_k^2 - B_k) \), so the re-planner tries any change in O(1). Households can share a pace too: \( Z_p = \sqrt{\kappa}\ W + \sqrt{1 - \kappa}\ U_p \).

5. The re-plan is exact. Each allowed change has a cost: a quicker version 1, a handoff 2, waiting until after leaving 3, skipping 4. The re-planner solves:
$$\min_{S \subseteq \text{allowed}} \sum_{c \in S} \text{cost}(c) \quad \text{such that} \quad P_p(\text{ready by } g \mid S) \ge 0.85 \quad \text{for every person } p$$
It is an iterative-deepening search with two pruning rules that never cut off a better plan, and among equally cheap plans it picks the one most likely to get the whole household out. When nothing is enough, a binary search finds the least lateness any plan can reach.

6. One bathroom. A later user waits \( W = \max(0, F - A) \) for a space free at \( F \), having arrived at \( A \). Clark's closed forms give its mean and variance, and Stein's lemma gives its link to the arrival, \( \mathrm{Cov}(W, A) = -\mathrm{Var}(A)\ P(W \gt 0) \), so a late arrival waits less and the spread stays right.
7. What a household is like. Three things are learned from its own mornings: how much each weekday slows everyone, the household's own planning fallacy (leave-one-out, shrunk by ten mornings), and how strongly its people's mornings move together (\( \kappa \)). A learned time is itself uncertain, so with real mornings the spread is the predictive one.
Proof, not claims
Calibrated: on 40,000 simulated mornings, when it says 80–90% it happens 84.9% of the time. Its calibration error is 0.39%; the same model with steps treated as unrelated is off by 2.44%.
And on mornings built to break it, where each household learns from five past mornings:
| Mornings that... | Calibration error | When it said 80–90%, it happened |
|---|---|---|
| follow the model | 1.5% | 84% |
| have heavy tails (8% of steps take 1.5–3x as long) | 3.1% | 77% |
| have gamma-shaped steps | 2.1% | 82% |
| come from people who say 60% of the truth | 1.1% (was 6.5%) | 84% |
| have 5% of "done"s said 20 minutes late | 6.7% | 90% (cautious, the safe side) |
Testing this way found two real flaws, both fixed: plan with the predictive spread, and learn the household's planning fallacy across all its steps.
| Also checked | Result |
|---|---|
| Re-plan against brute force | Equal on 1,000 random mornings; guarantees hold on 2,000 more |
| Chance of making the gate against simulation | Within 2 points on 100,000 mornings |
| Bathroom queue calibration (20,000 mornings) | 1.4% before it forms (28% without anticipating it), 0.7% during |
| Plan-tomorrow | The most sleep of any plan with the same chance (brute force) |
Fast
| p50 | p95 | worst | |
|---|---|---|---|
| Re-plan, 2,000 random mornings (1–5 people) | 0.19 ms | 7.8 ms | 19.4 ms |
| Re-plan, a household at the limits (8 people × 15 steps) | 54 ms | 59 ms | 67 ms |
| The board's work each second (3 people) | 11 µs | 18 µs | |
| Tool call under load (300 screens + 30 speakers) | 4.1 ms | 6.5 ms | 9.5 ms |
One process served about 1,830 requests a second with no errors.
Built to be checked
- 100 tests, plus a 26-step end-to-end smoke test (OAuth and account linking included), the official MCP conformance suite, a browser job that checks the board at every Echo Show size and plays the simulator,
cfn-linton the AWS template, and a scan that fails the build if an API key ever lands in the repository. All of it runs in CI on every push. - Security, from a 24-point checklist we walked against the code, then a self-audit that found and fixed six real issues:
- the Host is checked on every route (no DNS rebinding) and cross-site requests are refused;
- constant-time secret checks and per-household rate limits;
- a hash-only Content Security Policy;
- an audit log that holds no names;
- "delete everything" only counts a yes said after the warning.
The film is code too
The 2:48 submission film was built in code, in the repository's video/ folder:
- 3D: three.js draws a lit split-flap board and an Echo Show that hands over, pixel for pixel, to the real board.
- Real footage: the real board is filmed frame by frame at 60 fps under a paused clock.
- Sound: every voice is from ElevenLabs, with word-synced subtitles, and the score is synthesized.
Challenges we ran into
- No Alexa device and no Alexa+ developer access. Testing an add-on needs Developer Mode, which needs a paired Apple Watch or Bee. So we built a faithful stand-in: a simulator that is a real MCP client and MCP Apps host, rendering the board exactly as a host would. Alexa+ is simulated; the board is the real product.
- Honest probabilities. Our first version planned with single numbers and was confidently wrong. Moving to distributions meant proving every approximation, then testing against mornings built to break the model.
- An exact planner that stays fast. The cheapest-change problem is a covering problem. Running sums that update in O(1) and admissible pruning keep real households exact in well under a millisecond.
- The MCP Apps lifecycle. Messages sent to the view before it finished initializing were silently lost. We wrote it up in our friction log, and the bridge now waits for
initialized. - Every family's own clock. A server on AWS runs in UTC while the family is in Ohio or Pune. Every time is now read, said and shown in the household's own time zone, including the night the clocks change.
Accomplishments that we're proud of
- The board doesn't just say "late". It says Isha has a 48% chance, fixes it with breakfast to go and Dad packing her bag, and shows her back at 92%. Every one of those numbers is checked.
- A re-plan that is provably the cheapest, verified against brute force.
- It looks and feels like a product, from across the kitchen and up close.
- We audited our own work as if we were the judges, then fixed everything we found.

What we learned
- People estimate from the plan, not from last time, so a plan has to learn from last time.
- Uncertainty makes voice better, not worse: "about a 3 in 4 chance" is more useful than a precise-sounding wrong time.
- Test a model against the world it assumes and it will look perfect. Test it against mornings that break its assumptions and it tells you what to fix.
- MCP Apps fit glanceable household displays well, and small details of the host lifecycle matter.
What's next for Doorbound
- Real mornings in real homes. The demo household is illustrative; a five-morning family pilot runs with just a laptop (PILOT.md).
- Alexa+ itself, once add-on access opens. Every step is written up in ALEXA.md.
- Live traffic for the journey and school-holiday calendars.
- A native Fire TV board, picture icons for young children, and more languages.
Built With
- alexa-plus
- amazon-cloudwatch
- amazon-ec2
- amazon-sns
- aws-cloudformation
- aws-secrets-manager
- caddy
- docker
- elevenlabs
- esbuild
- ffmpeg
- github
- github-actions
- lenis
- librosa
- mcp-apps
- model-context-protocol
- node.js
- numpy
- oauth2
- playwright
- python
- three.js
- typescript
- zod

Log in or sign up for Devpost to join the conversation.