Feature Map · As-Built

The Project POV

Underground utility work, tracked from the trench to the invoice — every capability the platform ships, laid out the way a site plan lays out a job.

Sheet1 OF 1
Rev80123f7
ScaleNTS
StackNext.js 16
N SITE PLAN — FEATURE ARCHITECTURE
SCALE
SITE BOUNDARY — ADMIN & SECURITY GOVERN EVERYTHING WITHIN SMS field texts in EMAIL forwarded logs in RESOLVER job · code · crew match PROJECTS owner · client contractor · alias LOCATE TIX USA 811 compliance LABOR CODES price book CSV in/out WORK LOGS crew · codes · photos the record of what ran CREW & SUPERVISORS roster · invites INVOICING PDF · Excel generate · copy PROJECT FILES same-origin preview every browser XERO — easement — GMAIL SWEEP ADMIN — company status · SMS-readiness · invites SECURITY — CSP · encryption at rest · rate limits
Two service entries — SMS and email — converge at a resolver that matches the message against a project (by name, office-maintained alias, or the company attached to it), then a labor code and crew member. From there it becomes a work log, which is what every other structure on the plan hangs off. Not every message becomes a work log: a roll call or a rained-off day is recorded as a day report instead, and photos attach to the log they belong to. Xero and Gmail sit outside as an easement: optional, not load-bearing. Admin and security run the boundary around the whole site.
Service entry — SMS / email
Site boundary — governs everything inside
Core structure — a first-class feature area
Easement — optional third-party integration
FIELD NOTE "Send it the way you'd write it on a ticket — date, who it's for, the run. It reads that, reads a locate ticket, and asks if something's unclear."
ZONE 01

Service Entry — Field Intake

Where work enters the system. No app to open — a work log is a text message or a forwarded email, read the way the field actually writes it. The formats crews send are listed at /formats.

MarkFeatureWhat it does
SMS-01Documented format"LOG" + locate ticket + labor codes + crew, parsed deterministically — no LLM in the parsing path.Live
SMS-02Crew's own formatA date-led message with a measured run or a known job name is read as a work log too, then normalised into the same parser.Live
SMS-03CorrectionsReply "DATE: 8/19" or "JT-01 150" to fix one field on a pending draft without retyping the whole log.Live
SMS-04Approval repliesYES/NO against a short code saves or discards the draft the system read back.Live
SMS-05Disambiguation questionsAn unknown labor code, project or locate ticket comes back as one ranked question a sender answers with a single letter, so the rest of the message is held rather than lost.Live
SMS-06Phone activation gateNothing parses until the number is verified and tied to a company. One identical reply for every rejection reason, so a stranger can't fingerprint the system — and it carries the address where a supervisor can register the number themselves.Live
SMS-07Opt-out & helpSTOP/START honoured immediately; HELP replies with the format, once.Live
SMS-08Site photosPhotos attach to the work log they belong to, whether they arrive with it or as their own message straight after it — which is how a phone actually sends a batch of ten. The reply says how many were kept.Live
SMS-09Day reportsA roll call, a named absence or a rained-off day is recognised as a report in its own right, recorded against the day it covers, and answered — without inventing a work log or marking anybody present.Live
SMS-10Reads back what it understoodWhere a name or code is read as something slightly different, the confirmation says so on its own line above the YES, so the substitution is approved by a person rather than assumed.Live
EML-01Email work logsThe same grammar, read from a forwarded or sent email body — one parser for both channels.Live
EML-02Gmail project sweepA connected mailbox is scanned for new projects and their attachments, surfaced as candidates rather than filed automatically.Live
EML-03Candidate reviewApprove or reject swept project candidates in batches from the Gmail integration page.Live
ZONE 02

Main Structures — Core Operations

What every work log ultimately connects to — the projects, prices, people and paperwork a contractor already runs a job by.

MarkFeatureWhat it does
PRJ-01ProjectsOwner, prime client, contractor, and up to two subcontractors per project — the chain a text can be filed against.Live
PRJ-02Also Known AsOffice-maintained alias list per project, for the client or site name the field actually says out loud.Live
LOC-01Locate ticketsUSA 811 fields — status, address, utility type, marked/cleared dates, clearance proof.Live
LAB-01Labor codes & setsPer-company price books; import or export the whole set as CSV.Live
WLG-01Work logsDate, crew, labor codes with quantities, description, photos — one record per shift on one job.Live
WLG-02Crew clockTime-based crew reporting layered onto the same work-log records.Live
INV-01InvoicingGenerate an invoice from a date range of work logs; export PDF or Excel; copy an existing invoice.Live
CRW-01Crew & supervisorsBulk-add a crew from a pasted roster; invite and assign supervisors per project.Live
FIL-01Project filesUploads stream through a same-origin proxy, so PDFs and images preview in every browser — including Brave with Shields up.Live
APP-01Install on a phoneInstalls to a home screen and opens like an app. A scannable code and the per-platform steps are at /install.Live
APP-02Account coloursAdministrator, the four company roles and supervisor each carry their own colour and label wherever accounts are listed, so a prime client and a second-tier subcontractor are told apart at a glance.Live
ZONE 03

Easement — Integrations

Optional connections to systems the contractor already uses. Nothing above depends on these being configured.

MarkFeatureWhat it does
XRO-01XeroOAuth-connect a Xero organisation; sync generated invoices to it.Live
GML-01GmailOAuth-connect a mailbox for the project sweep in Zone 01; tokens are encrypted at rest, never stored in plain text.Live
ZONE 04

Site Boundary — Admin & Security

What governs the whole site rather than one structure on it — who can log in, who's suspended, and what a compromised script can't do.

MarkFeatureWhat it does
ADM-01Company controlSuspend a company with a required reason; every SMS and login checks the flag before doing anything.Live
ADM-02Supervisor controlSee who can actually text in at a glance; verify or unlink a phone; trigger a password reset.Live
ADM-03Filters everywhereEvery admin and project list — companies, projects, supervisors, members — filters by role, status, or SMS-readiness, with a card/list toggle.Live
ADM-04InvitesInvite a company or a supervisor by email; track pending invitations.Live
ADM-05Turned awayNumbers that have texted work in without being registered, grouped with how often they tried and what they last sent — so the office can tell who is trying to file and chase them.Live
ADM-06Action logSuspensions, company edits, phone verifications and unlinks, and password resets are each recorded with who did it, to whom, why and when. Append-only.Live
ADM-07Daily digestA once-a-day summary per company of what was filed and what is still waiting to be approved. Built, and currently sending to nobody — it stays off until you ask for it and say who should receive it.Off
SEC-01Security headersCSP, HSTS, frame-ancestors, nosniff and a locked-down permissions policy on every response.Live
SEC-02Encryption at restThird-party tokens (Xero, Gmail) are AES-256-GCM encrypted before they touch the database.Live
SEC-03Rate limitingPer-address, per-endpoint limits in front of every auth route.Live
SEC-04Runtime isolationThe application runs as an unprivileged user in its container, under memory, CPU and process limits, with a health check the platform can act on and log rotation that cannot fill the disk.Live
AUT-01AccountsCompany and supervisor signup, login, email verification, password reset, multiple email addresses per account.Live
Next.js 16 / React 19app framework
Drizzle + MySQL 8.3data layer
Docker on VPSdeployment
285unit tests, plus 17 e2e specs
Dark / lighttheme, on every page