- JavaScript 69.9%
- HTML 17.8%
- Python 5.5%
- CSS 4.8%
- Shell 1.2%
- Other 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
ci / build (push) Successful in 1m12s
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 |
||
| .claude | ||
| .githooks | ||
| .github/workflows | ||
| .vscode | ||
| archetypes | ||
| assets | ||
| content | ||
| layouts | ||
| scripts | ||
| static | ||
| .gitignore | ||
| AGENTS.md | ||
| biome.json | ||
| CLAUDE.md | ||
| flake.lock | ||
| flake.nix | ||
| hugo.toml | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
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>.mdscaffolds a draft. Front matter is YAML:title,date,description,tags,draft, and optionallycover,cover_credit, andkeywords(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 ascover: "images/<name>.jpg". Crop to that aspect before adding. If the image needs attribution (CC BY etc.), setcover_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
dateto the publish day. Posts sort by it. - Unpublish with
draft: truerather than deleting. The source and anystatic/images stay reachable in the repo either way. - Prose wraps at 80 columns. The pre-commit hook reflows staged content;
otherwise run
reflow-markdown.pyrather 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: truemakes a page aProfilePagewith a visible h-card (the about page).
Layout
layouts/: templates.partials/head/holdsmeta,css,jsonld,indieweb.assets/css/main.css: Tailwind v4 entry.assets/js/dungeon/: the easter egg. Its tilesheet is instatic/dungeon/.scripts/: the helpers above..claude/: agent settings, the/publish-checkcommand, and thedungeon-statsskill.
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:
- Tiny Dungeon by Kenney, rows 0-10 (sprite indices 0-131).
- Tiny Town by
Kenney, rows 11-21, addressed in code as
TOWN + nwhereTOWN = 132. - Tiny Farm by
Kenney, rows 22-32, addressed in code as
FARM + nwhereFARM = 264.
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.