CMS Chronicle·March 2026·4 min read

CMS Chronicle #09: Rebranding and Landing Rebranding and eating our own dog food

The CMS got a new identity — webhouse.app branding throughout, a branded login experience, and a landing page that is itself managed by the CMS. Plus the repo rename, deploy file cleanup, and npm publish.

A new face

The project has been called cms-engine internally since the start. Today we renamed the repository to just cms — matching the npm scope @webhouse/cms — and applied the webhouse.app brand identity everywhere.

The eye

The webhouse.app logo is a stylized eye with a golden iris. It represents observation, attention to detail, and the idea that a CMS should see your content clearly. The icon now appears in:

  • Admin sidebar (stacked: eye + wordmark + tagline)
  • Login page (centered, 72px)
  • Favicon (64px)
  • Landing page (hero, nav, footer)
  • webhouse-site footer ("Powered by")

The wordmark switches between dark and light variants based on the active theme.

Brand colors

ColorHexUsage
Primary gold#F7BB2ELogo, CTAs, accents
Dark gold#D9A11AHover states, shadows
Near-black#0D0D0DPrimary dark background
Dark blue-blacks#1C1C1C#2A2A3ESurface variants with subtle blue undertone

Login experience

The login page was previously rendered inside the admin layout — sidebar, tabs, and all visible behind the form. Now it is a fullscreen overlay with:

  • Dark gradient background with grid pattern
  • Radial gold glow accent
  • Eye icon + wordmark centered
  • "Powered by @webhouse/cms" footer
  • Glassmorphism card with backdrop blur

Sign out sends you to the landing page instead of back to login.

The landing page

Unauthenticated visitors at localhost:3010 see a marketing page for webhouse.app. It features:

  • Hero with floating eye icon, wordmark, terminal snippet
  • Stats bar (scaffold time, code needed, Lighthouse score)
  • Feature cards (AI agents, schema-driven content, static output, etc.)
  • Architecture diagram (the real SVG from Illustrator, not ASCII)
  • MCP section (public + authenticated server descriptions)
  • CTA section with GitHub link

The page is served as static HTML at 120% zoom for a bolder feel. Authenticated users are redirected straight to /admin.

Dog food: landing as a CMS example

Here is the interesting part. The landing page content is also defined as a CMS schema:

defineCollection({
  name: 'pages',
  label: 'Pages',
  urlPrefix: '/',
  fields: [
    { name: 'title', type: 'text', required: true },
    { name: 'metaDescription', type: 'textarea' },
    { name: 'sections', type: 'blocks', blocks: ['hero', 'stats', 'features', 'architecture', 'mcp', 'cta'] },
  ],
})

Six block types — hero, stats, features, architecture, mcp, cta — each with their own fields. The content is seeded as content/pages/home.json with all the real landing page data.

This lives in examples/landing/ alongside the existing examples/blog/. It is the second example site, and thanks to the multi-site admin (Chronicle #08), both sites are manageable from the same admin instance.

Repo cleanup

  • Repository renamed webhousecode/cms-enginewebhousecode/cms
  • Git remote, scripts, Dockerfile, fly-start.sh all updated
  • Deploy files moved into deploy/ within the repo (tracked in git)
  • webhouse-site's dependency path updated from ../cms-engine/ to ../cms/

npm publish

All five packages are now published on npm:

  • @webhouse/cms — core engine
  • @webhouse/cms-ai — AI agents
  • @webhouse/cms-cli — CLI tool
  • @webhouse/cms-mcp-client — public MCP server
  • @webhouse/cms-mcp-server — authenticated MCP server

npx @webhouse/cms init is now a real thing.


What is next

The landing page is currently a static HTML file. The next step is building the template engine that renders the block-based content from home.json into the same HTML — so edits in the admin UI update the live landing page. That is Phase 3 of the landing migration.

But first: multi-site management. That is Chronicle #08.