Door2Door.
The daily workspace for a team out in the field.
What started as a replacement for spreadsheets now runs TDX’s fiber sales operations. Dispatchers follow live shifts, managers assign sites, and agents record visits.
I’m the sole developer: I work with the team on requirements, build the product, and handle releases and support.
Visit Door2DoorOut of the office.
Still in sync.


- 120,000+
- Households engaged since 2023, across both backends
- 88
- Sites neighbourhood-scale canvassing areas
- 1,880
- Agent shifts 4,170 tracked hours
- 56,000
- Audited house edits every change logged with who and when
Production snapshot · October 8, 2026. Current backend counts start in January 2025; households cover the full run since 2023.
One place to run operations
A live agent map, house records, configurable forms and reporting. Salesforce and ArcGIS integrations keep the team’s existing systems connected.
Built for patchy reception
The mobile app saves visits locally and queues them for sync. Agents can see what’s pending or failed before they move on to the next house.
Under the hood / Forms, offline saves and the decisions behind them
When every client needs a different form
A photo for one campaign. A signature for another. Each new rule used to mean a code change, and renaming a field could break a report.
I built versioned forms that admins can publish and assign by site. The browser and server share a validator; reports use stable field keys. Each submission records the form version, and repeated offline requests are counted once.
The engine shipped in October 2026. Adding a signature requirement needed a new field type and tests, without changes to the submission pipeline.
A save bug that only appeared during shifts
GPS updates, syncs and agent edits were competing for SQLite writes. I routed writes through a single helper and kept reads concurrent, fixing the lock contention.

House records, visit outcomes and a running shift timer.

Hours, visits and conversion rates, all in one place.

Pending and failed syncs stay visible to the agent.
Next.js 15 · React 19 · TypeScript · Convex · NextAuth · shadcn/ui · Tailwind · Leaflet · Recharts · Stripe · Vitest · Vercel