FormField AI is field-operations software: build a form, dispatch an inspection, send someone out to fill it in, get structured data back. The platform is wider than that one loop, spanning a React web app, a FastAPI backend and worker, an Expo mobile app, a CLI, and an MCP/API surface for automation.
I was a founding engineer and worked full stack across all of it. The web app, the API, the mobile app, the CLI and MCP surface, the E2E tests, and the deployment shape were the parts I owned most.
What I built
- The foundation: the React/Vite frontend, the FastAPI backend and background worker, the local dev scripts, and the routing and shared UI everything else grew from.
- The original ML evaluation workflow, back when that was the product: datasets, a model registry, background evaluations with worker polling and stale-job recovery, image and metadata handling over Google Cloud Storage, and result polling on the frontend.
- Asset and inspection management: asset tables and map views, asset detail and hierarchy, galleries, metadata editors, inspection timelines, and direct uploads from the field.
- The FormField surface proper: form listing, the form builder with conditional logic, formulas, validation and file fields, public form links, version history, saved views, submission imports, and form creation straight from an uploaded photo or PDF.
- Dispatch and scheduling: teams, assignees, recurring schedules, corrective actions, and due dates.
- Dashboards and reporting, including the AI-generated operational insights and the event logs and usage views behind them.
- The platform layer: auth, organisations, invite codes, impersonation, personal access tokens with scoped enforcement, billing and usage limits, webhooks, rate limiting, generated API docs, MCP tools, and a command-line client.
- The Expo mobile app for inspectors in the field: authenticated tabs, camera capture with GPS tagging, secure token storage, and voice input.
Hard parts
Field work is messy, and the software has to absorb that instead of fighting it. Photos, PDFs, half-finished inspections, asset metadata that doesn’t quite fit the schema, someone switching from a laptop to a phone mid-job. The goal was to give all of that enough structure to be useful without making the product feel rigid to the person standing in a field with one bar of signal.
The API was the other half. It couldn’t just be plumbing for our own UI. That meant OpenAPI generation, scoped personal access tokens, webhooks that fail safely, a real CLI, MCP tools, and authorization tests that treat an external script as a first-class client rather than an edge case.
Stack
React, Vite, TypeScript, Tailwind and shadcn/ui, React Hook Form and Zod, TanStack Table, Mapbox; FastAPI, Pydantic, SQLAlchemy and Postgres on Google Cloud; WorkOS for SSO, Stripe for billing, LiteLLM for the model calls; an Expo/React Native app; and Playwright and pytest across the test suites.