This repository contains code for my personal website. It is hosted on Netlify but built and deployed using GitHub Actions.
Every push to master triggers a GitHub Actions workflow, which:
- Installs Node and OCaml (via
opam) and then installs Forester. - Runs
npm run build, producing the full site and the notes indist/. - Deploys
dist/to Netlify with the Netlify CLI action.
OCaml/Forester only exists on the Actions runner, so the build happens there rather than in Netlify's build image. Netlify just serves the uploaded dist/.
The current site is a small dependency-free Node static build.
npm run build
npm run serveFor local development with rebuilds:
npm run devOnce the local server is running, you can view the site at http://127.0.0.1:4173/ in your web browser.
The generated site is written to dist/.
The /notes/ section is set up with Forester. Forester is an OCaml tool; install it with opam. The CI deploy pins Forester 5.0 on OCaml 5.3.0, so use the same versions locally to keep the notes output layout identical to production:
opam install forester.5.0Forester
5.0's dependency closure does not resolve on newer compilers (e.g. OCaml5.4.x); opam would silently install an older Forester with a different output layout. Therefore, use OCaml5.3.0.
Notes live in notes/trees. Forester also needs a notes/theme directory (XSLT/CSS templates). The first npm run build:notes will fetch the base theme automatically if it is missing.
After Forester is installed:
npm run build:notesnpm run build builds the main site and then copies Forester output into dist/notes/ when the forester binary is available.