Conversation
The Astro front end serves every hostname through the same [...slug].astro page, so anything SiteHeader and SiteFooter render unconditionally also lands on the multisite dashboard — which is not a tenant site and has none of their content or styling behind it. Two things show up there today: - A "Site Title" bar with page navigation and the locale switcher, sitting above the dashboard's own admin UI. There is no tenant global doc behind it, so it renders the placeholder title. - The light/dark switch, which toggles a `dark` class that only the tenant sites' styles respond to. The dashboard never picks the class up, so the control is visible but does nothing. Skip both when serving the dashboard hostname. The check lives in one shared helper so a project that overrides the dashboard's short name has a single place to adjust.
boutell
approved these changes
Aug 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two pieces of tenant-site UI render on the multisite dashboard, where neither belongs.
Symptoms
1. A "Site Title" bar above the dashboard.
SiteHeaderrenders the site title, page navigation and locale switcher on the dashboard hostname. There's no tenant global doc behind it, so it falls back to the placeholder text — the bar readsSite Title, followed by aDashboardnav link and anEnglishlocale dropdown, sitting above the dashboard's own admin UI.2. A light/dark switch that does nothing.
SiteFooterrenders the mode switch on the dashboard too. It toggles adarkclass that only the tenant sites' styles respond to — the dashboard's admin UI never picks it up, so the control is visible but inert.Why it happens
The Astro front end serves every hostname in the project through the same
[...slug].astropage, dashboard included. AnythingSiteHeaderorSiteFooterrenders unconditionally therefore lands on the dashboard, even though the dashboard is not a tenant site and has none of their content or styling behind it.Worth noting this is specific to the Astro starter. In
apostrophecms/public-demo-multisitethe dashboard is a separate Apostrophe instance with its owndashboard/views/layout.html, so tenant chrome can't reach it — no equivalent change is needed there.The change
Skip both when serving the dashboard hostname. The check lives in one shared helper (
frontend/src/lib/isDashboard.js) rather than being duplicated, so a project that overrides the dashboard's short name has a single place to adjust.23 added lines, nothing removed, no change to how tenant sites render.
Testing
Verified on a multisite instance with the dashboard and nine tenant sites: the dashboard renders its own admin UI with no title bar and no mode switch, while tenant sites keep their header, navigation, locale switcher and a working light/dark toggle. Both modified components were also checked against the Astro compiler.
One question for maintainers
The footer itself (the ApostropheCMS logo and link columns) still renders on the dashboard. That may well be intentional, so I've left it alone — happy to include it if you'd rather the dashboard had no tenant footer at all.
🤖 Generated with Claude Code