Make It Yours: The Boots Docs Customization Guide
Where the colors live, every markdown superpower this site ships with, how to add images, charts, and graphs — and when to reach for MDX.
This site is built on Astro with Tailwind v4 + daisyUI, and everything you see — colors, fonts, layout, search — is configured in a handful of files you own. This guide covers the three things you’ll touch most:
- Changing the look (colors, fonts, layout knobs)
- Writing posts (frontmatter, images, callouts, code blocks, charts, math)
- Going further with MDX (components inside your content)
The entire palette is defined in two theme blocks near the top of src/styles/global.css — one for light mode (chirpy-light), one for dark (chirpy-dark). Each is a list of CSS variables consumed by daisyUI:
/* Boots midnight blue primary (#2E3644) — 12.2:1 on white */--color-primary: oklch(33.1% 0.027 261.6);
/* Darkened Boots gold (#8A6200) — AA-safe as text on light bg */--color-accent: oklch(52.4% 0.108 80.6);Change a variable, save, and the dev server hot-reloads with the new color everywhere it’s used. The current brand mapping:
| Token | Light mode | Dark mode | Used for |
|---|---|---|---|
--color-primary |
Midnight #2E3644 |
Gold #F7B844 |
Links, active nav, TOC highlight |
--color-accent |
Darkened gold #8A6200 |
Light gold #FBD382 |
Inline code |
--color-warning |
Gold #F7B844 |
Gold #F7B844 |
Warning alerts, search highlights |
--color-base-* |
White cards on light-gray page | #2E3644 cards on #222834 |
Backgrounds, dividers, body text |
The sidebar has its own tokens (it stays midnight in both themes) in the @theme block just below: --color-sidebar-from / --color-sidebar-to (the gradient), --color-sidebar-text, --color-sidebar-muted, and --color-sidebar-accent (the gold hover).
Colors are written in oklch() — a color space where the first number is perceived lightness, which makes “same color but darker” edits predictable. To convert a hex color, paste it into oklch.com and copy the result.
The gold-on-white trap
The fonts array at the bottom of astro.config.mjs loads Source Sans 3 (UI), Lato, and JetBrains Mono (code) from local @fontsource packages. To swap a font: install its @fontsource package with bun add -d, point the src paths at the new package’s .woff2 files, then update --font-sans / --font-mono in the @theme block of global.css.
Title, description, author, posts per page, nav items, social links, and footer text all live in src/config.ts, under a clearly marked “SAFE TO EDIT” section. The nav is just an array — add or remove entries in NAV to change the sidebar menu.
Every post is a markdown file in src/content/posts/en/. The filename becomes the URL slug — my-post.md → /posts/my-post.
Only title, description, and pubDate are required. The full menu:
---title: 'My Post' # required, max 140 charsdescription: 'One-liner.' # required, max 280 charspubDate: 2026-08-02 # requiredupdatedDate: 2026-08-15 # shows an "updated" datetags: [supabase, typescript] # listed on /tagscategories: [Runbooks] # listed on /categoriespinned: true # pin to top of the homepagedraft: true # hidden in production builds (visible in dev)unlisted: true # live at its URL but hidden from all listingstoc: true # right-rail table of contents (default on)heroImage: ./assets/hero.png # top-of-post image (see Images below)heroImageAlt: 'What it shows'math: true # enables KaTeX on this page onlymermaid: true # enables diagrams/charts on this page onlycomments: false # opt this post out of Giscus comments---math and mermaid are opt-in per post so their libraries stay off pages that don’t need them.
Three ways to add one, in order of preference:
- Optimized (recommended): put the file next to your post (e.g.
src/content/posts/en/assets/diagram.png) or undersrc/assets/, and reference it relatively:. Astro converts it to WebP, generates responsive sizes, and lazy-loads it. - Public folder: files in
public/are served as-is at the site root —. No optimization. - Remote URL: external images work if the host is allow-listed in
image.remotePatternsinastro.config.mjs(Unsplash, GitHub, jsDelivr, Cloudinary are pre-approved — add your own hosts there).
For a featured image at the top of the post and on its listing card, use heroImage in frontmatter instead.
Fenced ```alert blocks render as styled daisyUI alerts:
This is an alert block
Code blocks are powered by Expressive Code — they get a copy button for free, and the fence line accepts extras:
```ts title="src/utils/retry.ts" {3} ins={5} del={4}
```export async function retry<T>(fn: () => Promise<T>, times = 3): Promise<T> { try { return await fn(); // highlighted line console.log('unreachable'); // marked as removed if (times <= 0) throw new Error('out of retries'); // marked as added } catch (err) { if (times <= 0) throw err; return retry(fn, times - 1); }}title="..."adds a file-name frame{3}or{2-5}highlights linesins={5}/del={4}mark diff-style added/removed lineswrapsoft-wraps long lines
Set mermaid: true in frontmatter, then use ```mermaid fences. No chart library to install — this covers flowcharts, pie charts, bar/line charts, sequence diagrams, ER diagrams, and more.
Flowchart:
Pie chart:
Bar + line chart:
The full syntax for every diagram type is at mermaid.js.org. There’s also a deeper set of worked examples in this site’s Diagram Recipes post.
Set math: true in frontmatter, then write LaTeX between dollar signs. Inline like , or display blocks:
Standard GitHub-flavored markdown works everywhere: tables (like the color table above), task lists, blockquotes, and footnotes. Headings automatically get hover-to-copy anchor links, and everything you write is indexed by the built-in search (rebuilt on bun run build).
Rename a post from .md to .mdx and you can import components into your content — interactive widgets, reusable callouts, video embeds — while everything above keeps working.
---title: 'My Interactive Post'description: 'MDX in action.'pubDate: 2026-08-02---
import Callout from '../../../components/Callout.astro';
Regular markdown up here.
<Callout type="warning" title="From a component"> This box is an Astro component receiving props, rendered inside markdown.</Callout>
Markdown continues below — **bold**, `code`, lists, all normal.The rule of thumb: stay with .md for prose, code, and charts (everything in section 2 needs no MDX), and switch to .mdx when you want React/Astro components, JSX logic, or reusable content variables inside a post.
See it live in the companion post: Using MDX: Components Inside Your Posts — its source file is src/content/posts/en/using-mdx.mdx.
| I want to… | Edit this |
|---|---|
| Change brand colors | Theme blocks in src/styles/global.css |
| Change the sidebar colors | @theme sidebar tokens in src/styles/global.css |
| Change title/tagline/nav | src/config.ts |
| Change fonts | fonts in astro.config.mjs + @theme vars |
| Change avatar/favicon | src/assets/images/site/*.svg |
| Write a post | New .md file in src/content/posts/en/ |
| Add a chart | mermaid: true + a ```mermaid fence |
| Use components in a post | Rename .md → .mdx and import |