est. 2026 · gf.cx workshop · sheet 01

print.gf.cx · everything you print

One bookmark for everything that needs printing across the gf.cx and dogwood stacks. Print is the verb — labels, plastic-tags, apparel, photographs, signs, and service-design maps are sibling outputs of the same workshop, not tabs of one category. Each tab below is its own pipeline: local printing for the small stuff, partner-API ordering (Pwinty, Prodigi, Printful) for the wide-format and POD work. Live tabs ship; planned tabs show their roadmap.

Loading brands…
Vendor
Loading pricing…
— brands QR encodes the numeric tagId URL (denser scan, opaque, re-assignable). Brand list mirrors BRAND_REGISTRY in ~/Code/svc.gf.cx/src/index.ts. Scheme: 1xxx vehicles · 2xxx outdoor power · 3xxx tools · 4xxx leisure. URL hint off = label shows brand only — the QR carries the URL. Roadmap: per-label scan trace + aggregated analytics (sketched in panel below).
— sets · — labels Per-item set = case (50×50) + spine (60×12, for tape backs / jewel-case spines) + spare (35×35, backup case / digital-archive sleeve). All three encode the same QR URL. Records loaded from /api/records; filter by shipment via the Manifest dropdown. URL hint off = label shows brand name only, since the QR carries the URL — cleaner on small physical surfaces. Roadmap: per-label scan trace + aggregated analytics (sketched in panel below).
Loading records…

Plastic-tags · durable substrate

MECCANIXITY 1.5×2.5 inch white plastic hang-tag with integrated one-way locking cable-tie pulled through the eyelet
MECCANIXITY 1.5 × 2.5″ plastic hang-tag · sample Avery 5163 peel-stick label rendered on the tag face · attach via integrated ratchet-tie

1.5 × 2.5" white plastic hang-tags (MECCANIXITY-style) with an integrated one-way locking cable-tie. The goldilocks substrate between paper labels (cheap, indoor, fall apart) and metal-stamped (industrial, expensive, overkill) — rigid enough for outdoor + grip use, ~$0.15/tag at 100-count, and the single-use lock means a tag is hard to swap without destroying it (deters casual tampering).

Use cases: pa.gf.cx equipment (mowers, generators, blower, snowblower, chainsaw — survives the tool shed) · io.gf.cx/found tags (lost-and-found durable attachment, weather-tolerant) · svc.gf.cx outdoor service records (HVAC, valves, breakers) · abbeyroad.gf.cx guest-key fobs (post-booking welcome QR) · asset re-sale theft-recovery stubs (io.gf.cx/asset/<slug>).

Substrate
MECCANIXITY 1.5 × 2.5" pre-cut plastic hang-tag with grommet-eyelet + integrated ratcheting tie. Comparable from Avery / EveryTag / Tach-It. Bulk source TBD (Amazon at retail; AliExpress likely cheaper at 500+ unit).
Phase 1 (no new gear)
Avery 5163-style adhesive labels (1.5×4" trimmed to 1.5×2.5") printed locally → peel-stick onto the plastic tag face. 8 tags per Letter sheet. Validates the workflow before any tooling spend.
Controls
Record-set picker (pa-equipment · io-found · svc-record · abbeyroad-key · custom-slug) → sheet config (Letter 2×4 / A4 3×4) → per-tag content: kicker + name + QR + URL fallback → brand-chip flows through from the active brand · QR-overlay reuses the shared generator
Render path
Sheet-layout view at Avery 5163 dimensions (mm-accurate via @page) · live preview per tag · ⌘P → print to label sheet → peel + stick on the plastic tag faces → attach via the locking tie. Hookpoints (data-tag-id, data-tag-slug, data-qr-url) for re-print history + scan analytics.
Phase 2 / 3 (later)
Direct thermal-transfer onto plastic via Zebra ZD420 (~$300-600, decade-durable, amortized at ~1000 tags) · OR Prodigi/Pwinty POD for higher volumes / resale-tag uniformity (~5× per-unit but no equipment).
First candidate
pa.gf.cx equipment-tagging push (Z665 mower · gas snowblower · pressure washer · chainsaw). Each tag QR'd to pa.gf.cx/equipment/<slug>. Batch of 8 fills one Letter sheet — efficient against the per-sheet-vs-per-tag waste curve.
Resume trigger
Next physical-asset surge that needs durable tags (pa equipment-tagging push OR an io.gf.cx /found/ shipment requiring outdoor-tolerant attachment).
Est. effort
~3 hours for the Phase 1 sheet-layout tool against pa.gf.cx equipment records. The Avery sheet config + brand-chip pass-through + QR generator are all already shipped primitives.

