Install
Two pinned <link> tags, two attributes on <html>, and you are on-brand. No build step required.
Quick start · 60 seconds
Link once, theme everywhere.
Add two stylesheets, set two attributes. Every component frombrandOS/ui, every DaisyUI utility, and every--brandOS-* token becomes available.
- 19-step primary scale
- 12 accent palettes
- Red Hat + Inter + Mono
- 7 brand themes
- Light + dark parity
- 26 stroke icons
- Governed SVG assets
- DaisyUI overlay
- Tailwind v4 reference
<html data-brand="snyder" data-theme="light">
<head>
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/global-tokens.css">
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/snyder-brand.css">
</head>
</html>01 · CDN bundles
Pick the right file
Production apps load exactly two files: global-tokens.css plus the one<brand>-brand.css they ship. That pairing is roughly 42 KB raw, under 7 KB gzipped. brand-all.css carries every published brand theme at 2.7 MB raw and 158 KB gzipped, so keep it to prototypes and brand-switching demos.
Every bundle is served from an immutable, exact version path such as/cdn/0.44.11/…. There is no /cdn/v1/ path; only concrete versions and the rolling latest alias resolve, and latest is not a production path.
global-tokens.css16 KB · 2.9 KB gzThe token layer every brand builds on. Load this first, always.
/cdn/0.44.11/themes/global-tokens.csssnyder-brand.css25 KB · 3.9 KB gzSnyder theme only. Pair with global-tokens.css.
/cdn/0.44.11/themes/snyder-brand.csshackerman-brand.css36 KB · 5.0 KB gzHackerman theme only, same pairing.
/cdn/0.44.11/themes/hackerman-brand.csscontrolbus-brand.css31 KB · 4.3 KB gzControlBus profile only, pair with global-tokens.css.
/cdn/0.44.11/themes/controlbus-brand.cssmcit-brand.css27 KB · 4.2 KB gzMCIT profile only, pair with global-tokens.css.
/cdn/0.44.11/themes/mcit-brand.cssmicroinno-brand.css28 KB · 4.1 KB gzMicro Innovation profile only, pair with global-tokens.css.
/cdn/0.44.11/themes/microinno-brand.cssmicrolight-brand.css26 KB · 3.8 KB gzMicroLight profile only, pair with global-tokens.css.
/cdn/0.44.11/themes/microlight-brand.csslqdmrk-brand.css28 KB · 4.2 KB gzLiquid Marketing profile only, pair with global-tokens.css.
/cdn/0.44.11/themes/lqdmrk-brand.cssalexlabs-brand.css29 KB · 4.2 KB gzAlexander Labs profile only, pair with global-tokens.css.
/cdn/0.44.11/themes/alexlabs-brand.csstailwind.css391 BTailwind v4 @reference file exposing every token as a utility.
/cdn/0.44.11/themes/framework/tailwind.cssdaisyui.css246 BDaisyUI semantic slots wired to brandOS tokens.
/cdn/0.44.11/themes/framework/daisyui.cssbrand-all.css2.7 MB · 158 KB gzEvery published brand theme in one file. Prototyping and brand-switching demos only, never a production app that ships one brand.
/cdn/0.44.11/themes/brand-all.css02 · Framework snippets
Copy-paste for your stack
Every snippet produces the same runtime. Pick your stack, click copy.
<!DOCTYPE html>
<html data-brand="snyder" data-theme="light">
<head>
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/global-tokens.css">
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/snyder-brand.css">
</head>
<body>
<button class="bos:dui-btn bos:dui-btn-primary">Ship it</button>
</body>
</html><!-- src/layouts/BaseLayout.astro -->
<html data-brand="snyder" data-theme="light">
<head>
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/global-tokens.css">
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/snyder-brand.css">
<slot name="head" />
</head>
<body><slot /></body>
</html>// app/layout.tsx
export default function RootLayout({ children }) {
return (
<html data-brand="snyder" data-theme="light">
<head>
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/global-tokens.css" />
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/snyder-brand.css" />
</head>
<body>{children}</body>
</html>
);
}// nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
htmlAttrs: { 'data-brand': 'snyder', 'data-theme': 'light' },
link: [
{ rel: 'stylesheet', href: 'https://brand.snyder.tech/cdn/0.44.11/themes/global-tokens.css' },
{ rel: 'stylesheet', href: 'https://brand.snyder.tech/cdn/0.44.11/themes/snyder-brand.css' },
],
},
},
});<!-- index.html -->
<html data-brand="snyder" data-theme="light">
<head>
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/global-tokens.css">
<link rel="stylesheet" href="https://brand.snyder.tech/cdn/0.44.11/themes/snyder-brand.css">
</head>
<body><app-root></app-root></body>
</html>03 · Theme activation
Drive everything from <html>
Every theme decision lives on the root element. Never re-theme per-component, flip one attribute and all tokens follow.
| Attribute | Values | What it controls |
|---|---|---|
data-brand | snyderhackermancontrolbusmcitmicroinnomicrolightlqdmrkalexlabs | Flips the brand palette, semantic slots, and font pairing. |
data-theme | lightdark | Surface + content polarity. Every semantic slot adapts. |
data-palette | vividmutedmono | Home tile palette — vivid is default; mono tints all tiles primary. |
data-tile-columns | 579 | Home tile columns — 5 featured, 7 balanced, 9 dense. Default: 7. (data-density is reserved for the compact/spacious UI density axis.) |
04 · Version pinning
Pick your update cadence
Every CDN path is pinned to an exact version and is immutable once published. Published objects are never rewritten or deleted, so a pinned URL keeps rendering the same bytes forever. You opt in to an update by editing the version in the URL.
/cdn/0.44.11/…Pinned · recommendedThe correct path for every shipped app. Immutable, cacheable, reproducible, and audit-friendly. Bump the version deliberately, alongside your@snyder-tech/brandos-tokens dependency, so CSS and package stay in step.
/cdn/latest/…Preview onlyA best-effort convenience alias with short cache behaviour. Fine for a scratch pen or a local experiment. Never pin a production runtime, an email, or an SEO-visible asset to it: the bytes behind it change without notice.
/cdn/IndexThe CDN index lists the current latest value and every published version alongside the assets each one carries. Read it to find the exact version to pin.
05 · Verify
Confirm brandOS loaded
Paste into the DevTools console. You should see a real OKLCH value, not an empty string.
getComputedStyle(document.documentElement)
.getPropertyValue('--brandOS-primary-500')
.trim();
// → "oklch(0.72 0.1557 239.5)"06 · Common pitfalls
When something looks off
Common integration and SVG delivery issues, with the canonical fix for each.
Cause data-brand or data-theme missing on <html>.
Fix Add both attributes at the root element, never on <body> or a wrapper div.
Cause CSP blocks CDN font requests.
Fix Allow brand.snyder.tech in style-src + font-src CSP directives.
Cause data-theme is set via JS after hydration.
Fix Server-render the attribute, or add a blocking script in the document head to set it before the stylesheet loads.
Cause The Tailwind config did not pick up our @reference file.
Fix Add @reference "https://brand.snyder.tech/cdn/0.44.11/themes/framework/tailwind.css" at the top of your global CSS, or import @brandos/tokens/css/tailwind-theme if you already import Tailwind yourself.
Cause Web components are not part of the CDN theme bundles; they ship in the brandOS/ui npm package. There is no CDN ui.js bundle.
Fix Install @snyder-tech/brandos-ui, then register the elements from your own bundle: import "@snyder-tech/brandos-ui".
Cause The light and dark files do not share one normalized viewBox, or a consumer is overriding the intrinsic ratio.
Fix Use the registered brandOS variants and run just brandos-svg-check --report before replacing either file.
Cause Reusable artwork was authored inline, loaded from a local app folder, or imported through the aggregate asset barrel.
Fix Move it into the correct brandOS asset class, register its owner, then import the exact .svg?react or .svg?raw path.
07 · SVG assets
Import the asset, preserve the artwork.
Reusable logos, marks, icons, illustrations, shapes, and backgrounds belong inbrandOS/ui/src/assets. Resolve the owning registry entry first, then import the exact file instead of the aggregate asset barrel.
import Logo from '@brandos/ui/assets/brand-logos/acme-logo-ink.svg?react';
export function HeaderLogo() {
return <Logo role="img" aria-label="Acme" />;
}- Use
-logo-ink.svginline when the artwork should inheritcurrentColor. - Use registered
-logo-light.svgand-logo-dark.svgfiles for fixed-color contexts. Both variants must share one viewBox. - Decorative inline SVGs require
aria-hidden="true"andfocusable="false". Informative SVGs requirerole="img"and an accessible name. - Do not add root sizing or
preserveAspectRatiomechanically. Choose behavior from the asset class and test multiple viewport sizes. - Before review, run
just brandos-svg-check --reportandjust brandos-assets-check --report.
08 · Agent skills + Office artifacts
Connect without auth. Install with review.
The activation-ready public endpoint is https://brand.snyder.tech/mcp. It serves read-only catalog metadata, immutable URLs, byte sizes, and SHA-256 values. It remains unavailable until a public-approved artifact catalog is published.
Open the complete no-auth setup guide for Codex, Claude Code, Cursor, VS Code, GitHub Copilot CLI, Gemini CLI, and generic Streamable HTTP clients.
CodexNo authcodex mcp add brandos --url https://brand.snyder.tech/mcp
Claude CodeNo authclaude mcp add --transport http --scope project brandos https://brand.snyder.tech/mcp
CursorNo authAdd {"mcpServers":{"brandos":{"url":"https://brand.snyder.tech/mcp"}}} to .cursor/mcp.json.
MCP cannot write a Skill to your computer. Resolve an exact version, display and approve its immutable URL, byte size, SHA-256, and unsigned status; download the singleSKILL.md into a temporary directory; verify its digest; inspectSKILL.md, then copy atomically into one local skill root. Never usecurl | sh, npx, source, or server-returned install commands.
Read the complete Office Artifact Kit and safe skill-install contract.
09 · Next
Where to go from here
- AI Guardrails, the non-negotiable rules for any generated UI.
- Brand components, 26 first-party web components that drop in over the CDN link.
- Downloads, logos, fonts, raw
tokens.css+tokens.js. - Office Artifact Kits, per-brand DOCX, PPTX, XLSX, manifests, and portable Agent Skills.
- MCP Connection Guide, copyable no-auth setup for common AI harnesses.
- llms-full.txt, machine-readable contract for AI assistants.