This is the source for my portfolio site. It's made with:
- Astro and TypeScript
- MDX for post content
- vanilla-extract for styling
- React islands for the interactive widgets
The site is statically generated and deployed through Cloudflare Pages.
Requires Node 24 or newer. The algorithmic-art post's assets are a git submodule, so clone recursively:
git clone --recursive git@github.com:rfrowe/ryan.rowe.codes.git
npm installIf you already cloned without --recursive, the submodule is empty and the build will be missing those assets:
git submodule update --init --recursiveStart development server:
npm run devnpm run lint # eslint
npm run typecheck # tsc --noEmit
npx astro check # Astro's own diagnostics, including .astro templates
npm run test # vitestCI runs all of these plus the build on every pull request. A separate workflow runs the studio's Playwright end-to-end suite.
This site is deployed in production with Cloudflare Pages at ryan.rowe.codes,
built from main.
To build the static site for deployment:
npm run buildThe deployable artifact will be in ./dist
studio/ is a local-only tool for drafting posts: an MDX editor, a live Astro preview, and an
embedded agent, with each open post isolated in its own git worktree. It never ships to production.
npm run studio # opens the most recently modified post
npm run studio -- --post src/content/blog/<post> # opens a specific oneSee studio/README.md for the architecture, the ports it uses, how posts map to
worktrees, shipping a draft as a PR, and its test suites.