cartwright
API reference

brand.config.ts schema

Field-by-field reference for the brand configuration object.

brand.config.ts is the compile-time source of truth for everything brand-specific. This page documents every field. For the design rationale, see Architecture: brand.config.ts.

The exported type is Brand = typeof brand, so all fields are statically typed and the shape below is the literal current export.

Identity

storeName: string         // "Cartwright Demo Store"
storeSlug: string         // "cartwright-demo" — used as DB seed key + MCP server identifier
domain: string            // "example.com" — apex domain without protocol
url: string               // "https://example.com" — full canonical URL
tagline: string           // shop tagline shown in marketing
industryTemplate: string  // "generic" — selects industry-templates/<slug>/

Contact

emails: {
  from: string         // "noreply@example.com" — must match a Resend verified sender
  fromName: string     // display name shown before <from>
  support: string      // customer-support address
  admin: string        // admin/internal notifications
}

SEO / metadata

metadata: {
  title: string            // default <title> for pages without override
  description: string      // default meta description
  socialImageUrl: string   // OG + Twitter card image path
}

AI behaviour

ai: {
  enabled: boolean              // master switch — false ships a shop with no AI surface
  promptModule: string          // matches lib/ai/prompts/<name>.ts (defaults to "generic")
  assistantLabel: string        // aria-label / header text
  assistantOpenText: string     // FAB button text
}

Feature flags

features: {
  tryOn: boolean       // AR virtual try-on (eyewear-specific) — false in upstream
  aiStylist: boolean   // storefront AI assistant FAB
  newsletter: boolean  // footer newsletter section
  mcpPublic: boolean   // expose /api/mcp + /api/v1/tools publicly
}

Commerce policies

policies: {
  shippingFreeThresholdDkk: number  // in øre — value above which shipping is free
  shippingDefaultDkk: number        // in øre — default shipping cost
  returnDays: number                // return window in days
  currency: string                  // ISO-4217 — "DKK", "EUR", "USD", etc.
}

All monetary values in cartwright are in smallest currency unit (øre for DKK, cents for USD/EUR) to avoid floating-point math.

footer: {
  tagline: string
  disclaimer: string
  copyrightYear: number
}

Image defaults

images: {
  hero: string                                        // landing hero fallback
  lifestyle: string                                   // generic lifestyle photo fallback
  scenic: string                                      // wide scenic fallback
  categoryFallbacks: Record<string, string>           // per-category-slug → URL
}

When a Category.heroImage is null in the database, the storefront falls back to categoryFallbacks[slug], then images.hero if no per-slug fallback exists.

Stripe Elements appearance

stripeAppearance: {
  colorPrimary: string     // hex
  colorBackground: string  // hex
  colorText: string        // hex
  colorDanger: string      // hex
  fontFamily: string
  borderRadius: string     // CSS dimension, e.g. "10px"
}

Stripe Elements render in a same-origin iframe and cannot read your CSS variables. Sync these manually with themes/<slug>.css after a palette change.

UI labels

uiLabels: {
  searchPlaceholder: string
  searchAria: string
  allProductsLink: string
  newsletterHeading: string
  newsletterSubtext: string
  tryOnHeading: string
  tryOnSubtext: string
  aiStylistFallbackHeading: string
  aiStylistPlaceholder: string
  notFoundProductsLink: string
  productsPageHeading: string
  heroSubtagline: string
  heroCta: string
  categoryAllProductsBreadcrumb: string
  productCardOriginBadge: string
  trustBadgesPrimary: string
  pitchSectionHeading: string
  pitchSectionBody: string
}

Upstream cartwright ships these strings in Danish. Translating this block is the most common first task on a new fork. Full next-intl adoption with messages/en.json + messages/da.json is on the roadmap and will eventually replace this block.

Email palette

emailColors: {
  accent: string   // hex
  cream: string
  sand: string
  ink: string
  muted: string
  success: string
}

Mirrored from themes/<slug>.css because email clients cannot read CSS variables. Sync manually after palette changes.

Runtime overrides

Some fields can be overridden at runtime via the BrandingSettings Prisma model — typically storeName, contact emails, and integration keys. The setup wizard at /admin/setup writes to that table. Fields not in BrandingSettings are compile-time only.

On this page