You never fill a form again. Your agent does, and when it doesn't know something, it just texts you.
- User side (register, get your agent): https://storm-dominant-efficiency-charms.trycloudflare.com
- Company side (the WOKO application, a separate page the "institution" runs): https://storm-dominant-efficiency-charms.trycloudflare.com/apply
- WhatsApp simulator (if not using real WhatsApp): https://storm-dominant-efficiency-charms.trycloudflare.com/phone
These URLs are a cloudflared tunnel to the demo laptop and change if the tunnel restarts.
Every user gets a personal AI agent (living in WhatsApp) with a growing "LLM wiki" about them. Every company hosts a counterpart agent that knows its own forms and requirements. To apply anywhere, the user hands over one token — the two agents negotiate, fill the real PDF forms, and only interrupt the human for facts nobody has ever recorded.
Built at Beyond the Form (AI Hackathon, Student Project House, ETH Zürich, July 2026).
Slogan: Say it once. We'll say it everywhere.
# needs Python 3.10+ with OpenSSL (the LLM gateway requires TLS 1.3 —
# Apple's system python3.9/LibreSSL fails with "tlsv1 alert internal error")
python3.13 -m venv .venv && .venv/bin/pip install -r requirements.txt
cp .env.example .env # paste the team LLM key (works without one too — mock mode)
./run.sh # generates the demo form PDF + starts http://localhost:8000The landing page at / is a scroll-through presentation built from web/. The built assets live in static/landing/ and are committed so the demo runs without Node. To rebuild after editing the frontend:
cd web && npm install && npm run buildFor local frontend development with hot reload (backend must be running on port 8000):
cd web && npm install && npm run dev # → http://localhost:5173Public URL (needed for the Twilio webhook, nice for phones):
cloudflared tunnel --url http://localhost:8000 # or: ./run.sh --tunnel/— scroll through the story, then register with a phone number → agent greets you, you get a token (PXF-XXXX)./phone(on the demo phone, or real WhatsApp if Twilio is configured) — paste the contents ofdemo/about_me.txt. The agent saves the facts to your wiki. The blob deliberately omits the move-in date and room preference./apply— the WOKO page (its own standalone page, played by the "company"; not linked from the landing page). The scary 16-field housing form. Paste the token instead./theater?s=…(opens automatically — put this on the projector) — the two agents negotiate live. When the personal agent hits the planted gap, the phone buzzes.- Reply something like “Move in on 01.09.2026 — single room in Oerlikon!”
- Finale: the completed, filled PDF appears. 16 fields filled, 2 answers typed, 0 forms seen.
- Twilio Console → Messaging → Try it out → WhatsApp sandbox.
- From the demo phone, send
join <sandbox-code>to the sandbox number. - Put
TWILIO_ACCOUNT_SID/TWILIO_AUTH_TOKENin.env, restart. - Set the sandbox "When a message comes in" webhook to
https://<your-tunnel>.trycloudflare.com/webhook/twilio(method POST).
Without Twilio credentials everything runs against the built-in WhatsApp simulator at /phone.
User ──WhatsApp/Twilio (or /phone sim)──► Personal Agent ◄──A2A loop──► Company Agent
│ │
user wiki (facts, company wiki (rules,
grows every chat) required fields, form)
└──► pypdf fills the real
AcroForm PDF (out/*.pdf)
app/agents.py— the agent-to-agent negotiation loop; pauses on unknown facts, asks the human on WhatsApp, writes the answer back into the wiki (asked once, known forever).app/forms.py— fills any AcroForm PDF. Works on real IRS forms too: their field semantics are extracted from the embedded XFA captions (see PLAN.md).app/llm.py— hackathon gateway (gpt-5.4-mini); with no key, a deterministic mock runs the same flow (also the on-stage emergency fallback).static/theater.html— the live agent-conversation view (SSE), paced for an audience.
Demo data only — no real personal data (see house rules).