CLIENT WORK — PRODUCTION
Watch Catalogue Operations Hub
A 240-variant watch collection composited in under 5 minutes — and a hub any successor can pick up cold.
AT A GLANCE
- STATUS
- PRODUCTION
- TIMELINE
- 2026-05 — 2026-05 · 16 DAYS
- LANGUAGES
- Python / AutoHotkey / Markdown
- CATEGORY
- CLIENT WORK
RENDERS DELIVERED
OUTCOME
Delivered ~290 renders across 4 collections; a 240-variant collection now composites in under 5 minutes, and the client re-engaged after a 14-month gap with zero discovery phase.
METRICS
M.01 — RENDERS DELIVERED
Finished catalogue renders across 4 watch collections (2024-25), transparent-background, 2600×4000 px and above. Sum of per-collection folder labels (12 + 10 + 240 + 28); the largest batch has ~209 image files vs its 240 label — see source.
M.02 — LARGEST SINGLE COLLECTION
One collection automated end-to-end via the Python batch-render and compositor pipeline
M.03 — FULL-COLLECTION COMPOSITOR RUNTIME
Composites the full ~240-variant collection once layer PNGs are exported — down from manual work measured in days. Per engagement-history.md.
M.04 — LINES OF PRODUCTION PYTHON
Across the repo's scripts (reference parser, batch renderer, scene utilities); excludes the production compositor script held locally
THE CASE, CHAPTER BY CHAPTER
CH.01
The problem
A Swiss luxury watchmaker (Geneva) needed hundreds of catalogue renders per collection, but every brief was an undocumented code string and the work ran inside a locked-down remote desktop.
Each watch variant — case material, dial colour, diamond setting — needs a studio render at 2600 × 4000 px or larger, and the largest collection runs to 240+ variants. The reference codes pack all of that into one opaque string, and the same variant could appear under three different codes depending on the folder. There was no clipboard access and no documented process.
CH.02
What I built
A documented operations hub that turned an ad-hoc, in-one-person's-head process into a repeatable, auditable pipeline.
A reference decoder maps every code's four positional blocks to render specs, with a Python parser that flags unknown tokens instead of guessing. A workflow layer standardises how jobs arrive, get briefed, and get delivered. A scripted pipeline runs the rendering and compositing — all backed by an engagement history readable cold by anyone who takes over.
CH.03
The automation that pays off
A Python batch pipeline composites a full 240-variant collection in under 5 minutes — work that was previously manual and days long.
An AutoHotkey autotyper types scripts character-by-character into the remote desktop, bypassing the clipboard block. The Blender renderer chains scenes through a render_complete handler and timer, staying stable under heavy Cycles loads where a naive loop deadlocks the UI. A CSV-driven compositor then stacks the case, numbers, and hands layers into finished PNGs, resumable via lock-files if interrupted.
CH.04
Built to survive a handoff
When the contract resumed after a 14-month gap, the full context was available on day one — no discovery phase.
Every fact lives in one Markdown file, tagged Confirmed / Draft / Placeholder so nothing unverified gets promoted silently. The engagement history is a dated audit trail of every rate change, milestone, and open risk. A successor designer can read the hub cold and take over a collection without three weeks of rediscovery.
CH.05
Results and scale
~290 photorealistic renders delivered across 4 collections — and the cost per variant dropped sharply once the automation was in place.
The largest collection ran to ~240 variants, where the batch pipeline made the work cost-efficient; a later collection reused the same scene setup almost for free. 61 documents and 758 lines of Python make up the hub itself — the deliverable that makes re-engagement cheap and any handoff clean.
THE BUILD, WEEK BY WEEK
18 COMMITS — IN 17 DAYS — AVG 1/DAY
FEATURES
| Reference number decoder | Splits any opaque watch reference string into case family, complication, material, and dial/finish — flagging unknown tokens instead of guessing, with confidence tags on every code. |
|---|---|
| Clipboard-free script delivery | Types Python scripts character-by-character into the remote desktop, delivering code into a secure environment that blocks all clipboard transfer. |
| Blender batch-render pipeline | Renders every scene in a file by chaining a render-complete handler and timer, staying stable under heavy Cycles loads where a direct Python loop deadlocks the UI. |
| CSV-driven layer compositor | Reads a variant table and stacks three render passes (case, numbers, hands) into finished PNGs inside Blender's bundled Python, resuming from lock-files if a batch is interrupted. |
| Single-scene variant architecture | Holds every variant in one Blender scene with materials swapped by an embedded script, so one edit propagates to all variants and a successor can take over with no context transfer. |
| Docs-as-code knowledge base | Keeps product knowledge, workflow standards, and client history in one place, tagged by confidence and updated alongside the work, so the engagement resumes after any gap without rediscovery. |
ARCHITECTURE
| Reference knowledge base | Decodes the client's proprietary reference-number grammar and diamond-setting notation; source of truth for all abbreviation lookups |
|---|---|
| parse_reference.py | Lightweight command-line parser that splits a reference string into its four blocks using the same tables as the reference docs |
| SendToRDP.ahk | AutoHotkey autotyper: types a clipboard-loaded text file into the remote desktop session to bypass the clipboard restriction |
| batch_render_all_scenes_ui.py | Blender batch renderer: chains scene renders via a render_complete handler + timer, avoiding UI-thread deadlocks on heavy Cycles scenes |
| CSV compositor (keystroke.txt / batch_render.py) | Reads a per-variant CSV, alpha-composites case/numbers/hands layer PNGs in Blender's bundled Python, outputs finished watch images with lock-file resumption |
| Scripted-scene architecture doc | Blueprint for single-scene multi-variant .blend files: one scene, named collections per variant axis, embedded Python driver, fully manual fallback |
| Engagement history | Dated audit trail of every rate change, project milestone, scope conversation, and open risk — structured for cold readability across multi-month gaps |
STACK
SKILLS DEMONSTRATED
Turning manual, repetitive production work into Python batch automation · Decoding undocumented client systems into clear, shared references · Building knowledge bases that survive handoffs and multi-month gaps · Photorealistic 3D rendering for product catalogues (Blender, Cycles) · Blender Python scripting (batch rendering, layer compositing) · Working inside locked-down, security-constrained client environments · Designing briefing, delivery, and audit-trail workflows for solo client work
THE CODE, MAPPED
72 NODES · 45 EDGES · 40 COMMUNITIES — EXTRACTED FROM THE CODEBASE BY TREE-SITTER
