@repo/brand
The single source of truth for product identity, shared by every app and package.
@repo/brand is a small private package that holds the product identity for the whole monorepo: the product name, description, URLs, and the logo. Every app and package reads its branding from here, so a fork rebrands in one place instead of hunting through the web app, docs site, emails, and favicons.
Exports
The package exposes four entry points:
| Entry point | Contents |
|---|---|
@repo/brand | The brand object. Plain TypeScript, safe in CLI, email, and server code. |
@repo/brand/mark | The BrandMark React logo component. |
@repo/brand/author-mark | The AuthorMark jxd.dev logo, for "built by" attribution. |
@repo/brand/logo.svg | The raw logo SVG. Both apps import it for their favicons. |
The brand object
import { brand } from '@repo/brand';
brand.name; // "Onyx"
brand.slug; // "onyx", for machine identifiers
brand.description; // "The TypeScript starter kit from jxd.dev"
brand.url; // deployed origin
brand.author; // { name, url }Because it is plain TypeScript with no React or DOM dependencies, the brand object is imported by the CLI, React Email templates, and server code as well as the web app.
slug names everything the product writes that is not prose: the locale and consent cookies, the API key prefix, the log service, and the analytics SDK tag. Worker and Cloudflare resource names follow it by convention (<slug>-web, <slug>-db), but live in wrangler.jsonc, which cannot import TypeScript; renaming them is a step in Make it your own.
BrandMark
BrandMark renders the logo as an inline SVG built from polygons, sized by the parent through className:
import { BrandMark } from '@repo/brand/mark';
export function Header() {
return <BrandMark className="size-6" />;
}The optional size prop sets explicit dimensions instead, for renderers with no CSS layout: the OG image template passes size because satori measures SVG by its attributes.
React is a peer dependency, so only React consumers pay for this entry point.
Raw SVG
For places that need a file rather than a component, import the SVG directly. The favicon links in both apps' root routes do this:
import faviconUrl from '@repo/brand/logo.svg?url';Rebranding a fork
Rebranding is a two-step change inside private/brand:
- Edit the
brandobject insrc/index.tswith your name, slug, description, and URLs. - Replace
src/assets/logo.svgand the polygons insrc/mark.tsxwith your own logo.
The web app shell, docs site, emails, favicons, and OG images pick the changes up from here. For everything a rebrand does not cover, such as Cloudflare resource names, marketing content, and legal text, follow Make it your own.