Full-stack · Tech lead · Geometry & 3D

I build the parts that have to be correct, not just look right.

Senior full-stack engineer and Tech Lead, eight years in. TypeScript, Ruby on Rails, Node, React and Angular over PostgreSQL and AWS — APIs, background job pipelines and data ingestion built to survive production. I come from geometry that drives a cutting machine, where almost right wastes real material; that is the standard I bring to everything else.

Seam allowance · live bodice front allowance 10.0 mm · max deviation 0.00 mm
sewing line cutting line — seam allowance Every point measured back to the sewing line, every frame.

What I'm hired for

01

Full-stack product work

A feature from an unclear brief to something running in production: API design, data model, front end, tests, deploy. TypeScript with Angular or React, Ruby on Rails, Node, Java or Python behind it — and saying early which part is going to be the hard part.

02

Tech lead & the backend under it

Architecture and technical direction, code review and standards, performance and caching, CI/CD and release reliability. REST APIs, background-job architecture, data ingestion, and LLM pipelines with spend ceilings and circuit breakers so an integration can be left running unattended.

03

Geometry, 3D & browser graphics

The specialty the rest is built on. Three.js, WebGL, Canvas 2D and SVG; offsetting, booleans, self-intersection removal, nesting and tolerance handling — written from scratch when a library's edge cases don't match the domain, and tested against the degenerate inputs rather than the pretty ones.

Production work

Under NDA — described, not linked

Since 2021 I've worked on a pattern-making platform for the apparel industry, most recently as Tech Lead. Its output drives a cutting machine, so the geometry has to be right in millimetres — "almost" wastes real fabric on a real table.

It is a 2D CAD editor in the browser, a geometry and plotting pipeline, a cut-order planner and a nesting stack. The code is private, so what follows is a description of the problems and what I built, with no source, screenshots or client data.

5,641commits & contributions
Bitbucket + GitHub
19repositories
private and public
5½ yrs2021 — present
4languages in production
TS · Ruby · C# · Python
Grading & size charts

One shape, twenty sizes

A pattern isn't a shape, it's a size range. Every point has to travel the right distance as the garment grows, and a curve has to stay a curve at the far end of the range.

I built the size-chart layer — the measurement tables, their link to a pattern, and the sync that stops a graded pattern and its chart from drifting apart — and worked for years on the grading engine behind it: grouped grades, copying a grade set from a reference piece, automatic grading pins, and the ordering and duplication problems that surface once one chart feeds many patterns.

Seam allowance

The offset problem, in production

The same operation as the drawing at the top of this page, with a cutting table at the end of it. I built the feature, then rebuilt it on a new edge representation across all four services — the CAD editor, the geometry CLI, the API and the cut-order planner — with a migration for every pattern already drawn under the old model.

Most of the work was the failure modes: allowances running to infinity at near-degenerate corners, allowances overlapping on neighbouring pieces, and the performance ceiling once a piece carries thousands of edges.

Nesting

Bin packing that has to obey physics

Nesting is packing, constrained by things the fabric decides: roll width, grain direction, fold edges, and pieces that have to stay together. I work across its three layers — the TypeScript service that feeds and caches nesting jobs, the C# engine that does the packing, and a Python optimizer for spread and roll planning.

Most recently, locked groups: pieces the planner must treat as one unit are fused into a single pinned hull, including the awkward case where the group sits on the fold.

Test & QA infrastructure

Geometry fails silently

Output that is wrong by two millimetres still looks exactly like a pattern. Nothing throws. So the testing has to be visual and dimensional, not just assertive.

I built a golden-image regression suite over a corpus of real pattern files — DXF/AAMA, PLT and SVG — that fails on pixel and coordinate drift, plus a corpus runner that classifies which files import without their grading intact. On the front end, an end-to-end recorder that captures keyboard and canvas interaction, so a CAD bug arrives as something you can replay instead of something you have to reproduce from a description.

Before this: CAD and vector graphics tooling, enterprise Java banking systems, and Rails at scale. Background in Systems Analysis and Physics.

Open source & public work

07 projects · all linked
Open source library npm · TypeScript · zero dependencies

polygon-offset-exact

Offsetting a polygon so that every point of the result is actually at the distance you asked for. The intuitive method — push each vertex along its angle bisector — puts the corner at d / sin(θ/2) instead of d; on a star offset by 40 the worst point lands 121.8 units out. It still looks like an offset, which is the problem.

The library ships maxDeviation as part of its public API, because a picture cannot tell you an offset is correct. It also ships the naive method, so the error is measurable rather than asserted. 57 tests, the core of them one property asserted across five shapes: every returned point is at the requested distance, to 1e-6.

Published on npm: npm install polygon-offset-exact

