Relay logoRelay. Devpost GitHub
Agent for Good · Slack Agent Builder Challenge

In a disaster, the deadliest thing is a lost message.

Verified crisis coordination inside Slack — every need tracked, every promise proven.

Watch the 3-min demo See it on GitHub

Runs where volunteers already are. AI-optional by design.

ledger.events — append-only8 rows
#001NeedCreatedriverside · meals ×3
#002TriageConfirmedseverity: critical
#003Assigned→ volunteer A
#004NudgedSLA drift +12m
#005Reassigned→ volunteer B
#006EvidenceAttachedphoto · geo
#007Verifiedsign-off ✓
#008Closedneed #014 fulfilled
#001NeedCreatedriverside · meals ×3
#002TriageConfirmedseverity: critical
#003Assigned→ volunteer A
#004NudgedSLA drift +12m
// the problem

The same family gets rescued twice while another is missed. Volunteers say “I'll go” and silently drop.

Every failure is a state-tracking failure.

group chat
anyone near riverside??
i can go
did someone get the Kapoor family?
omw
still need water @ 4th st
who's got this??
state engine
structured ledger
#012Water ×20 · 4th Sttracked
#013Medical run · Kapoorassigned
#014Hot meals ×3 · Riversideverified ✓
// the loop

Six verbs. One append-only ledger.

State is the log. Every transition is an appended event — nothing is edited, nothing is deleted. The LLM interprets language; deterministic code controls state; humans confirm every consequential step.

01
Intake

Any message, any language, becomes a structured need.

NeedCreated
02
Triage

Extract, dedupe, flag low-confidence for a human.

TriageConfirmed
03
Match

Score volunteers; a human makes the assignment.

Assigned
04
Commit

An SLA clock starts, with drift detection watching.

Nudged · Reassigned
05
Verify

Photo, location, recipient, sign-off. Nothing closes on someone's word.

EvidenceAttached · Verified
06
Report

Donor-grade. Every number links to a ledger event.

Closed
ledger.events append-only · UPDATE rejected
NeedCreatedriverside#001
TriageConfirmedcritical#002
Assigned→ vol A#003
Nudged+12m#004
Reassigned→ vol B#005
EvidenceAttachedphoto · geo#006
Verifiedsign-off#007
Closed#014#008
// the moment it earns trust
“It caught that the food delivery never actually happened — the volunteer got stuck — and reassigned it before the coordinator even noticed.”

Drift detection watches the SLA clock, not the status flag. When a promise stalls, Relay nudges, waits, and reassigns — appending every step to the ledger.

Nudged no ack Reassigned
Dispatch · Need #014
Hot meals ×3 · Riverside shelter
critical
09:14
Assigned
→ Volunteer A
Assigned
09:26
SLA clock started
30 min to deliver
09:41
Drift detected
no location ping · unresponsive
◉ drift
09:41
Auto-nudge sent
“still able to deliver?”
Nudged
09:43
No acknowledgement
timeout
09:44
Reassigned
→ Volunteer B · 0.4 mi away
Reassigned
10:02
Delivered
photo · geo · recipient
EvidenceAttached
10:03
Verified ✓
coordinator sign-off
Verified
// proof, not promises

Five things you can verify in the code.

Each claim is enforced by a mechanism, not a marketing page.

01

Append-only ledger

A database trigger rejects any UPDATE. The audit trail is the product.

BEFORE UPDATE → RAISE EXCEPTION
02

Humans in command

The engine rejects agent or system actors on consequential transitions.

assertActor(human) · reject(agent)
03

Numbers are never hallucinated

Reports render {{stat:*}} tokens; a validator rejects any figure not backed by the ledger. A fabricated number falls back to a deterministic template.

{{stat:needs_verified}}
04

PII, minimized

Beneficiary contact lives only in an AES-256-GCM vault. The LLM never sees it.

vault.encrypt(aes-256-gcm)
05

AI-optional by design

Unplug the model and the whole loop keeps working on deterministic fallbacks.

if (!apiKey) useDeterministic()
// measured, not claimed

Two numbers, both reproducible.

extraction quality
86.1%
field accuracy
100%
critical-severity recall

On a 40-message labeled set.

reproducible · npm run eval
Simulated 48-hour flood · published rules
group-chat baseline
2 needs left unclaimed
2 families served twice
0 deliveries verified
Relay
14 tracked
repeats deduped
delivery verified on a
complete evidence packet

Labeled simulated on purpose — the honesty is the point.

// what exists today

Everyone solves one edge of this. Relay closes the loop.

Crisis mapping
Ushahidi · Sahana

Web crisis-mapping that lives outside the chat. No promise-tracking.

gap: outside the conversation
Group chats
WhatsApp groups

Where coordination actually happens — with zero structure and no accountability.

gap: no structure
Incident tooling
Slack tools · incident.io

Built for internal IT. Closes on status flags, not verified fulfillment.

gap: flags, not proof
Relay.

Coordination inside the conversation + promises with proof + donor-grade accountability.

// built on the Slack platform

Three platform capabilities, used honestly.

capability 01

Slack AI capabilities

Powers the Ask-Relay assistant — natural-language questions answered from the ledger.

capability 02

Real-Time Search API

Permission-aware field-context grounding — answers respect who is allowed to see what.

capability 03

MCP

Relay is exposed as an MCP server — read tools plus an opt-in pledge_support write tool. An external agent can file an accountable pledge; a human still confirms it.

Relay holds AI agents accountable too.

Every AI feature degrades to a deterministic fallback with no key. The loop never depends on the model.

// read the docs

Everything is written down.

Architecture, the full build spec, the deploy runbook, and the engineering invariants — all in the open, all reproducible.

diagram

System architecture

The six-verb loop over the append-only ledger, and the full stack — with every qualifying technology labeled.

view diagram →
start here

README & setup

60-second local setup, the full command list, and how each Slack platform capability is used.

open on GitHub →
spec

Build document

The full product spec — state machine, event taxonomy, and the compliance rules the engine enforces.

open on GitHub →
ops

Deploy runbook

Fly.io production deploy — deep health checks, migrate-and-seed on boot, and secret management.

open on GitHub →
invariants

Engineering invariants

Append-only ledger, human gates on every consequential step, PII only in the vault — the rules in code.

open on GitHub →
submission

Devpost submission

The full writeup, the demo video, and step-by-step instructions to test it in Slack yourself.

view on Devpost →

Don't trust our report — audit it.

Watch the demo Read the code Try the live sandbox
538 hermetic + 17 integration tests · deployed on Fly

All demo data is fictional. Relay assists volunteer coordinators; it is not an emergency service.

Relay. Agent for Good · Slack Agent Builder Challenge