Workspace-Branding

Verwalte Workspace-Branding-Assets (Logo, Favicon, Markenname, Open-Graph-Bild) und rufe sie in deiner Next.js-App über das cmssy-Gateway ab.

14. Juli 2026

Überblick

cmssy ist headless - deine Next.js-App besitzt das gesamte visuelle Styling (Farben, Typografie, Dark Mode) als normales Tailwind/CSS in deinem eigenen Repo. Was cmssy pro Workspace speichert, ist Branding: ein Markenname und gemeinsame Assets, die du abrufst und in deiner Site anwendest.


Workspace-Branding

Das Branding liegt in der Site-Config des Workspace. Rufe es über das Gateway mit deiner eigenen GraphQL-Abfrage ab - createCmssyClient(cmssy).query(...). Die Site-Config wird unter public.siteConfig bereitgestellt, und die Assets liegen in deren branding-Unterobjekt:

import { createCmssyClient, type CmssyBranding } from "@cmssy/core";
import { cmssy } from "@/cmssy.config";

const SITE_CONFIG_QUERY = `query PublicSiteConfig($workspaceSlug: String!) {
  public {
    siteConfig(workspaceSlug: $workspaceSlug) {
      branding {
        brandName
        logoUrl
        faviconUrl
        ogImageUrl
      }
    }
  }
}`;

const data = await createCmssyClient(cmssy).query<{
  public: { siteConfig: { branding: CmssyBranding | null } };
}>(SITE_CONFIG_QUERY, { workspaceSlug: cmssy.workspaceSlug });

const branding = data.public.siteConfig.branding;
// CmssyBranding | null - brandName, logoUrl, faviconUrl, ogImageUrl (each nullable)
FeldBedeutungVerwendung
brandNameAnzeigename der Site / Marke.Seitentitel, Metadata, Header
logoUrlLogo-Asset-URL.Im Header oder Footer rendern
faviconUrlFavicon-Asset-URL.In deine Metadata-Icons einbinden
ogImageUrlStandard-Bild für Open Graph / Social Sharing.Standard-OG-Bild für Seiten ohne eigenes Bild

Jedes Feld ist nullable - rendere nur, was gesetzt ist.

Branding in deiner App nutzen

Favicon:

import { createCmssyClient } from "@cmssy/core";
import { cmssy } from "@/cmssy.config";

const SITE_CONFIG_QUERY = `query PublicSiteConfig($workspaceSlug: String!) {
  public { siteConfig(workspaceSlug: $workspaceSlug) { branding { faviconUrl } } }
}`;

export async function generateMetadata() {
  const data = await createCmssyClient(cmssy).query<{
    public: { siteConfig: { branding: { faviconUrl: string | null } | null } };
  }>(SITE_CONFIG_QUERY, { workspaceSlug: cmssy.workspaceSlug });

  const faviconUrl = data.public.siteConfig.branding?.faviconUrl;
  return faviconUrl ? { icons: { icon: faviconUrl } } : {};
}

Logo im Header:

import { createCmssyClient, type CmssyBranding } from "@cmssy/core";
import { cmssy } from "@/cmssy.config";

const SITE_CONFIG_QUERY = `query PublicSiteConfig($workspaceSlug: String!) {
  public { siteConfig(workspaceSlug: $workspaceSlug) { branding { brandName logoUrl } } }
}`;

export default async function Header() {
  const data = await createCmssyClient(cmssy).query<{
    public: { siteConfig: { branding: CmssyBranding | null } };
  }>(SITE_CONFIG_QUERY, { workspaceSlug: cmssy.workspaceSlug });

  const branding = data.public.siteConfig.branding;
  return (
    <header>
      {branding?.logoUrl && <img src={branding.logoUrl} alt={branding.brandName ?? ""} />}
      {branding?.brandName && <h1>{branding.brandName}</h1>}
    </header>
  );
}