Brand
Draft a brand brief, save it as a kit, read it back, and write it into a project's brand seam.
The Brand category is the brand studio as four tools: brand_draft,
brand_save, brand_get, and brand_apply. The order is the loop —
draft → save → read → apply.
What a kit is
A brand kit is a name, a tagline, a voice in three adjectives, a five-to-seven colour palette, a Google Fonts pairing, and any logo assets. Every palette is contrast-checked against WCAG AA for its text pairs before it can be saved, and a failing one is refused with the offending pair named, so a kit that saved is a kit that reads.
The brand seam
brand_apply is the only tool that may write a project's brand files:
| Path | What lands there |
|---|---|
src/brand/tokens.css | the --brand-* CSS variables |
src/brand/brand.json | name, tagline, voice, logo paths |
src/brand/fonts.css | the allowlisted Google Fonts import |
public/brand/ | the logo files |
It writes those paths and nothing else. Every other path in the project is the Project category's business.
Two boundaries worth knowing
A kit is scoped to its owner. brand_get and brand_apply look a kit up by
owner, so a kit that belongs to someone else returns the same not-found as one
that does not exist. Neither tool is an id oracle.
A font family is checked against a committed allowlist before it can reach a
generated CSS @import. A family name is model-authored text, and an arbitrary
one in src/brand/fonts.css would be a request-forgery primitive against every
viewer of the project.
get_token_price
Fetch a token's spot price by asking the Uniswap API for a 100 USDC -> token quote and dividing. The Uniswap API does not expose a direct price endpoint, so the /quote derivation is the only path. Returns `{ pricePerToken, quoteToken, amountIn: 100, currency: USD }`. The derivation has known limits: a token with less than ~100 USDC of liquidity may return a partial price; UniswapX routes have a minimum swap value (300 USDC on Ethereum, 1000 USDC on L2s) and the call may fail below those thresholds. Defaults `quoteToken` to canonical USDC on Ethereum and Base; Robinhood does not have a canonical USDC, so callers on Robinhood must pass `quoteToken` explicitly. The `currency` label is `USD` because the helper assumes the quote token is a USD-pegged stablecoin.
Brand
Draft a brief, save it, read it back, apply it to a project.