Skills for setting up and customizing Astro Starlight documentation sites, covering project setup, custom theming, and component overrides.
100
100%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
Starlight is a full-featured documentation theme built on Astro. It ships with routing, search, dark mode, i18n, and accessibility — configure features rather than build them.
starlight-theme insteadstarlight-custom-component insteadStarlight = Astro integration + file-based routing + content collections.
starlight({}) in astro.config.mjs. No separate config file..md / .mdx under src/content/docs/ becomes a URL. File path = URL route.autogenerate.npm create astro@latest -- --template starlight
npm run devTo add Starlight to an existing Astro project:
npx astro add starlightAll options live inside starlight({}). See configuration-reference.md for the full option table.
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
export default defineConfig({
site: 'https://mydocs.example.com', // Required for sitemap
integrations: [
starlight({
title: 'My Docs',
logo: { src: './src/assets/logo.svg' },
social: [
{ icon: 'github', label: 'GitHub', href: 'https://github.com/my-org/repo' },
],
sidebar: [
{
label: 'Guides',
items: [
{ label: 'Getting Started', slug: 'guides/getting-started' },
],
},
{ label: 'Reference', autogenerate: { directory: 'reference' } },
],
editLink: { baseUrl: 'https://github.com/my-org/repo/edit/main/docs/' },
customCss: ['./src/styles/custom.css'],
}),
],
});Create .md or .mdx files under src/content/docs/:
---
title: My Page Title
description: A short description for SEO.
---
Content goes here.Use template: splash for landing pages, draft: true to exclude from builds:
---
title: Home
template: splash
hero:
tagline: Welcome to my docs
---src/content/docs/WHY: Starlight's routing only picks up files inside src/content/docs/. Consequence: Pages silently won't appear.
BAD: Create .md in src/pages/.
GOOD: Create .md in src/content/docs/.
src inside logo alongside light/darkWHY: Mutually exclusive. src is for a single logo; light/dark are for variants. Consequence: Config error.
BAD: logo: { src: './logo.svg', light: './light.svg' }
GOOD:
logo: { light: './src/assets/light-logo.svg', dark: './src/assets/dark-logo.svg' }WHY: Slugs map to paths under src/content/docs/ — no leading slash, no .md extension. Consequence: Sidebar links 404.
BAD: slug: '/guides/setup.md'
GOOD: slug: 'guides/setup'
site inside starlight({}) for sitemapWHY: Sitemap generation requires site at the defineConfig level. Consequence: Sitemap not generated.
BAD: starlight({ site: 'https://...' })
GOOD: defineConfig({ site: 'https://...' })
autogenerate with items in the same sidebar groupWHY: A group uses either items or autogenerate, not both. Consequence: Build error.
BAD: { label: 'Guides', items: [...], autogenerate: { directory: 'guides' } }
GOOD: Choose one approach per group.