Service records
At a glance
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.
/deere) are friendly aliases. Email-auth challenge on first visit (30-day session)./tape-1992-wedding). Manifests at /manifests/<id> for batch shipments.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.~/Code/io.gf.cx/scripts/tag-preview.html
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.
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.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./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.sandbox-beta-dashboard.pwinty.com (vendor sandbox)
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
| Slug | Title | Type | scan → |
|---|---|---|---|
| z665 | John Deere Z665 EZtrak | equipment | open ↗ |
| x350 | John Deere X350 | equipment | open ↗ |
| pool-pump | Pentair IntelliFlo VSF | equipment | open ↗ |
| pool-heater | Hayward HeatPro HP21404T | equipment | open ↗ |
| pool-disconnect | Pool electrical disconnect | infrastructure | open ↗ |
| septic-tank | Septic tank | infrastructure | open ↗ |
| lr4 | Land Rover LR4 2011 | vehicle | open ↗ |
| f250 | Ford F-250 2007 | vehicle | open ↗ |
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.cxandio.gf.cx/foundnow serve via wrangler-managed routes in each repo'swrangler.toml. One-line swap target for any future rename. - ✅ CF Access on svc.gf.cx (2026-05-27). Application
svc.gf.cx — owner onlywith policyOwner· include emaildan@gf.cx· session 730h (30 days). Created via theCloudflare portfolio Access apps-edit1P token + CF API. Email-OTP challenge on first visit; cached session thereafter. App ida485ce6d-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+getsnapshot script in ~/bin.
🟡 Workflow / UX2 open · 1 done
- ✅ Mobile entry form for svc (2026-05-27).
GET /<slug>/addrenders mobile-first form (native HTML5 date/number/textarea, 44–52px tap targets, brand-green submit, dark-mode readable).POSTappends 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 →" tosvc.gf.cx/<brand>+ "Scan-bridge →" toid.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_REGISTRYin 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 /healthreturns{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 atsvc.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/mlogicbrand entry - Source repos:
~/Code/svc.gf.cx/·~/Code/io.gf.cx/·~/Code/toolkit/web-assets/(assets.gf.cx) — deploy vianpx 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