# Undox: approval-gated data-broker opt-outs on TrueForge

> Source: <https://dev.to/manasdutta/undox-approval-gated-data-broker-opt-outs-on-trueforge-219m>
> Published: 2026-08-29 15:50:16+00:00

People-search sites still republish names, addresses, phones, and dates of birth. Opting out is tedious, easy to mess up, and basically irreversible once you hit Submit.

For the WeMakeDevs × TrueFoundry × Qodo agent-harness hackathon, I built **Undox** — a TrueForge agent that does the annoying work carefully, then **stops** until a person allows the exact payload.

**Live demo:** [undox.vercel.app](https://undox.vercel.app/app?session=demo-test-2)

**Repo:** [github.com/manasdutta04/undox](https://github.com/manasdutta04/undox)

**Connect MCP (paste-ready):** [undox.vercel.app/app/connect](https://undox.vercel.app/app/connect)

Privacy products exist because this workflow is painful. An agent that “just submits” is worse than no agent. We needed a harness that:

Chat summaries don’t count. Tool JSON and a dashboard do.

Undox is a TrueForge orchestrator wired to a custom HTTP MCP server (`undox-tools`

):

| TrueForge piece | How we use it |
|---|---|
MCP tools |
`find_*` → `run_sandbox_prepare` → approval-gated `submit_opt_out` ; plus `get_session_state` / `get_exposure_dashboard`
|
Sandbox + skills |
Broker prepare scripts (`prepare_runtime: sandbox-script` ) |
Approval |
Submit requires human Allow on the exact fields |
Subagents |
`dynamicSubAgents` + parallel tool fan-out fallback |
Sessions |
File store keyed by `session_id` — survives TrueForge restart |
Status UI |
Next.js dashboard on Vercel; same store as MCP on Render |

Demo brokers **PeopleFind** and **Clearbook** are fixtures (no live CAPTCHA on stage). Spokeo uses real URL mapping; submit stays **mock**.

The agent isn’t “one mock function + a chat UI.”

Kill TrueForge, restart, reopen the same `session_id`

— statuses are still there. That’s the Double-O story: durable harness state, not a one-shot demo.

Judges (and you) can walk the seeded session without cloning:

**Exposure → Brokers → Approval → Connect**

Session: `demo-test-2`

`web/`

)
`/mcp`

`undox-demo-public`

(mock submits only)Render free tier sleeps — first hit after idle can take ~a minute. Ping `/healthz`

before a live demo.

Every substantive change shipped as a PR with `/agentic_review`

. Qodo caught real issues — auth edges, stale UI after failed loads, CSS specificity bugs — and we fixed High/Medium before merge. CI also runs `typecheck`

, `test`

, and `prove:heart`

on every PR.

That mattered more than polish: the approval path and session store had to be trustworthy on camera.

Built with TrueForge. Reviewed with Qodo. Submits stay mock on purpose.

Thanks for reading — if you try the Connect paste, tell me what broke first. That’s usually the most useful review.
