# jeanlucmakiola.de Personal website + blog. Built with [Astro](https://astro.build), deployed on self-hosted [Coolify](https://coolify.io), analytics via self-hosted [Umami](https://umami.is). See [PLANNING.md](./PLANNING.md) for the decisions and roadmap. ## Develop ```sh 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`: ```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:///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.