@prowl-ai/brandbook
v1.9.0
Published
Prowl's brand system as an agent plugin — operator voice, terminology, canonical product facts, and the Editorial Luxury design system with machine-readable tokens.
Maintainers
Readme
Prowl Brandbook
The Prowl brand, packaged as an agent plugin — and the working repo where brand, SMM and marketing output actually lives.
Two ways to use this repo; only one of them needs an install
| You are | What you do | What keeps you current |
|---|---|---|
| Working inside this repo — brand, SMM, marketing, launches | git pull, read NOW.md, put your work under workspace/ | Nothing. The app repo pushes the current product straight in: the numbers, what shipped, what still needs a human |
| Working in another repo and want Prowl's voice and pixels there | Install the plugin (below) | claude plugin update prowl-brand@prowl-brand when the version moves |
NOW.md is the entry point for the first case — one page, rewritten on every product push: what Prowl is today, what shipped recently, what still needs a human, and where each kind of work goes. Nothing to install and no version to chase; the version bumps exist for the other audience.
Install it and any agent — Claude Code, Cursor, Codex — writes Prowl copy in Prowl's voice and builds Prowl visuals from Prowl's real tokens, without being told the rules each time.
Two skills:
| Skill | Job |
|---|---|
| prowl-brand | Every Prowl sentence — landing copy, UI strings, social, ads, docs, submissions — plus the canonical numbers, plan names, and boilerplate. |
| prowl-design | Every Prowl pixel — colour, type, logo, components, motion — plus brand.json, prowl-brand.css, an HTML artifact template, and all logo variants. |
prowl-brand is also the entry point: invoke it with no task and it reports
every open or conflicting fact and suggests one next action.
Install
From the repo
Private repo — you need read access and gh authenticated.
claude plugin marketplace add PROWL-AI/prowl-brandbookclaude plugin install prowl-brand@prowl-brandFrom npm — no repo access needed
npm i -g @prowl-ai/brandbookclaude plugin marketplace add "$(npm root -g)/@prowl-ai/brandbook"claude plugin install prowl-brand@prowl-brandThe package root carries its own marketplace.json, which is what makes
marketplace add work on it. Verified end to end against the registry, not
against a local checkout — npx and npm both resolve locally inside this
repo and would give a false pass.
npx skills add @prowl-ai/brandbook does not work. The skills CLI reads
that argument as a GitHub repo, not an npm package, and fails. For Cursor,
Codex and the rest, point it at the repo instead:
npx --yes skills add PROWL-AI/prowl-brandbook --globalFrom a ZIP — no git, no network
For anyone without repo access. Build the archive:
python3 scripts/build-release.pyThat writes dist/prowl-brand-<version>.zip (~1.1 MB, byte-reproducible) and
validates the staged plugin against claude plugin validate --strict first.
Hand over that one file. The recipient unzips it and picks either path — both
are documented in INSTALL.md, which ships inside the archive:
| Path | Command | Trade-off |
|---|---|---|
| Marketplace | claude plugin marketplace add <dir> then claude plugin install prowl-brand@prowl-brand | Versioned, appears in /plugin. The unzipped folder must stay put — a local-path marketplace is referenced, not copied. |
| Drop-in | unzip into ~/.claude/skills/ | Zero commands; loads as prowl-brand@skills-dir next session. No versioned updates. |
Claude Code has no ZIP source type — a marketplace entry takes a relative path,
github, a git URL, git-subdir, or npm. So the archive is not a source; it is a
folder built to satisfy both offline paths from one artifact. Its root carries
.claude-plugin/plugin.json and a marketplace.json whose single entry sits
at source: "./".
Never run both paths at once. Two copies means two listings of the same skills, and the plain skills-directory copy wins — usually the stale one.
One channel per agent. If the Claude Code plugin is installed, do not also
add the skills-CLI copy for claude-code — the stale plain copy wins and
shadows the plugin.
Update
claude plugin marketplace update prowl-brand && claude plugin update prowl-brand@prowl-brandRestart Claude Code afterwards.
Use
Nothing to invoke — the skills fire on intent. "Write a LinkedIn post about the
AEO module", "build an infographic for the Q3 numbers", "is this landing copy
on-brand?" all route correctly. To force one: /prowl-brand:prowl-brand or
/prowl-brand:prowl-design.
What ships
plugins/prowl-brand/
├── .claude-plugin/plugin.json
└── skills/
├── prowl-brand/
│ ├── SKILL.md
│ └── references/
│ ├── voice-and-tone.md how we sound, per surface
│ ├── terminology.md Hunt / Recon / Exploit …, status tags
│ ├── messaging.md taglines, one-liner, short + long boilerplate
│ ├── product-facts.md canonical numbers — the only place they live
│ ├── overview.md positioning, audience, 2026 repositioning
│ ├── social.md per-channel register, pillars, hooks
│ ├── channels.md official URLs and handles
│ └── writing-rules.md the seven rules + pre-publish checklist
└── prowl-design/
├── SKILL.md
├── references/
│ ├── color.md full palette, aliases, contrast rules
│ ├── typography.md three families, weights, scale, exports
│ ├── logo-and-icons.md variants, clearspace, regeneration
│ └── components.md buttons, cards, status blocks, motion
└── assets/
├── brand.json machine-readable tokens
├── prowl-brand.css drop-in custom properties + base classes
├── templates/artifact.html
├── icons/ every logo variant, SVG + PNG, + _gen.py
└── og-image.png · favicon-96x96.png · prowl-icon.svgWorking in this repo
CLAUDE.md is the entry point — any agent opening this repo reads it first. It sets out the three trees and their different rules:
| Tree | What | Rule |
|---|---|---|
| plugins/prowl-brand/ | Brand truth. Ships to everyone who installs. | Changes only when the brand or a fact changes. |
| internal/ | Reference — competitive map, submission playbook, v1.0 pack. | Read from it; never promote into the plugin. |
| workspace/ | Output — posts, pages, campaigns, generated visuals. | Follow workspace/README.md. |
Content pieces are scaffolded, not hand-created — the naming and front matter are validated:
python3 scripts/content.py new linkedin aeo-visibility-teardown --pillar ai-visibilitypython3 scripts/content.py indexThe second regenerates workspace/plan/calendar.md from the pieces themselves,
so the calendar cannot drift from the tree.
The dashboard
Everything above is markdown across forty files. The dashboard puts it on one page, in a browser, for the half of the team that does not run Python:
python3 scripts/dash.py startThe plan with owners, every content piece and its copy, the content plan, what
the product shipped, every channel handle, the asset folders, the internal/
index, and the Figma and Miro links — read from the working tree on every
request, so it is never a stale snapshot. python3 scripts/preflight.py raises
it for you and prints the URL.
It is read-only and bound to 127.0.0.1 only: the page renders
internal/, which never ships anywhere, so it is never served anywhere either.
It has no idle timeout — python3 scripts/dash.py stop is what stops it.
Not in the plugin
internal/ holds real working material that is not brand and must not ship to
every agent that installs this:
internal/competitive/— SEO/GEO market map (205 tools, 24 categories), coverage verdicts, opportunity backlog. Read it when writing comparison copy.internal/submissions/— directory/social submission playbook, answer bank, per-startup checklists. Carries operator contacts and form links.internal/brandbook-v1-source/— the v1.0 PDF/DOCX pack. Provenance only. Its typefaces were guessed from screenshots and several hexes drift from the real values; see the CHANGELOG for the corrections.
Ground truth
The live stylesheet https://prowl.chat/static/styles.css (:root) and the
live landing page are the authority on colour, type, and product numbers. When
this repo disagrees with them, the site wins — fix the repo in the same change,
then propagate.
Secrets never go in this repo. Passwords, tokens, and recovery emails live in a
password manager, and .gitignore blocks the obvious filenames.
Develop
python3 test/validate.py && python3 test/validate.py --self-testclaude plugin validate ./plugins/prowl-brand --strict && claude plugin validate . --strictBoth must pass before any version bump. See CONTRIBUTING.md for the release checklist.
