Jean-Luc Makiola 0a9ef90160 Publish two overdue posts (flip draft: false)
Both reached their pubDate but were still draft: true, so every daily
scheduled-deploy rebuild skipped them — the gate in src/utils/posts.ts
checks draft before pubDate, so the flag outranks the date indefinitely.
The Jul 6 flip (c321728) covered only the posts due that day; these two
were not yet due and were never revisited:

- caldav-colors            (2026-07-08, 17 days overdue)
- the-feature-i-said-no-to (2026-07-10, 15 days overdue)

Verified with a production build: both render and appear in the blog
index, RSS feed, and sitemap.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 09:57:45 +02:00

jeanlucmakiola.de

Personal website + blog. Built with Astro, deployed on self-hosted Coolify, analytics via self-hosted Umami.

See PLANNING.md for the decisions and roadmap.

Develop

npm install
npm run dev      # http://localhost:4321
npm run build    # output -> dist/
npm run preview  # serve the built site locally

Writing a post

Create a Markdown file in src/content/blog/, e.g. my-post.md:

---
title: My post
description: One-line summary (used for SEO + RSS).
pubDate: 2026-06-28
tags: [notes]
draft: false        # set true to hide from listings/feeds
---

Body in Markdown.

The filename (minus extension) becomes the URL slug: /blog/my-post/. Commit + push → Coolify rebuilds → live.

Analytics (Umami)

Analytics is off unless these env vars are set (so it stays off in dev). Set them as build-time variables in Coolify:

Variable Value
PUBLIC_UMAMI_SRC https://<your-umami>/script.js
PUBLIC_UMAMI_WEBSITE the website id (UUID) from Umami

Deploy on Coolify

This repo ships a multi-stage Dockerfile (build with Node → serve dist/ with Caddy on port 80).

  1. New Resource → Dockerfile (or auto-detect), point at this repo.
  2. Set the two PUBLIC_UMAMI_* build variables.
  3. Set the domain to jeanlucmakiola.de; Coolify provisions HTTPS.
  4. Deploy Umami separately (Coolify has a one-click Umami template), then copy its script URL + website id into the build variables above.

SEO

  • Sitemap at /sitemap-index.xml (via @astrojs/sitemap)
  • RSS at /rss.xml
  • Canonical URLs + Open Graph/Twitter tags in src/components/BaseHead.astro
  • robots.txt in public/
  • Add an og-default.png (1200×630) to public/ for link previews.
Description
Personal website & blog — Astro + Material 3 Expressive
Readme 287 KiB
Languages
Astro 52.2%
CSS 40.1%
TypeScript 5.5%
JavaScript 1.1%
Dockerfile 1.1%