Case study · Studio system
Branded Document System
My invoices came out of FreshBooks and looked nothing like my website. I turned my studio paperwork into a small design system with code behind it. Invoices, quotes, my resume and letters now come from the same brand rules, built from data instead of redrawn by hand.
The problem
My paperwork didn't look like my work
For years my invoices came out of FreshBooks. They worked, but they looked like everyone else's and nothing like raysandesigns.com.
When I needed a new invoice for a client, I also wanted a quote template and a resume in the same style. Making each one by hand in a layout tool meant three files that would drift apart the first time I changed a color or a phone number. I wanted the brand decided once and applied everywhere.
The approach
One brand, one pipeline
Every document goes through the same three steps. The content lives in a small data file. A build script lays it out with a shared brand kit. A headless browser prints it to a Letter-size PDF. Changing the brand means changing one file, and every document follows.
Data
A JSON file per document: the client, the line items, the dates. A new invoice is a few lines of data.
Brand kit
Fonts, colors, the type scale, the header, the color bar, the footer and the icons, defined once in Python and CSS.
Chromium renders the page to PDF with the fonts embedded. Quotes then get fillable signature and date fields.
The rules
The brand, written down as rules
I started from my website header and translated it to print: a cream wordmark bar flush to the top-left corner, then a color bar that steps from dark coral to light peach. I explored cool tones and a pistachio green along the way and came back to coral, partly because anything blue read too close to Panasonic, where I work day to day.
- A 60px wordmark bar and a 100px color bar, with white text and no shadow
- Four gradient stops: #F98A5E, #FE9A6C, #FFA874 and #FFBA82, with cream #FFECCE for accent panels
- Sofia Sans on a major-third scale from a 10pt base: 8, 10, 12.5, 15.6, 19.5, 24.4 and 30.5pt
- Small uppercase labels with wide tracking, and warm gray #E4E2DE for every rule
- The name is always "Raysan Designs." Only the URL and email stay lowercase.
Details
Small decisions that make it feel finished
The cream panel behind Amount due fades into white and runs off the right edge of the page, flush under the color bar, with the number right-aligned to the margin. The one figure a client needs is the one they see first.
Some table lines looked heavier than others. They were landing on half-pixels, so every row height is now a whole pixel. The header rule is 2px and the row rules are 1px of the same warm gray.
Quotes
Long quotes that still sign cleanly
A quote can run to several pages. Line items never split across a page break. Terms and totals always start on a fresh page that repeats the header, and the signature block and footer are pinned to the bottom of the last page.
The client name and signature line is a real form field, and the date opens a date picker in Acrobat and Reader. A client can sign and return a quote without printing it.
Process
I directed it; Claude wrote the code
I built this with Claude as a build partner. I set the direction, chose the type, color, spacing and icons, and judged every render. Claude wrote and rewrote the Python and CSS, rendered the PDFs and measured each layout. Most of the work happened in tight feedback loops: "the header is still too tall, cut it in half," "the rule under June looks different."
A few things broke along the way, and each one became a rule:
- A long resume title spilled out of the color bar. Titles now sit on one line at the 24.4pt step.
- The signature landed mid-page on short quotes. A small script measures the page and pins the block to the bottom.
- Resume content was silently clipped at the page edge. A fit check now reports where each page's content ends before anything prints.
- One overly broad edit wiped most of a script. It was restored from the saved template, and edits since then are small and targeted.
System
Each document became a skill
Templates still need someone to remember how to use them. So each document type became a skill: written instructions plus the code, which Claude loads when I ask for that document. "Make the October invoice for Matrix" or "tailor my resume to this posting" now starts from my rules instead of from scratch.
- Invoice. Finds the last invoice number, fills in the months and hours, and applies NJ sales tax.
- Quote. Numbers the quote, flows it across pages and adds the signature and date fields.
- Resume. Tailors to a job posting from a fact bank of real experience, never inventing claims, and checks that it fits two pages.
- Document system. The brand kit, letters, and the recipe for adding a new document type.
Extending it
A new document is a data file and a page of layout
The shared pieces live in one brand kit. A new document type uses it and only describes what's new about its own layout. The letter was the first type built this way, and it came together without restating a single brand rule. Its cover-letter version swaps the wordmark to my name, the same way the resume does.
What's next
Things to improve
- One source for the brand. The invoice, quote and resume scripts were built before the shared kit and still carry their own copy of the styles. Moving them onto it would make a brand change truly one edit.
- Catch visual changes automatically. I review every render by eye. Comparing each new PDF against an approved version would flag a shifted rule or a wrapped title before I do.
- Accessible PDFs. The files look right but aren't tagged for screen readers. Adding document structure and reading order is the next step for anything sent to clients.
- More document types. Project proposals and one-page capability sheets for prospective clients are next, built on the same kit.
- Decide the rules earlier. Many rounds went into details like header height and rule weight. Writing those as rules up front, the way they're written now, would have saved most of them.
Available for work