Personal Library (this very site)
In progressJuly 2026
This is the site you are looking at right now. It started as a portfolio and turned into something closer to a personal library: a place to keep the projects I have built, the books I read, and the photos I collect — with the option to keep any of them to myself.
How it is put together
Built with Astro running as a standalone Node.js server, so it can
live on any host instead of being tied to one platform. There is no database: content
is plain folders on disk — projects/, books/, gallery/ — read on every request. Drop
a folder in and it shows up; no rebuild, no migration.
Almost every page is server-rendered. That is what makes the next part possible.
Locking things down
Anything can be marked private: a project, a book, a whole photo category. Private items disappear from every listing, and typing the URL directly returns 404 — including the raw PDF and the image files. The access code is checked server-side only and never reaches the browser; what the browser gets is a signed, httpOnly cookie.
Getting that right turned out to be mostly about details that stay invisible until they break:
- Files whose privacy can change must not sit in the browser cache, or locking one has no
visible effect until the cache expires. They are served with revalidation and an
ETag. - Renaming or moving a locked book has to carry the lock along with it, or the book quietly becomes public again.
- One malformed content file must not take the whole site down — a bad entry is skipped and reported in the admin panel instead of throwing.
The admin side
A password-gated area for uploading books and photos, editing project metadata, and toggling what is private. Uploads are checked against the file's actual signature rather than its extension, confined to the target folder, and size-limited.
The dashboard also shows traffic — visits, most-read pages, visitors with browser and device — recorded by the server itself, with no third-party analytics and no tracking script running in the visitor's browser. A summary arrives in my inbox on a schedule.
Rebuilt from
The old Angular version, which never made it past the initial setup.