#+TITLE: Personal Site #+DESCRIPTION: Source for my personal website * Overview Static personal website built with [[https://nixos.org/][Nix]] and [[https://orgmode.org/manual/Publishing.html][org-publish]]. Deployed to Cloudflare Pages via CI/CD on a Gitea runner (Raspberry Pi). * Quick Start #+begin_src sh nix run # build site and serve at http://localhost:8080 nix run .#tunnel # serve + Cloudflare HTTPS tunnel + QR code nix build # build only → result/ symlink #+end_src * Project Structure #+begin_example personal-site/ ├── flake.nix Nix flake — inputs, build derivation, run apps ├── build.el Emacs Lisp org-publish configuration ├── content/ Source pages as org files │ ├── index.org Homepage → /index.html │ └── about.org About page → /about.html ├── static/ Static assets, copied verbatim │ └── style.css Site stylesheet ├── README.org This file └── CLAUDE.md Instructions for the Claude AI assistant #+end_example The build produces a =public/= directory (gitignored) which becomes the =nix build= output. Sub-projects are embedded as subdirectories (e.g. =/project-a/=). * Maintenance ** Adding a page 1. Create =content/.org= with at minimum: #+begin_src org #+TITLE: Page Title Content here. #+end_src 2. Add a link to the nav in =build.el= (the =site-nav= variable at the top). ** Adding a sub-project Sub-projects are separate Nix flakes that produce a static site as their default package. 1. Add the flake input in =flake.nix=: #+begin_src nix project-a = { url = "path:/path/to/project-a"; # or git URL inputs.nixpkgs.follows = "nixpkgs"; }; #+end_src 2. Expose the package in the =let= block: #+begin_src nix subProjectA = inputs.project-a.packages.${system}.default; #+end_src 3. Copy it into the site output in =installPhase=: #+begin_src nix mkdir -p $out/project-a cp -r ${subProjectA}/. $out/project-a/ #+end_src 4. Optionally add a nav link in =build.el=. ** Styling =static/style.css= uses CSS custom properties defined in =:root=. Dark mode is applied automatically via =@media (prefers-color-scheme: dark)=. Key variables: | Variable | Purpose | |----------------+--------------------------| | =--bg= | Page background | | =--fg= | Body text | | =--accent= | Links and highlights | | =--muted= | Secondary text | | =--border= | Dividers and box borders | | =--code-bg= | Code block background | | =--max-width= | Content column width | ** Updating dependencies #+begin_src sh nix flake update #+end_src * Deployment The site is deployed to Cloudflare Pages automatically on push via a Gitea Actions workflow running on a Raspberry Pi runner (=aarch64-linux=). The =nix build= output is uploaded directly as the Pages deployment artifact.