Skip to content
Site volume
Colourway

Brand

Documents

Quotes, proposals, invoices and letters: React templates rendered to tagged PDFs from JSON, with totals the template computes.

  • Stable
On this page

Applies to

  • Print
  • Documents
  • Email
  • Slides

Book version

1.0.0, the system's version; every change is a changeset on the changelog

Last verified

24 October 2026, commit 726d192, 83 looks (press check)

A quote, a proposal, an invoice and a letter are four React templates in the generators, rendered to PDF from a JSON file. They take the type, the inks and the kit straight from the system, compute every total in integer cents, and come out tagged and accessible with the fonts embedded. Make one with one command; keep the JSON, and the next one is a copy and an edit.

Rules#

The documents rules: 6 rules: 6 must
IdRuleWhyChecked by
BB-DOC-01MustMake quotes, proposals, invoices and letters only with the templates, from JSON.Applies to: DocumentsThe templates carry the type, the layout and the arithmetic; a document made by hand drifts from all three.Manual review
BB-DOC-02MustLet totals come from the template's arithmetic, never typed.Applies to: Documents, SlidesInteger cents rounded half up at every step (computeTotals) give the same total every time; a typed total is one typo from a wrong invoice.TestcomputeTotals
BB-DOC-03MustNumber documents Q-YYYY-NNN, P-YYYY-NNN and INV-YYYY-NNN, and give status as a literal word with an optional stamp (Sent, Approved, Paid).Applies to: DocumentsA number and a word are what a client's bookkeeper files. The stamp is the fun beside it.Testthe document schemas
BB-DOC-04MustKeep real client and payment details outside this repo; the repo holds fictional samples only.Applies to: Documents, Email, PrintThe repo is shared with agents and contractors. Real details live in Max's studio profile on Max's machine.Testcheck:docs; the rest by eye
BB-DOC-05MustEnter tax lines as inputs (label, rate, registration number); the template never decides tax.Applies to: DocumentsTax depends on the client and the province. The person sending the document knows it; the template does not.Testthe invoice schema
BB-DOC-06MustPrint documents on Letter by default and A4 on request, as tagged PDFs with the fonts embedded; press runs go through the press pipeline.Applies to: DocumentsLetter suits a Toronto studio with North American clients. A tagged PDF is accessible, and screen documents are RGB while press artwork is CMYK.Testpdfinfo Tagged and the page size

Specs#

The templates#

Every template: how to make one, at what volume, and its sample files
TemplateFormatInput and commandVolumeFiles
QuotePDF, Letter or A4QuoteInputoverprint-gen doc quote --in quote.json --out outQuietDocument body pages (quote, proposal body, invoice, letter)fernlight-quote.pdf
ProposalPDF, Letter or A4, a cover at PressProposalInputoverprint-gen doc proposal --in proposal.json --out outPressProposal coverpebblepath-proposal.pdf
InvoicePDF, Letter or A4InvoiceInputoverprint-gen doc invoice --in invoice.json --out outQuietDocument body pages (quote, proposal body, invoice, letter)fernlight-invoice.pdf
LetterPDF on the letterhead, Letter or A4LetterInputoverprint-gen doc letter --in letter.json --out outQuietDocument body pages (quote, proposal body, invoice, letter)letter-sample.pdf

How to make one#

  1. Write the document's JSON against its schema below (start from the samples in the templates download).
  2. Keep your studio profile outside the repo and pass it with --studio, or set OVERPRINT_STUDIO.
  3. Run the command; add --sheet a4 for A4 and --html for an HTML copy.
overprint-gen doc quote --in fernlight-quote.json --studio ~/studio.json --out out

The layout#

The first page carries the horizontal lockup at the top left margin, the document's title (its one display moment) and number at the top right, a meta block with the number, the dates and the client, the body and a footer with the studio's name, its site and the page count. Continuation pages carry the mark at the top left and the number at the top right. Body pages print at Quiet; tables repeat their header row, rows never split and the totals stay together (BB-VOLUME-02).

Previews#

A quote for Fernlight Bakery: the render surface /render/doc/quote/fernlight-quote
A proposal for Pebblepath: the render surface /render/doc/proposal/pebblepath-proposal
An invoice for Fernlight Bakery: the render surface /render/doc/invoice/fernlight-invoice
A letter on the letterhead, A4: the render surface /render/doc/letter/letter-sample

Money#

Every amount is an integer in cents. Each line is the quantity times the unit price, rounded half up to the cent; then the discounts, each tax on what remains, the total, a deposit and the balance. Nobody types a total (BB-DOC-02). The template prints money with formatMoney: CAD 5,424.00 for a project of CAD 4,800.00 with one tax at thirteen percent.

Inputs#

