Computational geometry · Graphics · CAD

I build the geometry layer underneath graphics software.

The part that has to be correct, not just look right. Product configurators, CAD-like editors and the algorithms under them — offsetting, booleans, hit testing, nesting, numerical tolerance, and the degenerate cases that break naive implementations.

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

Geometry algorithms

Offsetting, booleans, self-intersection removal, point-in-polygon, 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.

02

Browser graphics

Three.js, WebGL, Canvas 2D and SVG. 3D product configurators, CAD-like editors and interactive diagrams, built to stay responsive with thousands of entities on screen and to behave the same on a laptop trackpad and a touchscreen.

03

The backend under it

Rails, Java and Node. API design that keeps a graphics front end fast, background-job architecture, and LLM pipelines with spend ceilings and circuit breakers so an integration can be left running unattended.

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,069commits authored
10repositories
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

04 projects · all linked
Open source Canvas 2D · no dependencies

Polygon Offset Playground

Offsetting a polygon looks like moving every vertex outward along its angle bisector. It is the first thing you would write, and it is wrong — not because it self-intersects, which on most shapes it doesn't, but because it lands at the wrong distance. On the demo's star at 68 px, the worst point of the naive result sits 123.6 px from the source polygon. In CAD or cutting, that distance is the point: it's the seam allowance, the tool radius, the kerf.

The robust pass offsets each edge along its own normal, fills convex corners with an arc fan, trims reflex corners to the offset-edge intersection with a miter cap, then densifies and filters samples by their true distance to the source. The readout measures both, live, while you drag the vertices.

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.

Stack

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

Available for freelance work

Configurators, CAD-like tooling, geometry algorithms and the graphics work that sits between design and manufacturing. Remote, working across European and North American hours.