AI activation · Tooling
Purpose-built AI
A custom pipeline that rebuilds static PDFs as editable Figma files. Built for one job, because the tools that existed couldn't do it accurately.
- Document
- Heading
- Image
- Body text
- ▢ Frame
- T Heading
- ▣ Image
- T Body text
95 hours 3 hours
- Tools
- Scale
- 190 pages · 36 documents · 6 batches
- Outcome
- 95 hours of manual work, done in 3 hours
The problem
The client needed to document updates across 190 web pages, and the existing PDFs were static and outdated. Every tool that could rebuild them ran on a subscription and still lacked accuracy. So I built one for them that does.
The approach
Most people picture AI as one agent you hand a job to and trust to figure it out. This is the opposite. The work is split into small, scoped stages, most of it is plain code, and the AI runs inside a structure that keeps it honest: written instructions, logged decisions, and a check against the source at the end.
That structure is the actual system. Here are the real files. Click any one to see what it does, and where the AI is and isn't doing the work.
CLAUDE.md
The rules the AI follows. It does not invent the process. It reads this first and runs the right stage. This is what keeps it on rails.
Read CONTEXT.md before touching any file. Rebuild: native Figma layers only, never flattened images. extract/
Read the page. One job: get every element off the PDF and into structured data.
CONTEXT.md
AI does better with one job at a time. This file gives Stage 1 exactly one: pull everything off the page, build nothing yet.
Your one job: pull every text run, image, and position off this page. Don’t build anything yet. pdf-extract.mjs
Reads the PDF with PDF.js and pulls out every text run, image, and exact position. No AI in this step.
rebuild/
Rebuild the page as native, editable Figma layers from the extracted data.
CONTEXT.md
Same idea, one job. This file scopes Stage 2 to a single task: turn the extracted data into layers, matched to the original.
Your one job: turn that data into Figma layers. Match the original position exactly. gen-figma-call.mjs
Turns the extracted data into the exact Figma layer-creation calls. Same data in, same layers out, every time.
upload-and-bind.js
Uploads the page’s images and binds each one to the layer it belongs to.
DECISIONS.md
Every non-obvious choice, logged with its reasoning, so the work stays consistent and isn’t re-argued on the next run.
Rebuilt tables as real frames, not images, so cells stay editable. Slower, but the file stays usable. SESSION-LOG.md
AI starts every conversation blank. This is the running memory, so the next session picks up exactly where the last one stopped.
Finished batch 2 of 4. Next session: start batch 3, same settings. TEMPLATE-FRICTION.md
What went wrong or felt clumsy, captured the moment it happens. This is how the system improves instead of repeating mistakes.
Two labels overlapped on a dense page. Caught it the moment it happened, fixed before the next run. The result
190 pages rebuilt in about three hours, not the 95 it would take by hand. The files came out as proper, editable Figma layers, not flattened screenshots. This is the kind of work AI should be doing: well-defined, repetitive, and a poor use of a person's time.
Let's talk.
Have a job like this one? Tell me about the problem you're solving.
Start a conversation