-
-
Thumbnail
-
Laptop B perspective one drone down
-
Phone screen alone
-
Laptop B’s screen during the hub outage: “Hub offline. Working as a team.”
-
Hazard-striped hub outage: the crossed-out mast, team rings, and the 8-report backlog banner
-
12 of 12 reached, with the results chart (92% / 73% / 58%)
-
Team B back online from HQ perspective
-
Laptop B's off from the HQ perspective
-
Drone Crash
-
Initial graph start, 2 survivors reached
-
All teams in contact
Inspiration
When disaster strikes, the network is often the first thing to fail. Neptune North asked what happens when actors working toward one goal lose contact with each other and with any central hub. We wanted to answer that with real failures on real hardware, not a slide: switch off Wi-Fi, put a phone in airplane mode, crash a drone, take the hub down, and watch the system keep going.
What it does
Blackout is a rescue swarm of six actors with one shared goal: reach every survivor in a flooded city before their deadline. Four drone scouts find survivors and two rescue boats reach them, steering around floods and buildings. The actors run on three physical devices: two laptops and a phone.
During the demo we break things for real:
- Wi-Fi off on Laptop B. Its team of three keeps searching and rescuing alone. HQ shows them as ghosts at their last report, inside a storm cell that grows the longer they are dark.
- Airplane mode on the phone. Scout 4 works completely alone and still speaks its own radio calls offline.
- A drone crashes. It sends a mayday. Its partner flies to the wreck, recovers its survivor reports, and takes over its sector. If the partner is unreachable, the nearest working drone goes instead.
- The hub goes offline. Every team becomes an island, sharing only inside its own group. No relay, no Gemini, no n8n, and they still reached 12 of 12 survivors in our test run.
When contact returns, knowledge merges automatically and the backlog of reports written in the dark arrives in a burst that HQ reads out.
Over 50 maps with the same failures:
$$\text{reached} = \frac{\text{survivors rescued before deadline}}{\text{total survivors}} \quad\Rightarrow\quad \text{Blackout } 92\%,\ \ \text{central control } 73\%,\ \ \text{no sharing } 58\%$$
How we built it
- TypeScript on Node 24. A small hub on Laptop A plays the part of the air: actor $i$ only hears actor $j$ when both devices are online and $\lVert p_i - p_j \rVert \le 8$ tiles.
- Mergeable knowledge (CRDT style). Each actor keeps found survivors, rescues, claims and last-seen positions in a structure whose merge is commutative, associative and idempotent: $A \sqcup B = B \sqcup A$, $(A \sqcup B) \sqcup C = A \sqcup (B \sqcup C)$, $A \sqcup A = A$. Tests check these laws on hundreds of random cases, so any order of reconnection gives the same answer.
- Deterministic conflict resolution. When two rescuers claim the same survivor during a partition, the winner is $\arg\min_{r}\,(\text{eta}_r,\ \text{id}_r)$, and every device reaches the same answer independently.
- Rules first, AI second. Each actor runs offline rules (sweep, report, A* paths around water and buildings, cover a silent partner, recover a wreck). Gemini Flash on Vertex AI only chooses among the top 3 options the rules already judged feasible, and falls back to Flash-Lite on rate limits. Gemini 4 Argon writes each actor's standing orders before the mission. Every decision on screen is labelled Gemini or Rules.
- ElevenLabs gives each craft its own radio voice. 170 clips are pre-rendered, so a device with no network can still speak, and the closing line lands exactly on the final tick.
- n8n Cloud opens and closes incidents, logs the backlog and sends a hospital pre-alert. An outbox in the hub holds every message while n8n is unreachable and replays them in order.
- A deterministic headless simulator shares the exact actor code with the live devices and produces the 50-map comparison.
- The HQ dashboard, phone page and laptop pages are plain HTML and SVG, designed as a night storm chart in Neptune North's mesh-graph language.
Challenges we ran into
- Noticing a real Wi-Fi drop fast. A switched-off connection never closes cleanly and could take about 30 seconds to notice. We now treat 2 seconds of hub silence as a dead link, so Laptop B goes dark in about 3 seconds and rejoins about 2 seconds after Wi-Fi returns.
- Showing only what HQ can know. Cut-off actors are drawn at their last report, with their stated intent, not where they really are.
- An honest baseline. A pathfinding bug first made "no sharing" look much worse (21%) than it really is (58%). We fixed it and report the real number.
- Keeping voice on the demo clock. Stale calls are dropped, the backlog burst is allowed to wait, and the closing line interrupts everything at the end.
Accomplishments that we're proud of
- Every failure in the demo is real and physical: Wi-Fi, airplane mode, a crash, a hub outage.
- Actors make visible independent decisions: covering a silent partner's sector, flying to a wreck to recover its reports, carrying news to a rescuer.
- A judge suggested a hub outage mid-event. We added it, and the swarm still reached every survivor.
What we learned
- Reliable multi-agent systems need rules that work offline first. The model is most useful choosing among safe options, not replacing them.
- Showing staleness honestly makes resilience easy to understand. Ghosts, "last heard" times and late reports do that better than hiding the gaps.
What's next for Blackout
- Real drones or ground robots linked by LoRa or mesh radio instead of a simulated range.
- Finding survivors in drone camera feeds with Gemini vision.
- Larger swarms that form and split teams on their own as coverage changes.
Built With
- a-star-pathfinding
- claude-code
- codex
- crdt
- css3
- elevenlabs
- esbuild
- gemini
- gemini-4-argon
- gemini-flash
- google-cloud
- google-genai-sdk
- html5
- javascript
- multi-agent-systems
- n8n
- n8n-cloud
- node.js
- svg
- typescript
- vertex-ai
- web-audio-api
- websockets
- ws