A small, opinionated Astro theme tuned for writing and reading — academic typography, mono UI chrome, dark/light toggle, and an unobtrusive animated background.
Built with Astro 6, React 19, Tailwind CSS 4, and MDX. Static-site by default.
- Typography-first — Source Serif 4 for body, JetBrains Mono for UI chrome (dates, tags, code, captions).
- Dark / light mode with no FOUC. Picks up system preference on first
visit; remembers your choice in
localStorageafterward. - MDX + KaTeX + Shiki — write Markdown or MDX with inline / display math
and syntax-highlighted code (
github-light/github-dark-dimmed). - Content collections — typed frontmatter (
title,description,date,updated,tags,draft) via Astro's content layer. - Year-grouped notes index, tag cloud, RSS, sitemap — all wired up.
- Animated polygon background that respects
prefers-reduced-motion. - Reading time computed at build via
reading-time.
Requires Node 20+ and pnpm (or npm / yarn).
pnpm install
pnpm dev # http://localhost:4321
pnpm build # static output in ./dist
pnpm previewsrc/
├── components/ # Header, Footer, PostCard, Sidenote, PolygonBackground, ThemeToggle
├── layouts/ # BaseLayout, PostLayout
├── lib/ # posts.ts, format.ts
├── constants/site.ts # site metadata, nav, social
├── content/blog/ # Markdown / MDX posts
├── pages/ # index, about, 404, rss.xml, posts/, tags/
├── styles/global.css # Tailwind + theme tokens + prose-academic
└── content.config.ts # collection schema
public/favicon.svg
- Identity — edit
src/constants/site.ts(title,author,tagline,url,social,nav). - Colors —
src/styles/global.css, the:rootand.darkblocks. The theme uses CSS variables (--bg,--fg,--accent, ...), so changing a handful of tokens repaints the whole site. - About page —
src/pages/about.astro. - First post — replace
src/content/blog/hello-world.md.
---
title: Required string
description: Optional short summary
date: 2026-01-01 # required, ISO date
updated: 2026-02-15 # optional
tags: [astro, demo] # optional, defaults to []
draft: false # optional, hidden from build when true
---@/* → src/*
@lib/* → src/lib/*
@components/* → src/components/*
@layouts/* → src/layouts/*
@constants/* → src/constants/*
MIT.