Inspiration

A Reddit thread caught me: "Alexa+ is turning my lights on and off." Dozens of replies, and the real pain wasn't the bug. It was that nobody could say why. Lights at 2 AM? A routine? A cloud? A ghost? And when the assistant explains itself, it says "you asked me to." (They didn't.)

Banks solved "what did you do with my stuff?" decades ago with receipts. Smart homes still run on vibes. So I gave one a receipt printer and a ghost named Orbie 👻

What it does

Orbie is a self-hosted MCP server (Streamable HTTP, spec 2025-11-25) that gives every smart-home action:

  • 🧾 a receipt: hash-chained, with an evidence grade
  • 🚧 a fence: "lights off" won't kill the freezer or the grow lights
  • ↩️ an undo: exact states restored, or "things changed, I touched nothing"
  • 🕵️ an honest why: answered from the ledger only. No record? "I can't tell, and I won't guess."
  • 👻 a ghost hunt: spots things that switch by themselves, like every ~60 minutes

How I built it

Solo, in TypeScript, with Kiro writing specs while I wrote code: a pure engine, an Express + MCP server, a React + 3D web app, and a deterministic benchmark.

Receipts chain together, $h_n = \mathrm{SHA256}(h_{n-1} \parallel r_n)$, so editing history breaks every hash after it. A "ghost" is a repeating unexplained change: at least 4 events with $\dfrac{\mathrm{MAD}(\Delta t)}{\mathrm{median}(\Delta t)} < 0.15$.

Risky actions need a signed, single-use confirm token that a language model never sees. Only a human hold-to-confirm can approve. It talks to Home Assistant (preview mode by default), and any OpenAI-compatible model works through three lines of .env.

Challenges I ran into

  • No Alexa+ access. It's partner-only, so the assistant is simulated, and the app says so on every screen.
  • MCP has no "ask first" step. I invented the confirm token.
  • False premises. "Why did it turn on?" when it turned off. Orbie now politely disagrees.
  • My 3D house vanished. I was opening a new WebGL context on every render and browsers cap those. A ghost in my own machine.
  • My own bug: a dry-run blocked the same command as a "duplicate" once live mode was on. A preview must never count as "done".

Accomplishments that I'm proud of

  • 9 / 9 on my Phantom Bench of real reported failures; a naive assistant scores 0 / 9 (wrong-target actions 8 → 0, made-up answers 3 → 0).
  • 138 unit tests plus browser tests, and a fresh clone runs with one docker compose up (180 MB image).
  • A cute 3D home, a spooky splash, custom sounds, and an assistant that says "I don't know" with a straight face.

What I learned

Honesty is a feature you have to design. "I can't tell" is a great answer when a receipt backs it up. Also: test the boring paths (preview then live) before the flashy ones.

What's next for Orbie

  • Test against a real Home Assistant and, when access opens, a real Alexa+.
  • Authentication on /mcp and a public hosted endpoint.
  • An Agent Skill wrapper so any assistant can pick Orbie up in one line.
  • More ghosts. Always more ghosts.

Built for the Amazon Developer Hackathon, Alexa+ track by @himanshu007-creator.

Built With

Share this project:

Updates

Submission history