No description
  • JavaScript 69.9%
  • HTML 17.8%
  • Python 5.5%
  • CSS 4.8%
  • Shell 1.2%
  • Other 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Ata Kuyumcu eb86b8a13f
All checks were successful
ci / build (push) Successful in 1m12s
chore: match the claude allowlist to nix develop and let agents commit
The bare hugo and python3 rules never matched, since both only exist
inside the flake. AGENTS.md now allows committing without asking; pushing
still needs approval because it deploys.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3jqhN5g8AJLfZgyNxgCgE
2026-09-11 21:41:33 +02:00
.claude chore: match the claude allowlist to nix develop and let agents commit 2026-09-11 21:41:33 +02:00
.githooks fix: run the pre-commit hook under nix develop when its tools are missing 2026-09-11 21:38:02 +02:00
.github/workflows build: drop redundant hugo mounts and ci flags, match ci hugo to the flake 2026-09-11 21:38:33 +02:00
.vscode chore: extract syntax highlighting to syntax.css and switch to space indentation 2026-05-27 16:12:52 +02:00
archetypes refactor: switch the archetype to yaml and fold duplicate template branches 2026-09-11 21:38:09 +02:00
assets remove: drop the unused dungeon welcome lines 2026-09-11 21:38:14 +02:00
content style: reflow the remaining over-width content to 80 columns 2026-09-11 21:38:20 +02:00
layouts refactor: switch the archetype to yaml and fold duplicate template branches 2026-09-11 21:38:09 +02:00
scripts chore: apply the over-engineering audit's cuts 2026-08-20 15:40:36 +02:00
static remove: drop the unused janus cover 2026-08-23 09:57:56 +02:00
.gitignore chore: apply the over-engineering audit's cuts 2026-08-20 15:40:36 +02:00
AGENTS.md chore: match the claude allowlist to nix develop and let agents commit 2026-09-11 21:41:33 +02:00
biome.json fix: use scoped @biomejs/biome and exclude Hugo templates from Biome 2026-06-10 15:11:49 +02:00
CLAUDE.md docs: consolidate CLAUDE.md into AGENTS.md 2026-07-01 23:03:59 +02:00
flake.lock build: add nix flake 2026-07-31 21:12:38 +02:00
flake.nix chore: apply the over-engineering audit's cuts 2026-08-20 15:40:36 +02:00
hugo.toml build: drop redundant hugo mounts and ci flags, match ci hugo to the flake 2026-09-11 21:38:33 +02:00
package-lock.json feat: add p2p dungeon crawler easter egg 2026-08-10 21:26:05 +02:00
package.json feat: add p2p dungeon crawler easter egg 2026-08-10 21:26:05 +02:00
README.md docs: route tooling through the nix flake and trim duplicated docs 2026-09-11 21:37:55 +02:00

blog.lvmbdv.dev

Ata Kuyumcu's personal blog. A Hugo (extended) static site styled with Tailwind CSS v4, leaning on structured data (JSON-LD) and IndieWeb microformats (h-card / h-entry).

Setup

Tooling comes from the Nix flake: nix develop provides Hugo extended, Node 24, Python 3 with Pillow, optipng, jpegoptim, and rsync. Tailwind, Pagefind, Biome, and Trystero come from npm.

nix develop
npm ci
git config core.hooksPath .githooks   # reflow prose + optimize images on commit

CI installs its own Hugo (HUGO_VERSION in .github/workflows/ci.yml). Keep it matching the one flake.lock provides.

Development

hugo server -D                                   # dev server, drafts included, no search
hugo --gc --minify                               # production build into public/
npx pagefind --site public                       # search index, as CI does
python3 scripts/validate-linked-data.py public   # JSON-LD check, as CI does
npx @biomejs/biome check                         # lint + format CSS/JS/JSON (--write to fix)

Helper scripts:

python3 scripts/reflow-markdown.py [file...]   # reflow prose to 80 cols (default: all of content/)
scripts/optimize-images.sh [--lossy]           # recompress everything in static/images/
python3 scripts/stack-tilesheet.py ...         # add a Kenney pack to the dungeon sheet, see Credits

Writing posts

  • hugo new content posts/<slug>.md scaffolds a draft. Front matter is YAML: title, date, description, tags, draft, and optionally cover, cover_credit, and keywords (weighted above tags when picking related posts).
  • Set description (~150 chars max). Without it the meta/og/twitter descriptions fall back to the whole first paragraph and get truncated everywhere.
  • Covers are 1200×630 (the templates hardcode those dimensions), live in static/images/, and are referenced as cover: "images/<name>.jpg". Crop to that aspect before adding. If the image needs attribution (CC BY etc.), set cover_credit (markdown, e.g. cover_credit: "[Photo](url) by Author, CC BY 2.0"); it renders as a caption under the cover.
  • When undrafting, bump date to the publish day. Posts sort by it.
  • Unpublish with draft: true rather than deleting. The source and any static/ images stay reachable in the repo either way.
  • Prose wraps at 80 columns. The pre-commit hook reflows staged content; otherwise run reflow-markdown.py rather than hand-wrapping.
  • Tag pages (content/tags/<tag>/_index.md) are hand-authored. A new tag needs one (the dev server flags tags without a description), and orphans are pruned by hand.
  • profile: true makes a page a ProfilePage with a visible h-card (the about page).

Layout

  • layouts/: templates. partials/head/ holds meta, css, jsonld, indieweb.
  • assets/css/main.css: Tailwind v4 entry.
  • assets/js/dungeon/: the easter egg. Its tilesheet is in static/dungeon/.
  • scripts/: the helpers above.
  • .claude/: agent settings, the /publish-check command, and the dungeon-stats skill.

Credits

static/dungeon/tilemap.png is three Kenney packs stacked into one 12-column sheet, 16×16 tiles throughout. Each pack is exactly 11 rows, so each band starts at a round multiple of 132:

The packs ship separate palettes; they are merged into one 62-colour table when stacked, so the sheet stays 8-bit indexed rather than becoming truecolour.

All three are released under CC0 1.0, which asks for nothing, so this section is courtesy rather than obligation.

Deploy

The live site is served by Caddy from /srv/blog.lvmbdv.dev on the same server that hosts forge.lvmbdv.dev. Forgejo Actions (.github/workflows/ci.yml) runs on every push to main: Hugo build, Pagefind index, JSON-LD validation, then rsync public/ to the webroot. The rsync runs as the deploy user over an rrsync-restricted SSH key stored as the DEPLOY_SSH_KEY Actions secret; the key can only write to the webroot.

There is no manual deploy step: pushing to main deploys.

The Codeberg repo is a push mirror kept for backup; it no longer serves the site.