
Brand Library Architect
- 1 installs
- 28 repo stars
- Updated June 29, 2026
- nickcrew/claude-cortex
Builds a complete product brand library: visual-asset render pipeline, brand docs (BRAND, COPY, MANIFESTO, TONE, PRICING), OSS convention files, and a press kit.
About
Assembles a full brand library including a visual-asset render pipeline, a brand documentation set, open-source convention files, and a self-contained press kit. A developer uses it to build a brand kit, positioning manifesto, and visual identity for a product, phase by phase or end-to-end.
- Product-agnostic templates with {{TOKEN}} placeholders the skill prompts you to fill
- Covers BRAND, COPY, MANIFESTO, BIOS, FAQ, GLOSSARY, TONE, PRICING plus README/CONTRIBUTING/SECURITY
Brand Library Architect by the numbers
- 1 all-time installs (skills.sh)
- Ranked #1,710 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/nickcrew/claude-cortex --skill brand-library-architectAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 28 |
| Last updated | June 29, 2026 |
| Repository | nickcrew/claude-cortex ↗ |
What it does
Builds a complete product brand library: visual-asset render pipeline, brand docs (BRAND, COPY, MANIFESTO, TONE, PRICING), OSS convention files, and a press kit.
Files
Brand Library Architect
Overview
This skill captures a phased workflow for building a complete brand library for a product. It produces a coherent set of artifacts: a render pipeline for visual assets (HTML sheets → Playwright → WebP), a documentation set rooted in locked vocabulary and voice rules, repo conventions for open-source projects, and a press kit. The phases reference each other (e.g., the press kit pulls bios from BIOS.md, the README banner cites the visual pipeline output) so cross-references work even when phases are run independently.
Every template uses {{TOKEN}} placeholders for product-specific content. Prompt the user for the relevant tokens at the start of each phase rather than guessing, so the resulting library is voice-true to the product and not generically branded.
When to use this skill
Apply when the user asks for any of:
- "Build a brand library / brand kit / brand assets for product X"
- "Set up the brand library workflow for this repo"
- "Create a positioning manifesto + visual identity"
- "Author a press kit / FAQ / glossary / tone guide / pricing doc / founder bio"
- "Add CONTRIBUTING / SECURITY / CODE_OF_CONDUCT to this repo with brand voice"
- "I have visual assets — help me write the brand documentation that anchors them" (or vice versa)
- "Audit the brand assets in this repo" / "What brand assets do we have?" / "Discover existing brand surface" → run Phase 0 only as a standalone audit
Apply selectively when only one or two phases are needed. The phases are independent enough to mix and match.
Do not apply this skill when the user wants:
- Product feature documentation (use
documentation-production) - Generic copywriting unrelated to brand library structure (use
copywriter) - Visual UI components or design systems (use
ui-design-aestheticsorfrontend-design) - Internal-only docs (this skill is public-facing brand surface)
Phases
The workflow is seven phases (0-6). Run sequentially for a new product, or jump to a specific phase for incremental work. Phases 0 and 1 are required before any other phase.
Phase 0 — Discovery
Read references/existing-assets.md and run the four-step Discovery workflow:
1. Search the repo for existing brand assets, CSS color tokens, typography, logo files, OG/banner images, package metadata, internal pricing/entitlement docs that may constrain brand claims, and adjacent docs (CLAUDE.md, backlog tasks). 2. Infer what each finding implies about brand decisions (e.g., --primary: #2d6a96 in src/index.css → primary brand color; existing README subtitle → pre-locked-vocabulary version of the locked hero; package.json author.email → canonical contact email). 3. Confirm with the user. Surface the inventory and proposed dispositions; surface any inference uncertainties or detected conflicts. Default to preserve and surface rather than overwrite — never silently rewrite existing brand assets. 4. Request sources the agent can't grep for: designer Figma files, brand guideline PDFs, past marketing materials, external blog/podcast voice samples, logo files in shared drives or other repos. The highest-value brand inputs almost always live outside the repo.
The output is brand/discovery.md — a permanent record of what was found, what was inferred, what the user confirmed, and what additional sources the user provided. Subsequent phases read this doc.
Discovery can also run as a standalone capability (e.g., "audit the brand assets in this repo") — produce brand/discovery.md and stop. The discovery doc on its own is a useful audit deliverable.
Phase 1 — Decision rubric
Read references/decision-rubric.md and walk the user through any decisions Discovery didn't already answer. Don't re-elicit values that exist in brand/discovery.md — that's the whole point of running Discovery first. The output is brand/decisions.md capturing:
- Product name, domain, repo URL, contact email
- Brand verb (the owned action), durable noun (the substrate term), tagline, locked hero, trust line
- Color palette (primary brand color minimum; full palette preferred)
- Typography choices (body, mono, wordmark, display)
- License (AGPL-3.0 / MIT / Apache-2.0 / proprietary)
- Pricing model (episodic-pass / subscription / freemium / free / open-source-only)
- Pre-launch state (yes/no — affects deferral language throughout)
- Distribution domain for public docs (when public site lands)
Do not skip this. Subsequent phases reference these decisions. If the user resists upfront commitment on any token (e.g., "I don't have a tagline yet"), record the gap and proceed; later phases will surface where the gap blocks specific deliverables.
Phase 2 — Bootstrap
Read references/directory-structure.md first — it documents the canonical layout (where files live, naming conventions, what goes in icons/svg/ vs icons/png/, what goes in _source/html/ vs exports/, etc.) and the rationale behind each choice.
Create the directory structure and seed the canonical brand docs with placeholders:
brand/
├── README.md # library navigator (start here)
├── CHEATSHEET.md # 30-second locked-values lookup
├── CHANGELOG.md # chronological log of brand changes
├── CLAUDE.md # directory-local AI agent rules
├── RECIPES.md # common-task playbook
├── BRAND.md # visual brand reference (marks, colors, typography, asset library)
├── COPY.md # language reference (locked vocabulary, voice, asset → phrase index)
├── MANIFESTO.md # long-form positioning argument
├── decisions.md # the upfront commitments from Phase 1
└── (later phases populate the rest)Anchor doc templates: assets/brand-docs/BRAND.md.template, assets/brand-docs/COPY.md.template, assets/brand-docs/MANIFESTO.md.template.
Quick-reference doc templates (one-line landing page for each common task):
assets/brand-docs/README.md.template— library navigator with "what lives where" tables and quick pathsassets/brand-docs/CHEATSHEET.md.template— 30-second locked phrases / colors / fonts / pricing cardassets/brand-docs/CLAUDE.md.template— directory-local rules for AI agents editing brand filesassets/brand-docs/CHANGELOG.md.template— audit log seed with bootstrap entry, examples for common change typesassets/brand-docs/RECIPES.md.template— common-task playbook (add a sheet, refresh press kit, run vocab check, etc.)
Walk the user through filling each section. The MANIFESTO is the highest-leverage; it's where the positioning argument actually lives, and the FAQ / TONE / PRICING / BIOS docs reference it for long-form. Do not skim it — spend real time here. A weak manifesto produces weak everything else.
The quick-ref docs are templated specifically — fill the {{TOKEN}} placeholders from decisions.md (CHEATSHEET) or genericize based on Phase 0 inventory (README, RECIPES). The CHANGELOG seeds with the bootstrap entry; future entries get appended as substantive changes happen. CLAUDE.md is mostly product-agnostic — only the {{PRODUCT_SLUG}} and {{BRAND_VERB}} placeholders need filling.
Phase 3 — Visual asset pipeline
Set up the render pipeline that produces brand exports from HTML source sheets. Templates:
assets/pipeline/brand.justfile.template— parameterized just recipes for rendering, WebP conversion, and composite reference sheetsassets/sheets/concept-1200x630.html.template— concept poster (system / identity / methodology / etc)assets/sheets/manifesto-1080x1350.html.template— portrait anti-positioning cardassets/sheets/method-1600x900.html.template— widescreen methodology one-pagerassets/sheets/readme-1280x640.html.template— 2:1 GitHub README bannerassets/sheets/og-1200x630.html.template— Open Graph imageassets/sheets/poster-1224x1584.html.template— letter-portrait designer-handoff brand summary (dark + light)assets/sheets/swatch-1584x1224.html.template— letter-landscape designer-kit reference (lockups / colors / type, light only)
Each HTML sheet is self-contained, uses brand color/typography variables from Phase 0, and has a render-mode handler so Playwright can isolate variants by URL hash. The justfile recipes wire Playwright + cwebp into a just brand umbrella command.
Designer-facing artifacts — the poster + swatch templates produce print-ready letter-sized handoff materials:
- Poster (1224×1584 letter portrait, dark + light): single-page brand summary for external designer onboarding. Wordmark hero, color palette, typography, locked-phrases card, footer.
- Swatch (1584×1224 letter landscape, light only): standard designer-kit reference card. Lockup specimens, color swatches with hex codes, typography specimens with weights and roles. Living artifact for
press/swatch/so journalists/designers grab it via the press URL — output as PNG (not WebP) since designers print and import to slides/Figma.
These differ from the screen-friendly reference.html (if your bootstrap includes one): poster + swatch are letter-sized, print-ready, and copy-light. The brand library's screen reference is for internal-team use; the poster + swatch are for external-designer handoff.
Additional asset types not templated but worth knowing about: carousel (multi-slide deck), story (1080×1920 vertical), principle cards (1080×1080 quote cards), promo banners (launch-state), email headers, social square posts. See references/additional-asset-types.md for descriptions and when to extend the pipeline.
After scaffolding the pipeline, run just brand to confirm the render chain works end-to-end. The first run will produce empty/placeholder assets that the user iterates on.
Phase 4 — Brand docs
Author the documentation set that extends BRAND/COPY/MANIFESTO with applied content:
BIOS.md— three-size founder bio, three-size company boilerplate, social profile bios. Useassets/brand-docs/BIOS.md.template. Word counts: 50w / 100w / 250w (±5). Char caps for social: Twitter ≤160, LinkedIn ≤120, GitHub ≤160, BlueSky ≤256.FAQ.md— 10 canonical Q&A entries, each 50–150 words. Useassets/brand-docs/FAQ.md.template. Each answer references MANIFESTO sections; doesn't duplicate them.GLOSSARY.md— defines 6–10 brand-vocabulary terms with cross-references and don't-substitute callouts. Useassets/brand-docs/GLOSSARY.md.template.TONE.md— register-by-surface guide for support reply, release note, tweet, blog post intro, email subject. Useassets/brand-docs/TONE.md.template. Each surface gets register pressure + 2 good examples + 2 avoid examples.PRICING.md(only if user has a paid product) — public-facing pricing argument. Useassets/brand-docs/PRICING.md.template. Templates support both episodic-pass and subscription pricing models; seereferences/pricing-models.md.
After authoring, mechanically verify word/char counts:
# Word counts on FAQ answers (must be 50-150)
python3 scripts/word_count.py brand/FAQ.md
# Vocabulary check against don't-use list
bash scripts/vocab_check.sh brand/Phase 5 — Repo conventions
Refresh README.md and add open-source convention files. Templates:
assets/repo-conventions/README.md.template— theme-aware<picture>banner, locked positioning intro, install/run, cross-links to brand docsassets/repo-conventions/CONTRIBUTING.md.template— license-aware contribution stance, dev setup, code style, brand voice rules linked to COPY.mdassets/repo-conventions/SECURITY.md.template— vulnerability disclosure flow, response targets, scope, safe-harborassets/repo-conventions/CODE_OF_CONDUCT.md.template— Contributor Covenant 2.1 adopted by reference, not embedded. Embedding the verbatim text triggers content-filtering on output (the Covenant explicitly enumerates harassment types). Adopt-by-reference is a documented pattern used by Kubernetes, React, Vue, Rails, etc.
License sensitivity: if the user chose a non-OSS license at Phase 0, skip CONTRIBUTING / SECURITY / CODE_OF_CONDUCT (or adapt — see references/license-considerations.md).
Phase 6 — Press kit
Compile a self-contained brand/press/ folder. Pulls from already-built artifacts:
brand/press/README.md— quick facts, file inventory, bios inlined from BIOS.md, brand colors from BRAND.md, AGPL attribution policy, contact. Useassets/press/press-README.md.template.brand/press/logos/— copies of canonical logo SVGs frombrand/icons/svg/, plus high-res raster equivalents (≥1200px wide) rendered viarsvg-convert.brand/press/hero/— copies of the README hero WebP variants frombrand/exports/readme/.
No customer testimonials, case studies, or coverage clips if pre-launch; explicitly note their deferral in the press-kit README so journalists understand they're absent intentionally.
Distribution: until a public site exists, the press kit ships via the GitHub URL of the folder. Document in the press-kit README that the canonical URL will mirror to the public site when it lands.
Decision rubric and quality checks
Read these references files as needed during the phases:
references/decision-rubric.md— Phase 0 questionnaire and how to elicit each decision from the userreferences/existing-assets.md— Phase 0 detection sweep + per-asset disposition (preserve/merge/replace/archive); how to handle non-greenfield projectsreferences/directory-structure.md— canonical brand library layout, naming conventions, what goes wherereferences/voice-checks.md— don't-use vocabulary patterns; vocabulary table for the product gets seeded into COPY.mdreferences/word-count-bounds.md— verification rubric for FAQ (50–150 words), bios (50/100/250 ±5), social capsreferences/cross-link-map.md— what should reference what; verifies cross-link integrity at end of each phasereferences/pre-launch-deferrals.md— what to defer in pre-launch state vs post-launchreferences/additional-asset-types.md— extended visual asset types (carousel, story, principle cards, promo) — descriptions and pattern guidance for extending the pipelinereferences/pricing-models.md— episodic-pass / subscription / freemium / free guidance and which PRICING.md sections to keep / cutreferences/license-considerations.md— AGPL / MIT / Apache / proprietary affects which conventions ship and how CONTRIBUTING reads
Workflow notes
Pricing-model conflicts surface late. If the product has internal billing/entitlement docs (e.g., for a hosted version), check those before writing PRICING.md — a public-facing PRICING.md that contradicts the internal entitlement spec creates real downstream confusion. Surface the conflict to the user; do not paper over it.
Memory vs canonical doc. When agent memory and a brand doc disagree on a fact (price, positioning, naming), prefer the doc and update the memory. The decisions.md from Phase 0 is the source of truth for product-specific facts; if memory drifts, fix the memory.
Brand-led-product is fine. It is reasonable for brand to commit to naming or pricing ahead of the product reflecting it (e.g., the brand decides "Track" replaces "Pipeline" before the product nav renames). Document the gap in decisions.md so the brand-vs-product divergence is visible.
Do not fabricate. If the user can't supply a token (no tagline, no MANIFESTO content, no hex codes), record the gap rather than inventing. The skill produces an honest skeleton that prompts the user for what's missing, not a plausible-looking but ungrounded brand library.
Do not clobber existing work. When the detection sweep at Phase 0 finds existing brand assets, default to preserve and surface rather than overwrite. The user can always ask for more aggressive replacement; they can't easily un-overwrite hand-crafted content. See references/existing-assets.md for per-scenario guidance.
Cross-link integrity. At the end of each phase, run a grep to confirm every cross-link target exists. The pre-launch state often means PRICING.md or MANIFESTO.md may not exist yet when other docs are being authored — handle this by either omitting the link or annotating "coming soon", never by linking to a 404.
Content filtering on the Covenant. The Contributor Covenant 2.1 verbatim text triggers output content-filtering due to its explicit enumeration of harassment types. The CODE_OF_CONDUCT template adopts the Covenant by reference (state version, link to canonical text, provide enforcement contact, summarize informationally). This is the same pattern used by Kubernetes, React, Vue, and Rails.
Resources reference
Templates (in assets/):
| Path | Use in phase |
|---|---|
brand-docs/BRAND.md.template | 2 |
brand-docs/COPY.md.template | 2 |
brand-docs/MANIFESTO.md.template | 2 |
brand-docs/README.md.template | 2 |
brand-docs/CHEATSHEET.md.template | 2 |
brand-docs/CLAUDE.md.template | 2 |
brand-docs/CHANGELOG.md.template | 2 |
brand-docs/RECIPES.md.template | 2 |
brand-docs/BIOS.md.template | 4 |
brand-docs/FAQ.md.template | 4 |
brand-docs/GLOSSARY.md.template | 4 |
brand-docs/TONE.md.template | 4 |
brand-docs/PRICING.md.template | 4 |
repo-conventions/README.md.template | 5 |
repo-conventions/CONTRIBUTING.md.template | 5 |
repo-conventions/SECURITY.md.template | 5 |
repo-conventions/CODE_OF_CONDUCT.md.template | 5 |
press/press-README.md.template | 6 |
sheets/concept-1200x630.html.template | 3 |
sheets/manifesto-1080x1350.html.template | 3 |
sheets/method-1600x900.html.template | 3 |
sheets/readme-1280x640.html.template | 3 |
sheets/og-1200x630.html.template | 3 |
sheets/poster-1224x1584.html.template | 3 |
sheets/swatch-1584x1224.html.template | 3 |
pipeline/brand.justfile.template | 3 |
Helper scripts (in scripts/):
vocab_check.sh— grep for don't-use vocabulary across brand docsword_count.py— verify FAQ / bios word counts against bounds
References (in references/, loaded as needed):
decision-rubric.mdexisting-assets.mddirectory-structure.mdvoice-checks.mdword-count-bounds.mdcross-link-map.mdpre-launch-deferrals.mdadditional-asset-types.mdpricing-models.mdlicense-considerations.md
# {{PRODUCT_NAME}} Bios & Boilerplate
Reusable copy chunks for press requests, partnership emails, conference programs, podcast intros, "about" pages, and social profiles.
Companion to [`BRAND.md`](BRAND.md), [`COPY.md`](COPY.md), and [`MANIFESTO.md`](MANIFESTO.md).
**Voice constraint:** all copy uses the locked vocabulary from [`COPY.md`](COPY.md). Avoid the "what NOT to use" list patterns.
**What's not here:** specific pricing numbers (in `PRICING.md`); customer testimonials, case studies, or coverage clips (none yet — pre-launch); founder location or biographical specifics beyond what's verifiable.
---
## Founder
### Founder bio — 50 words
> {{FOUNDER_BIO_50W}}
*Word count: {{FOUNDER_50W_COUNT}} (target 50, ±5).*
Use for: conference program bios, short panel intros, social profile short-bios.
### Founder bio — 100 words
> {{FOUNDER_BIO_100W}}
*Word count: {{FOUNDER_100W_COUNT}} (target 100, ±5).*
Use for: podcast episode descriptions, partnership email signatures, "about the founder" page sections.
### Founder bio — 250 words
> {{FOUNDER_BIO_250W}}
*Word count: {{FOUNDER_250W_COUNT}} (target 250, ±5).*
Use for: long-form press requests, founder pages, investor decks, deeper podcast intros.
---
## Company
### Company boilerplate — 50 words
> {{COMPANY_50W}}
*Word count: {{COMPANY_50W_COUNT}} (target 50, ±5).*
Use for: short partner page descriptions, app store one-liners, social profile descriptions.
### Company boilerplate — 100 words
> {{COMPANY_100W}}
*Word count: {{COMPANY_100W_COUNT}} (target 100, ±5).*
Use for: medium-form press releases, partner integration pages, "about" sections, podcast show-notes.
### Company boilerplate — 250 words
> {{COMPANY_250W}}
*Word count: {{COMPANY_250W_COUNT}} (target 250, ±5).*
Use for: long-form press releases, partnership pitch documents, public landing page "about" section, conference sponsor write-ups.
---
## Social profile bios
### Twitter (≤160 chars)
> {{TWITTER_BIO}}
*Character count: {{TWITTER_COUNT}}.*
### LinkedIn company tagline (≤120 chars)
> {{LINKEDIN_TAGLINE}}
*Character count: {{LINKEDIN_COUNT}}.*
### GitHub bio (≤160 chars)
> {{GITHUB_BIO}}
*Character count: {{GITHUB_COUNT}}.*
### BlueSky (≤256 chars)
> {{BLUESKY_BIO}}
*Character count: {{BLUESKY_COUNT}}.*
---
## Notes for use
- **Founder + company boilerplate often pair.** Pick lengths that match (50w + 50w, 250w + 250w) — mismatched pairs make one feel padded.
- **Don't quote past these.** If a publication needs a *different* word count, write it custom rather than tweaking these. Stable versions stay stable.
- **Verify before press.** Before any pre-launch piece goes public, spot-check that "currently preparing for public launch" still matches reality.
# {{PRODUCT_NAME}} Brand Reference
> **Looking for taglines, hero copy, or "how should I write this"?**
> See [`COPY.md`](COPY.md) — the language reference. This doc handles
> visual brand (marks, colors, typography, asset library).
>
> **Looking for the long-form positioning argument?** See
> [`MANIFESTO.md`](MANIFESTO.md) — the source-of-truth document.
>
> **Looking for reusable founder/company bios or social profile copy?**
> See [`BIOS.md`](BIOS.md).
## Marks
### {{MARK_NAME}} (primary icon)
{{MARK_DESCRIPTION}} — describe the silhouette, the metaphor, what makes this mark distinct from alternatives. Note any color-variant rules (e.g. "two-tone split for dark vs light backgrounds").
Files: `brand/icons/svg/{{MARK_FILENAME}}.svg`. High-res raster equivalents in `brand/icons/png/`.
### Wordmark Lockup
{{LOCKUP_DESCRIPTION}} — gem mark + product name in {{WORDMARK_FONT}}. Used on banners, landing page, README hero.
| Context | Weight |
|----------------------------|--------|
| Hero, banner, landing (≥48px) | {{LARGE_WEIGHT}} |
| App header, nav (24–40px) | {{MID_WEIGHT}} |
| Inline with bold UI text | {{INLINE_WEIGHT}} |
---
## Color System
### Brand colors
**Primary brand color: `{{PRIMARY_HEX}}`** — the canonical product color. When in doubt, use this one.
| Token | Hex | Usage |
|--------------------|-----------|-------|
| `brand-primary` | `{{PRIMARY_HEX}}` | Primary, dark-mode accent |
| `brand-light` | `{{BRAND_LIGHT_HEX}}` | Light face / hover state |
| `brand-mid` | `{{BRAND_MID_HEX}}` | Mid-tone variant |
| `brand-highlight` | `{{BRAND_HIGHLIGHT_HEX}}` | Edge highlights, glow |
| `accent-primary` | `{{ACCENT_HEX}}` | Default accent |
### Dark theme
| Token | Hex | Usage |
|--------------------|-----------|-------|
| `bg-primary` | `{{DARK_BG}}` | Page background |
| `bg-surface` | `{{DARK_SURFACE}}` | Cards, panels |
| `text-primary` | `{{DARK_TEXT}}` | Body text |
| `text-secondary` | `{{DARK_TEXT_DIM}}` | Supporting text |
### Light theme
| Token | Hex | Usage |
|--------------------|-----------|-------|
| `bg-primary` | `{{LIGHT_BG}}` | Page background |
| `bg-surface` | `{{LIGHT_SURFACE}}` | Cards, panels |
| `text-primary` | `{{LIGHT_TEXT}}` | Body text |
### Status colors
| Token | Dark | Light |
|-----------|-------------|-------------|
| `success` | `{{SUCCESS_DARK}}` | `{{SUCCESS_LIGHT}}` |
| `warning` | `{{WARNING_DARK}}` | `{{WARNING_LIGHT}}` |
| `error` | `{{ERROR_DARK}}` | `{{ERROR_LIGHT}}` |
---
## Typography
| Context | Family | Weight | Usage |
|------------|------------------|---------|------------------------------------|
| Body | {{BODY_FONT}} | {{BODY_WEIGHTS}} | All app text, labels |
| Mono | {{MONO_FONT}} | {{MONO_WEIGHTS}} | Code, technical values |
| Wordmark | {{WORDMARK_FONT}} | {{WORDMARK_WEIGHT}} | Wordmark lockup only |
| Display | {{DISPLAY_FONT}} | {{DISPLAY_WEIGHTS}} | Hero text, marketing |
---
## Tagline
**{{TAGLINE}}**
Used across all brand assets. {{TAGLINE_RATIONALE}}
---
## Asset library
The brand asset render pipeline produces visual assets from HTML source sheets in `brand/_source/html/`. See `brand/_source/` for sources, `brand/exports/` for rendered WebP outputs.
```
brand/
├── README.md ← library navigator (start here)
├── CHEATSHEET.md ← 30-second locked-values lookup
├── CHANGELOG.md ← chronological log of brand changes
├── CLAUDE.md ← directory-local AI agent rules
├── RECIPES.md ← common-task playbook
├── BRAND.md ← this file (visual brand reference)
├── COPY.md ← language reference
├── MANIFESTO.md ← long-form positioning
├── BIOS.md ← reusable bios
├── FAQ.md ← canonical Q&A
├── GLOSSARY.md ← term definitions
├── TONE.md ← register-by-surface guide
├── PRICING.md ← pricing argument (if applicable)
├── decisions.md ← Phase 1 captured commitments
├── discovery.md ← Phase 0 inventory and inferences
├── icons/ ← logo SVGs and PNG rasters
│ ├── svg/ ← canonical vector source
│ └── png/ ← high-res raster exports
├── _source/ ← all source files (build inputs)
│ ├── html/ ← HTML source sheets for visual assets
│ │ └── _archive/ ← retired sheets preserved for history
│ └── ai/ ← Adobe Illustrator sources (.ai files)
├── exports/ ← rendered WebP outputs (generated by `just brand`)
└── press/ ← press kit (logos + hero + README)
```
## Render pipeline
Run `just brand` to render all visual assets. Recipes available:
- `just brand-concepts` — concept posters
- `just brand-banners` — hero banners
- `just brand-readme` — GitHub README hero
- `just brand-method` — methodology one-pager
- `just brand-manifesto` — anti-positioning card
- (extend per product needs)
See `justfile` for the full recipe list.
## Usage rules
1. {{USAGE_RULE_1}}
2. {{USAGE_RULE_2}}
3. {{USAGE_RULE_3}}
4. **Light theme is the default** unless the product surface is marketing / landing where dark is more impactful.
5. **{{WORDMARK_FONT}} is wordmark-only.** Don't use for body text or UI labels.
# Brand Changelog
What changed in the brand library and when. Public-surface audits, vocabulary updates, structural reorganizations, retired assets — all anchored here so future drift is measurable against a known-good baseline.
When you make a substantive brand change, append an entry with the date and what changed. Format: `## YYYY-MM-DD · {short title}` followed by a paragraph and bullet list.
For voice and register guidance, see [`COPY.md`](COPY.md). For library navigation, see [`README.md`](README.md).
---
## {{INITIAL_DATE}} · brand library bootstrap
Initial brand library scaffolded via the [`brand-library-architect`](https://github.com/example/brand-library-architect) skill. Phase 0 (Discovery) inventoried existing assets; Phase 1 (Decision rubric) captured commitments in `decisions.md`; Phase 2 (Bootstrap) created the directory structure and seeded BRAND.md, COPY.md, MANIFESTO.md.
Subsequent phases populated:
- {{PHASE_2_DESCRIPTION}}
- {{PHASE_3_DESCRIPTION}}
- {{PHASE_4_DESCRIPTION}}
- {{PHASE_5_DESCRIPTION}}
- {{PHASE_6_DESCRIPTION}}
**Initial commitments locked in `decisions.md`:**
- Brand verb: `{{BRAND_VERB}}`
- Durable noun: `{{DURABLE_NOUN}}`
- Tagline: {{TAGLINE}}
- Hero: {{LOCKED_HERO_NOUN}} *{{LOCKED_HERO_VERB}}*
- Primary color: `{{PRIMARY_HEX}}`
- License: {{LICENSE}}
- Pricing model: {{PRICING_MODEL}}
---
<!-- Append new entries above this line. Examples below show the format
for common change types: -->
<!--
## YYYY-MM-DD · public-surface audit
Sweep of public-facing assets to align with locked vocabulary. Caught {{NUMBER}} drifts:
- **{{ASSET_NAME}}** — old phrase → new phrase. Reason for change.
- **{{ASSET_NAME}}** — pre-rebrand language replaced with locked positioning.
**Known-deferred:** {{ITEMS_DEFERRED_AND_WHY}}.
## YYYY-MM-DD · vocabulary update
Updated `{{TERM}}` from `{{OLD_VALUE}}` to `{{NEW_VALUE}}`. Reason: {{REASON}}.
Updated all references:
- `COPY.md` "Locked phrases" / "Brand vocabulary" sections
- `BIOS.md` (if mentioned)
- `MANIFESTO.md` (if mentioned)
- All HTML sheets in `_source/html/`
- Re-rendered visual library via `just brand`
## YYYY-MM-DD · new asset type added
Added `{{TYPE_NAME}}` ({{DIMENSIONS}}). Use for {{USE_CASE}}.
- New source: `_source/html/{{TYPE_SLUG}}.html`
- New render recipe: `brand-{{TYPE_SLUG}}` in justfile
- New cleanup recipe: `brand-clean-{{TYPE_SLUG}}` in justfile, chained from `brand-webp-clean`
- Inventory tree updated in `BRAND.md`
## YYYY-MM-DD · retired asset
Retired `{{ASSET_NAME}}`. Reason: {{REASON}}.
Source archived to `_source/html/_archive/{{ASSET_NAME}}.html`. Removed from active render pipeline. Removed from inventory tree in `BRAND.md`. Cross-references in COPY.md / GLOSSARY.md updated to note retirement.
-->
# {{PRODUCT_NAME}} Cheatsheet
The 30-second reference. Locked phrases, brand vocabulary, colors, fonts, key URLs. No narrative.
For the full library navigator, see [`README.md`](README.md). For chronological history, see [`CHANGELOG.md`](CHANGELOG.md).
---
## Locked phrases
| Slot | Phrase |
|---|---|
| **Tagline** | {{TAGLINE}} |
| **Hero** | {{LOCKED_HERO_NOUN}} *{{LOCKED_HERO_VERB}}* |
| **Trust line** | {{TRUST_LINE}} |
| **Social / ad** | {{SOCIAL_AD_COPY}} |
| **Close phrase** | {{CLOSE_PHRASE}} |
## Brand vocabulary
| Term | Type | Notes |
|---|---|---|
| **{{BRAND_VERB}}** | verb | The brand verb. Never *tailor* / *generate* / *customize*. |
| **{{DURABLE_NOUN}}** | noun | The durable thing the user builds. |
| {{ARTIFACT_TERM}} | noun | A presentation produced by recutting (resume, letter, recruiter card, …) |
| {{SUBSTRATE_TERM}} | noun | The structural foundation underneath the model |
| {{POSITIONING_TERM}} | noun | A positioning angle |
| {{PRICING_UNIT}} | noun | A {{PRICING_UNIT_DURATION}} usage window (the pricing unit) |
For full definitions and don't-substitute callouts, see [`GLOSSARY.md`](GLOSSARY.md).
## Don't use
- ❌ Tailor / Generate / Customize → ✅ {{BRAND_VERB}}
- ❌ Profile / Customer data → ✅ {{DURABLE_NOUN}}
- ❌ Stand out / Stand out from the crowd
- ❌ AI-powered (as marketing label)
- ❌ Game-changing / Revolutionary / Next-generation
- ❌ {{PRODUCT_SPECIFIC_BANNED}}
Full list in [`COPY.md`](COPY.md#what-not-to-use).
## Colors
| Hex | Role |
|---|---|
| `{{PRIMARY_HEX}}` | Primary brand color — when in doubt, use this |
| `{{BRAND_LIGHT_HEX}}` | Light face / accent |
| `{{BRAND_MID_HEX}}` | Mid-tone variant |
| `{{ACCENT_HEX}}` | Default accent |
| Hex | Role |
|---|---|
| `{{DARK_BG}}` | Dark theme background |
| `{{LIGHT_BG}}` | Light theme background |
Full color system with named tokens in [`BRAND.md`](BRAND.md#color-system).
## Typography
| Use | Family | Weight |
|---|---|---|
| Body | {{BODY_FONT}} | {{BODY_WEIGHTS}} |
| Mono | {{MONO_FONT}} | {{MONO_WEIGHTS}} |
| Wordmark | {{WORDMARK_FONT}} | {{WORDMARK_WEIGHT}} |
| Display | {{DISPLAY_FONT}} | {{DISPLAY_WEIGHTS}} |
## Pricing facts (if applicable)
| What | Detail |
|---|---|
| Price | {{PRICE}} |
| Pass duration | {{PRICING_UNIT_DURATION}} |
| Usage window | {{USAGE_WINDOW}} |
| Refund | {{REFUND_WINDOW}} |
| Subscription | {{SUBSCRIPTION_POLICY}} |
Full pricing argument in [`PRICING.md`](PRICING.md).
## Key URLs and contact
| What | Where |
|---|---|
| Domain | {{DOMAIN}} |
| Repo | {{REPO_URL_SHORT}} |
| Press contact | {{CONTACT_EMAIL}} |
| Manifesto URL | `{{DOMAIN}}/manifesto` *(state if pending)* |
| Pricing URL | `{{DOMAIN}}/pricing` *(state if pending)* |
| Press URL | `{{DOMAIN}}/press` *(state if pending)* |
## Render commands
```bash
just brand # full library
just brand-{category} # any single category
just brand-clean # remove only pipeline renders (preserves AI exports)
```
See [`RECIPES.md`](RECIPES.md) for common task walkthroughs.
## Locked positioning rules
1. Lead with the structural claim, not a question.
2. Use the brand verb (`{{BRAND_VERB}}`).
3. Italic accent on the brand-claim noun in display titles.
4. Mono-uppercase for system metadata; sans-serif for body; display serif for hero.
5. Em-dash policy: display copy may use connective em-dashes; long-form prose avoids them.
Voice and register details in [`COPY.md`](COPY.md#voice-and-register).
# Brand library — directory-local guidance for AI agents
Instructions specifically for AI agents (Claude Code, Codex, etc.) working in `brand/` files. These supplement the project-root [`CLAUDE.md`](../CLAUDE.md) — the rules below are scoped to the brand library.
## Before any change
1. **Read [`CHEATSHEET.md`](CHEATSHEET.md) first.** It has the locked vocabulary, colors, and pricing facts.
2. **Read [`COPY.md`](COPY.md) before editing user-facing copy.** Section "What NOT to use" lists vocabulary to avoid in any positive use; section "Voice and register" describes the tonal moves the brand uses.
3. **Read [`MANIFESTO.md`](MANIFESTO.md) before adding new positioning content.** New FAQ answers / TONE examples / PRICING sections should reference it, not duplicate it.
4. **Run discovery before bootstrapping new content.** If you're a fresh agent landing in this directory, the inventory is in [`README.md`](README.md). Don't guess at existing structure — read what's there.
## Editing rules
- **Visual assets are produced via the render pipeline, not edited by hand.** Files in `exports/` are generated by `just brand-{category}`. Edit the source HTML in `_source/html/{name}.html`, then re-render. Don't manually edit a `.webp` or `.png` in `exports/`.
- **Locked vocabulary is locked.** Don't rewrite the brand verb (`{{BRAND_VERB}}`) as alternatives. The vocabulary is canonical because consistency is the brand. If the user explicitly requests a vocabulary change, update [`COPY.md`](COPY.md) first and document the change in [`CHANGELOG.md`](CHANGELOG.md).
- **Cross-link integrity matters.** When a doc references another doc, verify the target exists *and* the section anchor exists. Broken cross-links are silent failures the reader hits when clicking through.
- **Word-count bounds matter for FAQ and BIOS.** FAQ answers must be 50–150 words. Bios must be 50/100/250 ±5. Verify mechanically (Python script in `~/.claude/skills/brand-library-architect/scripts/word_count.py` or run a small inline counter) before claiming a doc is updated.
- **Don't fabricate brand commitments.** If you don't know a value (color hex, tagline word, pricing detail), ask the user. Inventing a plausible-looking-but-ungrounded value contaminates the canonical brand and is hard to detect later.
## Render pipeline
```bash
just brand # full library — render every category
just brand-{category} # render one category
just brand-webp-clean # remove pipeline-rendered WebP files (PNGs preserved)
just brand-clean # remove pipeline-rendered WebP + PNG files
just brand-clean-{category} # remove only one category's pipeline renders
```
**Critical:** `brand/exports/` may also contain Adobe Illustrator exports (or other manually-placed assets) that share the `{{PRODUCT_SLUG}}-*` prefix. The `brand-clean` recipes are written to enumerate exactly which files each `brand-{cat}` render produces — they don't `rm -rf` whole categories. **Don't change cleanup recipes to use directory-wide deletion.** If you add a new render category, add a matching `brand-clean-{cat}` recipe that enumerates the specific files that category produces, and chain it from `brand-webp-clean`.
See [`RECIPES.md`](RECIPES.md) for common task walkthroughs.
## When something looks wrong
- **Stale cross-link.** Update or remove. Never link to a 404. If the target doesn't exist yet, use `*(planned)*` annotation, then drop it when the file lands.
- **Vocabulary drift in committed code.** A pre-locked-vocabulary phrase in an existing surface needs updating. Surface the finding to the user; don't silently overwrite, especially in long-form docs.
- **File naming drift.** If you find files that don't match the conventions in [`BRAND.md`](BRAND.md) inventory tree, surface it. The canonical names are the ones in BRAND.md.
- **Internal-vs-public conflict.** If brand-side docs claim X and an internal doc claims Y, surface the conflict to the user before authoring anything that depends on either claim. The conflict resolution is product-strategy, not text-editing.
## When working from the brand-library-architect skill
The [`brand-library-architect`](file:///Users/nick/.claude/skills/brand-library-architect/) personal skill captures the full workflow for building or extending a brand library. Use it when:
- Bootstrapping a brand library for a new product.
- Authoring a new brand artifact type.
- Auditing an existing repo for brand assets.
When applied to *this* repo, the skill should run Discovery (Phase 0) and recognize the existing brand library — it should NOT clobber existing work. Default to **preserve and surface** rather than overwrite.
## Logging substantive changes
When you make a substantive brand change (new asset type, vocabulary update, audit pass, structural reorganization), append an entry to [`CHANGELOG.md`](CHANGELOG.md) with the date and what changed. Drift accumulates without a paper trail; the changelog is the paper trail.
## Don't
- Don't introduce new vocabulary without checking COPY.md first.
- Don't manually edit `exports/*.webp` or `exports/*.png`.
- Don't `rm -rf brand/exports/{category}` — Adobe Illustrator exports may live there too.
- Don't fabricate brand values you don't know.
- Don't skip the cross-link integrity check.
- Don't ship a "rebrand" or "vocabulary update" without a CHANGELOG entry.
## Do
- Do read CHEATSHEET.md when you need a fast lookup.
- Do verify cross-links after edits.
- Do verify word-count and char-cap bounds for FAQ and BIOS.
- Do surface conflicts (internal-vs-public, vocabulary drift, file naming inconsistency) rather than silently resolving them.
- Do use the render pipeline for visual assets.
- Do log substantive changes in CHANGELOG.md.
# {{PRODUCT_NAME}} Copy Reference
Canonical taglines, hero copy, brand vocabulary, concept names, and the
phrases worth lifting elsewhere. Companion to [`BRAND.md`](BRAND.md)
(which handles marks, colors, typography). This doc handles language.
For the long-form positioning argument that uses these phrases in
context, see [`MANIFESTO.md`](MANIFESTO.md).
---
## At a glance
| Slot | Phrase |
|---|---|
| Tagline | **{{TAGLINE}}** |
| Hero | **{{LOCKED_HERO_NOUN}}** *{{LOCKED_HERO_VERB}}* |
| Social / ad | {{SOCIAL_AD_COPY}} |
| Trust line | {{TRUST_LINE}} |
| Brand verb | **{{BRAND_VERB}}** |
| Domain | {{DOMAIN}} |
---
## Voice and register
{{PRODUCT_NAME}} copy is **declarative, confident, and self-aware**. {{VOICE_DESCRIPTION}}
**Tonal moves we use:**
- Short sentences. Cuts before clauses.
- Italic accent on the *key word* in a display title (Instrument Serif italic + brand color).
- Mono uppercase for system metadata (`v3 · public`, `01 / 02 / 03`).
- Owned verbs over generic ones (`{{BRAND_VERB}}` not `{{COMPETITOR_VERB}}`).
- The reader is a peer, not a prospect.
**Em-dash policy** — two rules for two registers:
> **Display copy** (principle cards, hero subtitles, captions) may use
> connective em dashes for rhythm at large size.
>
> **Long-form prose** (manifesto, blog posts, body copy ≥ 2 paragraphs)
> avoids connective em dashes. Prefer commas, colons, or new sentences.
**Tonal moves we avoid:**
- Hyperbolic claims ("revolutionary", "next-generation").
- "AI-powered" as a marketing label.
- Flat utility verbs ("optimize", "streamline", "leverage").
- Aspirational fluff ("unleash your potential").
- Empty contrast ("not just X, but Y").
---
## Locked phrases
These don't change without intent. If you're updating one, plan to update it everywhere it appears.
### Tagline
> **{{TAGLINE}}**
{{TAGLINE_DESCRIPTION}}
### Hero copy
> **{{LOCKED_HERO_NOUN}}**
> *{{LOCKED_HERO_VERB}}*
{{HERO_DESCRIPTION}}
### Trust line
> {{TRUST_LINE}}
{{TRUST_LINE_DESCRIPTION}}
---
## Brand vocabulary
### `{{BRAND_VERB}}` — the brand verb
> ✅ "{{GOOD_VERB_USE_1}}"
> ✅ "{{GOOD_VERB_USE_2}}"
> ❌ "{{BAD_VERB_USE_1}}" (every product in the category says this)
> ❌ "{{BAD_VERB_USE_2}}" (implies one-shot AI / wrong category)
**Why "{{BRAND_VERB}}":** {{BRAND_VERB_RATIONALE}}
### `{{DURABLE_NOUN}}` — the durable noun
The thing the user builds once. Always lowercase unless starting a sentence. Don't substitute:
> ❌ "{{BAD_NOUN_1}}" ({{REASON_1}})
> ❌ "{{BAD_NOUN_2}}" ({{REASON_2}})
---
## What NOT to use
Generic vocabulary that flattens the brand into the SaaS-startup category. Replace where you find it.
| Don't use | Use instead | Why |
|---|---|---|
| Tailor / Generate / Customize | **{{BRAND_VERB}}** | Generic; the brand verb is structural |
| Profile | **{{DURABLE_NOUN}}** | Suggests presentation layer |
| Career platform / Customer platform / etc. | (concept name) | Platform is generic |
| Stand out | (rephrase) | Empty competitive framing |
| AI-powered (as label) | Describe what it does | Don't lead with the tech |
| Game-changing / Revolutionary / Next-generation | (avoid) | Hyperbolic |
| {{PRODUCT_SPECIFIC_BANNED_1}} | {{ALTERNATIVE_1}} | {{REASON_1}} |
| {{PRODUCT_SPECIFIC_BANNED_2}} | {{ALTERNATIVE_2}} | {{REASON_2}} |
---
## Topics covered elsewhere
| Topic | Lives in | What it covers |
|---|---|---|
| Reusable founder/company bios | [`BIOS.md`](BIOS.md) | 50w / 100w / 250w bios; social profile bios |
| Predictable Q&A | [`FAQ.md`](FAQ.md) | Canonical answers to 10 common questions |
| Term definitions | [`GLOSSARY.md`](GLOSSARY.md) | Brand vocabulary with cross-references |
| Tone by surface | [`TONE.md`](TONE.md) | Register guide for support / release / tweet / blog / email |
| Anti-positioning | [`MANIFESTO.md`](MANIFESTO.md) | Long-form positioning argument |
| Pricing language | [`PRICING.md`](PRICING.md) | $X / pass-or-subscription / window / refund |
---
## Asset → phrase index
If you change a phrase, here's where it appears so you know what to update.
### Tagline (`{{TAGLINE}}`)
- {{LIST_TAGLINE_LOCATIONS}}
### Hero copy
- {{LIST_HERO_LOCATIONS}}
### Trust line
- {{LIST_TRUST_LOCATIONS}}
---
## When you write something new
The 4-step gut check before publishing brand copy:
1. **Does this say something only {{PRODUCT_NAME}} can say?** If a competitor's landing page could host the same sentence, rewrite.
2. **Did you reach for the owned verb?** If you wrote *tailor* / *generate* / *customize* — fix it.
3. **Is the locked hero or tagline within reach?** Anchor every asset.
4. **Is the register right for the surface?** Mono-uppercase for system slots; display serif italic for editorial accents; body sans for prose.
# {{PRODUCT_NAME}} FAQ
Canonical answers to predictable questions. Consistency is the point: the same question gets the same answer across blog posts, support replies, sales emails, social, and the landing page.
For the long-form positioning argument behind these answers, see [`MANIFESTO.md`](MANIFESTO.md). For locked vocabulary, see [`COPY.md`](COPY.md). For term definitions, see [`GLOSSARY.md`](GLOSSARY.md).
**Word-count budget:** each answer 50–150 words. Verify with `python3 scripts/word_count.py brand/FAQ.md`.
---
## What is {{PRODUCT_NAME}}?
{{ANSWER_WHAT_IS_IT}}
## {{COMPETITOR_CATEGORY_QUESTION}}
{{ANSWER_NOT_THAT_CATEGORY}}
See "{{MANIFESTO_SECTION_REF}}" in [`MANIFESTO.md`](MANIFESTO.md) for the full argument.
## What's a {{BRAND_VERB}}?
{{ANSWER_BRAND_VERB_DEFINITION}}
`{{BRAND_VERB}}` is the brand verb. Use it instead of *tailor* / *generate* / *customize*. See [`GLOSSARY.md`](GLOSSARY.md#{{BRAND_VERB}}) for the full distinction.
## How does my data work?
The {{DURABLE_NOUN}} belongs to the user. Structurally:
- {{PRODUCT_NAME}} is **{{LICENSE}}**. The codebase is auditable.
- Data exports cleanly — you can walk away with your full {{DURABLE_NOUN}} intact.
- The application is **self-hostable**. Run it on your own infrastructure.
- {{HOSTED_DATA_PROMISE}}
Open-source is the credibility; "{{TRUST_LINE_PROMISE}}" is the promise. See "Your data, your model" or equivalent in [`MANIFESTO.md`](MANIFESTO.md).
## Why {{PRICING_UNIT}} instead of subscription?
{{ANSWER_PRICING_MODEL_RATIONALE}}
## How is this different from {{COMPETITOR_LIST}}?
Most of those tools work from {{SHALLOW_PATTERN}}. That's a shallow {{DURABLE_NOUN}} — and it produces shallow output. {{PRODUCT_NAME}} treats {{X}} as a structured {{DURABLE_NOUN}} that can be queried and recomposed.
The other category-specific differences:
- **{{BRAND_VERB}}, not {{COMPETITOR_VERB}}.** {{DIFFERENCE_1}}
- **Correction over creation.** {{DIFFERENCE_2}}
- **{{PRICING_DIFF}}**
- **{{LICENSE_DIFF}}.**
## What does it cost?
{{PRICING_HEADLINE}}.
The short version of the why: {{PRICING_RATIONALE_ONE_LINER}}. The full argument lives in [`PRICING.md`](PRICING.md) and the "{{PRICING_MANIFESTO_SECTION}}" section of [`MANIFESTO.md`](MANIFESTO.md).
## Is this an AI tool?
{{AI_FRAMING_ANSWER}}
But {{PRODUCT_NAME}} isn't pitched as "AI for X." {{WHY_NOT_AI_LABEL}}. {{PRODUCT_NAME}} is structurally different: {{HOW_IT_DIFFERS}}.
## Can I self-host?
Yes. {{PRODUCT_NAME}} is open-source under {{LICENSE}} and built so the data, code, and entire system are exportable and auditable. Clone the repo, run the dev server, and you have a local instance. See the [README](../README.md#getting-started) for setup steps.
{{SELF_HOST_TRADEOFF_DESCRIPTION}}.
{{LICENSE_NETWORK_USE_NOTE}}.
## {{PRODUCT_SPECIFIC_FAQ_10}}
{{ANSWER_10}}
See "{{MANIFESTO_SECTION_REF_10}}" in [`MANIFESTO.md`](MANIFESTO.md) for the full argument.
# {{PRODUCT_NAME}} Glossary
Definitions of brand terms. Each entry includes good usage, what NOT to substitute, and "See also" cross-refs.
For the broader vocabulary discussion, see [`COPY.md`](COPY.md). For predictable Q&A using these terms, see [`FAQ.md`](FAQ.md).
---
## {{BRAND_VERB}}
*(verb)* — The brand verb. {{BRAND_VERB_DEFINITION}}.
- ✅ "{{BRAND_VERB_GOOD_USE_1}}"
- ✅ "{{BRAND_VERB_GOOD_USE_2}}"
- ❌ "Tailor X" (every product in the category says this)
- ❌ "Generate a custom X" (implies one-shot AI)
- ❌ "Optimize" (empty utility verb)
- ❌ "Customize" (generic)
**See also:** *{{DURABLE_NOUN}}*, *{{ARTIFACT_TERM}}*.
## {{DURABLE_NOUN}}
*(noun)* — {{DURABLE_NOUN_DEFINITION}}. Always lowercase unless starting a sentence.
- ✅ "{{NOUN_GOOD_USE_1}}"
- ✅ "{{NOUN_GOOD_USE_2}}"
- ❌ "Profile" (suggests presentation layer)
- ❌ "{{BAD_NOUN_2}}" ({{REASON_2}})
**See also:** *{{BRAND_VERB}}*, *{{COMPONENT_TERM}}*.
## {{ARTIFACT_TERM}}
*(noun)* — {{ARTIFACT_DEFINITION}}.
- ✅ "{{ARTIFACT_GOOD_USE_1}}"
- ❌ "{{BAD_ARTIFACT_USE}}" ({{REASON}})
**See also:** *{{BRAND_VERB}}*, *{{DURABLE_NOUN}}*.
## {{SUBSTRATE_TERM}}
*(noun)* — {{SUBSTRATE_DEFINITION}}.
- ✅ "{{SUBSTRATE_GOOD_USE}}"
**See also:** *{{DURABLE_NOUN}}*, *{{CONCEPT_NAME}}*.
## {{POSITIONING_TERM}}
*(noun)* — {{POSITIONING_DEFINITION}}.
- ✅ "{{POSITIONING_GOOD_USE}}"
**See also:** *{{BRAND_VERB}}*, *{{DURABLE_NOUN}}*.
## {{PRICING_UNIT}}
*(noun)* — {{PRICING_UNIT_DEFINITION}}.
- ✅ "{{PRICING_GOOD_USE_1}}"
- ❌ "Subscription" — the difference is structural, not branding.
**See also:** [`PRICING.md`](PRICING.md).
## {{RETIRED_TERM}}
*(retired)* — {{RETIRED_TERM_HISTORY}}. Retired in favor of {{REPLACEMENT}}.
- ❌ Don't introduce *{{RETIRED_TERM}}* in new copy.
**See also:** {{REPLACEMENT_LINK}}.
## {{CONCEPT_NAME}}
*(concept name; capitalized)* — {{CONCEPT_NAME_DEFINITION}}. Capitalized as a proper noun when invoking the concept.
- ✅ "{{PRODUCT_NAME}}'s **{{CONCEPT_NAME}}** {{CONCEPT_USE}}"
- ✅ "{{LOWERCASE_DESCRIPTIVE_USE}}" (descriptive use, lowercase, fine in product / hero copy)
- ❌ "{{BAD_CONCEPT_USE}}" — adding {{BAD_WORD}} weakens the claim
- ❌ "Career platform / customer platform / etc." — banned (generic)
**See also:** *{{DURABLE_NOUN}}*, *{{SUBSTRATE_TERM}}*.
# MANIFESTO
{{ONE_LINE_THESIS_OR_PROVOCATIVE_OPENER}}
{{OPENING_PARAGRAPH}} — describe what's broken in the category, in concrete terms. Name the failure modes. The reader should recognize the world being described.
{{CATEGORY_INDICTMENT}} — the structural pattern that makes the category broken. Take a position; don't hedge.
{{PRODUCT_NAME}} exists because {{REASON_FOR_EXISTENCE}}. The work that actually changes outcomes is the work nobody is helping the user do. {{PRODUCT_NAME}} does that.
So we built one that does.
## {{SECTION_1_TITLE}}
{{SECTION_1_OPENING_CLAIM}}
By "{{KEY_TERM}}" we mean: {{KEY_TERM_DEFINITION}}. Most {{CATEGORY_TOOLS}} work from {{SHALLOW_PATTERN}}. That produces {{SHALLOW_OUTPUT}}. You can tell because {{TELL_FOR_SHALLOW}}.
{{PRODUCT_NAME}}'s {{DURABLE_NOUN}} isn't {{NAIVE_THING}}. {{DURABLE_NOUN_DESCRIPTION}}.
{{TAGLINE}}.
This is the part most {{CATEGORY_TOOLS}} skip. They jump straight to {{SHORTCUT}} because {{SHORTCUT}} demos well. Building the {{DURABLE_NOUN}} takes time and feels like work. It is work. There's no version of this that gets faster by hiding the {{DURABLE_NOUN}} from the user and pretending the artifact came from somewhere magic.
## {{SECTION_2_TITLE}}
{{SECTION_2_THESIS}}
Most AI tools start with a blank page and ask you to fill it. That works fine for tasks where the AI knows more than you about the topic. It works terribly for tasks where the topic is *you* (or *your business*, or *your specific situation*). {{PRODUCT_NAME}}'s job isn't to {{NAIVE_AI_BEHAVIOR}}. Its job is to {{CORRECTION_BEHAVIOR}}.
Each pass surfaces what was already true.
{{REFINEMENT_DETAIL}} — the system extracts what you already know, structures it, lets you correct what comes out wrong. The next cut is closer to right by default.
The result reads like you because it is you. There are no AI tells because the AI didn't write your story. The AI structured what you said about your story. The voice was always yours.
## {{SECTION_3_ANTI_PATTERN_TITLE}}
We don't {{ANTI_PATTERN}} because {{ANTI_PATTERN_REASON}}.
{{ANTI_PATTERN_CATEGORY_DESCRIPTION}}. The math only works if {{CONDITION}}. {{WHY_CONDITION_FAILS}}.
The tools selling this know the math doesn't work. The pitch is selling effort relief, not outcomes. {{PROOF_POINT}}.
We're optimizing for the opposite.
{{POSITIVE_ALTERNATIVE}} — small numbers of {{GOOD_THING}}, not large numbers of {{BAD_THING}}. {{REASONING}}.
This is the strategy that fits the current market. {{MARKET_CONDITION}}. {{WHY_PRECISION_BEATS_VOLUME}}.
## {{SECTION_4_TITLE}}
{{LIVE_MODE_OR_SIMILAR_DEFENSE}}
{{NUANCED_DISTINCTION_BETWEEN_OUR_FEATURE_AND_CHEATING_TOOLS}}
{{PRODUCT_NAME}}'s {{FEATURE_NAME}} is structurally different. {{STRUCTURAL_EXPLANATION}}.
{{POSITIVE_FRAME}}.
Worth saying out loud: {{REAL_WORLD_CONTEXT}}.
The deeper architectural point: {{FEATURE_NAME}} is just another face of the same {{DURABLE_NOUN}}. Nobody calls a {{ARTIFACT}} a cheatsheet. Nobody objects to a candidate / user / customer showing up prepared.
## {{SECTION_5_PRICING_TITLE}}
{{PRICING_THESIS}}
{{WORK_PATTERN_DESCRIPTION}}. {{WHY_DEFAULT_MODEL_FAILS}}. The whole pricing model is misaligned with the work.
{{PRODUCT_NAME}} sells in {{PRICING_UNIT}}. {{PRICING_UNIT_RATIONALE}}.
The {{PRICING_UNIT}} runs in {{INTENSITY_PATTERN}}. The pricing should too.
{{ALIGNMENT_OF_INCENTIVES_ARGUMENT}}.
For the numbers, the refund terms, and the alignment-vs-subscription comparison, see [`PRICING.md`](PRICING.md).
## {{SECTION_6_DATA_TITLE}}
The {{DURABLE_NOUN}} belongs to the user. We mean it structurally, not as marketing.
Every feature in {{PRODUCT_NAME}} is built so the data is exportable, the code is auditable, and the entire system is self-hostable. {{LICENSE_SPECIFIC_DETAIL}}.
Open-source is the credibility. *{{TRUST_LINE_PROMISE}}* is the promise.
The reason we can ship export and self-host without losing customers is that the moat isn't your data. The moat is the product. {{PRODUCT_NAME}} is the place where {{DURABLE_NOUN_WORKING_FLOW}} is ergonomic. {{TAKE_DATA_ELSEWHERE_SCENARIO}}.
We're selling a product, not custody.
## What it adds up to
{{CLOSE_PHRASE_1}}
{{COMPOUND_VALUE_OVER_TIME_DESCRIPTION}}.
{{CLOSE_PHRASE_2}} — every cycle is a deeper version of the user.
{{LOCKED_HERO_NOUN}} {{LOCKED_HERO_VERB}}.
That's the whole pitch.
---
*{{TRUST_LINE}} · {{DOMAIN}}*
# {{PRODUCT_NAME}} Pricing
Public-facing pricing language. Numbers, the argument behind them, and what stays the user's after a {{PRICING_UNIT}} closes. For long-form positioning, see [`MANIFESTO.md`](MANIFESTO.md). For predictable Q&A, see [`FAQ.md`](FAQ.md). For internal entitlement enforcement, see {{INTERNAL_PRICING_DOC_PATH}} (if applicable).
---
## Quick facts
| What | Detail |
|---|---|
| Price | **{{PRICE}}** |
| {{PRICING_UNIT_LABEL}} | {{PRICING_UNIT_DURATION}} |
| Usage window | {{USAGE_WINDOW}} |
| Refund | {{REFUND_WINDOW}} |
| Subscription | {{SUBSCRIPTION_POLICY}} |
| Self-host | {{SELF_HOST_POLICY}} |
| Currency | {{CURRENCY}} |
---
## Why {{PRICING_UNIT}}
{{WORK_PATTERN_DESCRIPTION}}.
{{WHY_DEFAULT_PRICING_FAILS}}.
{{PRODUCT_NAME}} sells in {{PRICING_UNIT_PLURAL}} — {{PRICING_UNIT_RATIONALE}}.
When the {{PRICING_UNIT}} closes, the {{DURABLE_NOUN}} stays the user's. {{COMPOUND_VALUE_OVER_TIME}}.
Read the long-form argument in [`MANIFESTO.md`](MANIFESTO.md#{{PRICING_MANIFESTO_ANCHOR}}).
---
## Why not subscription
The argument isn't about price. It's about **alignment**.
{{ALIGNMENT_VS_TIME_ARGUMENT}}.
{{HONEST_VS_DISHONEST_ALIGNMENT}}.
The deeper point is incentive structure. {{INCENTIVE_ARGUMENT}}.
{{PRICING_MODEL}} is also why we can credibly say "{{TRUST_LINE_PROMISE}}." {{LOCK_IN_VS_NO_LOCK_IN}}.
---
## What stays mine
The {{DURABLE_NOUN}} is the user's, structurally. After the {{PRICING_UNIT}} closes:
- **Data exports cleanly.** {{EXPORT_DETAIL}}.
- **The application is open-source.** {{LICENSE}}. {{LICENSE_BENEFITS}}.
- **Self-host is first-class.** {{SELF_HOST_DETAIL}}.
- **The hosted product re-opens with the next {{PRICING_UNIT}}.** {{COMPOUND_VALUE_NOTE}}.
Open-source is the credibility; *{{TRUST_LINE_PROMISE}}* is the promise. The {{PRICING_MODEL}} structure is what makes those credible at the level of incentives.
---
## Comparison to {{COMPETITOR_CATEGORY}}
The category-specific differences from {{COMPETITOR_LIST}}:
| Axis | {{COMPETITOR_CATEGORY}} | {{PRODUCT_NAME}} |
|---|---|---|
| **Pricing structure** | {{COMPETITOR_PRICING}} | {{OUR_PRICING}} |
| **Incentive alignment** | {{COMPETITOR_INCENTIVE}} | {{OUR_INCENTIVE}} |
| **What you build** | {{COMPETITOR_OUTPUT}} | {{OUR_OUTPUT}} |
| **Data ownership** | {{COMPETITOR_DATA}} | {{OUR_DATA}} |
| **What expires** | {{COMPETITOR_EXPIRY}} | {{OUR_EXPIRY}} |
This isn't a price comparison; it's an alignment comparison.
---
## Refund and pause
- **Refund window:** {{REFUND_DETAIL}}.
- **Pause:** {{PAUSE_MECHANICS}}.
- **Re-buying:** {{REBUY_PATTERN}}.
---
## What's not here
This doc is the public-facing pricing argument. Implementation details — entitlement enforcement, billing system contracts — live in {{INTERNAL_DOC_LOCATION}} (if applicable). If you're a contributor or operator and need to know exactly which features are gated or how billing is wired, that's where to look.
Topics deliberately out of scope:
- **Future tiers / promo programs.** Not yet, not until they exist.
- **Self-host pricing.** {{SELF_HOST_PRICING_NOTE}}.
- **Enterprise / team plans.** Not yet, not until they exist.
- **Discount codes / partner pricing.** Not yet.
When any of those become real, this doc gets updated.
---
## Distribution
`brand/PRICING.md` is the canonical source for public pricing language. When the public site lands, it'll mirror to `{{DOMAIN}}/pricing`.
---
## Questions
**Pricing inquiries:** [{{CONTACT_EMAIL}}](mailto:{{CONTACT_EMAIL}})
**How the {{DURABLE_NOUN}} works after a {{PRICING_UNIT}} closes:** see [`MANIFESTO.md`](MANIFESTO.md#{{DATA_OWNERSHIP_ANCHOR}}).
**Why {{PRICING_UNIT}} instead of subscription:** see [`FAQ.md`](FAQ.md#why-{{PRICING_UNIT_SLUG}}-instead-of-subscription).
# {{PRODUCT_NAME}} Brand Library
The single source of truth for {{PRODUCT_NAME}}'s brand surface — visual marks, voice and vocabulary, the long-form positioning argument, reusable copy artifacts, and the render pipeline that produces shareable assets.
For the 30-second lookup (tagline, locked hero, primary color), see [`CHEATSHEET.md`](CHEATSHEET.md).
For chronological history (what changed when), see [`CHANGELOG.md`](CHANGELOG.md).
For "how do I do X" (add a sheet, refresh the press kit), see [`RECIPES.md`](RECIPES.md).
For AI agents working in this directory, see [`CLAUDE.md`](CLAUDE.md).
---
## What lives where
### Anchor docs (read these first)
| Doc | Purpose |
|---|---|
| [`BRAND.md`](BRAND.md) | Visual brand reference — marks, color system, typography, asset library inventory |
| [`COPY.md`](COPY.md) | Language reference — locked vocabulary, voice and register, "what NOT to use" |
| [`MANIFESTO.md`](MANIFESTO.md) | Long-form positioning argument |
### Reusable copy artifacts
| Doc | Purpose |
|---|---|
| [`BIOS.md`](BIOS.md) | Founder bio (50w / 100w / 250w), company boilerplate (matching lengths), social profile bios |
| [`FAQ.md`](FAQ.md) | Canonical Q&A entries (50–150 words each), each anchored to a MANIFESTO section |
| [`GLOSSARY.md`](GLOSSARY.md) | Brand terms with definitions, good usage, don't-substitute callouts |
| [`TONE.md`](TONE.md) | Register-by-surface guide for support reply, release note, tweet, blog post intro, email subject |
| [`PRICING.md`](PRICING.md) | Public-facing pricing argument (when applicable) |
### Press / partnerships
| Path | Purpose |
|---|---|
| [`press/`](press/) | Self-contained press kit — README, logos, hero image. Single URL for journalists. |
### Source files (build inputs)
| Path | Purpose |
|---|---|
| [`_source/html/`](_source/html/) | HTML source sheets for visual assets |
| [`_source/html/_archive/`](_source/html/_archive/) | Retired sheets preserved for historical reference |
| [`_source/ai/`](_source/ai/) | Adobe Illustrator sources (.ai files) |
| [`icons/svg/`](icons/svg/) | Canonical logo SVGs |
| [`icons/png/`](icons/png/) | High-res raster logo equivalents |
### Build outputs (do not edit by hand)
| Path | Purpose |
|---|---|
| [`exports/`](exports/) | Rendered WebP assets per category. Generated by `just brand`. |
---
## Quick paths
### "I need to write copy"
1. Read [`CHEATSHEET.md`](CHEATSHEET.md) for the locked phrases.
2. Read [`COPY.md`](COPY.md#what-not-to-use) for the vocabulary to avoid.
3. Read the surface-specific guidance in [`TONE.md`](TONE.md).
4. Pull canonical bios from [`BIOS.md`](BIOS.md) when needed.
### "I need to ship a marketing surface"
1. Pick the right asset type from the inventory in [`BRAND.md`](BRAND.md).
2. Render via `just brand-{type}` (or `just brand` for the full library). See [`RECIPES.md`](RECIPES.md).
3. Verify the rendered output in `exports/{category}/`.
### "I'm a journalist looking for materials"
1. Start at [`press/README.md`](press/README.md).
2. Press contact: {{CONTACT_EMAIL}}
### "I'm answering a question someone asked"
1. Check [`FAQ.md`](FAQ.md) — the answer is probably canonical there.
2. If not, check the relevant section of [`MANIFESTO.md`](MANIFESTO.md).
3. If still not, write the answer in brand voice and add it to FAQ.
### "I'm an AI agent editing brand files"
Read [`CLAUDE.md`](CLAUDE.md) before making changes.
---
## Render pipeline
```bash
just brand # render everything
just brand-{category} # render one category
just brand-clean # remove pipeline-rendered files (preserves AI exports)
just brand-clean-{category} # clean one category's renders
```
See [`RECIPES.md`](RECIPES.md) for common task walkthroughs.
---
## Conventions at a glance
- **Brand verb:** `{{BRAND_VERB}}`
- **Durable noun:** `{{DURABLE_NOUN}}`
- **Tagline:** {{TAGLINE}}
- **Trust line:** {{TRUST_LINE}}
- **License:** {{LICENSE}}
- **Pricing:** {{PRICING_HEADLINE}}
- **Contact:** {{CONTACT_EMAIL}}
For the full at-a-glance reference, see [`CHEATSHEET.md`](CHEATSHEET.md).
# Brand Recipes
Common-task playbook. Step-by-step for the things people do most often in this directory. For library navigation, see [`README.md`](README.md). For at-a-glance lookup, see [`CHEATSHEET.md`](CHEATSHEET.md).
---
## Add a new concept sheet
Concept sheets are 1200×630 thesis-led posters in [`_source/html/`](_source/html/).
1. **Create the source HTML.** Copy an existing concept sheet as a starting point. Rename to `_source/html/{slug}.html`. Update the `<title>`, the `#{slug}-dark` and `#{slug}-light` IDs, the per-variant CSS, the lockup, headline, and body content.
2. **Add the slug to the renderer.** Open `justfile`, find the `brand-concepts` recipe, and add the slug to the `sheets="..."` list.
3. **Add the cleanup case.** In `brand-clean-concepts`, add the slug to the `for slug in ...` list. (If you forget this, the file persists when `just brand-clean` runs — annoying but not destructive.)
4. **Render.** Run `just brand-concepts`. Verify output at `brand/exports/concepts/{{PRODUCT_SLUG}}-{slug}-{theme}.webp`.
5. **Update inventory.** Add the new sheet to the inventory tree in [`BRAND.md`](BRAND.md), and to the asset → phrase index in [`COPY.md`](COPY.md) if it uses any locked phrases.
6. **Log it.** Add a short entry to [`CHANGELOG.md`](CHANGELOG.md).
## Update the tagline (or any locked phrase)
The tagline is currently {{TAGLINE}}. Locked phrases by definition rarely change — this recipe is for when the user explicitly wants to update one.
1. **Find every reference.** Grep across the repo:
```bash
grep -rln "{{TAGLINE_GREP_FRAGMENT}}" brand/ README.md
```
Update [`COPY.md`](COPY.md) "At a glance" table and the "Locked phrases" section first — that's the canonical location.
2. **Sweep visual assets.** Tagline appears as text in many HTML sheets. Update each `_source/html/*.html` source.
3. **Re-render.** `just brand` to regenerate every category that uses the tagline.
4. **Sweep brand docs.** Update [`CHEATSHEET.md`](CHEATSHEET.md), [`BIOS.md`](BIOS.md) if it mentions the tagline, [`README.md`](README.md), and [`press/README.md`](press/README.md).
5. **Sweep repo-root.** Check the project [`README.md`](../README.md) and any landing-page or marketing surface code.
6. **Log it.** Substantive vocabulary change → entry in [`CHANGELOG.md`](CHANGELOG.md). Document the *why*.
## Refresh the press kit
Refresh when:
- A new logo variant lands.
- The README hero is re-rendered.
- Bios change.
- A new piece of attribution policy is added.
1. **Confirm the canonical sources are current.** [`BIOS.md`](BIOS.md) for bios, [`exports/readme/`](exports/readme/) for hero, [`icons/svg/`](icons/svg/) for logos.
2. **Re-render high-res logo PNGs** if SVG sources changed:
```bash
cd brand/press/logos
rsvg-convert -w 1200 ../../icons/svg/{{PRODUCT_SLUG}}-mark.svg -o {{PRODUCT_SLUG}}-mark-1200.png
# ...etc for each mark variant
```
3. **Copy fresh hero WebPs** if `exports/readme/` was re-rendered:
```bash
cp brand/exports/readme/{{PRODUCT_SLUG}}-readme-{dark,light}.webp brand/press/hero/
```
4. **Sync inlined bios in press/README.md** if BIOS.md changed.
5. **Log it** in [`CHANGELOG.md`](CHANGELOG.md).
## Run a full re-render of the visual library
```bash
just brand
```
Chains `brand-concepts`, `brand-banners`, `brand-social`, `brand-readme`, `brand-method`, `brand-manifesto`, then `brand-webp` (PNG → WebP conversion), then optionally `brand-composites`.
## Render only one category
```bash
just brand-readme # README hero
just brand-method # methodology one-pager
just brand-manifesto # manifesto anti-card
just brand-concepts # all concept posters
just brand-banners # hero banners
just brand-social # social channel assets
```
## Clean up renders without nuking AI exports
```bash
just brand-clean # all pipeline-rendered files (WebP + PNG)
just brand-webp-clean # only WebP (preserves any PNG)
just brand-clean-{category} # one category only
```
**Key behavior:** the cleanup recipes enumerate the exact files each `brand-{cat}` render produces — they don't `rm -rf` whole category directories. Adobe Illustrator exports and other non-pipeline files in `brand/exports/` survive cleanup.
When adding a new render category, add a matching `brand-clean-{cat}` recipe and chain it from `brand-webp-clean`.
## Verify FAQ / BIOS word counts
```bash
python3 ~/.claude/skills/brand-library-architect/scripts/word_count.py brand/FAQ.md
python3 ~/.claude/skills/brand-library-architect/scripts/word_count.py brand/BIOS.md
```
The script verifies:
- FAQ answers are 50–150 words.
- Founder bio variants are 50/100/250 ±5 words.
- Company boilerplate variants are 50/100/250 ±5 words.
- Social profile bios fit platform character caps.
Run before committing changes to FAQ.md or BIOS.md.
## Vocabulary check (don't-use words)
```bash
bash ~/.claude/skills/brand-library-architect/scripts/vocab_check.sh brand/
```
Greps for the don't-use vocabulary list. All hits should be in explicit "What NOT to use" callouts or "Avoid" example blocks — not in positive descriptions.
## Verify cross-link integrity
```bash
cd brand
grep -rEho '\[`?[^]]+`?\]\([^)]+\.md[^)]*\)' *.md press/ \
| grep -oE '\([^)]+\)' \
| tr -d '()' \
| sort -u \
| while read target; do
[[ -f "$target" || -f "press/$target" ]] || echo "MISSING: $target"
done
```
Any `MISSING:` output points at a broken cross-link.
## Run a discovery audit
If you're auditing the brand library state, invoke the [`brand-library-architect`](file:///Users/nick/.claude/skills/brand-library-architect/) personal skill in Phase-0-only mode:
> "Run brand library discovery on this repo"
The skill produces a `brand/discovery.md` capturing inventory, inferences, conflicts surfaced, and any external sources the user provides.
## Add a new asset category
1. **Create the HTML source** at `_source/html/{name}.html`. Follow the per-variant ID-scoped CSS pattern. Include the render-mode handler script.
2. **Add a render recipe** to `justfile`:
```
brand-{name}:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/{name}
for theme in dark light; do
out="brand/exports/{name}/{{PRODUCT_SLUG}}-{name}-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="{W},{H}" \
"file://$(pwd)/brand/_source/html/{name}.html#{name}-${theme}" "$out" 2>/dev/null
done
```
3. **Add a cleanup recipe** to `justfile`:
```
brand-clean-{name}:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/{name}/{{PRODUCT_SLUG}}-{name}-${theme}.webp"
rm -f "brand/exports/{name}/thumbs/{{PRODUCT_SLUG}}-{name}-${theme}.webp"
done
```
4. **Chain into umbrella recipes.** Add `brand-{name}` to the `brand:` umbrella; add `brand-clean-{name}` to the `brand-webp-clean:` chain.
5. **Update [`BRAND.md`](BRAND.md) inventory tree.**
6. **Log it** in [`CHANGELOG.md`](CHANGELOG.md).
## Audit existing brand surfaces against locked vocabulary
When the locked vocabulary changes (or you suspect drift):
1. Run the vocab check.
2. For each hit, classify: positive use describing the product (problem) vs explicit don't-use callout / Avoid example (fine).
3. Fix the positive uses.
4. Log the audit in [`CHANGELOG.md`](CHANGELOG.md) with the date, what was found, what changed.
# {{PRODUCT_NAME}} Tone by Surface
[`COPY.md`](COPY.md) handles voice and register at the unit level. This doc handles register at the *surface* level: how does a support reply sound? a release note? a tweet? Each surface has its own pressures.
The point of this doc is pattern-matching. Read good and avoid examples side by side; they're more useful than abstract guidance.
---
## Support reply
**Register pressure:** the reader is in the middle of a problem. They want clarity and forward motion, not voice. Skip pleasantries that delay the answer.
**Good:**
> {{SUPPORT_REPLY_GOOD_1}}
> {{SUPPORT_REPLY_GOOD_2}}
**Avoid:**
> {{SUPPORT_REPLY_AVOID_1}}
> {{SUPPORT_REPLY_AVOID_2}}
The avoid examples burn the reader's attention on warmth that doesn't help. Be direct. Be useful.
---
## Release note
**Register pressure:** what shipped, why it matters. Lead with the change. No "we're excited to announce" — the reader can tell from the headline this is a release note. Use the brand verb where relevant.
**Good:**
> {{RELEASE_NOTE_GOOD_1}}
> {{RELEASE_NOTE_GOOD_2}}
**Avoid:**
> {{RELEASE_NOTE_AVOID_1}}
> {{RELEASE_NOTE_AVOID_2}}
The avoid examples bury the actual change behind hype. Lead with the substance.
---
## Tweet
**Register pressure:** one beat per tweet. No thread-bait ("a 🧵"). Brand verb at least once if there's room. Tweets compress; cut every word that isn't doing structural work. Emoji sparingly, only when clarifying (not as decoration).
**Good:**
> {{TWEET_GOOD_1}}
> {{TWEET_GOOD_2}}
**Avoid:**
> {{TWEET_AVOID_1}}
> {{TWEET_AVOID_2}}
The avoid examples violate multiple don't-use rules at once and pad with empty emoji.
---
## Blog post intro
**Register pressure:** hook with a structural claim, not a question. Declare the stance early. Don't open with "Have you ever wondered why X feels broken?" — that's an empty rhetorical scaffold.
**Good:**
> {{BLOG_INTRO_GOOD_1}}
> {{BLOG_INTRO_GOOD_2}}
**Avoid:**
> {{BLOG_INTRO_AVOID_1}}
> {{BLOG_INTRO_AVOID_2}}
Avoid examples open with empty rhetorical questions, dated generalizations, or banned phrases per [`COPY.md`](COPY.md#what-not-to-use).
---
## Email subject line
**Register pressure:** the subject is doing pre-open work. Lead with substantive content, not the brand wrapper. No clickbait. Mono uppercase reserved for system / transactional emails.
**Good:**
> {{EMAIL_SUBJECT_GOOD_1}}
> {{EMAIL_SUBJECT_GOOD_2}}
> {{EMAIL_SUBJECT_GOOD_3}}
**Avoid:**
> {{EMAIL_SUBJECT_AVOID_1}}
> {{EMAIL_SUBJECT_AVOID_2}}
> {{EMAIL_SUBJECT_AVOID_3}}
The avoid examples are content-free, system-flavored when not system, or hype-flavored. None tell the reader why to open.
---
## Notes for use
- **Default to the brand voice in every register.** Shorter the surface, more deliberate each word.
- **Cross-check against [`COPY.md`](COPY.md).** Before publishing, scan the don't-use table.
- **Show, don't enumerate.** When extending this guide for a new surface (LinkedIn post, README badge, conference talk title), follow the same shape: register pressure → 2 good examples → 2 avoid examples.
# Brand asset render pipeline recipes.
#
# Templated for {{PRODUCT_NAME}}. Append these to the project's existing
# justfile (or create a new justfile if none exists). The recipes assume:
# - Playwright installed (`npx --yes playwright` works)
# - cwebp installed (`brew install webp` on macOS)
# - rsvg-convert installed (optional; for SVG → high-res PNG rendering)
#
# Usage:
# just brand # render every category
# just brand-concepts # render concept sheets only
# just brand-readme # render README hero only
# just brand-webp # convert all PNG exports to WebP
# just brand-composites # render composite reference sheets
#
# After changes to source HTML sheets in brand/_source/html/, run `just brand`
# to re-render the full library. After WebP conversion, the PNG sources
# are deleted (WebP-only export library).
# Render every brand category in sequence.
brand: brand-concepts brand-banners brand-social brand-readme brand-method brand-manifesto brand-og brand-poster brand-swatch brand-webp
@echo ""
@echo "All brand assets rendered to brand/exports/ (WebP-only)"
# Render concept sheets at 1200×630 (system, identity, methodology, etc).
# Add concept slugs to the sheets="..." list as new concept sheets are created.
brand-concepts:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/concepts
sheets="{{CONCEPT_SHEET_LIST}}" # space-separated slugs, e.g., "system identity method"
for sheet in $sheets; do
for theme in dark light; do
id="${sheet}-${theme}"
out="brand/exports/concepts/{{PRODUCT_SLUG}}-${id}.png"
npx --yes playwright screenshot \
--viewport-size="1200,630" \
"file://$(pwd)/brand/_source/html/${sheet}.html#${id}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
done
echo ""
echo "Rendered concept variants"
# Render banner sheet variants (1200×630 hero designs).
brand-banners:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/banners
pairs="bold-dark:hero-bold-dark bold-light:hero-bold-light atm-dark:hero-atmospheric-dark atm-light:hero-atmospheric-light"
for entry in $pairs; do
id="${entry%%:*}"
name="${entry##*:}"
out="brand/exports/banners/{{PRODUCT_SLUG}}-${name}.png"
npx --yes playwright screenshot \
--viewport-size="1200,630" \
"file://$(pwd)/brand/_source/html/banners.html#${id}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
# Render social channel assets (mixed sizes).
brand-social:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/social
# OG (1200×630)
for theme in dark light; do
out="brand/exports/social/{{PRODUCT_SLUG}}-og-image-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="1200,630" \
"file://$(pwd)/brand/_source/html/og.html#og-${theme}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
# Twitter banner (1500×500)
out="brand/exports/social/{{PRODUCT_SLUG}}-twitter-banner.png"
npx --yes playwright screenshot \
--viewport-size="1500,500" \
"file://$(pwd)/brand/_source/html/social.html#twitter" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
# GitHub banner (1280×320)
out="brand/exports/social/{{PRODUCT_SLUG}}-github-banner.png"
npx --yes playwright screenshot \
--viewport-size="1280,320" \
"file://$(pwd)/brand/_source/html/social.html#github" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
# Render OG image (1200×630 dark+light) — Open Graph link previews.
brand-og:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/social
for theme in dark light; do
out="brand/exports/social/{{PRODUCT_SLUG}}-og-image-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="1200,630" \
"file://$(pwd)/brand/_source/html/og.html#og-${theme}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
# Render README hero (1280×640 2:1, dark+light).
brand-readme:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/readme
for theme in dark light; do
out="brand/exports/readme/{{PRODUCT_SLUG}}-readme-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="1280,640" \
"file://$(pwd)/brand/_source/html/readme.html#readme-${theme}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
echo ""
echo "Rendered 2 readme variants"
# Render methodology one-pager (1600×900 widescreen, dark+light).
brand-method:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/method
for theme in dark light; do
out="brand/exports/method/{{PRODUCT_SLUG}}-method-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="1600,900" \
"file://$(pwd)/brand/_source/html/method.html#method-${theme}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
echo ""
echo "Rendered 2 method variants"
# Render manifesto anti-card (1080×1350 portrait, dark+light).
brand-manifesto:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/manifesto
for theme in dark light; do
out="brand/exports/manifesto/{{PRODUCT_SLUG}}-manifesto-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="1080,1350" \
"file://$(pwd)/brand/_source/html/manifesto.html#manifesto-${theme}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
echo ""
echo "Rendered 2 manifesto variants"
# Render brand summary poster (1224×1584 letter portrait, dark+light).
# Designer-handoff one-pager: wordmark · color palette · typography ·
# locked phrases · footer. Letter-portrait at 144 DPI prints clean on
# letter/A4. Different from the screen-friendly internal reference card.
brand-poster:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/poster
for theme in dark light; do
out="brand/exports/poster/{{PRODUCT_SLUG}}-poster-${theme}.png"
npx --yes playwright screenshot \
--viewport-size="1224,1584" \
"file://$(pwd)/brand/_source/html/poster.html#poster-${theme}" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
done
echo ""
echo "Rendered 2 poster variants"
# Render designer swatch sheet (1584×1224 letter landscape, light only).
# Standard designer-kit reference: lockup specimens · color swatches ·
# typography. Print-default light-bg. Output also copied to brand/press/
# swatch/ for journalists and external designers (PNG over WebP — designers
# print and import to slides/Figma).
brand-swatch:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p brand/exports/swatch
out="brand/exports/swatch/{{PRODUCT_SLUG}}-swatch.png"
npx --yes playwright screenshot \
--viewport-size="1584,1224" \
"file://$(pwd)/brand/_source/html/swatch.html#swatch" "$out" 2>/dev/null
printf " ✓ %s\n" "$out"
echo ""
echo "Rendered designer swatch sheet"
# Convert all PNG exports to WebP (~75% smaller). Removes the source PNG.
# Two outputs per source:
# - exports/{cat}/foo.webp (max 1600px wide, q90)
# - exports/{cat}/thumbs/foo.webp (max 800px wide, q80)
brand-webp:
#!/usr/bin/env bash
set -euo pipefail
if ! command -v cwebp >/dev/null 2>&1; then
echo "✗ cwebp not found — install with: brew install webp"
exit 1
fi
for png in $(find brand/exports -name "*.png" -not -path "*/thumbs/*"); do
dir=$(dirname "$png")
base=$(basename "$png" .png)
mkdir -p "$dir/thumbs"
cwebp -quiet -q 90 -resize 1600 0 "$png" -o "$dir/${base}.webp"
cwebp -quiet -q 80 -resize 800 0 "$png" -o "$dir/thumbs/${base}.webp"
rm "$png"
printf " ✓ %s/%s.png → .webp + thumb\n" "$(basename "$dir")" "$base"
done
# Render composite reference sheets (per-category contact sheets).
# Optional — useful for browsing the brand library at a glance.
brand-composites:
#!/usr/bin/env bash
set -euo pipefail
if ! command -v cwebp >/dev/null 2>&1; then
echo "✗ cwebp not found — install with: brew install webp"
exit 1
fi
mkdir -p brand/exports/composite/thumbs
rows="{{COMPOSITE_ROWS}}" # space-separated id:width,height
for row in $rows; do
id="${row%%:*}"
size="${row##*:}"
png="brand/exports/composite/{{PRODUCT_SLUG}}-composite-${id}.png"
webp="brand/exports/composite/{{PRODUCT_SLUG}}-composite-${id}.webp"
thumb="brand/exports/composite/thumbs/{{PRODUCT_SLUG}}-composite-${id}.webp"
npx --yes playwright screenshot \
--viewport-size="${size}" \
"file://$(pwd)/brand/_source/html/composite.html#composite-${id}" "$png" 2>/dev/null
cwebp -quiet -q 90 -resize 1600 0 "$png" -o "$webp"
cwebp -quiet -q 80 -resize 800 0 "$png" -o "$thumb"
rm "$png"
printf " ✓ %s\n" "$webp"
done
echo ""
echo "Rendered composite reference sheets (WebP + thumb)"
# Clean rendered brand exports (HTML sources untouched).
#
# IMPORTANT: brand/exports/ may also contain Adobe Illustrator exports or
# other manually-placed assets that share the {{PRODUCT_SLUG}}-* prefix.
# This recipe deletes ONLY the specific files the Playwright+cwebp render
# pipeline produces, enumerated below per category. Files not in the
# enumeration (e.g., AI exports) are preserved.
#
# When adding a new render category:
# 1. Add a brand-clean-{name} recipe enumerating the files it produces
# 2. Chain it from brand-webp-clean (and brand-clean inherits it)
brand-webp-clean: brand-clean-concepts brand-clean-banners brand-clean-social brand-clean-readme brand-clean-method brand-clean-manifesto brand-clean-og brand-clean-poster brand-clean-swatch
# Remove only thumbs/ directories that are now empty
@find brand/exports -type d -name 'thumbs' -empty -delete 2>/dev/null || true
@echo "Removed pipeline-rendered WebP files; AI exports preserved"
# Same enumeration as brand-webp-clean but also removes any .png renders
# that linger if a render was interrupted before WebP conversion.
brand-clean: brand-webp-clean
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/concepts/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/banners/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/social/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/readme/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/method/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/manifesto/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/poster/*' -delete 2>/dev/null || true
@find brand/exports -name '{{PRODUCT_SLUG}}-*.png' -path '*/swatch/*' -delete 2>/dev/null || true
@echo "Cleaned pipeline-rendered brand exports; AI exports preserved"
# Per-category clean recipes. Each enumerates the exact files that recipe's
# render produces. Adobe Illustrator exports and other non-pipeline files
# in brand/exports/ are preserved.
brand-clean-concepts:
#!/usr/bin/env bash
# Update {{CONCEPT_SLUG_LIST}} when concept sheets are added/removed.
for slug in {{CONCEPT_SLUG_LIST}}; do
for theme in dark light; do
rm -f "brand/exports/concepts/{{PRODUCT_SLUG}}-${slug}-${theme}.webp"
rm -f "brand/exports/concepts/thumbs/{{PRODUCT_SLUG}}-${slug}-${theme}.webp"
done
done
brand-clean-banners:
#!/usr/bin/env bash
for style in bold atmospheric editorial; do
for theme in dark light; do
rm -f "brand/exports/banners/{{PRODUCT_SLUG}}-hero-${style}-${theme}.webp"
rm -f "brand/exports/banners/thumbs/{{PRODUCT_SLUG}}-hero-${style}-${theme}.webp"
done
done
brand-clean-social:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/social/{{PRODUCT_SLUG}}-og-image-${theme}.webp"
rm -f "brand/exports/social/thumbs/{{PRODUCT_SLUG}}-og-image-${theme}.webp"
done
rm -f brand/exports/social/{{PRODUCT_SLUG}}-twitter-banner.webp
rm -f brand/exports/social/{{PRODUCT_SLUG}}-github-banner.webp
rm -f brand/exports/social/thumbs/{{PRODUCT_SLUG}}-twitter-banner.webp
rm -f brand/exports/social/thumbs/{{PRODUCT_SLUG}}-github-banner.webp
brand-clean-og:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/social/{{PRODUCT_SLUG}}-og-image-${theme}.webp"
rm -f "brand/exports/social/thumbs/{{PRODUCT_SLUG}}-og-image-${theme}.webp"
done
brand-clean-readme:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/readme/{{PRODUCT_SLUG}}-readme-${theme}.webp"
rm -f "brand/exports/readme/thumbs/{{PRODUCT_SLUG}}-readme-${theme}.webp"
done
brand-clean-method:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/method/{{PRODUCT_SLUG}}-method-${theme}.webp"
rm -f "brand/exports/method/thumbs/{{PRODUCT_SLUG}}-method-${theme}.webp"
done
brand-clean-manifesto:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/manifesto/{{PRODUCT_SLUG}}-manifesto-${theme}.webp"
rm -f "brand/exports/manifesto/thumbs/{{PRODUCT_SLUG}}-manifesto-${theme}.webp"
done
brand-clean-poster:
#!/usr/bin/env bash
for theme in dark light; do
rm -f "brand/exports/poster/{{PRODUCT_SLUG}}-poster-${theme}.webp"
rm -f "brand/exports/poster/thumbs/{{PRODUCT_SLUG}}-poster-${theme}.webp"
done
brand-clean-swatch:
#!/usr/bin/env bash
rm -f brand/exports/swatch/{{PRODUCT_SLUG}}-swatch.webp
rm -f brand/exports/swatch/thumbs/{{PRODUCT_SLUG}}-swatch.webp
# {{PRODUCT_NAME}} press kit
Materials for journalists, partners, conference organizers, and anyone writing about or partnering with {{PRODUCT_NAME}}. This folder is the single source for logos, hero images, founder and company bios, brand colors, and attribution requirements.
**Press contact:** {{CONTACT_EMAIL}}
---
## Quick facts
- **What:** {{ONE_LINE_DESCRIPTION}}
- **Hero:** {{LOCKED_HERO_NOUN}} *{{LOCKED_HERO_VERB}}*
- **Tagline:** {{TAGLINE}}
- **Trust line:** {{TRUST_LINE}}
- **License:** {{LICENSE}}
- **Pricing:** {{PRICING_HEADLINE}}
- **Status:** {{LAUNCH_STATE}}
- **Founder:** {{FOUNDER_NAME}} — {{FOUNDER_ROLE}}
- **Domain:** {{DOMAIN}}
- **Repo:** {{REPO_URL_SHORT}}
---
## Logos
In `logos/`. Both `.svg` (vector, infinitely scalable, preferred) and `.png` (high-resolution raster, ≥1200px wide for print and high-DPI display).
| File | Format | Use |
|---|---|---|
| `{{PRODUCT_SLUG}}-mark.svg` | SVG | Primary mark |
| `{{PRODUCT_SLUG}}-mark.png` | PNG ≥1200px | Primary mark, raster |
| `{{PRODUCT_SLUG}}-lockup-on-dark.svg` | SVG | Wordmark + mark, dark bg |
| `{{PRODUCT_SLUG}}-lockup-on-dark.png` | PNG ≥2000px | Wordmark + mark, dark, raster |
| `{{PRODUCT_SLUG}}-lockup-on-light.svg` | SVG | Wordmark + mark, light bg |
| `{{PRODUCT_SLUG}}-lockup-on-light.png` | PNG ≥2000px | Wordmark + mark, light, raster |
Don't recolor the marks. Don't squish or stretch them. Don't add drop shadows, outlines, or gradients beyond what's in the source.
If you need a different size, render from the `.svg` source. Common tools: `rsvg-convert -w <pixels>`, ImageMagick `convert -density`, Inkscape's command-line `--export-png`.
## Hero image
In `hero/`. The README hero banner.
| File | Format | Aspect |
|---|---|---|
| `{{PRODUCT_SLUG}}-readme-dark.webp` | WebP | {{HERO_DIMENSIONS}} |
| `{{PRODUCT_SLUG}}-readme-light.webp` | WebP | {{HERO_DIMENSIONS}} |
For other image options, see the parent [`brand/exports/`](../exports/) directory.
---
## Founder bio
Three lengths. Use the one that fits the surface.
### Founder bio — 50 words
> {{FOUNDER_BIO_50W}}
### Founder bio — 100 words
> {{FOUNDER_BIO_100W}}
### Founder bio — 250 words
> {{FOUNDER_BIO_250W}}
The canonical version of these bios lives in [`brand/BIOS.md`](../BIOS.md). If drift between this kit and the canonical doc, the canonical wins.
---
## Company boilerplate
Three lengths. Pairs naturally with the founder bio above.
### Company boilerplate — 50 words
> {{COMPANY_50W}}
### Company boilerplate — 100 words
> {{COMPANY_100W}}
### Company boilerplate — 250 words
> {{COMPANY_250W}}
---
## Brand colors
Flat hex list for press use. Full color system in [`brand/BRAND.md`](../BRAND.md#color-system).
**Primary brand color:** `{{PRIMARY_HEX}}` — when in doubt, use this one.
| Hex | Role |
|---|---|
| `{{PRIMARY_HEX}}` | Primary / canonical |
| `{{BRAND_LIGHT_HEX}}` | Light face / accent |
| `{{BRAND_MID_HEX}}` | Mid-tone variant |
| `{{ACCENT_HEX}}` | Default accent |
**Backgrounds:**
| Hex | Role |
|---|---|
| `{{DARK_BG}}` | Dark theme page background |
| `{{LIGHT_BG}}` | Light theme page background |
---
## Typography
- **Wordmark:** {{WORDMARK_FONT}} (regular weight, +1.5px letter-spacing)
- **UI body:** {{BODY_FONT}}, weights {{BODY_WEIGHTS}}
- **UI mono:** {{MONO_FONT}}, weights {{MONO_WEIGHTS}}
- **Brand display:** {{DISPLAY_FONT}}, weights {{DISPLAY_WEIGHTS}}
{{TYPOGRAPHY_NOTE}}.
---
## Attribution and reuse
{{PRODUCT_NAME}}'s source code is licensed under [**{{LICENSE}}**](../../LICENSE). The license terms govern code use, modification, and redistribution.
**Logos and wordmark** are project marks. Reuse policy:
- ✅ **Editorial / journalism / commentary.** Use the marks freely when writing about, reviewing, or covering {{PRODUCT_NAME}}. No prior permission needed.
- ✅ **Partner integrations.** If your product or service interoperates with {{PRODUCT_NAME}}, you may use the lockup or mark to indicate compatibility, with appropriate context.
- ✅ **Conference talks, blog posts, podcasts.** Use the marks to reference {{PRODUCT_NAME}}. We'd appreciate a link back to {{DOMAIN}} when practical.
- ❌ **Don't suggest endorsement.** Don't use marks in a way that implies endorsement, partnership, or affiliation that doesn't exist.
- ❌ **Don't use on competitive products.**
- ❌ **Don't recolor or distort.** Use the marks as designed.
**Screenshots of the application** are fine to use in coverage and educational contexts. If a screenshot includes example user data, treat it as illustrative only.
When in doubt, email **{{CONTACT_EMAIL}}** before publishing.
---
## What's not here yet
This is a {{LAUNCH_STATE_DESCRIPTOR}} press kit. Some standard press-kit content is deliberately absent until it exists:
- {{ABSENT_ITEM_1}}
- {{ABSENT_ITEM_2}}
- {{ABSENT_ITEM_3}}
---
## Distribution
For now, point people at the GitHub URL of this folder:
> {{REPO_URL}}/tree/main/brand/press
When the public site lands, this material will mirror to `{{DOMAIN}}/press`.
---
## Questions
**Press inquiries:** {{CONTACT_EMAIL}}
**Asset requests** (different format, custom size, additional imagery): {{CONTACT_EMAIL}}
**Anything else:** [`brand/COPY.md`](../COPY.md), [`brand/MANIFESTO.md`](../MANIFESTO.md), [`brand/FAQ.md`](../FAQ.md).
# Code of Conduct
## Our standard
The {{PRODUCT_NAME}} project adopts the **Contributor Covenant, version 2.1** as its Code of Conduct. The canonical text is maintained at [contributor-covenant.org/version/2/1/code_of_conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/), and is incorporated into this project by reference.
By participating in this project — contributing code, opening issues, reviewing pull requests, or engaging in any project-related discussion — you agree to abide by the Covenant.
## Why the Contributor Covenant
The Covenant is the standard adopted by most major open-source projects (Kubernetes, React, Vue, Rails, and thousands more). Adopting it rather than writing a custom CoC means:
- Contributors who already know the Covenant don't need to re-learn this project's rules.
- The text is community-maintained and updated over time; we benefit from those updates without having to re-litigate them.
- It's translated into many languages — non-English-speaking contributors can read it in their own language at the canonical source.
## Quick summary (informational only)
The Covenant text is the authoritative version. The summary below is informational, not a replacement.
**Pledge.** We aim to make participation in this project a welcoming, respectful, and harassment-free experience for everyone.
**Expectations.** Be considerate. Assume good intent. Disagree with ideas, not people. Take responsibility for mistakes. Center the community's well-being above any individual's preferences. Use welcoming and inclusive language.
**Enforcement.** Maintainers will enforce the Covenant. Consequences range from a private warning to permanent removal from project spaces, scaled to the severity and recurrence of the violation. The Covenant's "Enforcement Guidelines" section describes the ladder.
**Scope.** This Code of Conduct applies in all project spaces (the repository, issue trackers, pull-request discussions, project-affiliated communication channels) and in public spaces when an individual is officially representing the project.
## Reporting
Reports of unacceptable behavior go to:
> **{{CONTACT_EMAIL}}**
Reports are reviewed and investigated promptly and fairly. The identity of reporters is kept confidential to the extent practical; we will not share reporter identity beyond what is necessary to investigate and respond.
If a maintainer is the subject of a report, the report should still go to the address above; we will arrange external review if needed.
## Enforcement guidelines
We follow the **Community Impact Guidelines** published with Contributor Covenant 2.1 (linked above). Those guidelines describe a four-step ladder:
1. **Correction** — private written warning with clarity about why the behavior was inappropriate.
2. **Warning** — formal warning with consequences for continued behavior.
3. **Temporary ban** — temporary ban from project spaces for a specified period.
4. **Permanent ban** — permanent removal from project spaces.
The full guidelines, including the criteria for each step, are at the canonical Covenant URL above.
## Attribution
This Code of Conduct adopts the [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/), authored by Coraline Ada Ehmke and the Contributor Covenant community. Used under the [Creative Commons Attribution 4.0 license](https://creativecommons.org/licenses/by/4.0/).
# Contributing to {{PRODUCT_NAME}}
Thanks for considering a contribution. {{PRODUCT_NAME}} is open-source under **{{LICENSE}}** {{LICENSE_RATIONALE}}.
This guide covers development setup, code style, the pull request process, and the {{LICENSE}} contribution stance. The user-facing language reference lives in [`brand/COPY.md`](brand/COPY.md) — read that before writing any UI text, error message, or user-visible copy.
## Before you start
For non-trivial changes, **open an issue first** to discuss the direction. Things that benefit from a pre-PR issue:
- New features or substantial UX changes
- Schema or migration changes
- Renames of product modules or brand vocabulary
- {{ARCHITECTURE_SENSITIVE_AREAS}}
Small fixes, typo corrections, and tightly-scoped improvements are fine to PR directly.
## Development setup
### Prerequisites
- {{PREREQ_1}}
- {{PREREQ_2}}
- {{PREREQ_3}}
### Clone and install
```bash
git clone {{REPO_URL}}
cd {{PRODUCT_SLUG}}
{{INSTALL_COMMANDS}}
```
### Run the app
```bash
{{DEV_COMMANDS}}
```
Open [http://localhost:{{DEV_PORT}}]({{DEV_URL}}). The dev server hot-reloads.
### Run tests
```bash
{{TEST_COMMANDS}}
```
Run the full check before opening a PR — it's the same gate CI uses.
## Code style
- {{CODE_STYLE_RULE_1}}
- {{CODE_STYLE_RULE_2}}
- {{CODE_STYLE_RULE_3}}
- {{CODE_STYLE_RULE_4}}
For deeper style notes, see {{STYLE_GUIDE_PATH}} and the project documentation.
## Brand voice (for user-facing copy)
If your change includes any user-visible text — UI strings, error messages, release notes, README updates — it should match the brand voice:
- [`brand/COPY.md`](brand/COPY.md) — locked vocabulary, voice, "what NOT to use" list
- [`brand/MANIFESTO.md`](brand/MANIFESTO.md) — long-form positioning argument
Quick rules:
- **Brand verb is `{{BRAND_VERB}}`** (never *tailor* / *generate* / *customize*).
- **The user's data is a *{{DURABLE_NOUN}}***, never a *profile* or generic data.
- **Avoid AI-marketing-speak** — describe what the system *does*, not what tech it uses.
- **Don't lead with hype** ("revolutionary," "next-generation," "AI-powered").
When in doubt, read `brand/COPY.md` first; it has the don't-use table.
## Pull request process
1. **Branch from main.** Use a descriptive branch name.
2. **Keep PRs focused.** One concern per PR.
3. **Run the CI check locally** before pushing.
4. **Write a clear description.** What changes, why, what you tested.
5. **Update tests.** New behavior gets new tests.
6. **Update docs** in the same PR if your change affects how something is used.
7. **Don't bypass hooks.** No `--no-verify`. If a hook fails, fix the underlying issue.
8. **Respond to review.** Treat feedback as a conversation.
## {{LICENSE}} contribution stance
By submitting a contribution to this repo, you agree:
- Your contribution is licensed under **{{LICENSE}}** (the same license as the project).
- You have the right to license the contribution under {{LICENSE}} — i.e., it's your work, or you have permission from the rights-holder.
- {{LICENSE_NETWORK_USE_OR_PATENT_OR_COPYLEFT_NOTE}}
{{LICENSE_PHILOSOPHY_PARAGRAPH}}
## Code of Conduct
By participating in this project, you agree to abide by the [Code of Conduct](CODE_OF_CONDUCT.md). It's the Contributor Covenant 2.1 — please read it.
Reports of unacceptable behavior go to **{{CONTACT_EMAIL}}**.
## Security
Don't report vulnerabilities through public GitHub issues. See [`SECURITY.md`](SECURITY.md) for the disclosure flow, scope, and expectations.
## Questions
For questions that aren't bugs or features, the GitHub Issues tab with the `question` label is the right place. For private inquiries, reach **{{CONTACT_EMAIL}}**.
Thanks for helping build this in the open.
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="brand/exports/readme/{{PRODUCT_SLUG}}-readme-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="brand/exports/readme/{{PRODUCT_SLUG}}-readme-light.webp" />
<img alt="{{PRODUCT_NAME}} — {{LOCKED_HERO_NOUN}} {{LOCKED_HERO_VERB}}" src="brand/exports/readme/{{PRODUCT_SLUG}}-readme-dark.webp" width="100%" />
</picture>
</p>
<p align="center">
<strong>{{LOCKED_HERO_NOUN}}</strong><br />
<em>{{LOCKED_HERO_VERB}}</em>
</p>
<p align="center">
<a href="LICENSE"><img alt="License: {{LICENSE_BADGE}}" src="https://img.shields.io/badge/license-{{LICENSE_SLUG}}-blue?style=flat-square" /></a>
<a href="CONTRIBUTING.md"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat-square" /></a>
</p>
---
## What is {{PRODUCT_NAME}}?
{{ONE_PARAGRAPH_PRODUCT_DESCRIPTION}}
{{TAGLINE}}.
{{METHODOLOGY_PARAGRAPH}}.
Read the long-form positioning argument in [`brand/MANIFESTO.md`](brand/MANIFESTO.md).
## {{KEY_CONCEPT_HEADING}}
{{KEY_CONCEPT_DESCRIPTION}}
## Features
- {{FEATURE_1}}
- {{FEATURE_2}}
- {{FEATURE_3}}
- {{FEATURE_4}}
- {{FEATURE_5}}
- **Self-hostable** — open-source under {{LICENSE}}; the {{DURABLE_NOUN}} you build belongs to you, not the platform
## Getting started
### Prerequisites
- {{PREREQ_1}}
- {{PREREQ_2}}
### Installation
```bash
git clone {{REPO_URL}}
cd {{PRODUCT_SLUG}}
{{INSTALL_COMMANDS}}
```
### Development
```bash
{{DEV_COMMANDS}}
```
Open [http://localhost:{{DEV_PORT}}]({{DEV_URL}}) in your browser.
## Tech stack
| Layer | Technology |
|-------|-----------|
| {{LAYER_1}} | {{TECH_1}} |
| {{LAYER_2}} | {{TECH_2}} |
| {{LAYER_3}} | {{TECH_3}} |
## Contributing
Contributions are welcome. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for development setup, code style, the PR process, and the {{LICENSE}} contribution stance.
By participating in this project, you agree to abide by the [Code of Conduct](CODE_OF_CONDUCT.md).
## Security
If you've found a vulnerability, **please don't open a public issue**. See [`SECURITY.md`](SECURITY.md) for the disclosure flow, response expectations, and scope.
## License
[{{LICENSE_BADGE}}](LICENSE)
{{PRODUCT_NAME}} — {{ONE_LINE_DESCRIPTION}}
Copyright (C) {{YEAR}} {{COPYRIGHT_HOLDER}}
## Documentation
- [`brand/MANIFESTO.md`](brand/MANIFESTO.md) — long-form positioning argument
- [`brand/PRICING.md`](brand/PRICING.md) — pricing argument and terms
- [`brand/BRAND.md`](brand/BRAND.md) — visual brand reference (marks, colors, typography)
- [`brand/COPY.md`](brand/COPY.md) — language reference (locked vocabulary, voice)
- [`brand/BIOS.md`](brand/BIOS.md) — reusable founder / company / social bios
- [`docs/`](docs/) — project documentation and architecture
## Links
- **Repo:** [{{REPO_URL}}]({{REPO_URL}})
- **Issues:** [{{REPO_URL}}/issues]({{REPO_URL}}/issues)
- **Contact:** {{CONTACT_EMAIL}}
# Security Policy
{{PRODUCT_NAME}} {{DATA_SENSITIVITY_DESCRIPTION}}. Security matters here. If you've found a vulnerability, this document explains how to report it, what to expect, and what's in scope.
## Reporting a vulnerability
**Do not open a public GitHub issue for security-relevant findings.** Public issues become indexable the moment they're filed; an unpatched vulnerability disclosed publicly is a window for exploitation.
Email instead:
> **{{CONTACT_EMAIL}}**
If the finding is sensitive enough to warrant encryption, request a PGP key in your initial message.
In your report, include:
- A description of the vulnerability
- Steps to reproduce (or a proof-of-concept)
- The version / commit SHA you tested against
- Your assessment of impact (what an attacker could do)
- Any relevant logs, screenshots, or supporting artifacts
- Whether you'd like public credit when the fix ships (default: yes)
## What to expect
| Stage | Target time |
|---|---|
| Initial acknowledgement | within 72 hours |
| Triage outcome (confirmed / declined / needs more info) | within 7 days |
| Fix in progress (for confirmed findings) | within 30 days for high/critical, longer for low/medium |
| Public disclosure | after the fix ships, typically within 14 days of release |
These are targets, not contractual SLAs. {{TEAM_CONTEXT}}. If you haven't heard back within a week, send a polite follow-up.
## Scope
### In scope
- The {{PRODUCT_NAME}} application source in this repository
- {{DEPLOYED_INSTANCE_DETAIL}}
- {{ANCILLARY_SERVICES}}
- CI/CD configuration tracked in this repository
- Authentication, authorization, session handling, and data-storage paths
- Cross-site scripting, request forgery, server-side request forgery, injection, deserialization, and the rest of the OWASP Top 10
- Information disclosure of user data
- Privilege escalation between user accounts
- Data-export integrity
### Out of scope
- Vulnerabilities in third-party dependencies that have not yet been disclosed upstream — please report those upstream first
- Self-hosted deployments operated by other parties — those are the operator's responsibility
- Denial-of-service against public infrastructure that does not expose user data
- Issues that require a malicious browser extension already installed on the user's machine
- Social-engineering attacks against project maintainers
- "Best practice" findings without a concrete exploit path — open a regular issue or PR instead
If you're not sure whether something is in scope, send the report anyway.
## CVE policy
{{CVE_POLICY}}
## Safe-harbor
Security research conducted in good faith is welcome. We will not pursue legal action against researchers who:
- Make a reasonable effort to avoid privacy violations and service degradation
- Only test against accounts they own (or test instances they've set up themselves)
- Give us reasonable time to respond before public disclosure
- Don't exfiltrate, modify, or destroy user data beyond what's needed to demonstrate the vulnerability
This is a good-faith statement, not a contractual safe-harbor. If you're concerned about a specific test plan, email **{{CONTACT_EMAIL}}** before testing.
## Hall of fame
Researchers who report valid vulnerabilities will be credited (with their permission) in the changelog and release notes.
## Questions
Anything not covered here? **{{CONTACT_EMAIL}}**.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{PRODUCT_NAME}} — Concept Sheet</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="{{GOOGLE_FONTS_URL}}" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #1a1d24;
font-family: '{{BODY_FONT}}', sans-serif;
padding: 40px 0;
display: flex;
flex-direction: column;
align-items: center;
gap: 56px;
}
.sheet-label {
font-family: '{{MONO_FONT}}', monospace;
font-size: 12px; color: {{BRAND_LIGHT_HEX}};
letter-spacing: 2px; text-transform: uppercase;
padding: 6px 14px;
border: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.3);
border-radius: 4px;
background: rgba(10, 12, 16, 0.5);
margin-bottom: 12px;
}
.sheet-item { display: flex; flex-direction: column; align-items: center; }
/* Render mode: when URL has a variant hash, isolate that variant for screenshot */
body.render { padding: 0; gap: 0; background: {{DARK_BG}}; }
body.render .sheet-label { display: none; }
body.render .sheet-item { margin: 0; }
body.render .sheet-item.hidden { display: none; }
/* ─────────────────────────────────────────────────────────────
#{{CONCEPT_SLUG}}-dark · 1200×630 · {{CONCEPT_NAME}} (dark)
───────────────────────────────────────────────────────────── */
#{{CONCEPT_SLUG}}-dark {
width: 1200px; height: 630px;
background: {{DARK_BG}};
position: relative; overflow: hidden;
}
#{{CONCEPT_SLUG}}-dark::before {
content: ''; position: absolute; inset: 0; opacity: 0.5;
background-image:
linear-gradient(rgba({{BRAND_LIGHT_RGB}}, 0.025) 1px, transparent 1px),
linear-gradient(90deg, rgba({{BRAND_LIGHT_RGB}}, 0.025) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
}
#{{CONCEPT_SLUG}}-dark::after {
content: ''; position: absolute; inset: 0;
background: radial-gradient(ellipse 50% 70% at 50% 60%,
rgba({{BRAND_LIGHT_RGB}}, 0.08) 0%, rgba({{BRAND_PRIMARY_RGB}}, 0.03) 40%, transparent 70%);
pointer-events: none;
}
#{{CONCEPT_SLUG}}-dark .frame {
position: relative; height: 100%;
padding: 52px 72px;
display: flex; flex-direction: column;
z-index: 1;
}
#{{CONCEPT_SLUG}}-dark .header {
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 24px;
}
#{{CONCEPT_SLUG}}-dark .lockup { display: flex; align-items: center; gap: 12px; }
#{{CONCEPT_SLUG}}-dark .lockup-text {
font-family: '{{WORDMARK_FONT}}', Georgia, serif;
font-weight: 400; font-size: 32px; color: {{DARK_TEXT}};
letter-spacing: 1.5px; line-height: 1;
}
#{{CONCEPT_SLUG}}-dark .header-meta {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: {{ACCENT_HEX}};
letter-spacing: 2.5px; text-transform: uppercase;
opacity: 0.65;
}
#{{CONCEPT_SLUG}}-dark .title-block { margin-bottom: 32px; }
#{{CONCEPT_SLUG}}-dark .eyebrow {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: {{ACCENT_HEX}};
letter-spacing: 3px; text-transform: uppercase;
margin-bottom: 12px; opacity: 0.65;
}
#{{CONCEPT_SLUG}}-dark .title {
font-family: '{{DISPLAY_FONT}}', sans-serif;
font-weight: 200; font-size: 56px;
color: {{DARK_TEXT}}; letter-spacing: -0.6px;
line-height: 1;
}
#{{CONCEPT_SLUG}}-dark .title em {
font-family: '{{WORDMARK_FONT}}', Georgia, serif;
font-style: italic; font-weight: 400;
color: {{BRAND_LIGHT_HEX}};
}
#{{CONCEPT_SLUG}}-dark .body {
flex: 1;
display: flex; flex-direction: column;
gap: 16px;
}
#{{CONCEPT_SLUG}}-dark .footer {
display: flex; justify-content: space-between; align-items: center;
padding-top: 16px;
border-top: 1px solid #1a1e28;
margin-top: 16px;
}
#{{CONCEPT_SLUG}}-dark .tagline {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: #6b7a8d;
letter-spacing: 2px; text-transform: uppercase;
}
#{{CONCEPT_SLUG}}-dark .url {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: {{ACCENT_HEX}};
letter-spacing: 2px;
}
/* Light variant — duplicate the dark CSS, swap colors:
- background: {{DARK_BG}} → {{LIGHT_BG}}
- text: {{DARK_TEXT}} → {{LIGHT_TEXT}}
- accent rgba opacity adjusted for light bg legibility
- replace {{BRAND_LIGHT_HEX}} with {{BRAND_PRIMARY_HEX}} for italic accent (better contrast on light) */
</style>
</head>
<body>
<!--
Concept sheet template · 1200×630 thesis-led concept poster.
Used for: system / identity / methodology / extraction / iterative / vector / etc.
Replace {{CONCEPT_SLUG}} with the concept slug (e.g., 'system', 'identity').
Replace {{CONCEPT_NAME}} with the concept name in the comment header.
Fill the title-block, body, and footer slots with concept-specific content.
-->
<!-- ─── {{CONCEPT_SLUG}} · DARK ─── -->
<div class="sheet-item">
<div class="sheet-label">#{{CONCEPT_SLUG}}-dark · 1200×630</div>
<div id="{{CONCEPT_SLUG}}-dark">
<div class="frame">
<div class="header">
<div class="lockup">
<!-- Insert SVG mark here, sized 28×~40 -->
<svg width="28" height="41" viewBox="0 0 22 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Replace with product's mark SVG paths -->
{{MARK_SVG_DARK}}
</svg>
<span class="lockup-text">{{PRODUCT_NAME}}</span>
</div>
<div class="header-meta">{{HEADER_META}}</div>
</div>
<div class="title-block">
<div class="eyebrow">{{EYEBROW_TEXT}}</div>
<h1 class="title">{{TITLE_PREFIX}} <em>{{TITLE_ACCENT}}</em>{{TITLE_SUFFIX}}</h1>
</div>
<div class="body">
<!-- Concept-specific body content goes here. Examples:
- 4-layer stack diagram (system concept)
- 3-section substrate layout (identity concept)
- linear pipeline diagram (extraction concept) -->
{{BODY_CONTENT}}
</div>
<div class="footer">
<div class="tagline">{{TAGLINE}}</div>
<div class="url">{{DOMAIN}}</div>
</div>
</div>
</div>
</div>
<!-- ─── {{CONCEPT_SLUG}} · LIGHT ─── -->
<!-- Duplicate the dark variant, swap colors per light theme -->
<script>
// Render mode: hash like #concept-name-dark isolates that variant for Playwright screenshot.
(function() {
const hash = window.location.hash.slice(1);
if (!hash) return;
document.body.classList.add('render');
const target = document.getElementById(hash);
if (!target) return;
const targetItem = target.closest('.sheet-item');
document.querySelectorAll('.sheet-item').forEach(item => {
if (item !== targetItem) item.classList.add('hidden');
});
})();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{PRODUCT_NAME}} — Manifesto Anti-Card</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="{{GOOGLE_FONTS_URL}}" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #1a1d24;
font-family: '{{BODY_FONT}}', sans-serif;
padding: 40px 0;
display: flex;
flex-direction: column;
align-items: center;
gap: 56px;
}
.sheet-label {
font-family: '{{MONO_FONT}}', monospace;
font-size: 12px; color: {{BRAND_LIGHT_HEX}};
letter-spacing: 2px; text-transform: uppercase;
padding: 6px 14px;
border: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.3);
border-radius: 4px;
background: rgba(10, 12, 16, 0.5);
margin-bottom: 12px;
}
.sheet-item { display: flex; flex-direction: column; align-items: center; }
body.render { padding: 0; gap: 0; background: {{DARK_BG}}; }
body.render .sheet-label { display: none; }
body.render .sheet-item { margin: 0; }
body.render .sheet-item.hidden { display: none; }
/* ─────────────────────────────────────────────────────────────
#manifesto-dark · 1080×1350 · "What {{PRODUCT_NAME}} isn't" (dark)
───────────────────────────────────────────────────────────── */
#manifesto-dark {
width: 1080px; height: 1350px;
background: {{DARK_BG}};
position: relative; overflow: hidden;
}
#manifesto-dark::before {
content: ''; position: absolute; inset: 0; opacity: 0.4;
background-image:
linear-gradient(rgba({{BRAND_LIGHT_RGB}}, 0.025) 1px, transparent 1px),
linear-gradient(90deg, rgba({{BRAND_LIGHT_RGB}}, 0.025) 1px, transparent 1px);
background-size: 48px 48px;
pointer-events: none;
}
#manifesto-dark::after {
content: ''; position: absolute; inset: 0;
background: radial-gradient(ellipse 60% 50% at 50% 28%,
rgba({{BRAND_LIGHT_RGB}}, 0.10) 0%, rgba({{BRAND_PRIMARY_RGB}}, 0.04) 40%, transparent 70%);
pointer-events: none;
}
#manifesto-dark .frame {
position: relative; height: 100%;
padding: 64px 80px 56px;
display: flex; flex-direction: column;
z-index: 1;
}
#manifesto-dark .header {
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 80px;
}
#manifesto-dark .lockup { display: flex; align-items: center; gap: 14px; }
#manifesto-dark .lockup-text {
font-family: '{{WORDMARK_FONT}}', Georgia, serif;
font-weight: 400; font-size: 36px; color: {{DARK_TEXT}};
letter-spacing: 1.5px; line-height: 1;
}
#manifesto-dark .header-meta {
font-family: '{{MONO_FONT}}', monospace;
font-size: 12px; color: {{ACCENT_HEX}};
letter-spacing: 2.5px; text-transform: uppercase;
opacity: 0.65;
}
#manifesto-dark .eyebrow {
font-family: '{{MONO_FONT}}', monospace;
font-size: 12px; color: {{ACCENT_HEX}};
letter-spacing: 3px; text-transform: uppercase;
margin-bottom: 16px; opacity: 0.65;
}
#manifesto-dark .title {
font-family: '{{DISPLAY_FONT}}', sans-serif;
font-weight: 200; font-size: 96px;
color: {{DARK_TEXT}}; letter-spacing: -1.2px;
line-height: 0.95;
margin-bottom: 80px;
}
#manifesto-dark .title em {
font-family: '{{WORDMARK_FONT}}', Georgia, serif;
font-style: italic; font-weight: 400;
color: {{BRAND_LIGHT_HEX}};
}
#manifesto-dark .negations {
display: flex; flex-direction: column;
gap: 14px;
margin-bottom: 72px;
}
#manifesto-dark .neg {
display: flex; align-items: baseline; gap: 18px;
padding: 16px 0;
border-bottom: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.10);
}
#manifesto-dark .neg:last-child { border-bottom: none; }
#manifesto-dark .neg-mark {
font-family: '{{MONO_FONT}}', monospace;
font-size: 14px; color: {{ACCENT_HEX}};
opacity: 0.5;
flex-shrink: 0;
width: 16px;
}
#manifesto-dark .neg-text {
font-family: '{{BODY_FONT}}', sans-serif;
font-weight: 400; font-size: 32px;
color: {{DARK_TEXT_DIM}};
line-height: 1.2;
letter-spacing: -0.3px;
}
#manifesto-dark .turn {
display: flex; align-items: center; gap: 16px;
margin-bottom: 28px;
}
#manifesto-dark .turn-rule {
flex: 1; height: 1px;
background: linear-gradient(90deg, rgba({{BRAND_LIGHT_RGB}}, 0.3) 0%, rgba({{BRAND_LIGHT_RGB}}, 0) 100%);
}
#manifesto-dark .turn-label {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: {{ACCENT_HEX}};
letter-spacing: 3px; text-transform: uppercase;
opacity: 0.7;
}
#manifesto-dark .close {
font-family: '{{DISPLAY_FONT}}', sans-serif;
font-weight: 200; font-size: 48px;
color: {{DARK_TEXT}};
line-height: 1.05;
letter-spacing: -0.5px;
margin-bottom: 48px;
}
#manifesto-dark .close em {
font-family: '{{WORDMARK_FONT}}', Georgia, serif;
font-style: italic; font-weight: 400;
color: {{BRAND_LIGHT_HEX}};
}
#manifesto-dark .trust {
font-family: '{{MONO_FONT}}', monospace;
font-size: 12px; color: {{BRAND_LIGHT_HEX}};
letter-spacing: 2px; text-transform: uppercase;
opacity: 0.85;
}
#manifesto-dark .footer {
display: flex; justify-content: space-between; align-items: center;
margin-top: auto;
padding-top: 16px;
border-top: 1px solid #1a1e28;
}
#manifesto-dark .tagline {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: #6b7a8d;
letter-spacing: 2px; text-transform: uppercase;
}
#manifesto-dark .url {
font-family: '{{MONO_FONT}}', monospace;
font-size: 11px; color: {{ACCENT_HEX}};
letter-spacing: 2px;
}
/* Light variant: duplicate, swap colors per light theme. See concept template. */
</style>
</head>
<body>
<!--
Manifesto sheet · 1080×1350 portrait anti-positioning card. Lists what {{PRODUCT_NAME}}
*isn't* (5 numbered negations) followed by the locked hero (positive turn).
The negations are curated: each does specific category-distancing work. Order should
go bottom-feeder category → AI fad → generic generation → consultant register →
category-name distance.
-->
<!-- ─── MANIFESTO · DARK ─── -->
<div class="sheet-item">
<div class="sheet-label">#manifesto-dark · 1080×1350</div>
<div id="manifesto-dark">
<div class="frame">
<div class="header">
<div class="lockup">
<svg width="32" height="47" viewBox="0 0 22 32" fill="none" xmlns="http://www.w3.org/2000/svg">
{{MARK_SVG_DARK}}
</svg>
<span class="lockup-text">{{PRODUCT_NAME}}</span>
</div>
<div class="header-meta">Manifesto · 02</div>
</div>
<div class="eyebrow">The category we opt out of</div>
<h1 class="title">What {{PRODUCT_NAME}}<br><em>isn't</em>.</h1>
<div class="negations">
<div class="neg"><span class="neg-mark">01</span><span class="neg-text">{{NEGATION_1}}.</span></div>
<div class="neg"><span class="neg-mark">02</span><span class="neg-text">{{NEGATION_2}}.</span></div>
<div class="neg"><span class="neg-mark">03</span><span class="neg-text">{{NEGATION_3}}.</span></div>
<div class="neg"><span class="neg-mark">04</span><span class="neg-text">{{NEGATION_4}}.</span></div>
<div class="neg"><span class="neg-mark">05</span><span class="neg-text">{{NEGATION_5}}.</span></div>
</div>
<div class="turn">
<span class="turn-label">What it is</span>
<span class="turn-rule"></span>
</div>
<p class="close">{{LOCKED_HERO_NOUN}}<br><em>{{LOCKED_HERO_VERB}}</em></p>
<div class="trust">{{TRUST_LINE}}</div>
<div class="footer">
<div class="tagline">{{TAGLINE}}</div>
<div class="url">{{DOMAIN}}</div>
</div>
</div>
</div>
</div>
<!-- ─── MANIFESTO · LIGHT ─── -->
<!-- Duplicate dark variant, swap colors -->
<script>
(function() {
const hash = window.location.hash.slice(1);
if (!hash) return;
document.body.classList.add('render');
const target = document.getElementById(hash);
if (!target) return;
const targetItem = target.closest('.sheet-item');
document.querySelectorAll('.sheet-item').forEach(item => {
if (item !== targetItem) item.classList.add('hidden');
});
})();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{PRODUCT_NAME}} — Open Graph image</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="{{GOOGLE_FONTS_URL}}" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #1a1d24;
font-family: '{{BODY_FONT}}', sans-serif;
padding: 40px 0;
display: flex; flex-direction: column;
align-items: center; gap: 56px;
}
.sheet-label {
font-family: '{{MONO_FONT}}', monospace;
font-size: 12px; color: {{BRAND_LIGHT_HEX}};
letter-spacing: 2px; text-transform: uppercase;
padding: 6px 14px;
border: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.3);
border-radius: 4px;
background: rgba(10, 12, 16, 0.5);
margin-bottom: 12px;
}
.sheet-item { display: flex; flex-direction: column; align-items: center; }
body.render { padding: 0; gap: 0; background: {{DARK_BG}}; }
body.render .sheet-label { display: none; }
body.render .sheet-item { margin: 0; }
body.render .sheet-item.hidden { display: none; }
/* ─────────────────────────────────────────────────────────────
#og-dark · 1200×630 · Open Graph link preview (dark)
───────────────────────────────────────────────────────────── */
#og-dark {
width: 1200px; height: 630px; background: {{DARK_BG}};
position: relative; overflow: hidden;
display: flex; align-items: center; justify-content: center;
}
#og-dark::before {
content: ''; position: absolute;
width: 900px; height: 700px; top: 50%; left: 50%;
transform: translate(-50%, -50%);
background: radial-gradient(ellipse at center,
rgba({{BRAND_LIGHT_RGB}}, 0.08) 0%, rgba({{BRAND_PRIMARY_RGB}}, 0.04) 40%, transparent 70%);
pointer-events: none;
}
#og-dark .facet-grid {
position: absolute; inset: 0; opacity: 0.025;
background-image:
linear-gradient(40deg, {{BRAND_LIGHT_HEX}} 1px, transparent 1px),
linear-gradient(-40deg, {{BRAND_LIGHT_HEX}} 1px, transparent 1px);
background-size: 60px 60px; pointer-events: none;
}
#og-dark .vignette {
position: absolute; inset: 0;
background: radial-gradient(ellipse at center, transparent 35%, rgba(5,7,9,0.7) 100%);
pointer-events: none;
}
#og-dark .corner {
position: absolute; z-index: 2;
width: 36px; height: 36px;
}
#og-dark .corner-tl { top: 28px; left: 28px;
border-top: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12);
border-left: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12); }
#og-dark .corner-tr { top: 28px; right: 28px;
border-top: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12);
border-right: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12); }
#og-dark .corner-bl { bottom: 28px; left: 28px;
border-bottom: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12);
border-left: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12); }
#og-dark .corner-br { bottom: 28px; right: 28px;
border-bottom: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12);
border-right: 1px solid rgba({{BRAND_LIGHT_RGB}}, 0.12); }
#og-dark .content {
position: relative; z-index: 2;
display: flex; flex-direction: column; align-items: center; gap: 32px;
}
#og-dark .lockup { display: flex; align-items: center; gap: 20px; }
#og-dark .lockup-text {
font-family: '{{WORDMARK_FONT}}', Georgia, serif;
font-weight: 400; font-size: 96px; color: {{DARK_TEXT}};
letter-spacing: 3px; line-height: 1;
}
#og-dark .pitch {
font-family: '{{BODY_FONT}}', sans-serif;
font-weight: 300; font-size: 22px;
color: {{DARK_TEXT_DIM}}; line-height: 1.4;
text-align: center;
max-width: 720px;
}
#og-dark .tagline {
font-family: '{{MONO_FONT}}', monospace; font-size: 12px;
color: {{BRAND_LIGHT_HEX}}; letter-spacing: 2.5px; text-transform: uppercase;
opacity: 0.85;
}
#og-dark .url {
font-family: '{{MONO_FONT}}', monospace; font-size: 13px;
color: {{ACCENT_HEX}}; letter-spacing: 2px;
opacity: 0.85;
margin-top: 16px;
}
</style>
</head>
<body>
<!--
OG image · 1200×630 Open Graph link preview. Centered symmetric composition.
Renders when {{PRODUCT_NAME}} URLs are unfurled in social platforms, Slack,
iMessage, etc.
-->
<!-- ─── OG · DARK ─── -->
<div class="sheet-item">
<div class="sheet-label">#og-dark · 1200×630</div>
<div id="og-dark">
<div class="facet-grid"></div>
<div class="vignette"></div>
<div class="corner corner-tl"></div>
<div class="corner corner-tr"></div>
<div class="corner corner-bl"></div>
<div class="corner corner-br"></div>
<div class="content">
<div class="lockup">
<svg width="92" height="134" viewBox="0 0 22 32" fill="none" xmlns="http://www.w3.org/2000/svg">
{{MARK_SVG_DARK}}
</svg>
<span class="lockup-text">{{PRODUCT_NAME}}</span>
</div>
<div class="pitch">{{LOCKED_HERO_NOUN}} <em>{{LOCKED_HERO_VERB}}</em></div>
<div class="tagline">{{TRUST_LINE}}</div>
<div class="url">{{DOMAIN}}</div>
</div>
</div>
</div>
<!-- ─── OG · LIGHT ─── -->
<!-- Duplicate dark variant, swap colors -->
<script>
(function() {
const hash = window.location.hash.slice(1);
if (!hash) return;
document.body.classList.add('render');
const target = document.getElementById(hash);
if (!target) return;
const targetItem = target.closest('.sheet-item');
document.querySelectorAll('.sheet-item').forEach(item => {
if (item !== targetItem) item.classList.add('hidden');
});
})();
</script>
</body>
</html>
Pre-launch deferrals
Things to defer when the product is pre-launch. Note them explicitly in the brand docs ("What's not here yet" sections) so absent material is understood as intentional, not missing.
What to defer pre-launch
| Item | Where it would otherwise live | Reason for deferral |
|---|---|---|
| Customer testimonials | press kit, landing page, BIOS | No customers yet; can't fabricate |
| Case studies | press kit, blog | Same |
| Press quotes / coverage clips | press kit | No coverage yet |
| Hosted-product screenshots | README, press kit, marketing | UI may shift before launch; screenshots go stale |
| Specific public-URL references | brand assets (footers, links) | Domain may not be live; baking URLs creates 404 traps |
| "Trusted by 10,000+ users" / scale claims | landing page, pitch deck | Not true yet; don't fabricate |
| Discount codes / promo programs | PRICING.md, FAQ | Not real yet |
| Enterprise / team plans | PRICING.md | Not real yet |
| Founder photo / team photo | press kit | Optional; defer until photo session happens |
| API documentation | docs/ | Defer until API is stable enough that docs won't drift each week |
Pre-launch language patterns
Use these phrasings to convey "real but not yet shipped":
- "Currently preparing for public launch."
- "When the public site lands, this will mirror to {{DOMAIN}}/{{path}}."
- "Public URL pending."
- "(Available on request before launch; will be in this kit once the first version ships.)"
Avoid these phrasings (they confuse readers about what's real):
- ❌ "Coming soon!" (vague; sounds marketing-y)
- ❌ "Beta access available" (unless it actually is)
- ❌ "Sign up for early access" (unless that signup actually exists)
Press-kit "What's not here yet" pattern
Include in brand/press/README.md:
## What's not here yet
This is a pre-launch press kit. Some standard press-kit content is
deliberately absent until it exists:
- **Customer testimonials, case studies, coverage clips** — no users
yet. Will populate after public launch.
- **Hosted-product screenshots** — UI may shift before launch.
Available on request for context, but not packaged here until
stable.
- **Specific pricing detail beyond the headline** — see [`PRICING.md`](../PRICING.md)
for the full argument; specific tier breakdowns wait on launch.
- **Public press contact form** — `{{DOMAIN}}` doesn't yet have a
`/press` page. When it does, the canonical URL for this material
will be `{{DOMAIN}}/press`.This signals deliberate absence; a journalist reading it understands the gap is intentional rather than missing.
When to update post-launch
Once the product launches:
1. Remove "currently preparing for public launch" language across BIOS, press kit, README. 2. Replace public-URL "pending" notes with live links. 3. Add a "What's not here yet" → "What's not here" sweep, removing items that no longer apply. 4. Begin populating customer testimonials / coverage clips as they accrue. 5. Audit screenshots; replace pre-launch placeholders with current production UI.
This is a separate small task to file when launch happens.