Inspiration
My family has actually sat in those plastic chairs at 7am. Not hypothetically. Actually filling out the wrong form three times, getting passed between offices, then discovering the program closed enrollment last Tuesday.
The safety net is real — Section 8, SNAP, WIC, Medicaid, legal aid. These programs work. But accessing them? It's a maze. Fragmented websites, English-only forms written in bureaucratic jargon, zero coordination between agencies.
A single mother earning $1,800/month likely qualifies for 4-6 programs. She doesn't know that. Her caseworker probably doesn't either. Speaks Spanish? Finding translated forms is nearly impossible.
We built CivicMesh because the safety net shouldn't require a PhD to navigate.
What It Does
You open CivicMesh. You type in whatever language, whatever your situation:
"Soy madre soltera con 2 niños en Houston. Gano $1,800 al mes y necesito ayuda con vivienda."
In under a minute:
- A 7-walker AI agent evaluates you against 40+ real federal and state programs
- Builds a ranked action plan (not generic suggestions)
- Responds in your language
- Shows you:
- What you actually qualify for
- What documents you need (real requirements, not the ones you don't)
- The right number to call first
No signup. No data collection. No generic "please call 1-800 and wait." An actual plan that respects your time.
How We Built It
The pipeline runs 7 specialized agents in sequence:
Your message
↓
IntakeWalker ──→ detects language, extracts your situation
EligibilityWalker ──→ scores 40+ resources against your profile
NavigationWalker ──→ builds ordered steps
PathfinderWalker ──→ finds multi-step pathways
EscalationWalker ──→ crisis support and appeals
MemoryWalker ──→ saves session, learns from outcomes
CritiqueWalker ──→ evaluates its own reasoning
TranslateWalker ──→ converts everything to your language
Every response includes the complete reasoning — what each agent considered, what it decided, and why. Full transparency.
Three Core Innovations
1. Escape Path Pathfinder — When "you don't qualify" isn't the end. Programs connect to each other. Emergency shelter intake provides Section 8 priority. We map these connections and find multi-step pathways when direct qualification fails.
2. A Graph That Learns From Outcomes — Every eligibility rule tracks success rates. When applications succeed or fail, the system updates:
final_score = (1 - blend) × AI_score + blend × historical_success_rate
blend = attempts / (attempts + 20)
The graph itself learns from real outcomes. No external ML library.
3. Self-Evaluating Agents — After each conversation, the system analyzes its own reasoning and writes a self-evaluation to the graph. Next time, it uses previous evaluations as context. The system learns from its own performance.
Technology Stack
| Component | Technology |
|---|---|
| Language | Jac 0.15.1 (full stack) |
| LLM | NVIDIA NIM (Llama 3.1 8B) + Featherless.AI |
| API | jac-scale (auto-generated REST + WebSocket) |
| Frontend | Jac compiled to React 18 |
| Storage | Graph-native persistence |
| Deployment | Docker on Hugging Face Spaces |
Implementation: Zero hand-written prompts. 69 semantic annotations let the AI read field meanings, not just names. Zero manual API routes — jac-scale auto-registers everything.
Frontend (Five Purposeful Tabs)
- Chat — Conversation with inline reasoning, suggestions, voice input, multilingual
- Graph — Live SVG visualization of walkers, pathfinding, decision explanations
- Action Plan — Ordered steps with estimated annual benefits, status tracking
- Telemetry — Complete call tree, tool usage, self-evaluation timeline
- Impact — Aggregated metrics: people served, approval rates, languages covered
Keyboard-first navigation (Cmd+K), animated landing page, everything pulled live from the graph.
Challenges We Ran Into
JS Object iteration — for k in dict doesn't work in JavaScript. Solution: emit {key, count} pairs instead.
Dictionary conversion — Worked around by accessing properties directly instead of using Object.fromEntries().
JSX comment handling — C-style comments render as text. Restructured comments in JSX blocks.
Bundle scope isolation — Global variables in .impl.jac files weren't accessible in .cl.jac during production builds. Took three deployment cycles to diagnose.
HF Spaces iframe context — Tabs mounted simultaneously caused walkers to spawn before authentication. Fixed with conditional rendering so only active tabs mount.
Accomplishments We're Proud Of
✓ Built a system that actually understands civic program connections (not just binary eligibility)
✓ Implemented outcome-based learning entirely within the graph structure (no external ML)
✓ Created transparent AI reasoning — every decision shows its full work
✓ Delivered multilingual support (language detection + real-time translation)
✓ Made it work on Hugging Face Spaces free tier (16GB RAM, no credit card needed)
✓ Zero hand-written prompts (69 semantic annotations instead)
✓ Auto-generated API routes and documentation
What We Learned
Graph-native thinking works. walker + visit + here + typed edges creates control flow that feels natural. Idiomatic patterns reduced code by 30-40%.
Semantic annotations beat prompts. Documenting field meanings gets better AI results than writing prompts.
The safety net is fundamentally a graph problem. Programs connect to programs. Eligibility cascades through rules. Outcomes inform future scoring. Jac's design made this executable.
What's Next for CivicMesh
- Direct API integration — Connect to state SNAP and Section 8 APIs for pre-filled forms
- Caseworker review mode — Navigate review and approval before submission
- Mobile-first PWA — Optimize for smartphone-only users
- Geographic proximity ranking — Use address data for zip-code distance sorting
- Verified outcomes — Link application status to actual follow-ups for validated impact metrics
Built for people navigating systems that weren't designed for them. Free to use. Completely transparent.
Log in or sign up for Devpost to join the conversation.