Personal website and blog. Built with Astro, Tailwind CSS v4, and TypeScript. Deployed to Cloudflare Pages via GitHub Actions.
Based on Astro Nano. Tokyo Night theme.
Requires Devbox (or Node.js 22+ and pnpm).
devbox shell # enter dev environment (or: direnv allow)
pnpm install # install dependencies
pnpm dev # start dev server at localhost:4321
pnpm build # production build (type-check + build) to ./dist/
pnpm preview # preview production build locally- Astro 5 — static site generator with content collections and View Transitions
- Tailwind CSS 4 — styling via CSS-first config (
@themeinglobal.css) - TypeScript — strict mode with explicit types everywhere
- Fonts — Inter (body), Monaspace Neon (headings/nav/code) via Fontsource
- Theme — Tokyo Night (dark, default) / Tokyo Night Day (light)
- Icons — Lucide (UI icons) + Simple Icons via astro-icon (brand logos)
- i18n — all user-facing strings in
src/i18n/en.ts
pnpm lint # ESLint (v9 flat config, strict typescript-eslint)
pnpm lint:fix # auto-fix ESLint issues
pnpm format:check # check formatting with Prettier
pnpm format # auto-format with PrettierGit hooks (.githooks/) run lint + format check on staged files pre-commit, and a full build pre-push. Activate with:
git config core.hooksPath .githooks- Blog:
src/content/blog/<slug>/index.md - Projects:
src/content/projects/<slug>/index.md - Shelf: curated links and media in
src/i18n/en.ts(no content collection — data-driven)
Pushes to main trigger the GitHub Actions workflow which builds the site and deploys to Cloudflare Pages.
Requires two repository secrets:
CLOUDFLARE_API_TOKEN— Cloudflare API token with Pages edit permissionsCLOUDFLARE_ACCOUNT_ID— Cloudflare account ID