- Emacs Lisp 51.5%
- CSS 28.2%
- TeX 10.2%
- Python 8.3%
- JavaScript 1.3%
- Other 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| assets | ||
| content-org | ||
| lisp | ||
| static | ||
| tools | ||
| .DS_Store | ||
| .gitignore | ||
| build.sh | ||
| CLAUDE.md | ||
| LICENSE | ||
| Makefile | ||
| publish-config.el | ||
| README.org | ||
My Website built using Org mode
This repository hosts the sources for pierre-antoine-comby.fr, my personal website.
- It is built directly from Org mode to static HTML: no Hugo, no Markdown intermediate.
- Rendering is a thin export backend derived from
ox-html(lisp/ox-pac.el). Its overridden transcoders author their markup as S-expressions and serialize them with esxml, through a small authoring layer (lisp/sxml-html.el). - The earlier ox-hugo/Blowfish and
sxml-publishpipelines are retired; they only live in git history.
Building the website
TL;DR
- Have
emacs(29.1+),python3withfontTools,git,make,rcloneandlatexmkinstalled. - Clone this repository. Emacs packages (
xkcd,emacsql,htmlize,esxml) are installed into.packages/on first build. - Build the resume PDF and the website into
public/:
./build.sh
- Deploy with
rclone(the remote config is not in this repo):
make deploy
make alone only publishes the site; ./build.sh also builds the resume
(resume/CV2.tex, via latexmk) and copies it to assets/CV2.pdf.
The build fetches from the network: each xkcd: link queries xkcd's API
(cached in a local sqlite db).
Incremental builds
Pages are published incrementally through org-publish's timestamp cache,
kept in .cache/org-timestamps/. It only tracks .org sources, so after
changing anything in lisp/ or publish-config.el, force a full rebuild:
make cleanall && make
A full build takes about a minute.
Layout
-
publish-config.el - entry point. Bootstraps packages, loads
lisp/, sets the site description (nav, social links, footer), definesorg-publish-project-alist, and publishes. -
lisp/sxml-html.el - S-expression to HTML authoring layer on top of esxml.
-
lisp/ox-pac.el - the
pacexport backend (page template, talks and projects pages, link handling, post index and tag pages). -
lisp/pac-icons.el - replaces Nerd Font glyphs with inline SVG, extracted
by
tools/nerd_icon_svg.pyand cached instatic/icons/generated/. -
lisp/xkcd-extras.el - renders
xkcd:NUMlinks as images. -
content-org/ - the Org sources.
-
static/ - CSS, JS, fonts and icons, published verbatim.
-
resume/ - the LaTeX CV.
Export
org-publish-project-alist is made of:
-
pages - top-level
content-org/*.orgpages (intro.orgis excluded and spliced intoindex.organdabout.orgwith#+INCLUDE). -
post content-org/posts/, recursive, drafts excluded; also buildsposts/index.htmlandposts/tags/<tag>.html.-
content-images,static,assets - copied as-is with
org-publish-attachment. -
site - the umbrella component.
Publish only, without the resume:
emacs -Q --script publish-config.el
TODO Use CI to handle the deployment
For now I do it manually, but it would be nice to have a CI pipeline to do it automatically.
Writing content
- Blog posts live in
content-org/posts/*.orgwith#+TITLE:,#+DATE:and#+FILETAGS:. Park drafts incontent-org/posts/drafts/. - Page type is chosen per file with
#+template:(home,post,talks-page,projects-page, defaultpage). - Use
xkcd:NUM,pep:NUM,github:user/repoandgitlab:user/reporather than raw URLs. - Talks and projects take per-heading metadata in
:PROPERTIES:drawers (talks:DATE,LOCATION,SLIDES,POSTER,RECORDING,PAPER,WEBSITE; projects:IMAGE). A project is a top-level headline inprojects.orgwhose first paragraph is a one-line blurb. - Existing URLs (
/talks.html,/posts/foo.html,/posts/tags/<tag>.html) must be kept.
See CLAUDE.md for the architecture in more detail.