Test&Tag A Yonder Tech product

Shipped product · iOS, Android, web

Test and tag, end to end.

An offline-first phone app the technician carries round a site, an admin console the office runs the business from, and one API behind both. Every tag, failure and photo ends up in a report a client can rely on.

Today's tasks on the phone: one site assigned, 0 of 10 tagged.
The Tag screen: asset ID range readout, item chips, quantity, location, and Pass and Fail actions.
Recording a failure: reason, required photo and a note.
Apps
3
Phone, console, API
Shared domain package
1
So they can’t disagree
API endpoints
54
Fastify + Prisma
Tests passing
190
Domain, app and a full workflow run

01 — The field app

Built for a technician with a tester in one hand.

Expo and React Native, one codebase for iOS, Android and the web. Big targets, hold-to-confirm on anything that commits, and a dark instrument readout that stays legible in a plant room.

  1. Sign in with technician code and a four-digit PIN.

    01Sign in with a PIN

    Technician code and four digits. Anything already on the device stays queued while signed out.

  2. 02Today’s sites

    Only published jobs reach the phone — publishing is a separate, deliberate act in the console.

  3. 03The job brief

    Window, contact, floor plan and the previous work at this address, before a single tag is written.

  4. 04Tag in ranges

    A barcode range, an item, a room. Ten identical leads are one action, not ten.

  5. 05Fail with evidence

    A reason and a photo are required, so every failure in a report can be shown, not just stated.

  6. 06Records by room

    The day grouped by area, runs collapsed, failures and photos marked at a glance.

  7. 07Sync when there’s signal

    Records and photos wait on the device. Syncing twice is harmless; nothing is lost if the app closes.

02 — The office console

The business, run from one screen.

Vite and React, installable as a PWA. Schedule and publish jobs, import client registers, watch records arrive, and issue reports that are archived rather than regenerated.

Console overview: scheduled today, under way, unpublished drafts, sites overdue, today's jobs and recent imports.
What needs doing today: jobs under way, drafts not yet published, and sites that are overdue for a retest.

03 — Registers as they really are

A parser built for the spreadsheet clients actually send.

Client registers are kept by hand. Reading them literally loses most of the information, so the import reads them the way a person would — and one sheet becomes the asset register, the last inspection and the next visit at once.

  • Header blockThe table starts several rows down, under a heading block.
  • Blank means “same”The Location column is only filled in when the area changes; a blank means the room above.
  • No pass/fail columnThe verdict is prose in Comments — “Fail - Cracked case” — and a blank comment means it passed.
  • Merged headingsHeadings are merged across the table, so a naive reader sees the site name once per column.
  • Two dates, one line“Checked date … Recheck date …” sits in a single cell.

04 — How it’s built

One monorepo, one domain, three front doors.

ID-range expansion, run collapsing, area grouping, retest arithmetic and the Excel parser all live in one shared package — down to the colour palette — so the phone, the console and the server cannot disagree about what a record means.

apps/mobileField appExpo · React Native · offline queue
apps/adminConsoleVite · React · installable PWA
apps/apiOne APIFastify · Prisma · PDF reports
packages/sharedShared domainTypes · tag logic · register parser · design tokens
DataPostgres in production, the same schema on SQLite for development and tests
HostingConsole on Netlify · API in a container on Fly or Railway, with a volume for photos and issued reports
  • 190tests passing, including one that drives the whole business through HTTP — sign in, import, publish, sync twice, report.
  • 1schema on two databases, so nobody needs a database server to work on it.
  • 3platforms from one React Native codebase: iOS, Android and the web.

Need something like this for your field team?