When a disaster cuts a town off, coordination collapses into one chaotic group chat. This agent turns that chat into a relief operation — matching needs to nearby offers and official information, with a human confirming every match.
Pick a message below and watch the agent work its loop. Everything it surfaces is sourced and timestamped, and nothing happens without a human pressing the button.
Screenshot pendingimg/live-need.png — resident need → workspace match + Official information card
Screenshot pendingimg/live-safety.png — "is the road safe?" → refusal + road-closure advisory card
Screenshot pendingimg/live-board.png — coordinator board Canvas (cases + activity log + situation)
Screenshot pendingimg/app-home.png — branded App Home dashboard
Each required hackathon technology carries one capability — reasoning, memory, or reach. No decoration; remove any one and the product breaks.
Resident posts a need in the Slack thread. Split-view agent UI, suggested prompts, streaming replies.
Slack agent surfacePrior offers, coordinator notices, resolved cases — recalled live from the workspace itself. No wiki to maintain.
Real-Time Search APIBolt for Python + pydantic-ai. Parses to typed fields, plans sources, ranks matches, composes Block Kit replies.
Road closures, evac centres, official warnings — pulled through MCP servers (thin mocks for the demo; the integration pattern is the point).
MCP serversFastMCPRanked options, each stamped with who/when or feed/fetched-at, one-tap actions — and a human confirms the match. Resolved cases feed back into workspace memory.
Block KitCoordinator CanvasNative agent surface interprets free text and runs the loop under Slack's trust and bounded-autonomy guidance.
The workspace is the database. Day-one solutions answer day-three problems because every resolved case is searchable.
Official feeds arrive as agent tools. Degraded feeds are declared, never papered over.
No vector database, no embedding index on our side — two thin layers, each doing the one thing it's good at.
The LLM parses your message into a typed Need; we build a plain keyword query from it —
literally "water generator North Exmouth" —
and call assistant.search.context with a
user token. Slack matches server-side and returns relevance-ranked messages with author, channel,
timestamp, and permalink. We trust Slack's ranking as a first pass; its internals are Slack's business.
Pure, deterministic scoring: the match must share a resource word with the need (location words only boost, never qualify — a generator offer "in Exmouth" is not a formula match), plus linear 7-day recency. Agent-directed messages and the bot's own replies are filtered out. The top 5 render with source, timestamp, permalink, and the verify note.
The agent carries an MCPServerStreamableHTTP
toolset pointed at mcp.slack.com/mcp, authorized
with the user token. The LLM gets real workspace tools — search messages, read channels and threads,
manage canvases — which is why replies cite real sources and timestamps instead of inventing placeholders.
Thin FastMCP servers backed by static JSON simulate Main Roads WA closures, DFES advice, and evac-centre capacity. The agent consumes them exactly like Slack's MCP server — additional toolsets — so the integration pattern is identical to wiring a real government feed. A downed feed returns a structured error, not silence: that's guardrail 04 implemented at the protocol layer. No live feeds are claimed in the demo.
The search bar is classic interactive search (modifiers, pagination, UI). assistant.search.context is agent-built: clean structured payloads meant for LLM context.
The agent API returns public channel content only — it ignored offers sitting in a DM while classic search saw them. Post offers in channels.
Both run as a user. Your search bar = you; the agent's recall = the authorized user token. Visibility scopes to what that user can access.
The search bar ranks for browsing. Our pipeline re-ranks for the crisis domain: need-fit first, recency second, noise dropped.
Disaster coordination is high-stakes. These are product requirements, version-controlled in the system prompt and pinned by CI regression tests.
The agent surfaces and ranks. Every actionable match ends at a confirmation button — never an automatic action.
It will not say a road is safe or make a placement call. It points at official sources with a verify before relying on this note.
Every item carries who/when (workspace) or feed/fetched-at (external). Trust is shown on screen, not implied.
A feed that's down is named. Empty results are stated. The agent never goes quiet and never fills gaps with guesses.
Five-week plan to the July 13 deadline. Shipped via an agent-team pipeline — SWE implements, Tester verifies with evidence, every guardrail change re-checked, every milestone verified live in the sandbox.
Sandbox provisioned, app scaffolded (Bolt + pydantic-ai), installed and verified live: reply, reactions, feedback buttons end-to-end.
Deployed always-on and judge-accessible — one Docker image on a free-tier GCE e2-micro, with the official-directories MCP server kept warm over HTTP inside the box (no cold per-reply spawn). v1.0.0 tagged; the Devpost write-up drafted and truth-checked against the live app; live screenshots in; this field-guide page itself ships on GitHub Pages. Remaining: record the 3-minute video and submit on Devpost.