labels.gf.cx Β· print cockpit

One bookmark for everything that needs printing across the gf.cx and dogwood stacks. Small to super-large β€” 50mm QR labels, A1 service-design maps, 48-inch photographic prints, dogwood-branded apparel and cards. 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 so the scope is visible at a glance.

50 mm β†’ A4 / Letter β†’ A1 maps β†’ 48β€³ photo β†’ apparel Β· cards
β€” 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…

Stickers Β· hang-tags Β· brand assets

Non-record-keyed branded printed assets. Different from svc/found tabs (which need a record to render a label) β€” this is for generic brand output: Dogwood logo stickers (vinyl, 50mm round, for laptops / mailers / promo), gf.cx kicker stickers, audrey monogram seals, Dogwood retail hang-tags (T-shirt / tote / postcard tags with brand + size + price + care), gift labels, custom-art one-offs.

Workflow: pick an asset type β†’ pick a template β†’ fill in fields (where applicable) β†’ live preview β†’ print local or order POD.

Source
Asset library at assets.gf.cx/stickers/ + assets.gf.cx/hang-tags/ β€” SVG masters with per-template metadata (suggested sizes, paper type, intended use). New templates added by dropping SVG + metadata into the library.
Controls
Asset type picker (sticker Β· hang-tag Β· gift label Β· custom) β†’ template picker (Dogwood logo Β· gf.cx kicker Β· retail hang-tag Β· audrey monogram Β· …) β†’ form fields (per-template, e.g. hang-tag needs product name + size + price) β†’ size mm presets β†’ material (vinyl Β· paper Β· cardstock Β· waterproof) β†’ quantity β†’ sheet-layout view
Render path
Live preview per template with form-field substitution; sheet-layout view for quantity printing; QR-overlay option (re-uses the shared QR generator) for trackable hang-tags
Output path
Local print (vinyl sheets / cardstock) for small runs Β· POD via Pwinty/Prodigi for bulk (β‰₯ 25) β€” cred already in 1P as Prodigi svc.gf.cx API
First candidate
Dogwood logo sticker β€” 50mm round, vinyl, qty 25 β†’ Pwinty sandbox β†’ verify end-to-end β†’ first real Dogwood marketing stickers
Est. effort
~4-5 hours. Template library is the heavy lift; the form + render is straightforward.

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.

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 labels.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.