I'm Jacob Mastel — an engineer who is happiest with a terminal open and a camera within reach.
What I do
By day I work on software. By night (and on weekends, and on any road trip that passes something worth photographing) I shoot landscapes and cityscapes.
How this site works
This used to run on Grav. It was a fine CMS, but over time I'd migrated every feature I actually used — comments, forms, galleries — into dedicated, self-hosted open-source apps. What was left was a blog and some photos being served by a lot of machinery I no longer needed. So I tore it down to what it really is: Markdown files and a template, compiled to static HTML.
The stack is deliberately boring, which is the point — it should still build and run in ten years:
- Pelican turns Markdown into HTML. Content is plain text files in a git repo; there's no database and no admin panel.
- The theme,
typhoon-dark, is a small hand-written thing — a dark, royal-purple take on Grav's Typhoon. Code blocks are highlighted with Pygments, themed to match. - The photography gallery is a ~40-line Pelican plugin that scans a folder of
images, plus a masonry grid and a lightbox built entirely in CSS (the
:targettrick). It ships zero JavaScript. - Diagrams like the one below use Mermaid, self-hosted and version-pinned. It only loads on pages that actually contain a diagram — so the rest of the site stays JS-free. That Mermaid file is, in fact, the only JavaScript here, it's served same-origin, and there are no trackers or analytics anywhere.
Hosting is a single nginx container serving static files off my NAS. There's
no application runtime in production — no Python, no PHP, no database to patch.
Publishing is a git push: a post-receive hook on the NAS re-renders the pages
(about a second) straight into the running container's mounted directory, so a
new post never rebuilds a Docker image or restarts the server.
If that's your kind of thing, the details show up over on the blog.
Elsewhere
Find me on the links in the footer, or say hello by email.