Skip to content

Branded Docs

Turn plain content into polished, perfectly on-brand documents (proposals, one-pagers, presentations, invoices) without a designer or a single template fight.

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.

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.

Document types fall into two groups based on how they are produced.

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.

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.

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.

  1. 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.
  2. 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.
  3. It renders on-brand. The workbench runs render.sh to wrap your content in the right template, applying brand colors, type, and logo automatically.
  4. 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.

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 Statement
subtitle: Acme Manufacturing · Huntsville, AL
type: 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, and type on lines 2, 3, and 4). render.sh reads them by line position.
  • The type: value becomes the small header kicker (for example Proposal or Invoice).
  • 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.

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.

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/.

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