Service maps · A1 documents

Wide-format printed references pinned in the workshop / utility room / panel cupboard. Each map is a spatial or relational diagram of a system you need to reference while your hands are dirty — service network with vendor contacts, electrical-panel circuit map, irrigation zone schematic, MVHR airflow diagram, lawn-equipment maintenance flowchart.

A1 paper (594 × 841 mm) is the sweet spot — large enough to read from across the room, small enough to fit on most workshop walls without dominating. A3 / A2 / Letter fallbacks for smaller spaces.

Source
SVG / Mermaid / hand-authored HTML, served from the relevant Worker (e.g. svc.gf.cx/maps/z665-service-network, pa.gf.cx/electrical/panel-map). Map registry in maps/index.json per Worker. Diagrams version-controlled in git alongside the data they describe.
Controls
Map picker (dropdown grouped by source: pa · svc · uk · audrey) · paper size (A4 / A3 / A2 / A1) · orientation (landscape / portrait) · color profile (full color / grayscale for thermal / high-contrast for poor workshop light) · legend on/off · print scale (fit-to-page vs 1:1 mm-accurate)
Render path
iframe the selected map at chosen paper size (mm-accurate via CSS @page rules). Pure HTML+SVG — no image generation needed. Browser print dialog handles the A1 output natively.
Output path
Local wide-format printer (if owned) · OR Save as PDF → Staples / FedEx Office same-day pickup for one-off A1 prints (cheap, ~$8/sheet, walk-in)
First candidate
Z665 mower service network map. Nodes: John Deere (manufacturer) · N&J Repair (vendor) · annual cadence · parts list with SKUs. Edges: maintenance triggers, escalation paths. Authored as one SVG · ~2hr
Est. effort
~3 hours total to ship the tab MVP with the Z665 map. Each subsequent map = 1-2 hours of diagram authoring.
— variants Six-card POC for external drive-by signage — Prodigi yard signs (corrugated + aluminium), US-fulfilled, 72hr production, double-sided. Cards are scaled mockups at the real aspect ratios (landscape for road-side readability). Each "Test in sandbox ↗" hands the SKU off to sandbox.gf.cx/print/ with the order-spec prefilled. Headline / Subhead inputs override the sample text across all cards — useful for testing one phrase against every size. Prices shown in USD (≈ from Prodigi's GBP wholesale display · they're UK-based, multi-currency via API). Confirmed wholesale: 12×18 corrugated ≈ $12, metal 18×24 ≈ $57. Mid-sizes TBD on first sandbox order — sandbox returns the authoritative US-fulfilled USD price. Hookpoints: data-sign-sku · data-sign-size · data-sign-material.

Large-format photographs

Selected images from the Audrey photo library and the gf.cx / pa.gf.cx / audrey-archive substrates → photo-grade print partners for fine-art paper, canvas, framed, metal, acrylic. Scale ladder: 8×10″ desk-print · 11×14″ small wall · 16×20″ standard wall · 24×36″ statement · 36×48″ centerpiece.

This is the highest-quality-bar tab on the cockpit — color reproduction, paper choice, ICC profile matter. Browser-side soft-proofing before commit prevents the "print arrived wrong color" round-trip.