Open source Three.js · WebGL

Parametric product configurator

A 3D configurator with no model file. Most load a finished mesh and swap its materials, which demos well and says nothing about whether the thing can be made. Here the parameters are dimensions in millimetres: changing the gusset depth doesn't select a variant, it rebuilds the geometry — and moves the gusset on the 2D cutting layout by the same millimetres.

The cutting line is a polygon offset of the sewing line, and the page measures every point of it back to the sewing line: 0.00 mm. Three.js vendored rather than pulled from a CDN, so it has no external runtime dependency.

Open source Packing under constraints

Nesting playground

Nesting looks like bin packing until the material starts making rules: the roll is a fixed width and unbounded length, pieces must run along the grain so most get two rotations rather than four, and everything needs a gap. Each constraint is a control here rather than a paragraph, so its cost is visible in metres — dropping the grain lock on the default four-garment marker takes it from 2.54 m to 2.44 m.

Bottom-left fill with a skyline accelerator on a raster grid, run across four orderings because greedy placement is order-dependent and none wins on every mix. The grid resolution is a control too, so you can watch efficiency fail to improve monotonically as it gets finer — which is the greedy showing through, and the reason production nesters run search on top.

Writing Interactive

Geometry for design tools

Four pieces of 2D geometry every CAD-like editor needs — orientation, point-in-polygon, distance, tolerance — each written around its failure mode rather than its formula. Every figure is draggable and every number is computed live. The formulas take thirty seconds to look up; knowing which assumption breaks and what it costs downstream is the part that isn't written down anywhere.

Open source library TypeScript · React · Angular

looks-glassy

Refractive glass components for React and Angular, built on physics-based SVG displacement maps rather than a backdrop blur pretending to be glass. A framework-agnostic core generates the displacement map and builds the SVG filter; thin React and Angular packages wrap it.

Refractive index, glass thickness, bezel width, surface profile, specular angle and saturation are all parameters, so the effect is tuned like an optical material instead of dialled in by eye — with graceful fallbacks where the filter chain isn't supported.

Ongoing Automation engineer

Prompt Ops

I build the automation systems at Prompt Ops, a Brazilian studio that wires AI into the tools a business already runs — CRM, customer support, internal operations — rather than adding one more app beside them.

The work is integration and tuning: connecting existing systems, shaping prompts and workflows for accuracy and cost, and putting in the guardrails that let an automation be left running unattended instead of watched.

Architecture case Rails · Sidekiq · PostgreSQL

LLM outreach pipeline

A six-stage pipeline where the interesting part is everything around the model call. Daily and per-record spend ceilings are checked before the request rather than after. A circuit breaker opens on provider failure and the workers re-queue with a delay instead of burning their retry budget — and it only counts API errors, so a bug in my own code raises through instead of hiding behind an open circuit.

Sources are pluggable behind one interface, deduplication leans on a unique index rather than check-then-insert so concurrent workers can't both win, and nothing reaches a recipient without passing a human approval gate. Each stage sits behind its own feature flag, switchable without a deploy.

Open source Python · SQL

replayable-ingest

An ingestion pipeline built around the four things that break data platforms without ever raising an exception: the same export shipped twice, one row carrying "N/A" in an integer column, last week's re-export arriving after this week, and the same key appearing twice in one file. A plain upsert gets all four wrong quietly — a double count finance finds later, a cast to zero nobody can tell from a real zero, a table walking backwards, and a guess presented as a fact.

Batches are identified by the hash of their bytes rather than their name, deduplication rests on a unique index rather than on the loader being correct, a record older than what we hold never overwrites it, and a batch either lands whole or goes to quarantine with every failing line, field and reason named. Each guarantee has a test named after it, so a red test says which promise stopped holding — including one that loads the same files in reverse order and asserts the table converges on the same fingerprint.

Writing

25 posts · Rails, databases & systems

I write up the failure modes I have had to design around — idempotency, retries, migrations that cannot take a lock, caches that are allowed to be wrong. Seven of the twenty-five below; the rest are in the archive.

Stack

Graphics & geometry
Three.jsWebGLCanvas 2D SVGGLSLCAD data formats
Front end
TypeScriptAngularReact RxJSJest / Karma / Cypress
Back end & infra
Ruby on RailsJava / Spring BootNode.js PythonPostgreSQLSQL / ETLRedis / SidekiqAWSDockerCI/CD

Available for freelance work

Product engineering and technical leadership: APIs, background job pipelines, data ingestion, and the integrations that have to keep running unattended. Plus the geometry and 3D work that most teams cannot staff — configurators, CAD-like tooling, graphics between design and manufacturing. Eight-plus years in software, with a background in Systems Analysis and Physics. Remote, working across European and North American hours.