100 lines
3.0 KiB
Org Mode
100 lines
3.0 KiB
Org Mode
#+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/<name>.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.
|