The studio profile (outside the repo)
FieldTypeRequiredDefaultLimits
namestringYesNone≥ 1 chars, ≤ 60 chars
legalNamestringNoNone≥ 1 chars, ≤ 80 chars
personobjectYesNoneNone
addressstring[]YesNone≥ 1 items, ≤ 6 items
webstringYesNone≥ 1 chars, ≤ 40 chars
taxIdsobject[]No[]≤ 4 items
paymentMethodsobject[]No[]≤ 4 items
termsstringYesNone≥ 1 chars, ≤ 1200 chars
currencystringNo"CAD"matches ^[A-Z]{3}$
localestringNo"en-CA"≥ 2 chars, ≤ 16 chars
dueDaysintegerNo14≥ 0, ≤ 120
QuoteInput
FieldTypeRequiredDefaultLimits
numberstringYesNonematches ^Q-\d{4}-\d{3}$
issuedstringYesNonematches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
validUntilstringYesNonematches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
clientobjectYesNoneNone
titlestringNoNone≥ 1 chars, ≤ 80 chars
scopestringYesNone≥ 1 chars
itemsobject[]YesNone≥ 1 items, ≤ 40 items
optionalobject[]NoNone≤ 10 items
discountsany[]NoNone≤ 3 items
taxesobject[]YesNone≤ 3 items
timelineobject[]NoNone≥ 1 items, ≤ 8 items
depositobjectNoNoneNone
termsstringNoNone≥ 1 chars, ≤ 1200 chars
notestringNoNone≥ 1 chars, ≤ 280 chars
status"draft" | "sent" | "approved"NoNoneNone
A line item
FieldTypeRequiredDefaultLimits
descriptionstringYesNone≥ 1 chars, ≤ 120 chars
qtynumberYesNone≤ 100000
unitstringNoNone≥ 1 chars, ≤ 16 chars
unitPriceintegerYesNone≥ 0, ≤ 100000000
A tax line
FieldTypeRequiredDefaultLimits
labelstringYesNone≥ 1 chars, ≤ 40 chars
ratenumberYesNone≥ 0, ≤ 1
registrationstringNoNone≥ 1 chars, ≤ 40 chars
ProposalInput
FieldTypeRequiredDefaultLimits
numberstringYesNonematches ^P-\d{4}-\d{3}$
datestringYesNonematches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
titlestringYesNone≥ 1 chars, ≤ 60 chars
preparedForobjectYesNoneNone
coverobjectNoNoneNone
sectionsobject[]YesNone≥ 1 items, ≤ 6 items
quoteobject | objectYesNoneNone
timelineobject[]NoNone≥ 1 items, ≤ 8 items
nextStepsstring[]YesNone≥ 1 items, ≤ 6 items
closingstringNoNone≥ 1 chars, ≤ 160 chars
InvoiceInput
FieldTypeRequiredDefaultLimits
numberstringYesNonematches ^INV-\d{4}-\d{3}$
issuedstringYesNonematches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
duestringNoNonematches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
billToobjectYesNoneNone
itemsobject[]YesNone≥ 1 items, ≤ 40 items
discountsany[]NoNone≤ 3 items
taxesobject[]YesNone≤ 3 items
paymentsobject[]NoNone≤ 12 items
status"draft" | "sent" | "paid"YesNoneNone
quotestringNoNonematches ^Q-\d{4}-\d{3}$
notestringNoNone≥ 1 chars, ≤ 280 chars
LetterInput
FieldTypeRequiredDefaultLimits
datestringYesNonematches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
recipientobjectYesNoneNone
subjectstringNoNone≥ 1 chars, ≤ 120 chars
salutationstringYesNone≥ 1 chars, ≤ 60 chars
bodystringYesNone≥ 1 chars, ≤ 6000 chars
closingstringYesNone≥ 1 chars, ≤ 60 chars
signerobjectYesNoneNone

Do and don't#

Do

Total, taxes includedCAD 5,424.00Due in 14 days

The total at Quiet, from the arithmetic.

Don't

Total, taxes includedCAD 5,424.00

A total with an SFX beside it.

No comic on a page with prices (BB-COMIC-14); totals from the template (BB-DOC-02).

Do

Paid in full on 2 November 2026

The literal line, and the stamp beside it.

Don't

The stamp alone.

Status is a literal word with an optional stamp (BB-DOC-03).

Do

Invoice INV-2026-018 · due 6 November 2026

The number format and a written date.

Don't

Invoice #18 · due 11/06

A loose number and an ambiguous date.

Numbers follow Q-, P- and INV-YYYY-NNN; dates follow the voice page (BB-DOC-03, BB-VOICE-06).

Files#

Document samples and template inputs, built from version 1.0.0
FileWhat it isFormat and sizesha256Built by
makr-labs-templates.zip/brand/downloads/makr-labs-templates.zipTemplate inputs: the JSON schemas and fictional example files for documents, signature, social and decksZIP archive, 31 KB4571cdfcf0c37d42ea93d30c0b95f1b1c7d1139bd22a5797e6596230d1345d06overprint-gen brand --only templates
fernlight-quote.pdf/brand/downloads/samples/fernlight-quote.pdfSample quote for Fernlight Bakery (fictional)PDF, 614 KB29e123b856002c680480d84bd2da9ae349ad3f249bf5fa9a56a716bc0c974ddaoverprint-gen doc quote
pebblepath-proposal.pdf/brand/downloads/samples/pebblepath-proposal.pdfSample proposal for Pebblepath (fictional)PDF, 2.7 MB0eb1c52499be1c388ff203e2b1e9d02de92b8fd6b03733a04cfc79b5efd0313aoverprint-gen doc proposal
fernlight-invoice.pdf/brand/downloads/samples/fernlight-invoice.pdfSample invoice for Fernlight Bakery (fictional)PDF, 369 KB387e33f5994f9c2c1c664e11424cb95e2ce6073cd165e0283ddee79650e56d9eoverprint-gen doc invoice
letter-sample.pdf/brand/downloads/samples/letter-sample.pdfSample letter on the letterhead (fictional)PDF, 146 KBe0738d559b1b3b0c91d80297bd04f0410389004ea4273bc0633dc1d59b959408overprint-gen doc letter