Inspiration
People say "someone should build..." all the time, and the idea is gone by dinner. Bee already hears those moments. Could a wearable and a coding agent turn that sentence into a working app by the next morning, with a person still deciding what gets built?
What it does
Overnight runs on a Mac and listens to Bee's live stream from an Apple Watch. When a conversation goes quiet, Kiro decides whether someone described a small app. If so, the watch buzzes with a Bee to-do: "Build tonight? <title>". Tick it in the Bee app for yes, delete it for no. At 1:00 am Kiro Crew builds each approved idea as a small static web app. Overnight tests it in a sandbox, publishes it to GitHub Pages, and at 7:00 am the watch buzzes with the link. It is for builders with more app ideas than time.
How we built it
TypeScript on Node 24, SQLite and zod, run as four macOS background jobs (listener, Kiro Crew gateway, build, delivery).
- Hear: one package makes every Bee call, through @beeai/cli, and saves each line from
bee streamthe moment it arrives. - Notice: Kiro CLI, headless, with a no-tools agent; the reply is checked against a schema.
- Ask and approve: a Bee to-do with an alarm, then polling
bee todos get. - Build: one Kiro Crew agent job per idea, given one page (our template plus the idea's title and pitch, never the quote), with the whole gateway inside our own macOS sandbox. Kiro CLI, also sandboxed, is the fallback.
- Deliver: Playwright tests the app inside a second, tighter sandbox. Only then is it pushed to GitHub Pages. The agent never sees a token.
- See: a read-only dashboard on the Mac shows each idea's path from "heard" to "delivered" and its short quote (hidden in filming mode), never the transcript.
I wrote it with Claude Code as my coding assistant. 3,588 automated tests pass.
Challenges we ran into
- A conversation's last stream event holds the whole transcript with first names, which Bee's docs don't mention. We drop it at once.
- Approvals send no event: ticking a to-do never produced
todo-updated, so Overnight polls. - Kiro Crew's own sandbox, even at
strict, left the GitHub login in the Keychain readable from a job. macOS can't nest sandboxes, so the whole gateway runs inside ours, checked every night. - Kiro's hourly sign-in can't be renewed inside that sandbox, so our code renews it outside before every build.
- On the first real night macOS ran both jobs an hour late: its scheduler still used the time zone the Mac had when it last restarted, and the zone had been changed since. Now Overnight keeps its own clock.
Accomplishments that we're proud of
The whole loop ran for real once, with nobody touching the Mac. An idea said near the watch on Oct 10 was asked on the wrist and ticked on the phone. That night Kiro Crew built "Plant Watering Tracker" in 2 min 40 s for 4.59 credits. In the morning it was tested and published, and the watch buzzed with the link at 7:32 am instead of 7:00, because both night jobs ran an hour late (see Challenges). Along the way we wrote 56 friction-log entries.
What we learned
Read the real payloads, not only the docs. Measure what a sandbox hides; its name won't tell you. And a laptop makes a hard server: sleep, time zones and an hourly sign-in shaped the design more than the AI did.
What's next
More real nights (Bee has sent no new speech since Oct 10), and trying for real the cases that are only tested so far.
What has not been tried for real
Only one real idea has gone all the way so far. Not yet tried for real: ticking the to-do on the watch, a rejection or expiry with real speech, the dashboard on real data, a night with the lid closed on battery (the rule is written and tested, not tried with a real lid), and whether the Mac stays awake on battery. Where the video shows the dashboard, it is invented demo data, marked "DEMO DATA: invented".
Built With
- bee
- beeai/cli
- better-sqlite3
- claude
- eslint
- github
- github-cli
- kiro-cli
- kiro-crew
- launchd
- macos-sandbox-exec
- node.js
- playwright
- sqlite
- typescript
- vite
- vitest
- zod
Log in or sign up for Devpost to join the conversation.