Source
R2 bucket of print-ready masters (TIFF / 16-bit, sRGB + AdobeRGB variants) at r2://gfcx-print-masters/. Per-image sidecar JSON: native aspect ratio, recommended max size, ICC profile, color notes, photographer/era tags. Curated subset of the broader Audrey library (only print-grade images live here).
Controls
Image picker (thumbnail gallery, filter by tag / era / aspect) · print size (preset 8×10 / 11×14 / 16×20 / 24×36 / 36×48 / custom mm) · aspect-lock (image-native vs trim to standard frame, with crop overlay preview) · paper / substrate (fine art matte · gloss · canvas · metal · acrylic · framed) · ICC soft-proof preview · quantity · ship-to address-book picker (studio / gift recipient / direct-to-wall)
Render path
Image preview at selected size with crop overlay + soft-proof color simulation (best-effort browser-side via Canvas ICC profile conversion — perfect-fidelity proofing requires partner-side previews). Estimated cost surfacing per partner before commit.
Order path
Prodigi Print API (already wired, cred in 1P as Prodigi svc.gf.cx API) · sandbox first via sandbox.gf.cx/print/ · drop-ship direct to recipient. Alternative partners pluggable per-image: Whitewall (gallery-grade fine art, manual upload), Bay Photo (US Pro), Theprintspace (UK, used previously for dare.co.uk).
First candidate
One curated 16×20″ test print on fine art matte → Prodigi sandbox → verify color reproduction end-to-end → spec sheet captured as feedback_prodigi_color_spec_2026-XX-XX.md
Est. effort
~6-8 hours. R2 binding + image preview UI + soft-proofing + partner API + address-book picker. Most complex tab on the cockpit.

Apparel · cards · dogwood POD

Existing Dogwood / audreyinc product surface — T-shirts, totes, sweatshirts, postcards, greeting cards — managed through this same cockpit instead of jumping between vendor dashboards. Print-on-demand workflow with no inventory, no fulfillment overhead.

Partner candidates already wired: Pwinty / Prodigi (Dogwood account, API enabled — credential in 1P as Prodigi svc.gf.cx API). Alternatives to evaluate: Printful (broader catalog, slightly higher cost), Printify (multiple supplier-network, lowest cost / variable quality).

Source
Dogwood / audreyinc product catalogs (artwork already in Shopify), plus new gf.cx-portfolio creative if it earns the slot
Order path
Pwinty / Prodigi API · order on demand, ships direct to recipient (gift mode) or to studio for fulfillment
First candidate
One sample T-shirt + one greeting-card pack to verify the API end-to-end and confirm POD-vs-Shopify cost delta

Diagnostics · validation, trace, analytics (planned)

Pre-print and post-stick instrumentation. Each rendered label already carries data-qr-url + data-tag-id + data-tag-slug attributes so future scripts can hook in without touching the render code. Today's Test ↗ button is the manual entry point — opens the first label's URL in a new tab for an eyeball check. Below is the planned arc.

Auto-validate all
One click → fetch every unique data-qr-url in the active tab (HEAD request, sibling-origin so CORS is open) → render a colored dot on each label (✓ green = 200, ⚠ amber = 3xx, ✗ red = 4xx/5xx/network). Pre-print sanity check that no label ships pointing at a 404. ~2 hr.
Trace · per-scan event log
When a tag is scanned in the wild, log to KV: timestamp, CF geo (city / ASN / colo), user-agent, referrer, tag-id. Hashed-IP for privacy. Surface = small "last scanned 14h ago · Doylestown PA" line on each tag's record page. Closes the loop: you know your labels work because you see them being used. Wire-in point: each Worker's slug-resolver route prepends a KV write before serving the response. ~3 hr per Worker.
Analytics dashboard
Aggregated view of the scan log — which labels get scanned most, when, where (anonymous geo heatmap), drop-offs (printed but never scanned = candidate for re-positioning / re-printing). Sibling surface to pa.gf.cx/service-records/ — could live at print.gf.cx/analytics or merge into the operator dashboard. ~6 hr after trace lands.
Re-print history
Track WHICH tag-set was printed WHEN, so a lost label has a paper trail ("Z665 deck label originally printed 2026-05-12, replaced 2026-08-04 after sun-fade"). Could surface as a small "last printed" sub-line per tag in this cockpit. ~2 hr.
Hookpoints today
data-qr-url = the URL the QR encodes · data-tag-id = svc numeric id where applicable · data-tag-slug = canonical slug. validateTab(tabId) is the seed function — extend to validateAllTabs() + traceScan(tagId) + analyticsForTag(tagId) as each feature lands.