Project description
Small food banks and neighborhood groups often have to reconcile three moving lists every morning: requests, stock that may expire soon, and the volunteers available in each area. The matching is repetitive, but a shortage is not something an agent should quietly decide on its own.
QuietRelay prepares that daily plan on the coordinator's computer. It assigns available items in earliest-expiry order and checks volunteer capacity. Straightforward matches are marked ready. If stock is short or no volunteer can cover the area, QuietRelay stops that request and presents the evidence for review.
The coordinator can hold the remaining stock or apply an approved substitute, then undo the choice if needed. The session ledger keeps the earlier decision visible. QuietRelay never sends a message, spends money, or dispatches a volunteer.
How it works
The input boundary accepts a small, fixed schema and synthetic identifiers only. It rejects identity fields, unknown fields, oversized payloads, invalid units, duplicate IDs, and unsupported catalog values. Source identifiers become short per-run handles before planning.
A deterministic Python planner performs the actual allocation. The plan is then bound to a no-argument Strands tool and exercised by a pinned local Ollama model. Because the tool takes no arguments, the model cannot rewrite dates, identifiers, stock quantities, or volunteer capacity while constructing a tool call. The interface displays the deterministic result, not model-written prose.
The React console talks only to a Python server on numeric loopback. The server checks Host and Origin, does not enable CORS, limits request and response sizes, bounds concurrent work, and avoids request logging. Review choices remain in browser memory and disappear on reload.
Built with
- Strands Agents SDK
- Python and Ollama with a pinned Qwen3 model digest
- React, TypeScript, and Vite
- A deterministic FEFO allocation engine
The hardest part
The central design problem was giving the agent useful work without giving a language model authority over facts or real-world actions. A conventional prompt-based workflow would make the model responsible for copying structured records correctly. QuietRelay instead computes the plan deterministically, binds that result to a tool the model cannot alter, and reserves every consequential exception for a coordinator.
The second challenge was making the safety boundary visible without turning the product into a security dashboard. The interface uses plain status labels, a single review path, immediate feedback, and an activity ledger so a coordinator can understand what happened without reading implementation details.
What we are proud of
QuietRelay is a working end-to-end product rather than a chat mockup. The local model is genuinely exercised through Strands, the result is checked against a deterministic plan, and the browser flow covers run, review, approval, audit, and undo. The repository includes reproducible setup instructions, an architecture diagram, and tests for allocation behavior, privacy limits, timeout handling, origin checks, and the integrated endpoint.
What we learned
Agentic software does not have to maximize autonomy to be useful. In community operations, the better boundary is often simple: let the agent absorb predictable coordination work, then surface the few cases where context and accountability matter.
Next steps
The next useful step is a small pilot using synthetic or deliberately de-identified workflows with community coordinators. Their feedback would guide configurable local catalogs and review policies while keeping the same local-only, no-external-action boundary.
Testing instructions
Follow the README to install the locked Python and frontend dependencies, pull the documented Ollama model, and start Ollama on 127.0.0.1:11434. Run uv run python scripts/serve_local.py, open http://127.0.0.1:4173, and select Run local agent. Review the rice shortage, approve the oats substitute, and use Undo to verify that the earlier ledger entries remain visible.
Built With
- python
- strands-agents-sdk
Log in or sign up for Devpost to join the conversation.