Inspiration

One of us spent a week this summer visiting someone in a hospital room. The light switch was on the wall by the door. The TV remote had been borrowed from a different room and only half the buttons worked. Every evening, the same small negotiation: wait for a nurse to walk past, or get up when you shouldn't.

Then you check into a hotel and it's the same thing with better furniture. A smart TV you can't cast to. A speaker that wants the owner's account. A thermostat with an app you'll install once, for two nights, and never open again.

The devices are right there. You just aren't allowed to talk to them. So we built a way to borrow a room.

What it does

You walk up to a room and there's a card on the table with a QR code. Scan it and you're in a chat with the room. No app, no account, nobody asked for your email. You type what you want the way you'd text a friend: "turn on a light," "play something calm," "say hello." Something in the room does it. A phone's flashlight comes on. Music starts from the laptop. The laptop says hello out loud. The room texts back one sentence about what it just did.

The part we care about most is what happens when you're done. Your access is a lease, not an account: ten minutes and a specific set of devices. When you text "leave," or your time runs out, or the host hits one key to reset the room, you're out. Ask for the light again and the room politely tells you you're no longer here, scan the card to come back. The light stays however you left it. It was never yours to begin with.

The host has a screen that reads like a story, not a log: who's in the room, what's online, and what happened in plain sentences ("Owen's phone turned its flashlight on").

If you'd rather text than use a web page, the room has a real phone number. Give the join page your number and the room shows up in Messages like any other contact. Same room, same conversation, same ten minutes.

How we built it

Two people, one Saturday, two iPhones, a MacBook and whatever speaker was nearby.

  • The Brain is a small Python server (FastAPI, WebSockets). Every device connects and announces what it can do: "I'm Owen's phone, I have a flashlight and I can talk." The Brain keeps that registry and the list of who currently holds a lease, passes commands down to devices, and waits for them to say done. Adding a device means plugging it in and letting it introduce itself. No code changes.
  • The agent is one conversation, running on OpenAI Codex signed in locally on the host's Mac. When it wants to touch a device, the request goes through the Brain, and the Brain checks your lease at that moment, not when you joined or when you typed. A lease that ended a second ago is refused.
  • The devices are web pages. On an iPhone, Safari can control the flashlight through the camera's torch setting over HTTPS with permission, so we keep a page open that stays awake and listens. On the Mac, a small Python script drives Music, the volume and the voice through AppleScript.
  • Two ways in: a chat page, and iMessage through Photon 2.0. Photon gives the room a number and delivers the texts; our agent does the thinking either way.
  • The look is deliberately plain. Dark plum, one pink that means "live," no boxes, no IDs, no code on any screen a guest or judge sees. Just sentences.

Challenges we ran into

  • The hard part isn't making it work, it's making it stop. What if someone texts "leave" while the room is halfway through doing what they asked? We stamp every command with the lease's version number and devices ignore anything stale. If a command times out, we don't know what happened, so we say so, and we never quietly retry it on another device.
  • Phones do not want to be demo hardware. They sleep, they drop Wi-Fi, and Safari changes its mind about the flashlight between iOS versions. We needed Wake Lock, auto-reconnect, and a rule for when the same phone shows up twice (the original wins, the newcomer is told to try again) before we got three clean runs in a row.
  • "Accepted" is not "delivered." Photon's API says yes long before a text appears on a phone. We treat those as two different facts and only claim the one we've watched happen.

Accomplishments we're proud of

  • A stranger scans a code and a real flashlight in front of them turns on, within seconds, with nothing installed.
  • The lease really ends. We ran a full ten-minute expiry, a "leave," and a host reset. Each time, the very next request was refused.
  • Reset is one key. Every lease ends, lights go off, music stops, the room code rotates so a photo of the old QR is useless, and the log clears, all in about a second.

What we learned

Temporary is harder than permanent. Almost every bug lived at the boundary: the command already on its way when the lease ended, the device reconnecting under an old identity. Designing for "the room forgets you" gave us two rules we'd now use anywhere. Every action is absolute (light on, never toggle), and every permission is checked at the moment of action, not before.

What's next

Two phones and a laptop were what we had at 4 PM on a Saturday. The Brain doesn't care. A hotel TV, a smart bulb, or the controls on a hospital bed would join the same way and live under the same lease. After that: voice (hold to talk, the room talks back), letting a guest lend their own camera to the room, and letting a host set rules in plain language: "whenever someone joins, dim the lights."

Built With

Share this project:

Updates

Submission history