Substrate · operator dashboard · service-records + lost-and-found stack

Service records

Operator control panel for the three sibling Workers — svc.gf.cx (Access-gated, brand-keyed service logs), io.gf.cx/found (public lost-and-found with reward + return), and id.gf.cx (asset-keyed scan-bridge from sticker → canonical home.gf.cx record + service-entry form, built 2026-05-27). Rolled-up counts pulled from all three APIs. Action launcher hands off to where each verb lives (write manifest · edit/add service entry · scan-to-log via id · print labels · order labels). Read-me + gap-list doubles as the stack's running TODO.
At a glance
svc records
loading svc.gf.cx…
found records
loading io.gf.cx/found…
id assets
8
baked manifest — seeded 2026-05-27
shipments
loading manifests…
page generated
your local browser time
Surfaces · live URLs

Where the stack actually lives. Custom domains svc.gf.cx + io.gf.cx/found are both bound and serving as of 2026-05-27. Tag-preview pages are local-only — they open from disk because they're authoring tools, not production surfaces.

svc.gf.cx · access-gated
Service-record router
svc.gf.cx
Per-brand service logs. QR labels carry numeric tagIds (1xxx vehicles · 2xxx outdoor power · 3xxx tools · 4xxx leisure). Slug URLs (/deere) are friendly aliases. Email-auth challenge on first visit (30-day session).
io.gf.cx/found · public
Lost-and-found resolver
io.gf.cx/found
QR on a sent-out item → public page with contact + reward. Slug URLs (/tape-1992-wedding). Manifests at /manifests/<id> for batch shipments.
id.gf.cx · scan-bridge
Asset-id router
id.gf.cx
Sticker on a piece of equipment → id.gf.cx/<slug> opens phone-optimized summary + add-service form. KV inbox at /api/queue (Access-gated /api/*). Seeded with 8 assets: z665, x350, pool-pump, pool-heater, pool-disconnect, septic-tank, lr4, f250. Bridges scan → canonical home.gf.cx record.
tooling · local-only
Tag-preview pages
~/Code/svc.gf.cx/scripts/tag-preview.html
~/Code/io.gf.cx/scripts/tag-preview.html
Browser-rendered QR label sheets. Open from disk, print → PDF or thermal printer. svc = 1-up grid; found = 3-label sets (case · spine · spare) per item, filterable by manifest.
manifest · printable
Latest shipment
io.gf.cx/found/manifests/2026-05-27-brooklyn-tapes
Family video archive → TapeMaster Digitization. Print → PDF, drop one copy in the box + email a copy to the recipient ahead of arrival.
patterns.gf.cx · portable patterns
Portable patterns
patterns.gf.cx
Curated, design-friendly view of operating patterns from this stack — developer-facing companion to kb.gf.cx (your Memory Archive). Seed entry (2026-05-27) is the Read-me · status of the stack pattern — same R/Y/G + collapsible structure used on this page, codified for reuse.
Action launcher

This page is a launcher — actions live on their owning surfaces (svc.gf.cx, id.gf.cx, io.gf.cx/found, local tag-preview files, code-edit locations). The cockpit iframe below is the one exception that actually surfaces live work inline — every other card is a hand-off link to where the verb lives. Each card's kicker badge signals state: live ready to use, code-edit requires editing source + redeploy, not yet wired placeholder for future build.

cockpit · latest shipment manifest
open standalone ↗
code-edit manifest · write
Write a new manifest
~/Code/io.gf.cx/src/index.ts → MANIFESTS
Add a new entry to the MANIFESTS map keyed by slug (e.g. 2026-06-15-amazon-returns), then add items with matching manifest_id in RECORDS. npx wrangler deploy from ~/Code/io.gf.cx/. New manifest is live at io.gf.cx/found/manifests/<id> ready to print. Future: mobile form on io.gf.cx/found/manifests/new.
live service log · edit
Edit a service record
svc.gf.cx → pick brand → edit ✎ on any entry
Tap the edit ✎ chip next to any service-log entry → form pre-filled → Save changes (green) or Delete entry (red, with confirm). Mobile-first form, dark-mode-readable, brand-green submit.
live service log · add
Add new service entry
svc.gf.cx/<brand>/add
From any brand page tap the green + Add service entry button. Date defaults to today; notes required; vendor + cost optional. Saves direct to KV; appears in the log immediately.
live scan-to-log · id.gf.cx
Add service entry via asset scan
id.gf.cx/<slug> → fill add-service form
Contractor at the equipment scans the QR sticker → asset summary + add-service form opens. Submission lands in the id.gf.cx KV inbox (/api/queue, Access-gated). Differs from svc/found: asset-keyed (not brand- or shipment-keyed) and phone-optimized for at-the-equipment use. Bridge surface — home.gf.cx canon is one click away via "Open canonical record →" button.
live print cockpit · small → super-large
Print labels
labels.gf.cx
Universal print cockpit. Tabbed: svc tags (one label per brand, 50mm) · found tags (3-label set per item: case·spine·spare, filterable by manifest) · planned service maps (A1) · photographs (large-format POD) · apparel + cards (Dogwood POD via Pwinty/Prodigi). Each tab is its own pipeline. Replaces the old file:// local-tool surfaces.
not yet wired labels · order
Order labels (POD)
sandbox.gf.cx/print/ (planned)
sandbox-beta-dashboard.pwinty.com (vendor sandbox)
Small self-contained surface on sandbox.gf.cx/print/ wires the Prodigi/Pwinty sandbox API end-to-end before promoting to canonical svc/found tag-previews. Dan has credential in 1P (Prodigi svc.gf.cx API). Discipline: sandbox the print-API functions first — vendor sandbox dashboard at sandbox-beta-dashboard.pwinty.com. Details in feedback_print_on_demand_label_apis_2026-05-27.md.
Library · rolled-up index

All registered items across both workers. svc records are brand-aggregate (one tag per brand); found records are per-item. Refresh the page to re-pull from the live APIs.

svc records loading…

found records loading…

shipments loading…

id assets 8 baked · seeded 2026-05-27

SlugTitleTypescan →
z665John Deere Z665 EZtrakequipmentopen ↗
x350John Deere X350equipmentopen ↗
pool-pumpPentair IntelliFlo VSFequipmentopen ↗
pool-heaterHayward HeatPro HP21404Tequipmentopen ↗
pool-disconnectPool electrical disconnectinfrastructureopen ↗
septic-tankSeptic tankinfrastructureopen ↗
lr4Land Rover LR4 2011vehicleopen ↗
f250Ford F-250 2007vehicleopen ↗
Read-me · status of the stack

Honest gap-list as of 2026-05-27. ✅ 6 of original 23 items resolved this session (svc + found custom domains, CF Access on svc, mobile add form, edit/delete loop, OWNER_CONTACT filled). All 3 production-blockers closed. Three priority tiers: 🔴 production-blocking (do these before claiming the system is "live"), 🟡 lifecycle / UX (gets worse over time without), 🟢 hygiene + integration (silent-failure risks, nice-to-haves). Expand each to see the punch-list.

Production-blocking · all resolved3 of 3 done
  • ✅ Custom domains bound (2026-05-27). Both svc.gf.cx and io.gf.cx/found now serve via wrangler-managed routes in each repo's wrangler.toml. One-line swap target for any future rename.
  • ✅ CF Access on svc.gf.cx (2026-05-27). Application svc.gf.cx — owner only with policy Owner · include email dan@gf.cx · session 730h (30 days). Created via the Cloudflare portfolio Access apps-edit 1P token + CF API. Email-OTP challenge on first visit; cached session thereafter. App id a485ce6d-b110-459b-b82c-820e7dbb223e.
  • ✅ OWNER_CONTACT.phone + .address filled (2026-05-27). Both fields populated in ~/Code/io.gf.cx/src/index.ts. Tap-to-call (212) 960 3201 + mail-back to Dan Sellars · 2996 Sugan Road #11 · Solebury PA 18963. Reward + return loop complete on every io.gf.cx/found item page.
🟡 Data lifecycle3 open · 1 done
  • ✅ Edit/delete UI for log entries (2026-05-27). GET/POST /<slug>/edit/<n> + POST /<slug>/delete/<n> on svc.gf.cx. Edit-chip on every entry. Mobile-first form, brand-green submit, red delete (JS-confirmed).
  • No status field on any record (svc or found). Can't mark "recovered" / "returned" / "sold" / "retired" / "active". Sell the Land Rover → record sits forever, indistinguishable from active.Add status: 'active' | 'archived' | 'sold' | 'returned' to both BrandRecord and FoundRecord. Page templates show status pill.
  • No item photos. Found-page is description-only. Small photo would help finders verify visually + make the page feel less like a phishing attempt.R2 binding on the Worker, image URL field on FoundRecord, <img> in the panel above the description.
  • No KV backup / export. svc log entries are single-point-of-failure in CF KV. One bad write or namespace deletion = data loss.Nightly cron Worker dumps KV → R2 / GitHub repo. Or wrangler kv key list + get snapshot script in ~/bin.
🟡 Workflow / UX2 open · 1 done
  • ✅ Mobile entry form for svc (2026-05-27). GET /<slug>/add renders mobile-first form (native HTML5 date/number/textarea, 44–52px tap targets, brand-green submit, dark-mode readable). POST appends to KV. + Add service entry CTA prominent on every brand page; no CLI required.
  • No email-in pattern. Paste a receipt text into an email to service@gf.cx, parser appends to the right brand. CLAUDE.md flags this as Future.Cloudflare Email Worker route + an LLM call to extract date/vendor/cost/notes from the body. Auto-route by subject prefix or by brand-mention.
  • No reprint tracking. Once a label is printed + stuck, no record of WHERE. Lose the label → no idea which asset is un-tagged.Add a "labels printed on YYYY-MM-DD for brand X · placed on [Z665 deck] [Z665 spare]" log per brand on the svc page itself.
🟡 Cross-surface integration3 items
  • home.gf.cx records ↔ svc.gf.cx records don't cross-link. Both exist; neither knows about the other. Partly mitigated 2026-05-27 by id.gf.cx, which is now the asset-keyed bridge for 8 assets — each id slug links to its home.gf.cx canonical record via "Open canonical record →". Still missing: reverse links from home.gf.cx records back to id.gf.cx/<slug> + svc.gf.cx/<brand>.Each home.gf.cx category record (Z665, LR4, etc.) gets two cross-refs: "View service log →" to svc.gf.cx/<brand> + "Scan-bridge →" to id.gf.cx/<slug>. Reverse on svc side already exists in concept.
  • svc registry doesn't reflect home.gf.cx real inventory. svc has Dan's actual seeded brands (good). But home.gf.cx category records (Hayward heat-pump, Pentair pump, Zoeller, Franklin Electric, etc.) aren't in svc yet. The real "asset library" lives in two places.Add hayward · pentair · franklin-electric · zoeller · levelguard · cress-gas-co to BRAND_REGISTRY in svc.gf.cx, with new tagIds in the right class (5xxx utilities? 6xxx pool?).
  • svc and found use different identifier schemes — numeric tagId for svc, slug for found. Tomorrow-Dan might forget which is which.Document the schism in CLAUDE.md (done in svc, partly in found). Or unify: give found records numeric tagIds too (5xxx for sent-out items, mapping to slug aliases). Decide before the library grows past ~20.
🟢 Operational hygiene4 items
  • No /health or /admin endpoint on either worker. Silent if scraper breaks or KV mis-fires.Trivial: GET /health returns {kv: 'ok', brands: N, manifests: N, deployed: ISO}. Wire into the at-a-glance card row above.
  • No scan-event logging on io.gf.cx/found. If a tape goes missing and someone scans the QR in Newark, you'd never know.KV write per scan: {ts, country, city, ua, slug}. Owner-side admin page (gated, maybe at svc.gf.cx/found-admin) reads from KV.
  • No notification when a found-QR is scanned. Original sketch had this — "scan event → Dan gets a ping." Not built.Worker fires webhook (sms.to / Pushover / Resend email) on first scan per slug-per-day. Sibling pattern to agent.gf.cx alerts.
  • No /api/manifests for adding/editing. Manifest changes need a redeploy. Fine for low-frequency use; no quick-edit path.Lower-priority — code-as-source-of-truth is the design. Revisit only if shipment volume hits 1+/week.
🟢 Tag-physical workflow3 items
  • No thermal-printer driver setup documented. Works via system Print → any printer, but Brother PT/QL or DYMO direct integration not wired.When you commit to a printer: add a section to each CLAUDE.md with the print path + CUPS device name + tested labels stock.
  • Sticker stock choice undocumented. Vinyl outdoor vs paper indoor, matte vs glossy (for QR scanability), adhesive permanence.Suggest: matte vinyl for outdoor/grease (heat-pump, mower, propane), paper for indoor/clean (tape cases, books). Avoid glossy — reflects camera flash, scan fails in raking light.
  • No "test scan before shipping" protocol. Easy to print, stick, and only discover the QR doesn't scan after the item leaves.Discipline: scan every newly-printed label with phone before adhering. Spend 10 sec to save a "lost tape, dead QR" disaster.
🟢 People / governance3 items
  • No multi-user pattern. Only Dan can add svc entries (CLI on his Mac).When Audrey or a household member needs entry access: mobile entry form (above) + CF Access policy allowing additional emails.
  • No backup credentials story beyond 1Password. Single point-of-failure for the wrangler OAuth + future scoped token.Recovery doc: which 1P vault holds the deploy creds, what to do if 1P session lost, fallback OAuth login flow.
  • Custom domains will live in which CF account. Document the ownership chain (cine@gf.cx → Dan Sellars account → svc.gf.cx CNAME).Add to each CLAUDE.md: account email + account ID + zone where the subdomain lives.
Cross-references
  • Refuse / garbage — sibling home.gf.cx category, same template family
  • Sump system — another wet-stack category sibling
  • /technology/mdrive/ — example home.gf.cx record that would benefit from cross-link to a future svc.gf.cx/mlogic brand entry
  • Source repos: ~/Code/svc.gf.cx/ · ~/Code/io.gf.cx/ · ~/Code/toolkit/web-assets/ (assets.gf.cx) — deploy via npx wrangler deploy; pre-push hooks auto-deploy assets.gf.cx
  • Memory: project_svc_gf_cx_qr_router_2026-05-26.md · project_agent_gf_cx_vendor_watcher_module_2026-05-26.md — parked memos for the QR-router umbrella and the vendor-watcher agent module