No description
  • JavaScript 70.3%
  • HTML 17.2%
  • Python 5.5%
  • CSS 4.8%
  • Shell 1.4%
  • Other 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Ata Kuyumcu 81323714a7
All checks were successful
ci / build (push) Successful in 57s
fix: whatever the fuck
2026-08-26 20:59:03 +02:00
.claude feat: mark the unbound in the numbers 2026-08-14 03:16:38 +02:00
.githooks chore: add image optimization to pre-commit hook 2026-07-18 13:37:37 +02:00
.github/workflows chore: apply the over-engineering audit's cuts 2026-08-20 15:40:36 +02:00
.vscode chore: extract syntax highlighting to syntax.css and switch to space indentation 2026-05-27 16:12:52 +02:00
archetypes chore: initial commit 2026-05-23 12:38:05 +02:00
assets feat: give mermaid charts accessible colors in light and dark 2026-08-19 09:49:48 +02:00
content fix: whatever the fuck 2026-08-26 20:59:03 +02:00
layouts style: improve postcard grid spacing and responsiveness on home 2026-08-23 10:41:56 +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 feat: put a farm in the village 2026-08-12 14:12:52 +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 fix: unbreak the hugo_stats cachebuster regex 2026-08-20 15:42:26 +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 feat: put a farm in the village 2026-08-12 14:12:52 +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).

Requirements

  • Hugo extended (bundles Dart Sass / the Tailwind binary). Pinned version lives in .github/workflows/ci.yml (HUGO_VERSION).
  • Node for Biome. Pinned via NODE_VERSION in .github/workflows/ci.yml.
  • Python 3 (stdlib only) for the helper scripts.

Development

hugo server -D          # local dev server, drafts included, live reload
hugo --gc --minify      # production build into public/ (gitignored)
npx @biomejs/biome check  # lint + format CSS/JS/JSON (--write to fix)

Helper scripts (scripts/, stdlib Python only):

python3 scripts/reflow-markdown.py [file...]   # reflow prose to 80 cols
python3 scripts/validate-linked-data.py public # validate JSON-LD in a build

Writing posts

  • Posts live in content/posts/*.md with YAML front matter (title, date, tags, optional cover, draft, description).
  • 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 single-post template hardcodes 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.
  • Prose wraps at 80 columns — use reflow-markdown.py rather than hand-wrapping.
  • Tag pages (content/tags/<tag>/_index.md) are hand-authored; prune orphans manually.
  • draft: true hides a post from the built site but the source and any static/ images remain reachable in the repo.
  • Unpublish a post by setting draft: true (don't delete).

Layout

  • content/posts/*.md — posts. Front matter is YAML (---).
  • content/tags/<tag>/_index.md — tag pages are hand-authored.
  • layouts/ — custom templates. partials/head/ holds meta, css, jsonld, indieweb.
  • assets/css/main.css — Tailwind v4 entry.
  • scripts/ — standalone Python 3, stdlib only.

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.

Both 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: build (Hugo with Pagefind indexing) → validate:linked-data → 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.