Skip to main content

Get Branding Config

Retrieve branding configuration for a workspace.
const res = await client.branding.byWorkspaceSlug.$get({ 
  slug: "acme" 
})
const { config } = await res.json()
Type: Public Procedure
slug
string
required
Workspace slug
config
object | null
Branding configuration is cached for 30 seconds with stale-while-revalidate for 5 minutes.

Update Branding

Update workspace branding configuration.
const res = await client.branding.update.$post({
  slug: "acme",
  primaryColor: "#3b82f6",
  theme: "light",
  showLogo: true,
  showWorkspaceName: true,
  hidePoweredBy: true,
  layoutStyle: "default",
  sidebarPosition: "left",
  logoUrl: "https://cdn.acme.com/logo.png"
})
const { ok } = await res.json()
Type: Private Procedure (requires branding manager permission)
slug
string
required
Workspace slug
primaryColor
string
Primary brand color as hex code (e.g., “#3b82f6”)
theme
string
Theme preference: “light”, “dark”, or “auto”
showLogo
boolean
Display workspace logo in UI
showWorkspaceName
boolean
Display workspace name alongside logo
hidePoweredBy
boolean
Hide “Powered by Featul” branding (requires higher plan)
layoutStyle
string
Layout style preference
sidebarPosition
string
Sidebar position: “left” or “right”
logoUrl
string
URL to workspace logo image
ok
boolean
Whether the update was successful
Plan Requirements:
  • Branding customization (logo, colors, theme): Requires paid plan
  • Hide “Powered by”: Requires Professional plan
  • Free plan: Basic branding options available (layout, sidebar position)
Attempting to set branding options not available on your current plan will return a 403 error.
Implementation Notes:
  • Logo URL updates are applied to the workspace table
  • Other branding settings are stored in the brandingConfig table
  • If no config exists, one is created automatically
  • All fields are optional - only provided fields are updated

Build docs developers (and LLMs) love