Branded Docs
Turn plain content into polished, perfectly on-brand documents (proposals, one-pagers, presentations, invoices) without a designer or a single template fight.
What it does
Section titled “What it does”branded-docs produces finished business documents that look like your brand every single time. You provide the words. The workbench wraps them in your identity (colors, type, logo, spacing) and hands you a clean document ready to send or save as PDF.
There is no design tool to learn, no template to wrestle, and no toolchain to
install beyond python3 (for the render step) and a browser. The output is a
self-contained HTML file you open in any browser and print to PDF. The logo and
brand fonts are embedded directly into that file as data URIs, so it opens and
prints anywhere, with no network connection required.
When to use it
Section titled “When to use it”Reach for branded-docs whenever something needs to leave your workshop looking professional and on-brand. If you would otherwise open a blank doc and start fighting fonts, this is the tool.
What you can make
Section titled “What you can make”Document types fall into two groups based on how they are produced.
Render-injectable templates (recommended path)
Section titled “Render-injectable templates (recommended path)”Your CLI agent writes a content fragment. render.sh wraps it in the brand template
automatically. This is the main workflow for most documents.
| Template name | What it produces |
|---|---|
document-template |
Proposals, agreements, memos, general documents. Portrait, Letter. |
onepager |
Capability statements, sell sheets, single-page leave-behinds. |
Standalone templates (edit directly)
Section titled “Standalone templates (edit directly)”These are complete, ready-to-use HTML files. Open one in any browser or text editor
and fill in your content. They do not go through render.sh.
| Template | What it produces |
|---|---|
presentation-ai-training.html |
On-brand slide decks with a presenter console, no slide software needed. |
onepager-ai-training.html |
A fully self-contained one-pager for quick edits. |
presenter-console.html |
Speaker notes view for live presentations. |
registration.html |
Event or course registration page. |
Commercial paper (manual fill today)
Section titled “Commercial paper (manual fill today)”invoice.html, quote.html, and purchase-order.html share the same brand base
(embedded fonts and logo, print-ready CSS) but carry structured fields (vendor/client
blocks, line items, totals, terms) that you fill in directly. They are not render.sh
targets. Open one in an editor, fill in the structured sections, and print from the
browser.
Quick start
Section titled “Quick start”- Ask your CLI agent. In your own harness say something like: “Draft a one-page capability statement for a Huntsville manufacturer,” and list the points you want covered.
- It drafts the content. Your assistant writes a content fragment in the right format (frontmatter plus HTML body). You review and edit the words, never the styling.
- It renders on-brand. The workbench runs
render.shto wrap your content in the right template, applying brand colors, type, and logo automatically. - Open and save as PDF. Open the rendered HTML file in your browser, then Print (Ctrl/Cmd+P) → Save as PDF. Enable “Background graphics” so the brand colors print.
How the content works
Section titled “How the content works”A content fragment is a short file: exactly five frontmatter lines, then plain HTML body tags. You rarely write this directly (your assistant does it), but here is what one looks like so there is no mystery.
---title: Capability Statementsubtitle: Acme Manufacturing · Huntsville, ALtype: document---
<h2>Who we are</h2><p>One paragraph of plain content. The brand is applied for you.</p>A few things to know:
- The frontmatter must be exactly five lines (the dashes open and close on lines 1
and 5, with
title,subtitle, andtypeon lines 2, 3, and 4).render.shreads them by line position. - The
type:value becomes the small header kicker (for exampleProposalorInvoice). - Write only body fragments:
<h2>,<p>,<table>,<ul>. Do not include<!DOCTYPE>,<head>, or<body>tags. The template supplies those, plus all brand styling.
The brand never lives in the document. It lives in brand-kit. Change your brand
once there, and every document re-renders to match.
CSS class hooks (document-template)
Section titled “CSS class hooks (document-template)”The template styles plain HTML and also provides optional helper classes so your content looks polished without any custom CSS. Use these. Do not invent inline styles.
| Purpose | Markup |
|---|---|
| Metadata block (Prepared for / by, date) | <div class="parties"><div><span class="k">Label</span>value</div>…</div> |
| Signature blocks | <div class="sigs"><div class="sig"><div class="who">Party</div><div class="ln">Signature</div>…</div>…</div> |
| Right-aligned money column | <td class="amt"> or <th class="amt"> |
| Emphasized total row | <tr class="total">…</tr> |
| Small muted caption or footnote | <p class="note">…</p> |
The template already supplies the logo, title, subtitle, kicker, and footer. Your fragment starts at the metadata block and ends at the signatures.
Common pitfalls
Section titled “Common pitfalls”Wrapping content in a full HTML document. The most common mistake is including
<!DOCTYPE html>, <head>, or <body> in the content fragment. The template
supplies all of that. If you add it yourself, the render will produce duplicate or
broken structure. Write only the inner fragments.
Passing a standalone template to render.sh. Templates like
presentation-ai-training.html and presenter-console.html are complete standalone
files, not render targets. If you pass one to render.sh, it will look for
{{TITLE}} and {{CONTENT}} placeholders that are not there. Use only
document-template or onepager as render targets.
Forgetting “Background graphics” when saving as PDF. Without this checkbox, the browser strips background colors from the PDF. The brand palette disappears entirely. It is a single checkbox in the print dialog and easy to miss.
Using inline styles in your content fragment. The template provides CSS class
hooks (.parties, .sigs, .amt, .total, .note) specifically so you do not
need inline styles. Inline styles can conflict with the template’s print CSS and break
the layout at print time.
Expecting commercial paper fields to be auto-filled. The invoice, quote, and
purchase-order templates are brand-complete but carry structured fields (line items,
totals, vendor blocks) that you fill in manually. They are not yet render.sh
targets. Open and edit them directly.
Adding a Google Fonts CDN link to a template. The brand fonts are embedded by
render.sh as base64 @font-face blocks. If you add a <link> to Google Fonts or
an @import, the output is no longer self-contained and the fonts will conflict. Let
render.sh handle fonts. The only fonts it embeds are the ones present in
brand-kit/assets/fonts/.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Cause | Fix |
|---|---|---|
| PDF prints without colors or brand | “Background graphics” was not enabled | Open the browser print dialog, check “Background graphics,” then save again |
render.sh reports “template not found” |
The template name is wrong or is a standalone file | Use exactly document-template or onepager as the template argument |
| Logo is missing from the output | The brand-kit symlink does not resolve, or Logo-01.* is not in brand-kit/assets/logos/ |
Confirm the symlink exists and the logo file is there |
render.sh fails with “python3: command not found” |
python3 is not installed |
Install python3. It is the only runtime dependency |
| Content looks unstyled (wrong fonts, no colors) | The fragment included full HTML structure (<head>, <body>) that conflicts with the template |
Remove all structural tags from the fragment. Write body fragments only |
| Frontmatter title or subtitle is blank in the output | The frontmatter line count is off | Count lines 1-5 exactly: dashes, title, subtitle, type, dashes |
| Fonts fall back to system defaults | brand-kit/assets/fonts/ is empty |
If the folder is empty, render.sh falls back to the Google Fonts CDN. Add the .woff2 files to the folder for air-gapped output |
| You want a different logo variant | Default is Logo-01. Other variants exist |
Set LOGO_VARIANT=Logo-02 (or another name) before running render.sh |
| A new document type is not listed | No template exists for it yet | Ask your assistant. New types are built from the brand-kit and come out on-brand automatically |