A Ghost app's screens use Shade (@tryghost/shade), the design system Ghost
Admin is built with. This skill sets Shade up and routes to the Shade skills
installed beside it; the rules live in Shade's docs. The app's manifest,
connect() and install belong to the build-ghost-app skill.
The docs
Docs links use https://shade.ghost.org. If the project's AGENTS.md says
where Shade's docs are (another address, or a source folder), use that
instead. At an address, start from <address>/llms.txt and fetch web pages
with curl -s <address>/docs/<page>.md, so the text arrives exact: a web
fetch tool summarises it and refuses localhost.
When sources disagree, trust them in this order:
- The installed
@tryghost/shadepackage (its code and type definitions; it ships no docs) decides what exists: components, props and imports. Its types match the install. - The docs at the address above decide how to use it.
- Ghost's source, if it's on disk, is reference only. Never import from it, and skip its Admin-only rules.
Set up
Check each step against the app, and do the ones it's missing:
-
Install
@tryghost/shade@alphaand its peers from npm;latestis older.npm create vitescaffolds React 19, which npm refuses beside Shade, so move the React packages and types first, as Install shows. -
Set up Tailwind and the stylesheet.
-
Load the Fonts.
-
Follow Admin's Light and dark theme.
-
Set the Page frame and margins.
-
If the app keeps state in the query string, follow App state in the URL.
-
Add this section to the app's
AGENTS.md, creating the file if needed. Keep any line already there that says where Shade's docs are.## Shade Before building or changing a screen, use the `build-ghost-app-ui` skill. Shade docs: https://shade.ghost.org
Build a screen
- Start from the page template with
shade-page-templates. - As the screen needs them, use
shade-page-headerfor the header,shade-use-primitivesfor layout,shade-tokens-not-hexfor colour,shade-no-dark-variantsfor dark mode andshade-importsfor imports. - Read only the docs that apply to apps.
Self-check
Before finishing, confirm in Admin:
- The screen looks right in Admin's light and dark theme, and switches with it.
- Inter loads:
document.fontslists it at each weight in Fonts. - The page has no outer padding of its own.
- Nothing is styled by hand where Shade has a component, primitive or token.
- Every state (empty, loading, error) is reachable with the sample data, and uses Shade components.
- The app's
AGENTS.mdhas the Shade section.