# Hammer Tech Blog » Code, Linux & Self-Hosting URL: https://hmmr.online/ ## Alexander Hammer URL: https://hmmr.online/about/ I'm Alexander Hammer, aka ZanderHammer. Software developer based in Aachen, Germany. Arch Linux user, self-host everything I use, open to new roles. ![Alexander Hammer](/_astro/avatar.3RRzZobR_ZWuYQb.webp) # Alexander Hammer Aachen, Germany [ZanderHammer](https://codeberg.org/ZanderHammer) • [blog@hmmr.online](mailto:blog@hmmr.online) Software developer. Arch Linux. Self-hosted everything. I'm a backend developer with a soft spot for Python. It just fits my brain better than most languages. C# and Java pay the bills often enough that I've made peace with them too. Frontend, on the other hand, is where my confidence dies. I can bully CSS into behaving if I have to, but honestly I just make an AI eat that shit for me while I bitch about wanting less AI in my life. Massive hypocrite, I know. Arch, obviously. Yes, the meme is accurate. No, I won't shut up about it. I self-host basically everything I can get away with, held together by Docker and Traefik, which I love unconditionally right up until a reverse-proxy rule breaks. That same instinct is why this blog lives on Codeberg instead of GitHub. Microsoft already runs enough of my life. It doesn't need to run my code too. The blog itself only exists because I got sick of solving the same problem twice. Writing it down once means I don't have to dig through my own broken memory six months later, trying to remember how I fixed it the first time. And honestly, maintaining this thing and writing posts is just fun. I like having a spot to dump whatever I figured out that week. Recruiters Yes, I'm looking for new opportunities Remote or somewhere around Aachen. If something looks interesting, say hi. [Get in touch](/contact/) --- ## AI Disclaimer URL: https://hmmr.online/ai-disclaimer/ Yes I use AI. Here's exactly what for, and what's still mine. # AI Disclaimer Last updated: July 1, 2026 * * * I read other blogs now and half the time can’t tell what’s written by a person and what’s ChatGPT slop. It sucks. So here’s the honest breakdown for this one. ## Text I write the posts. All of them. The ideas, the dumb tangents, the frustrations. All mine. What I use AI for: proofreading and catching typos. Sometimes I’ll ask if a paragraph makes sense, or get it to rephrase a sentence that came out clunky. That’s it. No post here is AI-generated. If something reads like slop, that’s on me. ## Images Some images are AI-generated. Usually teaser images and header graphics where I didn’t have an actual screenshot or photo to use. Decorative stuff. AI-generated images are marked as such. Check the caption under the image and you’ll see it. Screenshots of real terminals, configs, dashboards. Those are real. What you see is what I ran. ## Why bother saying this Honestly? Because I’d rather be upfront than have you sit there wondering. If you’re reading this, you deserve to know which one you’re getting. That’s it. Questions about any of this? Drop me a line at [blog@hmmr.online](mailto:blog@hmmr.online). --- ## Contact URL: https://hmmr.online/contact/ Practical stuff on Linux, Docker, and self-hosting. Container setups, reverse proxies, home servers – and other questionable life choices. # Contact * * * Use the form below to get in touch. Fields marked with an asterisk are required. Name Email \* Organization Subject \* Message \* Website check I have read the [privacy policy](/privacy/) and agree that my submission will be processed to handle my inquiry. \* Send message --- ## Elsewhere URL: https://hmmr.online/elsewhere/ Links worth reading, with a note on why each one stuck with me. Stuff I found around the web and wanted to keep. # Elsewhere Things I read elsewhere and wanted to keep. I might even share my thoughts on it. 1. Jul 23, 2026 • drewdevault.com ## [Stop externalizing your costs on me](https://drewdevault.com/blog/Stop-externalizing-your-costs-on-me/) This one struck a nerve. It puts words to something I’ve felt for a while: the broad, careless use of LLMs quietly pushes the cost of the mess onto everyone downstream. It reinforces the same argument I made in [We got lost in AI](/posts/we-got-lost/), except Drew lays out the receipts better than I could. --- ## Imprint URL: https://hmmr.online/imprint/ Practical stuff on Linux, Docker, and self-hosting. Container setups, reverse proxies, home servers – and other questionable life choices. # Imprint Last updated: May 7, 2026 * * * ## Legal Notice hmmr - Alexander Hammer c/o Online-Impressum #8062 Europaring 90 53757 St. Augustin Germany ## Contact E-Mail: [blog@hmmr.online](mailto:blog@hmmr.online) Contact form: [hmmr.online/contact](/contact/) ## Responsible for content Responsible for the content according to § 18 (2) MStV (Medienstaatsvertrag): Alexander Hammer (address as above) --- ## Hammer Tech Blog » Code, Linux & Self-Hosting URL: https://hmmr.online/ Practical stuff on Linux, Docker, and self-hosting. Container setups, reverse proxies, home servers – and other questionable life choices. # Hammer Tech Blog » Code, Linux & Self-Hosting Questionable life choices by Alexander Hammer [Read the Blog →](/posts/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZgSxEA.webp) ## About I run Arch Linux, self-host basically everything with Docker, and write code in whatever the project needs. This is where I document the stuff that actually worked. [About me →](/about/) ## Topics * [![](/_astro/hugo-logo.CL5Lk52C_Z1A8euh.svg) Hugo](/topics/hugo/) * [![](/_astro/docker-logo.cLFSuHxc_t0lC4.svg) Docker](/topics/docker/) * [Self-Hosting](/topics/self-hosting/) * [![](/_astro/linux-logo.C_7ld7wB_1vbXgs.svg) Linux](/topics/linux/) * [All topics →](/topics/) ## Latest Posts ### [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/) Jul 20, 2026 · [#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/) [![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp)](/posts/sidekick-skill/) Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp") [Read More →](/posts/sidekick-skill/) ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) Jul 15, 2026 · [#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/) [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp)](/posts/why-astro-not-hugo/) I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp") [Read More →](/posts/why-astro-not-hugo/) ### [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/) May 22, 2026 · [#Codeberg](/topics/codeberg/) [#Forgejo](/topics/forgejo/) [#Docker](/topics/docker/) [#CI/CD](/topics/cicd/) [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_2s5POH.webp)](/posts/codeberg-forgejo-runner/) Codeberg gives you Actions but limited runners. Here is how to host your own Forgejo runner in Docker and connect it. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&title=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions "Share on Reddit")[](https://bsky.app/intent/compose?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Threads")[](https://mastodon.social/share?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it. "Share on Telegram")[](https://wa.me/?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share via WhatsApp") [Read More →](/posts/codeberg-forgejo-runner/) ### [We got lost in AI](/posts/we-got-lost/) May 19, 2026 · [#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/) [![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp)](/posts/we-got-lost/) Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/) We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp") [Read More →](/posts/we-got-lost/) [All posts →](/posts/) ## Most Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) --- ## Posts URL: https://hmmr.online/posts/2/ Practical stuff on Linux, Docker, and self-hosting. Container setups, reverse proxies, home servers – and other questionable life choices. # Posts 12 Posts ## [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) Apr 24, 2026 · [#Umami](/topics/umami/) [#Analytics](/topics/analytics/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [#Privacy](/topics/privacy/) [![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_Z2iEbi5.webp)](/posts/umami-v3-1-0-review/) Umami v3.1.0 drops with Session Replay, custom Boards and Web Vitals. I updated my self-hosted instance and took it for a spin. Here's what actually works. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&title=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look "Share on Reddit")[](https://bsky.app/intent/compose?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Threads")[](https://mastodon.social/share?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works. "Share on Telegram")[](https://wa.me/?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share via WhatsApp") [Read More →](/posts/umami-v3-1-0-review/) ## [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) Apr 5, 2026 · [#Hugo](/topics/hugo/) [#WordPress](/topics/wordpress/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/) [![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_Z2sRgdy.webp)](/posts/why-hugo-not-wordpress/) [Image AI generated](/ai-disclaimer/) I used WordPress for years before switching to Hugo. Static HTML, no database, no plugins, 100/100 Lighthouse. Here is why I am not going back. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&title=Why%20I%20Switched%20from%20WordPress%20to%20Hugo "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share via WhatsApp") [Read More →](/posts/why-hugo-not-wordpress/) ## [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/) Apr 4, 2026 · [#Hugo](/topics/hugo/) [#Pagefind](/topics/pagefind/) [#Search](/topics/search/) [#Guide](/topics/guide/) [![Screenshot of the search page on this blog, showing a search bar and results for "Docker".](/_astro/search-teaser.DLYSs_HW_Z2tFvhq.webp)](/posts/hugo-search-pagefind/) [Image AI generated](/ai-disclaimer/) How to add search to a Hugo static site with Pagefind. No backend, no JSON templates, no pain. Just one build command and twenty lines of code. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&title=Adding%20Search%20to%20Hugo%20with%20Pagefind "Share on Reddit")[](https://bsky.app/intent/compose?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Threads")[](https://mastodon.social/share?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code. "Share on Telegram")[](https://wa.me/?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share via WhatsApp") [Read More →](/posts/hugo-search-pagefind/) ## [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/) Apr 2, 2026 · [#Traefik](/topics/traefik/) [#Docker](/topics/docker/) [#Reverse Proxy](/topics/reverse-proxy/) [#Self-Hosting](/topics/self-hosting/) [#SSL](/topics/ssl/) [#Let's Encrypt](/topics/lets-encrypt/) [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_u5ERv.webp)](/posts/traefik-reverse-proxy/) [Image AI generated](/ai-disclaimer/) Nginx Proxy Manager stopped renewing SSL certs. Switched to Traefik as Docker reverse proxy - wildcard Let's Encrypt, zero web UI, way less painful. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&title=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik "Share on Reddit")[](https://bsky.app/intent/compose?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Bluesky")[](https://threads.net/intent/post?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Threads")[](https://mastodon.social/share?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share via WhatsApp") [Read More →](/posts/traefik-reverse-proxy/) ## [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/) Mar 10, 2026 · [#Wallpaper](/topics/wallpaper/) [#Linux](/topics/linux/) [#Ricing](/topics/ricing/) [#Resources](/topics/resources/) [![I Just Want a Nice Background](/_astro/wallpaper-teaser.DwfQY61S_1D0twv.webp)](/posts/wallpaper-sources/) [Image AI generated](/ai-disclaimer/) Every wallpaper site promises high-res downloads. Most of them lie. Wallhaven, Unsplash, Reddit — here are the sources that actually deliver quality. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&title=Where%20to%20Actually%20Find%20Good%20Wallpapers "Share on Reddit")[](https://bsky.app/intent/compose?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Threads")[](https://mastodon.social/share?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality. "Share on Telegram")[](https://wa.me/?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share via WhatsApp") [Read More →](/posts/wallpaper-sources/) [Prev](/posts/) Page 2 of 3 [Next](/posts/3/) --- ## Posts URL: https://hmmr.online/posts/3/ Practical stuff on Linux, Docker, and self-hosting. Container setups, reverse proxies, home servers – and other questionable life choices. # Posts 12 Posts ## [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) Jan 6, 2026 · [#Hyprland](/topics/hyprland/) [#Claude](/topics/claude/) [#Linux](/topics/linux/) [#Workflow](/topics/workflow/) [![Hyprland Desktop with Waybar](/_astro/hyprland-teaser.Cdw2bFv6_29nk4D.webp)](/posts/hyprland-claude-code/) [Image AI generated](/ai-disclaimer/) I used Claude Code CLI to rice my Hyprland desktop — Waybar, dotfiles, keybindings, the whole thing. Turns out AI makes configuring Linux way less painful. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&title=Ricing%20Hyprland%20with%20Claude%20Code%20CLI "Share on Reddit")[](https://bsky.app/intent/compose?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Threads")[](https://mastodon.social/share?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share via WhatsApp") [Read More →](/posts/hyprland-claude-code/) ## [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/) Dec 10, 2025 · [#Hugo](/topics/hugo/) [#Docker](/topics/docker/) [#Guide](/topics/guide/) [#DevOps](/topics/devops/) [![Neutraler Verlauf als Titelbild](/_astro/docker-teaser.BIxfPpXx_Z1gwKzy.webp)](/posts/hugo-docker-container/) [Image AI generated](/ai-disclaimer/) Why I run Hugo in a Docker container instead of installing it bare metal — cleaner builds, no version conflicts, and a dev workflow that just works. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&title=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide "Share on Reddit")[](https://bsky.app/intent/compose?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Threads")[](https://mastodon.social/share?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works. "Share on Telegram")[](https://wa.me/?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share via WhatsApp") [Read More →](/posts/hugo-docker-container/) [Prev](/posts/2/) Page 3 of 3 --- ## Blog Updates #1 URL: https://hmmr.online/posts/blog-updates-1/ Quick rundown of what I changed on the blog: privacy policy, imprint, contact form, footer, sitemap. # Blog Updates #1 May 8, 2026 · 7 min read · 34 views [#Hugo](/topics/hugo/) [#Privacy](/topics/privacy/) [#Legal](/topics/legal/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [Share](#post-share) * * * ![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_1ivK2c.webp) Photo from Sami Abdullah // [Pexel](https://www.pexels.com/de-de/foto/nahaufnahme-von-holzklotzen-mit-der-aufschrift-neu-33705550/) On this page * [Privacy Policy](#privacy-policy) * [Writing the Policy](#writing-the-policy) * [Imprint and Contact Form](#imprint-and-contact-form) * [Other Updates](#other-updates) * [TL;DR](#tldr) Table of contents * [Privacy Policy](#privacy-policy) * [Writing the Policy](#writing-the-policy) * [Imprint and Contact Form](#imprint-and-contact-form) * [Other Updates](#other-updates) * [TL;DR](#tldr) It’s been a couple of weeks since the last post and the blog has changed quite a bit since then. None of it was on my roadmap. A Reddit comment kicked the whole thing off, and from there it kind of snowballed into a full legal compliance sprint plus a handful of smaller fixes I’d been putting off anyway. Here’s the rundown. ## Privacy Policy After I posted my [Umami v3.1.0 review](/posts/umami-v3-1-0-review/), [a comment on r/selfhosted](https://www.reddit.com/r/selfhosted/comments/1suip3x/comment/oi6v71y/) made me aware that a privacy policy is not optional, even though I had claimed otherwise in the post. So I started researching what I needed to do to be compliant with EU and German privacy law. First reaction was anger. At the bureaucracy and at the fact that I had to do this at all. I get why these rules exist. Transparent use of user data, preventing abuse, all that. But this is a small non-commercial personal tech blog. What the hell do I need to put my private address on here for. So I contemplated quitting the blog. Or moving it to the dark web. Then I read about the “blog address” services some companies offer. You pay a small monthly amount, and you get to use their address in your imprint and privacy policy. The only requirement under German law is that the address has to be “ladungsfähig”. A court has to be able to reach you. That works as long as the imprint service forwards the mail, either physically or by scanning and emailing it to you. Sounds great. I keep writing my blog without doxxing myself, for 4 euros a month. So that’s what I did. I went with [Online-Impressum.de](https://www.online-impressum.de/). Best bang for the buck in my research. ## Writing the Policy Now the actually hard part. The address was the easy buy. Websites and generators offer boilerplates, but none of them fit my setup. The usual best practice is to not use legal text from AI, but I thought to myself, this is such a lightweight setup, how hard can it be. So I fired up my favorite LLMs. First I did some research on my own. Then I had Claude do deep research on what needed to be in the privacy policy and how to structure it. Built a first draft, refined it back and forth maybe fifty times. Dropped the final version into all the common AIs to rate it. They all said it looked solid. But LLMs are notorious liars. So I went and read the privacy policies of other small blogs and compared section by section. And indeed, mine was actually good. Structure right, legal references right, disclosures matched what my site actually does. The key is being transparent and making sure all legal requirements are covered. For a small non-commercial blog focused on privacy, the risk of getting sued over this is very small. The final version lives on the [privacy policy page](/privacy/). Long, dense, boring. Which is exactly what a privacy policy should be. ## Imprint and Contact Form With the privacy policy comes the imprint. Easy. Name, address, email. But the law requires two contact options. One is email. For most people the second would be a phone number. I don’t have a spare phone number, so I went with a contact form on the page itself. And here I ran into the staticness of [Hugo](/posts/why-hugo-not-wordpress/). A contact form needs some kind of backend to handle the input. Options ranged from developing my own solution (not difficult but I wasn’t in the mood) to some kind of SaaS. Yikes. After some digging I found [hugo-mx-gateway](https://github.com/rchakode/hugo-mx-gateway). Small service that takes the form POST and emails it to me. Drop it into [docker-compose](/posts/hugo-docker-container/), point [Traefik](/posts/traefik-reverse-proxy/) at it, fill in the SMTP credentials in an env file. Done. I love it when something just works. ``` hmmr-contact: image: rchakode/hugo-mx-gateway:1.0.0 container_name: hmmr-contact restart: unless-stopped env_file: - ./contact.env networks: - proxy labels: - "traefik.enable=true" - "traefik.http.routers.hmmr-contact.rule=Host(`hmmr.online`) && PathPrefix(`/api/contact`)" - "traefik.http.routers.hmmr-contact.entrypoints=websecure" - "traefik.http.routers.hmmr-contact.tls=true" - "traefik.http.routers.hmmr-contact.middlewares=hmmr-contact-strip" - "traefik.http.middlewares.hmmr-contact-strip.stripprefix.prefixes=/api/contact" - "traefik.http.services.hmmr-contact.loadbalancer.server.port=8080" ``` Added a simple HTML5 form that POSTs to `/api/contact/sendmail`. Name, email, subject, message, a honeypot field for bots, a privacy consent checkbox. A tiny bit of JS shows a spinner and a success message so the page doesn’t feel dead while the request goes out. Form is [here](/contact/) if you want to see it. Added a layout for the legal pages, dropped them into the footer menu, and now the blog is compliant under German law. Nice. ## Other Updates * **Footer menu.** The old one was way too big. Icons didn’t fit, spacing was sloppy, the whole row felt like an afterthought (because it was). Trimmed it down, removed the icons, and re-weighted the entries so the legal stuff sits at the end where it belongs instead of cluttering up the middle. Looks like a footer now, not a misplaced navbar. * **Sitemap.** Hugo generates a `sitemap.xml` automatically. Great for search engines. Useless for humans. So I added a [proper one](/sitemap/) too. Plain page, all posts grouped by year, newest first, title and date. That’s it. If you want to scroll through what I’ve written without fighting the homepage pagination, that’s where you go. * **Smooth scrolling.** The share button at the top of each post used to jump straight to the share section at the bottom. Instant teleport. Felt broken every single time I tried it. Adding `scroll-behavior: smooth` on the `html` element fixed it in literally one line of CSS. Now it glides. Why this isn’t the browser default in 2026 I genuinely do not understand. ## TL;DR Blog is now legal under German law. Privacy policy, imprint, working contact form. The address comes from a 4-euro-a-month Impressum service so I don’t have to publish my own. Privacy policy written with LLM help and cross-checked against other small blogs. Contact form runs on hugo-mx-gateway behind Traefik. Also redid the footer, added a human-readable sitemap, and made the share button smooth scroll instead of jumping. This post is part of the **Hugo** topic hub. [Explore all Hugo guides →](/topics/hugo/) This post is part of the **Docker** topic hub. [Explore all Docker guides →](/topics/docker/) This post is part of the **Self-Hosting** topic hub. [Explore all Self-Hosting guides →](/topics/self-hosting/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&title=Blog%20Updates%20%231 "Share on Reddit")[](https://bsky.app/intent/compose?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Threads")[](https://mastodon.social/share?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap. "Share on Telegram")[](https://wa.me/?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share via WhatsApp") ← Previous [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/ "Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look") Next → [We got lost in AI](/posts/we-got-lost/ "We got lost in AI") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Self-Hosting a Forgejo Runner for Codeberg Actions URL: https://hmmr.online/posts/codeberg-forgejo-runner/ Codeberg gives you Actions but limited runners. Here is how to host your own Forgejo runner in Docker and connect it. # Self-Hosting a Forgejo Runner for Codeberg Actions May 22, 2026 · 8 min read · 1 views [#Codeberg](/topics/codeberg/) [#Forgejo](/topics/forgejo/) [#Docker](/topics/docker/) [#CI/CD](/topics/cicd/) [Share](#post-share) * * * ![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_2s5POH.webp) On this page * [Why I Run My Own Codeberg Runner](#why-i-run-my-own-codeberg-runner) * [Setting Up the Docker Compose File](#setting-up-the-docker-compose-file) * [Getting Your Runner Token from Codeberg](#getting-your-runner-token-from-codeberg) * [Editing the Config and Starting the Runner](#editing-the-config-and-starting-the-runner) * [Using Your New Runner](#using-your-new-runner) * [TL;DR](#tldr) Table of contents * [Why I Run My Own Codeberg Runner](#why-i-run-my-own-codeberg-runner) * [Setting Up the Docker Compose File](#setting-up-the-docker-compose-file) * [Getting Your Runner Token from Codeberg](#getting-your-runner-token-from-codeberg) * [Editing the Config and Starting the Runner](#editing-the-config-and-starting-the-runner) * [Using Your New Runner](#using-your-new-runner) * [TL;DR](#tldr) ## Why I Run My Own Codeberg Runner My Codeberg review is still in the pipeline but I wanted to get this out now. For everyone who doesn’t know [Codeberg](https://codeberg.org/): it’s a GitHub alternative run by the non-profit organization [Codeberg e. V.](https://en.wikipedia.org/wiki/Codeberg) out of Berlin. It’s based on the Gitea fork [Forgejo](https://forgejo.org/). Just like GitHub, Forgejo has an Actions feature. Codeberg offers runners to use, but since they’re a non-profit and their resources are limited, the only right thing to do is to set up your own Forgejo runner and connect it to Codeberg. In this quick guide I’ll show you how to set up the Forgejo runner with Docker and connect it to Codeberg. I set it up on my VPS, which acts as my development server. But since the runner connects to Codeberg and not the other way around, it’s absolutely possible to deploy the runner on a local machine and only fire it up when you need it. ## Setting Up the Docker Compose File The [official Forgejo documentation](https://forgejo.org/docs/latest/admin/actions/installation/docker/) lets you run the runners on bare metal or in Docker. But either way you need Docker or Podman, since the runners run in containers. Since I’m [team Docker](https://hmmr.online/posts/hugo-docker-container/), I chose to run it in Docker. For security reasons the runners shouldn’t get access to the host Docker daemon and instead be given “Docker in Docker”. The Docker Compose file is pretty straightforward. Two containers. The DinD and the Forgejo runner itself: ``` version: '3.8' services: docker-in-docker: image: docker:dind container_name: 'docker_dind' privileged: 'true' command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false'] restart: 'unless-stopped' runner: image: 'data.forgejo.org/forgejo/runner:12' links: - docker-in-docker depends_on: docker-in-docker: condition: service_started container_name: 'runner' environment: DOCKER_HOST: tcp://docker-in-docker:2375 # User without root privileges, but with access to `./data`. user: 1001:1001 volumes: - ./data:/data restart: 'unless-stopped' command: 'forgejo-runner daemon --config runner-config.yml' ``` We are not quiet ready to start it. You first need to create the data folder and its permissions, and of course the config file. Choose a directory where you want to place the `docker-compose.yml`. I like to put my Compose files in the `/opt` directory, but your home folder is also fine. Then create the data and cache folders and give them non-root permissions: ``` cd /opt/forgejo-runner mkdir -p data/.cache chown -R 1001:1001 data chmod 775 data/.cache chmod g+s data/.cache ``` Now it’s time to create the default Forgejo runner config. Using Docker, this can be done with this command: ``` sudo sh -c 'docker run --rm data.forgejo.org/forgejo/runner:12 forgejo-runner generate-config > data/runner-config.yml' ``` Now we’re almost ready to fire up the runner. ## Getting Your Runner Token from Codeberg Now we need to get our token for the runner from Codeberg. You can set up a runner either for your account, for your organization, or just a single repository. Go to the respective settings -> Actions -> Runners. The [Codeberg documentation](https://docs.codeberg.org/ci/actions/) is outdated here. It tells you to copy the `registration token`. But that route is deprecated. Instead, hit “Create new runner”, enter the name for your runner and an optional description. [![Codeberg create new runner dialog](/_astro/codeberg-create-runner.CjozeTxJ_ZMVRL3.webp)](/images/codeberg-create-runner.webp) Codeberg create new runner dialog You’re then presented with the UUID and Token. These values need to be added to the runner config so the runner can connect to Codeberg. They’re only shown once, so write them down or you’ll have to reset them later. [![Codeberg runner config block](/_astro/codeberg-runner-config.tBkY3HtP_Z1G3KtT.webp)](/images/codeberg-runner-config.webp) Codeberg runner config block Here, Codeberg hands you the correct config so you don’t have to bother writing it yourself. Which, given my own YAML track record, I’m grateful for. ## Editing the Config and Starting the Runner Head back to the folder where you created the `runner-config.yml` and open it with the text editor of your choice. The default config is fine for most users. It’s very well documented. Just scroll through it and you’ll understand it. The only optional change I made is the `capacity` setting. Default is one job per runner. I set it to 4. And then there are two changes you have to make: add the server config and set the runner labels. In line 63 you’ll find the config for the labels: ``` # The labels of a runner are used to determine which jobs the runner can run and how to run them. # Like: ["macos-arm64:host", "ubuntu-latest:docker://node:20-bookworm", "ubuntu-22.04:docker://node:20-bookworm"] # If it's empty when registering, it will ask for inputting labels. # If it's empty when executing the `daemon`, it will use labels in the `.runner` file. labels: ['ubuntu-latest:docker://node:20-bookworm', 'ubuntu-22.04:docker://node:20-bookworm', 'ubuntu-24.04:docker://node:22-bookworm'] ``` These labels tell Codeberg what actions the runner can handle. Think of it as a matchmaking system between your workflows and this runner. Each label follows a strict three-part syntax: `[Workflow Label]:[Execution Method]://[Environment]`. * **The Workflow Label (`ubuntu-latest`)**: This is the trigger. If a workflow file says `runs-on: ubuntu-latest`, this runner will raise its hand and take the job. * **The Execution Method (`docker`)**: This tells the runner to spin up an isolated Docker container to execute the workflow steps. * **The Environment (`//node:20-bookworm`)**: This is the actual Docker image the runner pulls to run the job. (Notice it uses a Node/Debian image to essentially “fake” an Ubuntu environment, which works perfectly fine for most standard workflows.) I didn’t have any special requirements and just set `ubuntu`. Feel free to copy my config. Now you’ll need the config from Codeberg you wrote down earlier. This goes at the bottom of the config file. There’s already a placeholder: ``` server: # A map of connections to one or more Forgejo instances. Example: # [...] # minimum value for certain instances like Codeberg. connections: ``` Codeberg gives you the entire server block. So make sure not to just paste it at the bottom. Below `connections:`, put the `forgejo` block from Codeberg. Replace `forgejo` with a name of you liking. The final result should look like this: ``` server: # A map of connections to one or more Forgejo instances. Example: # [...] # minimum value for certain instances like Codeberg. connections: my-codeberg-runner: url: https://codeberg.org/ uuid: token: ``` All set. Now fire it up with `sudo docker compose up -d`. If everything is set up correctly, the runner overview in Codeberg should now show “Idle” next to your runner. ## Using Your New Runner To use your new runner, you either specify it directly by its name in your action or tell it to use the label you assigned to it. In my case that would be “ubuntu-latest”: ``` # .forgejo/workflows/test.yml on: [push] jobs: hello: runs-on: ubuntu-latest # or the name of your runner you set in Codeberg steps: - run: echo "Running on my own runner!" ``` ## TL;DR Codeberg’s shared runners are limited because they’re a non-profit, so host your own. Run two containers with Docker Compose: `docker:dind` and `data.forgejo.org/forgejo/runner:12`. Create the `data` folder with `1001:1001` permissions, generate the config, then grab a UUID and token from Codeberg under Settings -> Actions -> Runners via “Create new runner”. Paste the `forgejo` block under `connections:`, set your labels, and run `docker compose up -d`. This post is part of the **Docker** topic hub. [Explore all Docker guides →](/topics/docker/) This post is part of the **Self-Hosting** topic hub. [Explore all Self-Hosting guides →](/topics/self-hosting/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&title=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions "Share on Reddit")[](https://bsky.app/intent/compose?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Threads")[](https://mastodon.social/share?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it. "Share on Telegram")[](https://wa.me/?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share via WhatsApp") ← Previous [We got lost in AI](/posts/we-got-lost/ "We got lost in AI") Next → [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/ "Why I Switched from Hugo to Astro") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Hugo in Docker: Benefits and Practical Guide URL: https://hmmr.online/posts/hugo-docker-container/ Why I run Hugo in a Docker container instead of installing it bare metal — cleaner builds, no version conflicts, and a dev workflow that just works. # Hugo in Docker: Benefits and Practical Guide December 10, 2025 · 6 min read · 106 views [#Hugo](/topics/hugo/) [#Docker](/topics/docker/) [#Guide](/topics/guide/) [#DevOps](/topics/devops/) [Share](#post-share) * * * ![Neutraler Verlauf als Titelbild](/_astro/docker-teaser.BIxfPpXx_Z1gwKzy.webp) [Image AI generated](/ai-disclaimer/) On this page * [Why Docker for Hugo?](#why-docker-for-hugo) * [The Official Hugo Docker Image](#the-official-hugo-docker-image) * [Real-World Implementation: How hmmr.online Uses Docker](#real-world-implementation-how-hmmronline-uses-docker) * [Centralized Configuration](#centralized-configuration) * [The Workflow](#the-workflow) * [Why I Use This Setup](#why-i-use-this-setup) * [TL;DR](#tldr) Table of contents * [Why Docker for Hugo?](#why-docker-for-hugo) * [The Official Hugo Docker Image](#the-official-hugo-docker-image) * [Real-World Implementation: How hmmr.online Uses Docker](#real-world-implementation-how-hmmronline-uses-docker) * [Centralized Configuration](#centralized-configuration) * [The Workflow](#the-workflow) * [Why I Use This Setup](#why-i-use-this-setup) * [TL;DR](#tldr) ## Why Docker for Hugo? I used to install Hugo directly on my system. Then I switched to Docker, and honestly? I’m never going back. Here’s why: **No cluttering your system.** Hugo installed bare metal means adding binaries, dependencies, and configuration to your machine. With Docker, it’s isolated. Clean. **Version switching is painless.** Need a different Hugo version? Just change the image tag. No reinstalling, no conflicts with system packages. One line change. **Consistency everywhere.** Local development, CI/CD, production - they all run the exact same Hugo version. No more “but it works on my laptop” surprises at 3 AM. **Lightweight.** The official Hugo image is around 100MB. Compare that to installing Go and compiling Hugo from source. **Just works.** Docker takes care of everything. No setup scripts, no dependency management. Pull the image, run the container. ## The Official Hugo Docker Image The official image is at `ghcr.io/gohugoio/hugo:v0.152.2`. One thing to watch out for though: the command syntax is a bit different: ``` # These won't work: hugo new site # Wrong hugo server # Wrong # This is what you actually do: new site # Right server # Right --destination /target --minify # Build command ``` It’s a minor quirk, but once you know it, you’re golden. ## Real-World Implementation: How hmmr.online Uses Docker I built this blog using three simple scripts. They handle everything from local development to production deployment. Let me show you how they work. ### 1\. `dev.sh` – Local Development Run a live-reload development server on port 1313: ``` #!/bin/bash HUGO_IMAGE="ghcr.io/gohugoio/hugo:v0.152.2" docker run --rm -it \ -v $(pwd):/src \ -w /src \ -p 1313:1313 \ "$HUGO_IMAGE" \ server --bind 0.0.0.0 --buildDrafts --buildFuture ``` Start it with `./dev.sh`, then open `http://localhost:1313`. Edit your markdown files and watch the site update in real-time. `--buildDrafts` lets you preview unpublished posts, and `--buildFuture` shows scheduled ones. No installation, no fiddling with your system. Just run and write. ### 2\. `deploy.sh` – Production Deployment Build and deploy the site to production: ``` #!/bin/bash HUGO_IMAGE="ghcr.io/gohugoio/hugo:v0.152.2" LIVE_DIR="/var/www/hugo/hmmr" LOCK_FILE="/tmp/hugo-hmmr-deploy.lock" if [ -f "$LOCK_FILE" ]; then echo "Deployment already running. Exiting." exit 0 fi touch "$LOCK_FILE" trap "rm -f $LOCK_FILE" EXIT # Build with minification docker run --rm \ -v $(pwd):/src \ -v "$LIVE_DIR":/target \ -w /src \ "$HUGO_IMAGE" \ --destination /target --minify ``` This script builds the site to `/var/www/hugo/hmmr` where Nginx serves it. The `--minify` flag compresses HTML/CSS/JS. The lock file prevents multiple builds running at once. I call this after pushing to main - either manually with `./deploy.sh` or automatically via GitHub Actions. Either way, the site is live in seconds. ### 3\. `shell.sh` – Run Any Command Run any Hugo command in the container: ``` #!/bin/bash HUGO_IMAGE="ghcr.io/gohugoio/hugo:v0.152.2" CONTAINER_NAME="hugo-shell-$(date +%s)" docker run --rm -it \ --name $CONTAINER_NAME \ -v $(pwd):/src \ -w /src \ "$HUGO_IMAGE" \ "$@" ``` **Usage:** ``` # Create a new post ./shell.sh new content/posts/my-post.md # Check Hugo version ./shell.sh version # Build without minification ./shell.sh --destination ./public ``` ## Centralized Configuration All scripts reference a single configuration file: **`hugo-container.conf`:** ``` HUGO_IMAGE="ghcr.io/gohugoio/hugo:v0.152.2" ``` Change the Hugo version here, and all scripts automatically use the new version. No copy-pasting needed. For anything else, I use a generic wrapper: ``` #!/bin/bash HUGO_IMAGE="ghcr.io/gohugoio/hugo:v0.152.2" CONTAINER_NAME="hugo-shell-$(date +%s)" docker run --rm -it \ --name $CONTAINER_NAME \ -v $(pwd):/src \ -w /src \ "$HUGO_IMAGE" \ "$@" ``` Use it like this: ``` ./shell.sh new content/posts/my-post.md # Create a post ./shell.sh version # Check Hugo version ./shell.sh --destination ./public # Build without minify ``` It’s just a passthrough to Hugo. Handy for when the standard scripts don’t cover what you need. ## The Workflow In practice, here’s how I publish a new post: ``` # 1. Start the dev server ./dev.sh # 2. Write in another terminal # The site live-reloads at http://localhost:1313 # I can see my changes instantly # 3. Commit and push git add content/ git commit -m "Add new post" git push origin main # 4. Deploy (manually or via automation) ./deploy.sh # The site is now live ``` That’s it. Write, commit, deploy. No build steps to babysit, no version conflicts to debug. ## Why I Use This Setup The beauty of Docker is simplicity. I don’t have Hugo installed anywhere. My entire blogging setup lives in three bash scripts and some Docker volumes. If I need to set this up on a new machine, I just: 1. Clone the repo 2. Install Docker 3. Run `./dev.sh` That’s it. No “follow 12 installation steps”, no version conflicts, no mystery errors. And when I deploy to production, I know for a fact that the exact same Hugo version and environment is running there as on my laptop. No surprises. ## TL;DR Use Hugo in Docker instead of installing it bare metal. You get version isolation, consistency across environments, and no system clutter. Use three simple scripts: `dev.sh` for development with live reload, `deploy.sh` for production builds, and `shell.sh` for custom commands. Write, commit, push - GitHub Actions or `./deploy.sh` handles the rest. This post is part of the **Hugo** topic hub. [Explore all Hugo guides →](/topics/hugo/) This post is part of the **Docker** topic hub. [Explore all Docker guides →](/topics/docker/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&title=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide "Share on Reddit")[](https://bsky.app/intent/compose?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Threads")[](https://mastodon.social/share?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works. "Share on Telegram")[](https://wa.me/?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share via WhatsApp") Next → [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/ "Ricing Hyprland with Claude Code CLI") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Adding Search to Hugo with Pagefind URL: https://hmmr.online/posts/hugo-search-pagefind/ How to add search to a Hugo static site with Pagefind. No backend, no JSON templates, no pain. Just one build command and twenty lines of code. # Adding Search to Hugo with Pagefind April 4, 2026 · 9 min read · 74 views [#Hugo](/topics/hugo/) [#Pagefind](/topics/pagefind/) [#Search](/topics/search/) [#Guide](/topics/guide/) [Share](#post-share) * * * ![Screenshot of the search page on this blog, showing a search bar and results for "Docker".](/_astro/search-teaser.DLYSs_HW_Z2tFvhq.webp) [Image AI generated](/ai-disclaimer/) On this page * [I Have Four Posts](#i-have-four-posts) * [Hugo Doesn’t Do Search](#hugo-doesnt-do-search) * [Pagefind Is Stupidly Simple](#pagefind-is-stupidly-simple) * [Setting Up Pagefind in Hugo](#setting-up-pagefind-in-hugo) * [Pagefind with Hugo in Docker](#pagefind-with-hugo-in-docker) * [The hugo serve Problem](#the-hugo-serve-problem) * [Don’t Index Your Nav](#dont-index-your-nav) * [Make It Not Ugly](#make-it-not-ugly) * [Was This Worth It?](#was-this-worth-it) * [TL;DR](#tldr) Table of contents * [I Have Four Posts](#i-have-four-posts) * [Hugo Doesn’t Do Search](#hugo-doesnt-do-search) * [Pagefind Is Stupidly Simple](#pagefind-is-stupidly-simple) * [Setting Up Pagefind in Hugo](#setting-up-pagefind-in-hugo) * [Pagefind with Hugo in Docker](#pagefind-with-hugo-in-docker) * [The hugo serve Problem](#the-hugo-serve-problem) * [Don’t Index Your Nav](#dont-index-your-nav) * [Make It Not Ugly](#make-it-not-ugly) * [Was This Worth It?](#was-this-worth-it) * [TL;DR](#tldr) ## I Have Four Posts Four. That’s the entire content library of this blog. And I just spent an evening adding search to my Hugo site with [Pagefind](https://pagefind.app). You could literally scroll for three seconds and find every post I’ve ever written. But no, I needed a search bar. Because what if someone lands on my site and desperately needs to find that one article about [wallpapers](/posts/wallpaper-sources/) but can’t be bothered to move their eyes slightly downward? What then? Chaos. Anarchy. An unacceptable user experience. The real reason is that I’m going to keep writing stuff, and adding search to a static site with 200 posts sounds way more annoying than adding it to one with four. So I’m doing it now. Future me can thank current me later. Or not. He’s probably still procrastinating on something else. ## Hugo Doesn’t Do Search Hugo generates static HTML files. No server. No database. No nothing. Your entire website is a pile of `.html` files sitting in a folder. Which is why I love it. Also why adding search is a bit of a “go screw yourself” situation. Any search has to happen client-side, in the browser, with no backend to lean on. The traditional approach is painful. You create a Hugo template that vomits all your content into a JSON file. Then you load a JavaScript library like Fuse.js or Lunr.js that downloads that entire JSON blob into the visitor’s browser and does fuzzy string matching on it. Every visitor. Every page load. The whole damn index. For four posts? Sure, who cares. For 500 posts? You’re shipping a 5MB JSON file to people who just wanted to search for “Docker.” And Fuse.js has this fun habit where you search for “Traefik” and it goes “did you mean: traffic, tragic, trick?” No I did not. I meant Traefik. The thing I typed. Thanks for nothing. Lunr.js is… I mean it’s not even maintained anymore. Last release was like 2020. The GitHub issues are piling up. It’s that project on life support where nobody wants to be the one to pull the plug. ## Pagefind Is Stupidly Simple Pagefind does something smart: it ignores Hugo completely. Instead of making you write JSON templates and wire up search logic and deal with Hugo’s output format configuration, Pagefind just… looks at your HTML. You build your site with Hugo like normal. Then you point Pagefind at the output. It crawls `public/`, reads the rendered HTML, builds its own index. But here’s the actually clever part. It doesn’t create one fat index file. It splits everything into tiny chunks and only loads the ones relevant to what you’re searching for. The whole thing, JavaScript plus WASM runtime plus whatever index fragments your query needs, comes in under 100KB per search. Compared to “download the entire blog as JSON and pray,” that’s not bad. And it ships with a UI. You don’t write any search frontend code. None. You add a `
`, include two files, write four lines of JavaScript. I kept waiting for the catch. There isn’t one. ## Setting Up Pagefind in Hugo ### Search Page Make `content/search.md`: ``` +++ title = 'Search' url = '/search/' layout = 'search' +++ ``` Thrilling content right there. ### Layout Create `layouts/_default/search.html`: ``` {{ define "main" }}
{{ end }} ``` Wrap it in whatever your theme’s base template expects. The Pagefind part is the stuff between the `
` tags. That’s all the frontend you’ll ever write for this. I know. I was suspicious too. ### Build Command Before: ``` hugo --minify ``` After: ``` hugo --minify && pagefind --site public ``` One extra command appended with `&&`. I kept staring at the docs thinking I was missing a step. Nope. That’s the whole integration. You can run it via `npx -y pagefind --site public` if you’re into Node, or just download the binary: ``` wget -qO- https://github.com/CloudCannon/pagefind/releases/download/v1.4.0/pagefind-v1.4.0-x86_64-unknown-linux-musl.tar.gz | tar xz ``` I went with the binary. No npm, no node\_modules, no downloading twelve thousand packages so I can index four blog posts. Just a file that does the thing. ## Pagefind with Hugo in Docker I’m [running Hugo in Docker](/posts/hugo-docker-container/) because I apparently enjoy making everything slightly harder for myself. So Pagefind needs to be available after Hugo builds. My approach is dumb and I like it: download the Pagefind binary, stick it in `bin/` in my project, commit it to git. Yeah yeah, binaries in git, I know. It’s 15MB. I’ll survive. It means zero runtime dependencies, no pulling packages during deploy, no “oh the npm registry is down again and now my blog can’t build.” Just a file in a folder. Revolutionary. The deploy script: ``` #!/bin/bash source hugo-container.conf LIVE_DIR="/var/www/hugo/hmmr" LOCK_FILE="/tmp/hugo-hmmr-deploy.lock" PAGEFIND_BIN="./bin/pagefind" if [ -f "$LOCK_FILE" ]; then echo "Deployment already running. Exiting." exit 0 fi touch "$LOCK_FILE" trap "rm -f $LOCK_FILE" EXIT # Hugo builds the site docker run --rm \ -v $(pwd):/src \ -v "$LIVE_DIR":/target \ -w /src \ "$HUGO_IMAGE" \ --destination /target --minify # Pagefind indexes it $PAGEFIND_BIN --site "$LIVE_DIR" ``` Hugo builds. Pagefind indexes. Two commands, same script. That’s basically it. ## The hugo serve Problem `hugo serve` renders everything in memory. Doesn’t write to `public/`. So during development, the Pagefind index doesn’t exist and search just… shows nothing. You type a query, hit enter, silence. Great. The workaround: ``` hugo --minify && pagefind --site public --output-subdir ../static/pagefind ``` This dumps the index into `static/pagefind/` instead, which `hugo serve` actually serves. The index won’t live-reload when you edit posts, so you’d have to rebuild manually. But at least search doesn’t just sit there staring at you. Honestly I almost never bother with this. I test search after deploying. Four posts. I can verify results by remembering what I wrote. That’s the luxury of having no content. ## Don’t Index Your Nav This one bit me. Pagefind indexes everything by default. Your header. Your footer. Your tag pages. That sidebar you forgot about. So you search for “Docker” and suddenly get eight results because the word appears in your navigation on every page. Took me a minute to figure out why search results were such garbage. The fix: ```
{{ .Content }}
``` Now it only touches what’s inside `
`. Navigation, footer, all that crap? Gone. Should’ve done this first. Would’ve saved me from questioning Pagefind’s intelligence. You can also kill specific sections within the body: ```
Pagefind pretends this doesn't exist.
``` ## Make It Not Ugly The default Pagefind CSS looks like a developer designed it. Because a developer designed it. CSS custom properties fix most of it: ``` :root { --pagefind-ui-primary: #your-accent-color; --pagefind-ui-text: #your-text-color; --pagefind-ui-background: #your-bg-color; --pagefind-ui-border: #your-border-color; --pagefind-ui-border-width: 1px; --pagefind-ui-border-radius: 8px; --pagefind-ui-font: inherit; } ``` Set `inherit` on the font. Match your colors. Done. I spent longer picking the accent color than setting up the entire search. ## Was This Worth It? For a blog with four posts? No. Obviously not. But it took maybe fifteen minutes. Twenty lines of code across two files. One extra command in my deploy script. Every new post gets indexed automatically. I never have to touch it again. And now I have a search bar on a blog that you can read entirely during a bathroom break. Big day. ## TL;DR [Pagefind](https://pagefind.app) runs after Hugo builds your site. It crawls the HTML, creates a chunked index, gives you a drop-in search UI. No JSON templates, no JavaScript search libraries, no backend. Stick `data-pagefind-body` on your article wrapper so it doesn’t index your nav and footer. If you’re [running Hugo in Docker](/posts/hugo-docker-container/), keep the binary in your repo and call it after Hugo. Twenty lines of code and one build command. Even for four posts. This post is part of the **Hugo** topic hub. [Explore all Hugo guides →](/topics/hugo/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&title=Adding%20Search%20to%20Hugo%20with%20Pagefind "Share on Reddit")[](https://bsky.app/intent/compose?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Threads")[](https://mastodon.social/share?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code. "Share on Telegram")[](https://wa.me/?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share via WhatsApp") ← Previous [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/ "I Replaced Nginx Proxy Manager with Traefik") Next → [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/ "Why I Switched from WordPress to Hugo") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Ricing Hyprland with Claude Code CLI URL: https://hmmr.online/posts/hyprland-claude-code/ I used Claude Code CLI to rice my Hyprland desktop — Waybar, dotfiles, keybindings, the whole thing. Turns out AI makes configuring Linux way less painful. # Ricing Hyprland with Claude Code CLI January 6, 2026 · 4 min read · 144 views [#Hyprland](/topics/hyprland/) [#Claude](/topics/claude/) [#Linux](/topics/linux/) [#Workflow](/topics/workflow/) [Share](#post-share) * * * ![Hyprland Desktop with Waybar](/_astro/hyprland-teaser.Cdw2bFv6_29nk4D.webp) [Image AI generated](/ai-disclaimer/) On this page * [I Never Had Time for This](#i-never-had-time-for-this) * [How This Actually Works](#how-this-actually-works) * [It’s Not Perfect Though](#its-not-perfect-though) * [Worth It?](#worth-it) Table of contents * [I Never Had Time for This](#i-never-had-time-for-this) * [How This Actually Works](#how-this-actually-works) * [It’s Not Perfect Though](#its-not-perfect-though) * [Worth It?](#worth-it) ## I Never Had Time for This You know those [r/unixporn](https://www.reddit.com/r/unixporn/) posts with the gorgeous Hyprland setups? I’ve been jealous of those for years. But every time I tried to get into ricing, I’d hit a wall. Config files everywhere, weird syntax, tools I’ve never heard of. And honestly? I have a job and a family. I don’t have weekends to burn figuring out why my window borders won’t change color. So I just used Gnome. It works, it’s fine, whatever. I spent my free time on other projects. Then I started using Claude Code CLI for work stuff and thought - wait, can this thing do Hyprland configs? Turns out, yes. And it’s kind of great. [![My Hyprland setup](/_astro/hyperland-screenshot.BELA2par_ZtxqAp.webp)](/images/hyperland-screenshot.webp) My Hyprland setup ## How This Actually Works I just… tell it what I want. “Make Super+Enter open my terminal.” “I want gaps between windows, like 10 pixels or something.” “Make Spotify always open on workspace 4.” Claude writes the config. I reload Hyprland. It works. Or it doesn’t, and I tell Claude what went wrong, and it fixes it. That’s basically it. No wiki rabbit holes. No copying configs from GitHub and hoping they work with my setup. The whole thing I set up - keybindings, window rules, how things look, my Waybar - all of it was just me describing what I wanted. Some back and forth, sure. But way less painful than learning the config syntax myself. ## It’s Not Perfect Though Look, sometimes it just doesn’t work and you have to figure out why yourself. Best example: I wanted my wallpapers to rotate automatically with hyprpaper. Claude found the feature in the docs, wrote the config, looked totally legit. Didn’t work. I wasted hours on this. Restarted hyprpaper like fifty times. Checked the config over and over. The syntax was right, the feature was documented, what the hell? Turns out wallpaper rotation was added to hyprpaper literally a day before. My version didn’t have it yet. Claude pulls from the latest docs but has no idea what version you’re actually running. So yeah, keep that in mind. When something should work but doesn’t, check your versions. Also, the more specific you are, the better results you get. “Make it look nice” doesn’t really help. “I want rounded corners, blue borders, and gaps between windows” does. ## Worth It? For me, absolutely. I finally have a setup I actually like, and I didn’t have to mass-learn a bunch of config syntax to get there. Some things still need manual tweaking, but the bulk of it? Claude handles it. If you’ve been putting off ricing because it seemed like too much work - this is a pretty good way in. This post is part of the **Linux** topic hub. [Explore all Linux guides →](/topics/linux/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&title=Ricing%20Hyprland%20with%20Claude%20Code%20CLI "Share on Reddit")[](https://bsky.app/intent/compose?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Threads")[](https://mastodon.social/share?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share via WhatsApp") ← Previous [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/ "Hugo in Docker: Benefits and Practical Guide") Next → [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/ "Where to Actually Find Good Wallpapers") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Posts URL: https://hmmr.online/posts/ Practical stuff on Linux, Docker, and self-hosting. Container setups, reverse proxies, home servers – and other questionable life choices. # Posts 12 Posts ## [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/) Jul 20, 2026 · [#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/) [![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp)](/posts/sidekick-skill/) Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp") [Read More →](/posts/sidekick-skill/) ## [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) Jul 15, 2026 · [#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/) [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp)](/posts/why-astro-not-hugo/) I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp") [Read More →](/posts/why-astro-not-hugo/) ## [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/) May 22, 2026 · [#Codeberg](/topics/codeberg/) [#Forgejo](/topics/forgejo/) [#Docker](/topics/docker/) [#CI/CD](/topics/cicd/) [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_2s5POH.webp)](/posts/codeberg-forgejo-runner/) Codeberg gives you Actions but limited runners. Here is how to host your own Forgejo runner in Docker and connect it. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&title=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions "Share on Reddit")[](https://bsky.app/intent/compose?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Threads")[](https://mastodon.social/share?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it. "Share on Telegram")[](https://wa.me/?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share via WhatsApp") [Read More →](/posts/codeberg-forgejo-runner/) ## [We got lost in AI](/posts/we-got-lost/) May 19, 2026 · [#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/) [![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp)](/posts/we-got-lost/) Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/) We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp") [Read More →](/posts/we-got-lost/) ## [Blog Updates #1](/posts/blog-updates-1/) May 8, 2026 · [#Hugo](/topics/hugo/) [#Privacy](/topics/privacy/) [#Legal](/topics/legal/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_1ivK2c.webp)](/posts/blog-updates-1/) Photo from Sami Abdullah // [Pexel](https://www.pexels.com/de-de/foto/nahaufnahme-von-holzklotzen-mit-der-aufschrift-neu-33705550/) Quick rundown of what I changed on the blog: privacy policy, imprint, contact form, footer, sitemap. [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&title=Blog%20Updates%20%231 "Share on Reddit")[](https://bsky.app/intent/compose?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Threads")[](https://mastodon.social/share?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap. "Share on Telegram")[](https://wa.me/?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share via WhatsApp") [Read More →](/posts/blog-updates-1/) Page 1 of 3 [Next](/posts/2/) --- ## Sidekick: A Claude Code Skill Against Vibe Coding URL: https://hmmr.online/posts/sidekick-skill/ Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick. # Sidekick: A Claude Code Skill Against Vibe Coding July 20, 2026 · 6 min read · 61 views [#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/) [Share](#post-share) * * * ![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp) On this page * [Ranting Is the Easy Part](#ranting-is-the-easy-part) * [So I Built a Skill](#so-i-built-a-skill) * [Markdown Files as Memory](#markdown-files-as-memory) * [Do the Research Once](#do-the-research-once) * [Claude Does the Boring Stuff](#claude-does-the-boring-stuff) * [How Much AI Do You Want?](#how-much-ai-do-you-want) * [This Is What I Meant](#this-is-what-i-meant) Table of contents * [Ranting Is the Easy Part](#ranting-is-the-easy-part) * [So I Built a Skill](#so-i-built-a-skill) * [Markdown Files as Memory](#markdown-files-as-memory) * [Do the Research Once](#do-the-research-once) * [Claude Does the Boring Stuff](#claude-does-the-boring-stuff) * [How Much AI Do You Want?](#how-much-ai-do-you-want) * [This Is What I Meant](#this-is-what-i-meant) ## Ranting Is the Easy Part Two months ago I posted [a rant](/posts/we-got-lost/) about how we got lost in AI. Short version: vibe coding killed the fun in my projects, I didn’t know my own codebases anymore, and I wanted AI to be a tool again instead of a replacement for me. Felt great to write. Changed absolutely nothing. Because that’s the thing with rants. You hit publish, people nod along, and the next evening you open Claude Code and let it vibe out another feature because it’s just so damn convenient. Complaining is easy. Doing something about it is the hard part. So here’s me doing something about it. ## So I Built a Skill The result: [Sidekick](https://github.com/ZanderHammer/sidekick), a Claude Code skill. Well, “I built” is generous. I told Claude’s skill-creator what I wanted and it wrote the skill for me. Yes, I used AI to build the thing that tells AI to back off. I know how that sounds. Whatever, it worked. If you’ve never touched skills: they’re basically markdown files with instructions that Claude Code loads when they become relevant. [The docs](https://code.claude.com/docs/en/skills) explain it better than I will. The whole point of Sidekick is flipping the role. Claude stops being an agent on autopilot that silently finishes entire features while you watch. Instead it becomes your sidekick. It helps with planning, digs through research, sets up the boring parts, reviews your code - but writing the actual code? That’s your job again. ## Markdown Files as Memory The first thing Sidekick changes is how a project starts. Instead of dumping an idea into the chat and watching Claude implement it, you build a rough outline together and split the project into small pieces. Every piece becomes its own markdown file in a `backlog/` folder, right inside your repo. A `BACKLOG.md` on top links them all, sorted by priority, and a `SPRINT.md` tracks what’s being worked on right now. There’s also a `VISION.md` - one paragraph on what the project is and what it’s explicitly not, so it doesn’t scope-creep into a monster. I know. Sounds like corporate scrum theater for a hobby project. But these files fix the single most annoying part of working with an LLM: the new session. Normally you re-explain your entire project every time you open a fresh chat. With these files, you don’t. Claude reads them and knows what’s planned and what’s already done. And it works the other way too - I open the folder and instantly see where the project stands, without scrolling through old conversations. The markdown files are memory. For me and for the LLM. ## Do the Research Once For code, Sidekick tells Claude to hold back. For research, it’s the exact opposite: go wild. Which makes sense, honestly. Claude can search the web and dig through the MCP servers in a project way faster than I ever could. Comparing libraries, checking current docs, that kind of stuff - sure, I’d learn something doing it myself. But it’s a boring chore, and I’d rather code than google. So Claude gets full freedom there. But every finished research topic gets saved as its own markdown file, with a `RESEARCH.md` index on top. Each file holds the question and a short answer, plus links to the sources. Readable by any human and any LLM, now or in a year. No more researching the same library decision twice because the answer is buried in a chat from last month. ## Claude Does the Boring Stuff Project setup is the other job that goes to Claude. But Claude doesn’t get to decide everything on its own. It makes the suggestions and I make the final decisions. Then it sets up the whole project from scratch. Directory structure, configs, git init, tooling. Nobody ever learned anything from writing a linter config by hand. You skip straight to the coding. The fun part. ## How Much AI Do You Want? That’s up to you. The skill is a default, not a law. You can go full purist and write every single line yourself, with Claude only doing code reviews. Or you can override it mid-session with a “just write it” and get the old autopilot back for one task. Both are fine. I landed somewhere in the middle. Claude creates the bare structure of a file - function signatures, comments marking where the logic goes - and I fill in the body myself. When I get stuck, I ask for help. And this is my favorite part: it doesn’t hand me the solution. It gives me a nudge. A hint at where the problem might live. Most of the time that’s enough to get me unstuck. And when it’s not? I tell it to just fix it, and it does. That happened more than once. I’m not pretending I white-knuckled through every bug on hints alone. ## This Is What I Meant I was honestly blown away by this workflow. It combines the fun part of coding with the part of AI that’s actually useful. I code faster and I get stuck less. But at the end it’s my code, not Claude’s. I know how everything works because I wrote it. I can navigate the codebase blind again. Is it slower than letting Claude vibe out the whole thing? Obviously. That’s the point. I love it. In the rant I wrote that AI should serve me, not the other way around. Turns out you don’t have to quit AI for that. You just have to change who’s holding the pen. GITHUB Sidekick A Claude Code skill for people who want a partner, not an autopilot. [View on Github](https://github.com/ZanderHammer/sidekick) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp") ← Previous [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/ "Why I Switched from Hugo to Astro") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## I Replaced Nginx Proxy Manager with Traefik URL: https://hmmr.online/posts/traefik-reverse-proxy/ Nginx Proxy Manager stopped renewing SSL certs. Switched to Traefik as Docker reverse proxy - wildcard Let's Encrypt, zero web UI, way less painful. # I Replaced Nginx Proxy Manager with Traefik April 2, 2026 · 9 min read · 44 views [#Traefik](/topics/traefik/) [#Docker](/topics/docker/) [#Reverse Proxy](/topics/reverse-proxy/) [#Self-Hosting](/topics/self-hosting/) [#SSL](/topics/ssl/) [#Let's Encrypt](/topics/lets-encrypt/) [Share](#post-share) * * * ![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_u5ERv.webp) [Image AI generated](/ai-disclaimer/) On this page * [The Uptime Kuma Alert](#the-uptime-kuma-alert) * [I Always Thought Traefik Was for Masochists](#i-always-thought-traefik-was-for-masochists) * [It’s Just Docker Labels](#its-just-docker-labels) * [Traefik Docker Compose Config](#traefik-docker-compose-config) * [Adding a Docker Service to Traefik](#adding-a-docker-service-to-traefik) * [Bonus: Error Pages That Don’t Look Like Ass](#bonus-error-pages-that-dont-look-like-ass) * [Traefik vs Nginx Proxy Manager: Do You Need a GUI?](#traefik-vs-nginx-proxy-manager-do-you-need-a-gui) * [Migrating from Nginx Proxy Manager to Traefik](#migrating-from-nginx-proxy-manager-to-traefik) * [TL;DR](#tldr) Table of contents * [The Uptime Kuma Alert](#the-uptime-kuma-alert) * [I Always Thought Traefik Was for Masochists](#i-always-thought-traefik-was-for-masochists) * [It’s Just Docker Labels](#its-just-docker-labels) * [Traefik Docker Compose Config](#traefik-docker-compose-config) * [Adding a Docker Service to Traefik](#adding-a-docker-service-to-traefik) * [Bonus: Error Pages That Don’t Look Like Ass](#bonus-error-pages-that-dont-look-like-ass) * [Traefik vs Nginx Proxy Manager: Do You Need a GUI?](#traefik-vs-nginx-proxy-manager-do-you-need-a-gui) * [Migrating from Nginx Proxy Manager to Traefik](#migrating-from-nginx-proxy-manager-to-traefik) * [TL;DR](#tldr) ## The Uptime Kuma Alert I got an SSL certificate expiry alert from my Uptime Kuma on a Tuesday. Ten days left. Fine, I thought. Nginx Proxy Manager handles renewal. That’s literally the one thing it needs to do. Ten days later, my sites were serving browser warnings. You know those full-page “Your connection is not private” screens that make your site look like it’s distributing malware? Yeah. That. Nginx Proxy Manager just… stopped renewing. No error in the logs, no failed attempt, nothing. The UI still showed the certificates as “valid.” They weren’t. I restarted the container, clicked “Renew” manually, waited. Clicked again. Refreshed. Clicked again like it’s a crosswalk button. Nothing. Googled it, checked the logs again, tried different things. No clue what caused it. And that’s almost worse than a clear error - at least then you know what to fix. Nginx Proxy Manager just quietly decided to stop doing its one job. Like a smoke detector that works fine for two years and then just watches your kitchen burn down. ## I Always Thought Traefik Was for Masochists I’d heard of [Traefik](https://traefik.io/traefik/) before. Every self-hosting thread has that one guy going “just use Traefik.” And every time I looked at the docs I saw diagrams with arrows going in seven directions, concepts like “entrypoints” and “routers” and “middlewares” and “providers” and I thought yeah, no, I have a life. Nginx Proxy Manager had a pretty web UI. Click, click, SSL, done. Why would I trade that for whatever Traefik was trying to explain to me with those diagrams? Well, because the click-click-done thing stopped doing the “done” part. ## It’s Just Docker Labels Okay so here’s the thing that nobody told me and I’m kind of annoyed about: setting up Traefik as a reverse proxy is not that complicated. The docs make it look like you’re configuring a space shuttle. You’re not. The entire concept is: Traefik watches your Docker containers. You slap some labels on a container. Traefik reads them and goes “ah, this thing wants to be reachable at app.yourdomain.com, got it.” That’s it. That’s the whole thing. No web UI, no database, no clicking through forms. Your reverse proxy config lives right next to the service in the same `docker-compose.yml`. I set up my [Hugo blog](/posts/hugo-docker-container/) deployment with Docker already, so this was basically just adding labels. I wasted like two years being intimidated by this. ## Traefik Docker Compose Config Here’s my Traefik container, anonymized but structurally identical to what’s actually running: ``` services: traefik: image: traefik:v3 container_name: traefik restart: unless-stopped command: - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--providers.docker.network=proxy" # HTTP → HTTPS redirect - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - "--entrypoints.web.http.redirections.entrypoint.scheme=https" # Wildcard cert via DNS challenge - "--entrypoints.websecure.http.tls=true" - "--entrypoints.websecure.http.tls.certresolver=letsencrypt" - "--entrypoints.websecure.http.tls.domains[0].main=yourdomain.com" - "--entrypoints.websecure.http.tls.domains[0].sans=*.yourdomain.com" # Let's Encrypt - "--certificatesresolvers.letsencrypt.acme.dnschallenge=true" - "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=your-dns-provider" - "--certificatesresolvers.letsencrypt.acme.dnschallenge.resolvers=8.8.8.8:53,1.1.1.1:53" - "--certificatesresolvers.letsencrypt.acme.email=you@yourdomain.com" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" environment: - DNS_PROVIDER_API_KEY=your-api-key - DNS_PROVIDER_API_SECRET=your-api-secret ports: - "80:80" - "443:443" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" - "letsencrypt:/letsencrypt" networks: - proxy volumes: letsencrypt: networks: proxy: external: true ``` Looks like a wall of text. It’s not that bad, I promise. **The entrypoints** are just “port 80” and “port 443.” The redirect block sends all HTTP to HTTPS. Four lines, never think about it again. **`exposedbydefault=false`** is important. Without it Traefik happily exposes every container on your system to the internet. Ask me how I know. Actually don’t. Just set it to false. **The wildcard cert stuff** - Nginx Proxy Manager could do this too, sure. But with Traefik it’s just lines in the command block. Domain, DNS provider, API credentials as environment variables, done. No UI wizard, no separate cert management page. Traefik supports [a ton of providers](https://go-acme.github.io/lego/dns/) - Cloudflare, Hetzner, Netcup, Route53, whatever you’re using. And yeah, the renewal actually works. Automatically. Without silently failing. What a concept. ## Adding a Docker Service to Traefik This is the part that made me feel stupid for not switching sooner. ``` services: myapp: image: whatever/app:latest labels: - "traefik.enable=true" - "traefik.http.routers.myapp.rule=Host(`app.yourdomain.com`)" - "traefik.http.routers.myapp.entrypoints=websecure" - "traefik.http.services.myapp.loadbalancer.server.port=8080" networks: - proxy ``` Four labels. Container goes up, route exists. Container goes down, route disappears. No orphaned proxy hosts in some UI, no “wait, is this one still pointing somewhere?” I used to have like eight proxy entries in Nginx Proxy Manager and couldn’t remember what half of them were for. ## Bonus: Error Pages That Don’t Look Like Ass Totally optional but I love it. Instead of Traefik’s default “404 page not found” in plain text like it’s 1998, [tarampampam/error-pages](https://github.com/tarampampam/error-pages) gives you a container that catches all errors and shows actually styled pages. They have a bunch of templates - I’m using `ghost` because it looks clean: ``` error-pages: image: tarampampam/error-pages:latest container_name: error-pages environment: - TEMPLATE_NAME=ghost labels: - "traefik.enable=true" - "traefik.http.routers.error-pages.rule=HostRegexp(`{host:.+}`)" - "traefik.http.routers.error-pages.priority=1" - "traefik.http.services.error-pages.loadbalancer.server.port=8080" ``` Wire this up as a global middleware on the Traefik entrypoint and every 4xx/5xx gets caught and replaced. Even subdomains that don’t point anywhere yet get a nice 404 instead of a connection refused. Your broken stuff looks professional now. Priorities. ## Traefik vs Nginx Proxy Manager: Do You Need a GUI? People always ask this. “But Nginx Proxy Manager had a GUI.” Yeah, and I opened it maybe twice a year. Every time I had to remember what port it was on, log in, find the right proxy host, click edit, change things, save. With Traefik I open the `docker-compose.yml` I’m already working on, change a label, `docker compose up -d`. Done. And the config is in git. I can grep it, diff it, copy it to another server in seconds. Try migrating a Nginx Proxy Manager setup to a new server. You’re exporting a SQLite database and praying. ## Migrating from Nginx Proxy Manager to Traefik My plan was very sophisticated: open Nginx Proxy Manager one last time, screenshot every proxy host, then go through them one by one. Very organized. Very adult. Portainer took like two minutes. Four labels, `networks: proxy`, done. I sat there waiting for something to go wrong. It didn’t. Weird feeling honestly, like when you parallel park on the first try and nobody’s around to witness it. Open WebUI - same thing. I didn’t even remember what port that thing runs on. 3000? 8080? Doesn’t matter. You tell Traefik the port, Traefik handles it. I used to have a sticky note with port numbers on my monitor like some kind of medieval sysadmin. That’s gone now. Then I hit the 502 wall. One service just wouldn’t come up. Traefik could see it, the labels were right, everything looked fine. I checked the config like four times. Restarted everything. Started questioning my life choices. Forgot to add it to the `proxy` network. Ten minutes of my life I’m not getting back. But honestly that was the only real hiccup. The rest was just copy-paste the same four labels, change the subdomain and port, move on. Some services I’d set up in Nginx Proxy Manager so long ago I couldn’t even remember what they did. Migrated them anyway. Figured I’d find out if anything breaks. After everything was running I `docker stop`’d Nginx Proxy Manager, let it sit for a day just in case, then `docker rm`’d it. Felt like throwing out a printer that’s been jamming for months. Should’ve done it way sooner but you keep thinking maybe this time it’ll work. ## TL;DR Nginx Proxy Manager silently stopped renewing my SSL certs. Switched to Traefik as my Docker reverse proxy - it configures itself from container labels, so routing config lives right next to each service. Wildcard Let’s Encrypt certs via DNS challenge that actually auto-renew. Took about an hour to migrate everything. I spent longer being scared of Traefik than actually setting it up. This post is part of the **Docker** topic hub. [Explore all Docker guides →](/topics/docker/) This post is part of the **Self-Hosting** topic hub. [Explore all Self-Hosting guides →](/topics/self-hosting/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&title=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik "Share on Reddit")[](https://bsky.app/intent/compose?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Bluesky")[](https://threads.net/intent/post?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Threads")[](https://mastodon.social/share?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share via WhatsApp") ← Previous [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/ "Where to Actually Find Good Wallpapers") Next → [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/ "Adding Search to Hugo with Pagefind") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look URL: https://hmmr.online/posts/umami-v3-1-0-review/ Umami v3.1.0 drops with Session Replay, custom Boards and Web Vitals. I updated my self-hosted instance and took it for a spin. Here's what actually works. # Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look April 24, 2026 · Updated May 11, 2026 · 14 min read · 3164 views [#Umami](/topics/umami/) [#Analytics](/topics/analytics/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [#Privacy](/topics/privacy/) [Share](#post-share) * * * ![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_Z2iEbi5.webp) On this page * [I Still Run My Own Analytics](#i-still-run-my-own-analytics) * [The Changelog, Short Version](#the-changelog-short-version) * [The Update Itself Was Boring](#the-update-itself-was-boring) * [Session Replay Is the Headline Feature](#session-replay-is-the-headline-feature) * [Boards Are Actually Useful](#boards-are-actually-useful) * [Web Vitals Almost Tricked Me](#web-vitals-almost-tricked-me) * [Everything Else](#everything-else) * [The Downsides](#the-downsides) * [Would I Install Umami Fresh Today?](#would-i-install-umami-fresh-today) * [TL;DR](#tldr) Table of contents * [I Still Run My Own Analytics](#i-still-run-my-own-analytics) * [The Changelog, Short Version](#the-changelog-short-version) * [The Update Itself Was Boring](#the-update-itself-was-boring) * [Session Replay Is the Headline Feature](#session-replay-is-the-headline-feature) * [Boards Are Actually Useful](#boards-are-actually-useful) * [Web Vitals Almost Tricked Me](#web-vitals-almost-tricked-me) * [Everything Else](#everything-else) * [The Downsides](#the-downsides) * [Would I Install Umami Fresh Today?](#would-i-install-umami-fresh-today) * [TL;DR](#tldr) > **Update, May 2026.** I messed this one up. Someone on the [r/selfhosted thread](https://www.reddit.com/r/selfhosted/comments/1suip3x/comment/oi6v71y/) asked whether “no GDPR lawyer required” actually holds up. I dug in. It doesn’t. > > Session Replay is the obvious one. It records mouse movement, clicks, scrolls, DOM mutations, and form inputs. Under § 25 TDDDG, that’s not the kind of thing you turn on without consent. So it’s off. Recordings deleted. Won’t come back without a real opt-in flow. > > The less obvious one: the standard Umami tracker also reads stuff off the device via JavaScript. `navigator.language` and `screen.width`. Not a lot, but enough that the strict reading of § 25 TDDDG catches it. I yanked the default script tag and switched to `data-auto-track="false"` with a manual `umami.track()` call that strips both from the payload. What’s left is URL, referrer, user agent and country, all from HTTP headers, none of it read off the device. > > Whether that’s enough to stay banner-free is genuinely contested. The DSK (Germany’s data protection authorities) tightened its reading of “Zugriff” (access) in November 2024, and recent court rulings have leaned strict. My take is that header-only data isn’t “Zugriff”, so no banner. The [privacy policy](/privacy/) lays out what’s running and why. > > The original passages are below, struck through. Leaving them in because the mistake is the point. ## I Still Run My Own Analytics Google Analytics is a dumpster fire. Cookie banners, GDPR paperwork, a UI that changes every six months, and they sell you out to advertisers by default. I noped out of that years ago. [Umami](https://umami.is/) has been my analytics stack ever since I moved this blog [from WordPress to Hugo](https://hmmr.online/posts/why-hugo-not-wordpress/). Self-hosted, no cookies, one lightweight script, no GDPR lawyer required. It just counts the things I actually care about. Page views. Referrers. What countries people come from. That’s it. > **Update:** “No GDPR lawyer required” was sloppy. The standard tracker reads `navigator.language` and `screen.width` from the browser via JavaScript. Under the DSK’s November 2024 reading of § 25 TDDDG, active JS reads of device properties count as “Zugriff” (access to the end device), which means consent territory. Fix: `data-auto-track="false"` plus a manual `umami.track()` call with those two fields stripped. URL, referrer, user agent, country all come from HTTP headers, so they’re fine. That’s the version running now. And now v3.1.0 is out. This is a big one. [![Umami v3.1.0 dashboard overview showing hmmr.online stats](/_astro/umami-v3-1-0-dashboard.eAL8jWK2_1271Cw.webp)](/images/umami-v3-1-0-dashboard.webp) Umami v3.1.0 dashboard overview showing hmmr.online stats ## The Changelog, Short Version * **Session Replay** - record and play back real user sessions in the browser, built on rrweb * **Boards** - drag-and-drop custom dashboards with charts, tables and metric tiles * **Core Web Vitals** - real-user LCP, INP, CLS, FCP and TTFB tracking * **Redesigned share pages** - proper mobile support, named share links, filtered views * **OR logic and regex in filters** - the filter system finally does what you want * **Quality-of-life fixes** - PostgreSQL 12/13 compatibility, timezone bugs, mobile UI, Prisma race conditions Session Replay is the headliner. Web Vitals is the one I actually care about. ## The Update Itself Was Boring Which is exactly what you want. I run Umami in a Docker container behind [Traefik](https://hmmr.online/posts/traefik-reverse-proxy/) like everything else on my server. Pull the new image tag, `docker compose up -d`, wait for the Prisma migrations to finish, done. Took maybe two minutes. One thing to watch out for: v3.1.0 bumps the minimum Node.js version to 22 because Prisma 7 needs it. If you’re building from source you’ll care. If you’re using the Docker image like a normal person, you don’t. The schema migrations for the new Boards and Session Replay features run automatically on first boot. I checked the logs, saw a bunch of `migrating...` lines, then nothing scary. No downtime, no manual SQL. ## Session Replay Is the Headline Feature This is the one everyone’s going to talk about. Umami can now record user sessions and play them back in your browser. Mouse movements, clicks, scrolls, the whole thing. [![Session Replay playback modal showing a recorded visit](/_astro/umami-v3-1-0-session-replay.ZIrW2AU__Z9t1rA.webp)](/images/umami-v3-1-0-session-replay.webp) Session Replay playback modal showing a recorded visit It’s built on [rrweb](https://www.rrweb.io/), which is the same library that powers basically every session replay tool out there. Works alongside the existing tracker. You enable it per-website, and it starts recording. Privacy-wise, they defaulted it to “moderate” masking. Input fields get obscured, sensitive elements are hidden. Which is good, because the whole point of running Umami is to not spy on people. There are stricter and looser levels if you want to tune it. > **Update:** “Moderate” only masks form inputs. That’s it. Anything your page renders as plain HTML (names, order IDs, a user ID in the URL, a “Welcome back, Alex” header) lands in the replay stream in clear text. Attributes like `alt`, `title`, `value`, `src` aren’t touched either. For a logged-out blog the surface is tiny, but the “we’re not spying on people” framing only really works if Replay is either off or cranked to Strict with `.rr-block` and `.rr-mask` classes painted onto anything sensitive. The default doesn’t do most of the work for you. Did I turn it on for this blog? Yeah, and I left it on. Watching someone scroll through my TL;DR section and then leave is weirdly humbling. But it’s also genuinely useful. You see where people bounce, which sections they skim, whether the mobile layout actually works on a weird screen size you never tested on. Stuff that raw pageview numbers don’t tell you. If you’re running an app or a shop, this is obviously a bigger deal. For a blog it’s more of a curiosity tool. Either way, I’m keeping it on. > **Update:** Wrong, and “I’m keeping it on” especially. Turning on Session Replay without consent in Germany is just not allowed. § 25 TDDDG settles the question before you ever look at the GDPR balancing test. It demands an opt-in for accessing the visitor’s device, no matter what your legitimate interest looks like. The “strictly necessary” exception that lets shopping carts work without consent doesn’t stretch to analytics. Nobody comes to a blog because they want their scrolling recorded. > > So Replay is off. Recordings deleted. It comes back when the recorder script is properly gated behind a consent manager and the privacy policy spells out what it does. Not before. ## Boards Are Actually Useful Umami has always had “the dashboard” - views, visitors, referrers, the usual. It’s fine but it’s fixed. Boards let you build your own. Drag components onto a canvas. Charts, tables, metric tiles. Bind each one to whichever website you want. Add text blocks for notes. Share the whole thing with a link. [![Custom board with metrics tiles and chart block](/_astro/umami-v3-1-0-boards.D-hIQAR0_2eSiIy.webp)](/images/umami-v3-1-0-boards.webp) Custom board with metrics tiles and chart block I threw together a board for the blog that’s just the stuff I actually look at. Top pages. Referrers that aren’t bots. Country breakdown. Events for the RSS subscribe button. That’s all I need. The default dashboard has like fifteen other things I scroll past every time. The cool part: both the default dashboard and the custom boards let you mix data from multiple sites, pixels and links on the same view. Stack a campaign pixel next to the main site, compare two projects side by side, whatever you want. No tab switching. Am I going to use this? Honestly, no. I have one blog. Comparing hmmr.online to hmmr.online is not exactly a thrill ride. But the feature sits there looking useful, and now I’m weirdly tempted to start a second site just to justify the split view. That’s how you know they built it right. ## Web Vitals Almost Tricked Me This one made me smile. Umami now tracks Core Web Vitals in the browser. LCP, INP, CLS, FCP, TTFB. All the things Google cares about for SEO. Real data from actual visitors, not synthetic tests from [PageSpeed Insights](https://pagespeed.web.dev/). [![Performance page showing Core Web Vitals with rating badges](/_astro/umami-v3-1-0-web-vitals.CqX9CYuD_Z2amNkO.webp)](/images/umami-v3-1-0-web-vitals.webp) Performance page showing Core Web Vitals with rating badges My Lighthouse scores are almost always 100/100, so I was curious whether the real-world numbers would match. Opened the shiny new Performance tab after the upgrade and… nothing. Empty. Zero visitors recorded. I spent way too long debugging this. Checked the logs, checked the Postgres volume, seriously considered rolling back. Someone else [ran into the same wall](https://github.com/umami-software/umami/issues/4179). Turns out Web Vitals collection is opt-in. You need `data-performance="true"` on your tracker script tag. Miss it, and the Performance page just sits there looking sad forever. ``` ``` Add the attribute, redeploy, wait for a few visitors to trickle in. Data started flowing within minutes. All green across the board so far, which matches my Lighthouse scores. And that’s exactly why this feature matters. Right now everything’s fine. But if a future deployment bloats a page, or a third-party script starts misbehaving, or I add an image that tanks LCP on mobile, I’ll see it in the dashboard. Not weeks later in a Search Console email. Real user data catches regressions that synthetic tests miss. That alone is worth the upgrade. > **Update:** I’ve since turned this off too. Same trap as Replay. Web Vitals hooks into the Performance API to read LCP, INP, CLS, all device-side reads via JavaScript. § 25 TDDDG applies the same way. If you’re outside the EU, ignore this. If you’re inside, leave `data-performance` off until you’ve got a consent flow that gates it properly. ## Everything Else The release notes are huge. A lot of it is quality-of-life stuff: * **Redesigned share pages** - proper mobile support, named links and filtered views. Big step up from the old cramped version if you share your numbers publicly. * **OR logic across filters** - you can finally build “referrer is X or Y” queries without hacks * **Regex operators** - proper pattern matching in filters * **Custom slugs for Links** - their URL shortener feature gets vanity URLs * **Download for breakdown reports** - export to CSV without SQL gymnastics * **`SKIP_BUILD_GEO` env variable** - skips the GeoIP database build if you don’t need it, which makes the image smaller * **Configurable salt rotation** - used to be hardcoded, now you set the period * **Bounce exclusion toggle** - finally Also a pile of bug fixes. PostgreSQL 12/13 compatibility issues, timezone bugs in relational queries, mobile UI fixes, session race conditions in Prisma. The kind of stuff that was probably annoying specific people a lot and nobody else at all. If any of those were biting you, they’re fixed now. ## The Downsides Firefox gets the read-only tour. Viewing boards works fine, but the edit screen just… doesn’t load. Blank canvas, no toolbar, nothing. Like the page is quietly judging you for not using Chrome. So you design the board somewhere else, switch back to Firefox, admire your work, switch away again to change anything. Silly little dance. A [fix is already merged on GitHub](https://github.com/umami-software/umami/issues/4168), just not in a release yet, so this sorts itself out on the next point version. Session Replay adds weight to the tracker script. Not a lot, but more than zero. If you’re obsessive about page speed, check your [Lighthouse](https://pagespeed.web.dev/) scores after enabling it. The migrations felt slightly scary. Lots of schema changes at once: Boards, Shares, Session Replay. Did I back up my Postgres volume first? No. I yolo’d it. Worked fine. You should still run a `pg_dump` before upgrading. Way less painful than losing a year of stats because a migration went sideways. ## Would I Install Umami Fresh Today? Yeah, absolutely. If you’re self-hosting anything already - running [Hugo in Docker](https://hmmr.online/posts/hugo-docker-container/), managing your own containers, fighting with reverse proxies - Umami fits right in. One more `docker-compose.yml` entry. Works alongside everything else. If you’re on managed hosting and don’t want to mess with containers, Umami offers a hosted Cloud plan. That’s fine too. The software is open source either way. The alternative is Google counting your visitors for you. Hard pass. If you already [built the site yourself](https://hmmr.online/posts/why-hugo-not-wordpress/) and [wired up your own search](https://hmmr.online/posts/hugo-search-pagefind/), owning the analytics is the obvious next step. Same stack, no cookie banner, no ad tech sitting in the middle. ## TL;DR Session Replay, custom Boards, real-user Web Vitals. The update was boring in the good way. Turn on `data-performance="true"` or the Web Vitals page just sits there empty and you waste an afternoon wondering why. **If you’re in the EU:** Session Replay and Web Vitals need a consent flow before you turn them on. Both read from the visitor’s device via JS, which kills the no-banner-needed argument. Check your base tracker too: the standard script reads `navigator.language` and `screen.width` the same way. Fix is `data-auto-track="false"` plus a manual `umami.track()` call with those two stripped. Boards, filters, the share page redesign: fine as is. This post is part of the **Docker** topic hub. [Explore all Docker guides →](/topics/docker/) This post is part of the **Self-Hosting** topic hub. [Explore all Self-Hosting guides →](/topics/self-hosting/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&title=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look "Share on Reddit")[](https://bsky.app/intent/compose?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Threads")[](https://mastodon.social/share?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works. "Share on Telegram")[](https://wa.me/?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share via WhatsApp") ← Previous [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/ "Why I Switched from WordPress to Hugo") Next → [Blog Updates #1](/posts/blog-updates-1/ "Blog Updates #1") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Where to Actually Find Good Wallpapers URL: https://hmmr.online/posts/wallpaper-sources/ Every wallpaper site promises high-res downloads. Most of them lie. Wallhaven, Unsplash, Reddit — here are the sources that actually deliver quality. # Where to Actually Find Good Wallpapers March 10, 2026 · 5 min read · 129 views [#Wallpaper](/topics/wallpaper/) [#Linux](/topics/linux/) [#Ricing](/topics/ricing/) [#Resources](/topics/resources/) [Share](#post-share) * * * ![I Just Want a Nice Background](/_astro/wallpaper-teaser.DwfQY61S_1D0twv.webp) [Image AI generated](/ai-disclaimer/) On this page * [I Just Want a Nice Background](#i-just-want-a-nice-background) * [AI Wallpapers Are Even Worse](#ai-wallpapers-are-even-worse) * [Sources That Actually Work](#sources-that-actually-work) * [What to Avoid](#what-to-avoid) * [TL;DR](#tldr) Table of contents * [I Just Want a Nice Background](#i-just-want-a-nice-background) * [AI Wallpapers Are Even Worse](#ai-wallpapers-are-even-worse) * [Sources That Actually Work](#sources-that-actually-work) * [What to Avoid](#what-to-avoid) * [TL;DR](#tldr) ## I Just Want a Nice Background You’d think finding a good wallpaper in 2026 would be easy. Google “4K wallpaper”, pick one, done. Nope. Every site promises “Ultra HD” and “4K” and whatever other buzzwords they can cram into their SEO title. You download the image, set it as your background, and… it’s blurry. Some 1080p file that got upscaled to pretend it’s high-res. The thumbnail looked sharp. The actual file is garbage. I’ve wasted hours on this. Page after page of the same rehosted, compressed, mislabeled images. So I started keeping track of which sources don’t lie to you. ## AI Wallpapers Are Even Worse And then there’s the AI stuff. Look, I get it. Type a prompt, get a mountain landscape. Sounds great. But stare at one for more than two seconds and you start noticing things. Textures that don’t quite work. Lighting from nowhere. That same… soulless quality everything has. Like stock photos but somehow even more lifeless. The real kicker is they’re flooding every wallpaper site now. Search for a landscape and half the results are AI slop with six-fingered hikers and trees that melt into the sky. Some sites are basically AI galleries at this point. ## Sources That Actually Work ### Wallhaven [Wallhaven](https://wallhaven.cc) is the one. Massive library, filters for resolution and color and aspect ratio - the actual useful stuff. But the best part? They banned AI-generated art. Moderators noticed over half of new uploads were AI and just… said no. Some still slips through, but it’s the cleanest wallpaper site I’ve found. ### Photography Sites [Unsplash](https://unsplash.com) isn’t technically a wallpaper site, but I don’t care. Professional photographers uploading their work at full resolution - we’re talking 4K to 6K originals. Landscapes, architecture, macro stuff. You just have to find compositions that work as backgrounds, which is a bit of a hunt. But the quality is real. [Pexels](https://pexels.com) - same idea, less AI contamination because actual photographers upload here. ### The Minimal Stuff [Simple Desktops](https://simpledesktops.com) if you want flat, clean, nothing-going-on wallpapers. Extremely curated. Most images top out around 1440p though, and it barely gets updated anymore. [Basic Apple Guy](https://basicappleguy.com) is one person making hand-crafted minimal designs up to 6K. Apple-aesthetic, but works on anything. Small output since it’s a solo project. ### Reddit [r/wallpapers](https://reddit.com/r/wallpapers) and [r/wallpaper](https://reddit.com/r/wallpaper) - millions of members, community voting filters the garbage. Posts tagged with resolution so you know what you’re getting. But watch out - Reddit’s image hosting compresses everything. Always check the comments for the original source link. [r/unixporn](https://reddit.com/r/unixporn) is where it gets interesting. The ricing community picks wallpapers to match specific color schemes - Nord, Catppuccin, Gruvbox, whatever you’re running. Their Discord server has a dedicated wallpaper channel that’s basically a curated stream. If you’re into ricing at all, you probably already know this one. And [r/WQHD\_Wallpaper](https://reddit.com/r/WQHD_Wallpaper) enforces a minimum of 2560x1440. Small community, but everything posted is genuinely high-res. No exceptions. ### GitHub Repos This is the nerd route, but honestly it’s great. [D3Ext/aesthetic-wallpapers](https://github.com/D3Ext/aesthetic-wallpapers) - ricing-oriented, sourced from Wallhaven and r/unixporn. They built a web app for browsing. Resolution varies but the curation is solid. [makccr/wallpapers](https://github.com/makccr/wallpapers) targets 4K and above specifically - one person, consistent taste, `git clone` and done. Then there’s [BitterSweetcandyshop/wallpapers](https://github.com/BitterSweetcandyshop/wallpapers) which is just a straight archive of the r/unixporn Discord wallpaper channel. About 2GB. No web UI, you clone and browse locally. Kind of annoying, but worth it if you’re into ricing. ## What to Avoid WallpaperAccess, WallpaperSafari, WallpaperCave, 4kwallpapers.com - all the same thing. SEO scraper farms. Rehosted images at reduced quality, ads everywhere, resolutions they don’t actually deliver. If the site name sounds like someone asked ChatGPT for a wallpaper domain, close the tab. ## TL;DR [Wallhaven](https://wallhaven.cc) for the biggest curated library with AI art banned. [Unsplash](https://unsplash.com) for real photography at actual high resolution. [r/unixporn](https://reddit.com/r/unixporn) + Discord for ricing wallpapers. GitHub repos for bulk downloads. Avoid anything that looks like it exists to rank on Google. This post is part of the **Linux** topic hub. [Explore all Linux guides →](/topics/linux/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&title=Where%20to%20Actually%20Find%20Good%20Wallpapers "Share on Reddit")[](https://bsky.app/intent/compose?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Threads")[](https://mastodon.social/share?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality. "Share on Telegram")[](https://wa.me/?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share via WhatsApp") ← Previous [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/ "Ricing Hyprland with Claude Code CLI") Next → [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/ "I Replaced Nginx Proxy Manager with Traefik") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## We got lost in AI URL: https://hmmr.online/posts/we-got-lost/ We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done. # We got lost in AI May 19, 2026 · 5 min read · 143 views [#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/) [Share](#post-share) * * * ![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp) Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/) ## I am done Okay, this is a different kind of post. In 2022 when ChatGPT was first released to the public I was really excited. I told my friends this technology would change the world similar to how the steam engine changed the world. I felt like a prophet, but in hindsight that was probably not that difficult. But somehow we as humanity took a wrong turn. Instead of helping us at our creative work and using AI as a tool, people and companies use it to replace all human creativity. Myself included. But I don’t want this anymore and it stops now. ### I miss the pre-AI days In the age before AI, solving a difficult problem could be a real challenge, sometimes annoying and took a lot of time. But now that Claude Code can finish a project in a day or two it becomes obvious to me that it wasn’t always about finishing a project but more about enjoying the journey. AI takes that completely away. Sure, even with AI, if you want the finished project to be usable you need to invest a lot of time in the planning of the architecture and the prompts. But it is not the same. While vibe coding you never get to know your code base the way you did while doing it the regular way. While working on a project I could navigate the codebase blind. I knew how everything worked and where everything was located. In a vibe coded project not so much. ### The problem is not AI itself It’s the hype around “Agentic”-AI. In the beginning I used AI as a tool. To help me when I got stuck for a long time or to do the tedious parts which wasn’t fun. That was a great time. AI was useful but not yet that good to do all the work for you. I remember the first time I tried Copilot in VS Code. It started with autocomplete in the editor, which even back then I found to be more annoying than useful, and later the agent mode. It was like watching magic. The code it could take hours to write myself just appeared and most of the time just worked. Wow. Except I never actually read the code. The only criteria I had was if the code works or not. Now that I decided to quit vibe coding I started to look closer at the results and I was surprised how bad it could get. Sometimes it’s fine but most of the times it’s a burning pile of trash. ### The good ol’ days While reading this back after I wrote it, I feel like I sound really old. The “back in the days everything was better” kind. I never thought it would come to this. I am now learning that my old life motto “new is always better” does not always apply. The way that everyone is now using AI is terrifying. Not everyone is a programmer, or an artist, or a writer. But with AI everyone now thinks they are. This needs to stop. This development kills our individuality and as a result everything starts to look the same, read the same, sound the same. ### Does this mean I will stop using AI? Okay look. AI has its legitimate place and use cases. It should be used again as a tool for embracing your own creativity again. And that is what I want to do again. I want to do the creative part again: the coding, writing these blog posts, the research for learning a new skill. I want to use AI to assist me with these things. Help me find a bug I am struggling to fix, review my finished article I wrote myself, guiding me while learning. It should serve me, not the other way around. Okay rant is over. But do you want to know what the worst part is: even though I recognized the importance from day one, I didn’t buy any NVIDIA stock. fml ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp") ← Previous [Blog Updates #1](/posts/blog-updates-1/ "Blog Updates #1") Next → [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/ "Self-Hosting a Forgejo Runner for Codeberg Actions") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Why I Switched from Hugo to Astro URL: https://hmmr.online/posts/why-astro-not-hugo/ I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape. # Why I Switched from Hugo to Astro July 15, 2026 · 7 min read · 559 views [#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/) [Share](#post-share) * * * ![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp) On this page * [I Still Love Hugo](#i-still-love-hugo) * [Don’t Let Your Dreams Be Dreams](#dont-let-your-dreams-be-dreams) * [Astro Islands Sounded Perfect. I’m Not Using Them.](#astro-islands-sounded-perfect-im-not-using-them) * [The Feature That Actually Sold Me: Build-Time TypeScript](#the-feature-that-actually-sold-me-build-time-typescript) * [What Else Changed](#what-else-changed) * [So, Was Hugo the Wrong Choice?](#so-was-hugo-the-wrong-choice) Table of contents * [I Still Love Hugo](#i-still-love-hugo) * [Don’t Let Your Dreams Be Dreams](#dont-let-your-dreams-be-dreams) * [Astro Islands Sounded Perfect. I’m Not Using Them.](#astro-islands-sounded-perfect-im-not-using-them) * [The Feature That Actually Sold Me: Build-Time TypeScript](#the-feature-that-actually-sold-me-build-time-typescript) * [What Else Changed](#what-else-changed) * [So, Was Hugo the Wrong Choice?](#so-was-hugo-the-wrong-choice) ## I Still Love Hugo That hasn’t changed. One binary that eats Markdown and spits out static HTML. No runtime, no database, no node\_modules folder with the gravitational pull of a small moon. It can’t get any more minimal, and [I wrote a whole love letter about it](/posts/why-hugo-not-wordpress/) after escaping WordPress. But the thing that makes Hugo beautiful is the same thing that started to bug me. Everything is static. Radically static. The moment you want anything dynamic, Hugo forces you to think outside the box. For a pure static site, that’s fine. But if you’re like me and want a website that’s compliant with German law, you need a second contact method next to your email address. A spare phone number or a contact form, basically. I don’t have a spare phone number lying around, so contact form it was. I [got one working on the Hugo site](/posts/blog-updates-1/), but it wasn’t satisfying. The whole time it felt like I was making Hugo do something it was never designed to do. I might also just be a little delulu. Either way, the question was on the table: is Hugo really the right choice for me? ## Don’t Let Your Dreams Be Dreams Back in the WordPress post I wrote that everything WordPress hands you for free, “I can duct-tape onto Hugo if I care enough”. Still holds up. The contact form is living proof. So is the duct tape. Then I wanted a view counter on my posts, so I could build a top-posts section from real numbers. The numbers already exist. My self-hosted [Umami](https://umami.is) instance ([took a closer look at v3.1.0 here](/posts/umami-v3-1-0-review/)) tracks every pageview. The problem is getting them onto pages that are built once and then never change. My first idea: a script that runs before the Hugo build, pulls the views from the Umami API and writes them into the frontmatter of every post. Would work. Felt wrong. So instead I added a views field to my frontmatter and typed the numbers in by hand. With a handful of posts that’s fine. It’s not fine. That’s me being a human cron job. So I went full [Shia LaBeouf](https://www.youtube.com/watch?v=ZXsQAXx_ao0). Just do it. Don’t let your dreams be dreams. I sat down to finally build that view counter properly. And right before I started, I read about [Astro](https://astro.build) and its islands. ## Astro Islands Sounded Perfect. I’m Not Using Them. [Islands](https://docs.astro.build/en/concepts/islands/) are Astro’s headline feature: the page stays static HTML, and you drop small interactive components into it exactly where you need them. A view-counter island on every post, pulling fresh numbers from Umami, while everything around it stays static. That’s my use case, word for word. On paper. The more I read into Astro, the more islands felt like overkill for what I wanted. An island with live view counts means shipping JavaScript and having every visitor’s browser ask my server for a number that changes maybe twice a day. Nobody needs that. So I made the most boring decision possible: no islands. The site stays completely static, same as with Hugo. Which had a nice side effect: the static HTML coming out of Astro drops into my setup exactly where the static HTML out of Hugo used to be. Nothing downstream even noticed the switch. Maybe I’ll revisit islands later. For now the view counter ships zero JavaScript. ## The Feature That Actually Sold Me: Build-Time TypeScript On every Astro page you can write code that runs at build time. And it’s not some templating language. It’s plain TypeScript. Sit with that for a second. `{{ range where .Pages "Type" "posts" }}` versus a normal `for` loop in a language my editor actually understands. Go templates are cursed. I said that when I switched to Hugo and I stand by it today. So the view counter is now just a small TypeScript module. It logs into the Umami API, grabs the pageviews per post and hands them over. My Astro pages import it, call it at build time, and the numbers get baked straight into the HTML. The site rebuilds once a day and pulls fresh numbers on every build, so the counts are never more than a day old. For a top-posts section on a blog, that might as well be real time. Simple and effective. No island, no client-side JavaScript, no pre-build frontmatter surgery. ## What Else Changed The engine swap turned into a full rebuild. Of course it did. **Tailwind instead of PicoCSS.** I did a [Tailwind](https://tailwindcss.com) crash course and honestly tried to do the design myself. But I would never dare to call myself a frontend developer. Shame on me: I got a lot of help from Claude with the design. And yes, I hear it, [I wrote a whole rant about AI use](/posts/we-got-lost/). This is exactly the AI-as-a-tool use I meant there. Mostly. **A complete restyle.** The blog looks premium now. [PicoCSS](https://picocss.com) served me well, but there’s only so far “classless CSS framework” takes you. **Images go through Astro’s asset pipeline.** Optimized formats, responsive sizes, all generated at build time. I do nothing. **TOML to YAML.** Hugo frontmatter was TOML, Astro wants YAML. Converting every post gave me more of a headache than I’d like to admit. **A floating back-to-top button and a dark mode switch.** The little things. **A table of contents.** Fancy floating one next to the post on big screens, and on mobile it’s simply folded out of the way. **Search survived.** [Pagefind](https://pagefind.app) indexes the built HTML and doesn’t care which tool generated it. [Same idea as on Hugo](/posts/hugo-search-pagefind/), with one upgrade: back then the Pagefind binary was literally sitting in my git repo. Now npm pulls it in like any other dependency. Much more convenient. **And the Lighthouse score?** Still 100 across the board. Same as Hugo. Static HTML doesn’t get slower just because a different tool wrote it. ## So, Was Hugo the Wrong Choice? No. Hugo got me off WordPress, taught me how much I don’t need a database, and ran this blog without a single incident. If your site is truly static, use Hugo. It’s great. But I kept catching myself duct-taping around the static-ness. A contact form here, a hand-typed views field there, a pre-build script idea that still haunts me. Astro keeps everything I loved about Hugo: static files, boring hosting, no moving parts in production. And it replaces the part I was fighting with. Instead of Go templates and workarounds I now write plain TypeScript at build time. Is Hugo really the right choice for me? It was. It isn’t anymore. And that’s fine. This post is part of the **Hugo** topic hub. [Explore all Hugo guides →](/topics/hugo/) ![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp) Written by Alexander Hammer Software developer. Arch Linux. Self-hosted everything. [About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer) Share this post [](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp") ← Previous [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/ "Self-Hosting a Forgejo Runner for Codeberg Actions") Next → [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/ "Sidekick: A Claude Code Skill Against Vibe Coding") [← Back to the Blog](/posts/) ## Popular Posts 1. #1 ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) 3164 views · [Read](/posts/umami-v3-1-0-review/) 2. #2 ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) 559 views · [Read](/posts/why-astro-not-hugo/) 3. #3 ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) 543 views · [Read](/posts/why-hugo-not-wordpress/) 4. #4 ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) 144 views · [Read](/posts/hyprland-claude-code/) 5. #5 ### [We got lost in AI](/posts/we-got-lost/) 143 views · [Read](/posts/we-got-lost/) × --- ## Why I Switched from WordPress to Hugo URL: https://hmmr.online/posts/why-hugo-not-wordpress/ I used WordPress for years before switching to Hugo. Static HTML, no database, no plugins, 100/100 Lighthouse. Here is why I am not going back. # Why I Switched from WordPress to Hugo April 5, 2026 · 13 min read · 543 views [#Hugo](/topics/hugo/) [#WordPress](/topics/wordpress/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/) [Share](#post-share) * * * ![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_Z2sRgdy.webp) [Image AI generated](/ai-disclaimer/) On this page * [I Just Want to Put Text on the Internet](#i-just-want-to-put-text-on-the-internet) * [I Used to Love WordPress. That’s the Sad Part.](#i-used-to-love-wordpress-thats-the-sad-part) * [Hugo: A Static Site Generator That Does Basically Nothing](#hugo-a-static-site-generator-that-does-basically-nothing) * [Hugo Performance: 100/100 Lighthouse and I Barely Tried](#hugo-performance-100100-lighthouse-and-i-barely-tried) * [Hugo’s Learning Curve Will Humble You](#hugos-learning-curve-will-humble-you) * [Building a Custom Hugo Theme Because Every Other One Sucked](#building-a-custom-hugo-theme-because-every-other-one-sucked) * [WordPress Security vs a Static Site](#wordpress-security-vs-a-static-site) * [What Hugo Can’t Do (That WordPress Can)](#what-hugo-cant-do-that-wordpress-can) * [Hugo vs WordPress: Who Should Switch](#hugo-vs-wordpress-who-should-switch) * [TL;DR](#tldr) Table of contents * [I Just Want to Put Text on the Internet](#i-just-want-to-put-text-on-the-internet) * [I Used to Love WordPress. That’s the Sad Part.](#i-used-to-love-wordpress-thats-the-sad-part) * [Hugo: A Static Site Generator That Does Basically Nothing](#hugo-a-static-site-generator-that-does-basically-nothing) * [Hugo Performance: 100/100 Lighthouse and I Barely Tried](#hugo-performance-100100-lighthouse-and-i-barely-tried) * [Hugo’s Learning Curve Will Humble You](#hugos-learning-curve-will-humble-you) * [Building a Custom Hugo Theme Because Every Other One Sucked](#building-a-custom-hugo-theme-because-every-other-one-sucked) * [WordPress Security vs a Static Site](#wordpress-security-vs-a-static-site) * [What Hugo Can’t Do (That WordPress Can)](#what-hugo-cant-do-that-wordpress-can) * [Hugo vs WordPress: Who Should Switch](#hugo-vs-wordpress-who-should-switch) * [TL;DR](#tldr) ## I Just Want to Put Text on the Internet That’s it. That’s the whole requirement. I write things, I want them on a website. Markdown in, HTML out. After years of WordPress slowly losing its mind, I switched to [Hugo](https://gohugo.io), a static site generator that starts with exactly that and lets you bolt on the rest yourself. WordPress heard “simple” and said hold on, let me spin up a MySQL database, a PHP runtime, an admin panel with a login page, a REST API, a block editor nobody wanted, a cron system, a media library, and, oh you’ll love this, a built-in emoji script. `wp-emoji-release.min.js`. Ships on every single page. Every. Page. I write blog posts about Docker containers. I do not need browser-side emoji rendering. WordPress ships it anyway. ## I Used to Love WordPress. That’s the Sad Part. WordPress was my go-to for like a decade. And back then? It ruled. Install it, pick a theme, write posts. The admin panel was clean. The editor was a text box. You typed words into it. Revolutionary concept. That WordPress is dead. Somewhere around 2018 someone at Automattic decided WordPress needed to be Squarespace and Shopify and Salesforce all at once. The classic editor got ripped out and replaced by [Gutenberg](https://wordpress.org/gutenberg/), a block editor that solves a problem nobody had. Want to write a paragraph? Drag a block. Want an image? Different block. Want to just type words into a text box like you’ve been doing for fifteen years? Get absolutely wrecked, here’s blocks. I tried to like Gutenberg. I really did. I gave it months. It’s awful. It turns “write a blog post” into “assemble a blog post from Lego bricks while the UI fights you.” I don’t want to drag and drop my paragraphs. I want to type. And the plugins. Oh god, the plugins. Everything is freemium now. Everything. Install a contact form plugin, immediately get three nag banners about the Pro version. Install [Yoast](https://yoast.com), get a dashboard that looks like the cockpit of a 747 with half the instruments locked behind a paywall. Install a gallery plugin, get upsold on “premium templates” and “priority support” and a newsletter you never signed up for. I ran a WordPress site for a small project last year. The dashboard had more notifications than my phone. Update this, renew that, your PHP version is outdated, this plugin conflicts with that plugin, would you like to connect to Jetpack, would you like to try the AI writing assistant, would you like to upgrade to Premium Plus Pro Business Enterprise. No. I would like to write a blog post. That used to be what this thing was for. Remember? ## Hugo: A Static Site Generator That Does Basically Nothing Hugo takes Markdown files and spits out static HTML. No database. No PHP. No server-side anything. Just… files. On a disk. [Nginx](https://nginx.org) points at them. That’s it. That’s the product. The build for this entire site takes under a second. I [run Hugo in a Docker container](/posts/hugo-docker-container/) because I’m that kind of person, and the site is live before I can switch browser tabs. WordPress sites also load. Eventually. If the cache plugin is cooperating. And the optimization plugin isn’t in a fistfight with the security plugin. And nobody pushed an update that broke [WooCommerce](https://woocommerce.com) even though you don’t have a shop and never had a shop, you just installed it in 2021 “just in case” and now it’s load-bearing somehow. We’ve all been there. Don’t lie to me. ## Hugo Performance: 100/100 Lighthouse and I Barely Tried This site scores 100 across the board on [Google Lighthouse](https://developer.chrome.com/docs/lighthouse). Performance, accessibility, best practices, SEO. All hundreds. I need you to understand: this is not because I’m some frontend god. I am not. This is because there is _nothing here_. No jQuery from 2014. No render-blocking plugin CSS. No admin bar leaking into production because you were logged in and didn’t notice for a week. No `wp-emoji-release.min.js`. I will keep bringing that up. It haunts me. Static HTML is fast because there is nothing to be slow. You can’t have a slow page if the page is just text and a couple of images. You can also get good Lighthouse scores with WordPress. You just need WP Super Cache or W3 Total Cache or LiteSpeed Cache (pick one, pray), plus Autoptimize for the CSS and JS, plus ShortPixel or Imagify for images, plus a lazy-loading plugin unless your theme already does it but probably wrong, plus probably a CDN, and then you spend a Saturday configuring all of that. Two weeks later a WordPress update breaks one plugin and your scores crater and you don’t notice until someone on Twitter tells you your site loads slower than their grandma’s dial-up. But yeah. Totally the same thing as just having HTML files. ## Hugo’s Learning Curve Will Humble You Okay look. Hugo is not easy. I’m not going to sugarcoat this. [Go templates](https://pkg.go.dev/text/template) are cursed. Who looked at `{{ range where .Pages "Type" "posts" }}` and thought yeah, that’s readable, ship it. The syntax looks like someone took a perfectly normal for-loop, ran it through a blender, and served whatever came out. Half the time you’re just guessing where the curly braces go and hoping the error message is useful. It won’t be. I wasted an entire evening trying to figure out why my tags page was blank. No content. No errors. No warnings. Just a white page, radiating smugness. Turns out I had the taxonomy config wrong. One line. One stupid line in `hugo.toml` and the whole thing just silently decided not to work. And the docs. The [Hugo docs](https://gohugo.io/documentation/) are… they exist. They technically contain the information you need. But reading them feels like looking up a word in the dictionary and the definition uses four other words you also need to look up. Technically correct. Completely useless when you’re debugging at midnight. But after about a week of suffering, it clicks. You stop fighting Go templates and start thinking in partials and base layouts, and suddenly it’s just text files all the way down. No surprises. No “WordPress auto-updated at 3 AM and now your header font is Comic Sans and your contact form emails go to the void.” That specific thing hasn’t happened to me. But I’ve seen things on Reddit that would make you cry. ## Building a Custom Hugo Theme Because Every Other One Sucked Every [Hugo theme](https://themes.gohugo.io/) on the internet falls into one of two categories: 1. So minimal it’s basically a `
` tag with pretensions
2.  Has a `params.toml` longer than the complete works of Shakespeare

The popular ones are insane. Thirty config options for the footer alone. A “social” section with slots for your Mastodon, your Bluesky, your LinkedIn, your GitHub, your YouTube, your Twitch, your MySpace. A dark mode toggle that breaks if you also enable “custom colors.” Documentation that says “see example site” and the example site uses every feature at once so you can’t tell what does what.

So I built my own. Took a while. Involved a lot of swearing and one evening where I genuinely considered just writing raw HTML like it’s 2003.

But now every single line of markup on this site is something I put there on purpose. When something breaks (and stuff breaks, it’s software) I know exactly where the problem is because I wrote the problem.

With someone else’s theme you get to play detective in a codebase you’ve never seen. Seven partial files, three of which seem to render the post title, and the bug is always in the one you checked last.

## WordPress Security vs a Static Site

WordPress gets hacked. A lot. Not because the core software is garbage, but because it’s the biggest target on the internet, it runs PHP, and every WordPress site on earth has at least four plugins from developers who stopped answering GitHub issues in 2019.

There’s an entire industry built around WordPress security. [Wordfence](https://www.wordfence.com), [Sucuri](https://sucuri.net), iThemes Security, All In One WP Security. Plugins to protect you from the vulnerabilities introduced by your other plugins. It’s honestly kind of beautiful. A perfectly self-sustaining ecosystem of problems and solutions to those problems.

You know what the attack surface of my Hugo site is?

Files. On a server. Read-only.

No admin panel to brute-force. No `xmlrpc.php` hanging out like a neon sign that says “hack me.” No database to inject into. No `wp-login.php` getting hammered by bots from every corner of the internet every fourteen minutes around the clock forever.

Some bot still tries to hit `/wp-admin` on this site like three times a day. I check the access logs sometimes just for entertainment. Keep trying, buddy.

## What Hugo Can’t Do (That WordPress Can)

Look, I’ll give WordPress this: out of the box, it wins on features. Contact forms, comments, search, newsletters, membership areas. Install a plugin, done. Five minutes. Works. With Hugo you get a folder of HTML files and a pat on the back.

But I’m stubborn and I will die on this hill.

Search was the first thing I tackled. Everyone says “you can’t have search on a static site” like it’s a law of physics. Turns out you can. I [added Pagefind to this blog](/posts/hugo-search-pagefind/) and it cost me an evening, a lot of swearing, and one moment where I questioned why I didn’t just use WordPress. [Pagefind](https://pagefind.app) crawls your HTML after Hugo builds, creates a chunked index, ships its own UI. No backend. No JSON templates. No shipping your entire blog as a fat JavaScript blob to every visitor. It just works, and it works better than whatever search plugin WordPress would’ve given me after three upsell banners.

Contact forms? I’ll figure something out. Comments? Eventually. RSS? Already there, Hugo does that natively. The point is: everything WordPress hands you on a silver platter, I can duct-tape onto Hugo if I care enough. And apparently I care enough. I’ve been adding features to a four-post blog like it’s my full-time job.

WordPress gives you everything on day one and then slowly buries you in plugin updates and freemium nags. Hugo gives you nothing on day one and then you spend your evenings building it yourself and somehow enjoying it. Pick your poison.

## Hugo vs WordPress: Who Should Switch

If you like the terminal, write in a text editor, and don’t need seventeen dashboard widgets telling you how many comments are pending moderation on a blog that gets four visitors a day… Hugo.

If the terminal makes you nervous or you need a blog running in ten minutes or you want to install WooCommerce “just in case”… WordPress. It’s fine. It works. It’s just a lot.

But if you’ve ever opened your WordPress dashboard, stared at the forty-seven menu items, the six update notifications, the banner begging you to upgrade to Business Pro Plus Premium, the popup asking you to rate the plugin five stars, the Jetpack prompt, the “your site is running an outdated version of PHP” warning you’ve been ignoring for eight months…

And thought “I just want to write a blog post.”

Yeah. I know.

## TL;DR

Hugo turns Markdown into static HTML. No database, no PHP, no plugin circus. This site hits 100/100 on Lighthouse because there’s barely anything to load. The learning curve is steep and will make you question your career choices for about a week. Every existing theme annoyed me so I built my own. WordPress does more out of the box, but I’m duct-taping features onto Hugo one evening at a time and enjoying every stupid minute of it. WordPress used to be the obvious choice. Then it got Gutenberg and freemium brain rot. I just want to put text on the internet. Hugo lets me do that without asking me to upgrade to Pro.

This post is part of the **Hugo** topic hub. [Explore all Hugo guides →](/topics/hugo/)

![Avatar of Alexander Hammer](/_astro/avatar.3RRzZobR_ZTAxDe.webp)

Written by

Alexander Hammer

Software developer. Arch Linux. Self-hosted everything.

[About me →](/about/) [ZanderHammer](https://codeberg.org/ZanderHammer)

Share this post

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&title=Why%20I%20Switched%20from%20WordPress%20to%20Hugo "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share via WhatsApp")

← Previous [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/ "Adding Search to Hugo with Pagefind")

Next → [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/ "Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look")

[← Back to the Blog](/posts/)

## Popular Posts

1.  #1
    
    ### [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/)
    
    3164 views · [Read](/posts/umami-v3-1-0-review/)
    
2.  #2
    
    ### [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/)
    
    559 views · [Read](/posts/why-astro-not-hugo/)
    
3.  #3
    
    ### [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/)
    
    543 views · [Read](/posts/why-hugo-not-wordpress/)
    
4.  #4
    
    ### [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/)
    
    144 views · [Read](/posts/hyprland-claude-code/)
    
5.  #5
    
    ### [We got lost in AI](/posts/we-got-lost/)
    
    143 views · [Read](/posts/we-got-lost/)
    

×

---

## Privacy Policy

URL: https://hmmr.online/privacy/

How hmmr.online handles your data. Short version: as little as technically necessary.

# Privacy Policy

Last updated: August 13, 2026

* * *

## The Short Version

This blog is hosted on a server in Germany provided by netcup GmbH and delivered to you through Bunny.net’s content delivery network, which caches pages closer to you so the site loads faster, and which, as a side effect, sees somewhat more connection data per request than a plain web server would (details below). No cookies. No third-party scripts. No Google Analytics, no Facebook pixel, no ad networks, nothing of the sort. Beyond that CDN hop, the only data involved is what your browser sends to any web server when you visit a page, plus privacy-friendly visitor statistics through a self-hosted analytics tool that doesn’t track you.

This isn’t accidental. I run this blog precisely because I don’t want to feed the surveillance machine. No external fonts pulled from Google, no embedded YouTube videos that drop tracking cookies before you’ve even pressed play, no ad tech riding along with the CDN. If a feature needs me to share your data with someone else beyond what it takes to actually deliver the page, I don’t add the feature.

If you just wanted the gist, that’s it. The rest is the legally required detail.

## Applicable Law

Processing of personal data on this site is governed by the GDPR (Regulation (EU) 2016/679) and the law of the Federal Republic of Germany, including the BDSG and the TDDDG.

## Who’s Responsible

The controller for data processing under the GDPR is:

hmmr – Alexander Hammer  
c/o Online-Impressum #8062  
Europaring 90  
53757 St. Augustin  
Germany

Email: [blog@hmmr.online](mailto:blog@hmmr.online)

If you have any questions about your data, this is who you talk to.

A designated data protection officer is not required (§ 38 BDSG — fewer than 20 persons engaged in automated processing of personal data).

## Hosting

This website is hosted by netcup GmbH, Daimlerstraße 25, 76185 Karlsruhe, Germany. Because Bunny’s CDN caches most pages (see “Content Delivery Network” below), most visits are served entirely from Bunny’s edge and never reach this server. When a request does reach it, netcup processes connection data (including your IP address) as part of delivering the website to you.

For more information, see netcup’s privacy policy:  
[https://www.netcup.de/kontakt/datenschutzerklaerung.html](https://www.netcup.de/kontakt/datenschutzerklaerung.html)

A data processing agreement under Article 28 GDPR has been concluded with netcup GmbH.

**Legal basis:** Article 6(1)(f) GDPR — legitimate interest in reliable and secure hosting of this website.

## Content Delivery Network (CDN)

This site is delivered to you through Bunny.net, a content delivery network operated by BunnyWay d.o.o., Dunajska cesta 165, 1000 Ljubljana, Slovenia. Instead of every request travelling all the way to the server in Germany, Bunny caches and serves pages from a location closer to you, which makes the site load faster.

To do that, Bunny’s edge servers process more than a plain web server log would: your IP address, the URL requested, timestamp, HTTP status code, your browser’s user agent and referrer, a JA4 TLS client fingerprint, your network’s ASN/organization and country, cache status, bytes transferred, a request ID, and which edge location served you. Raw request data sits in edge memory for roughly 20–30 seconds before being cleared and sent on to Bunny’s central log processing (based in the EU). IP addresses are anonymized by default; I haven’t changed that setting or enabled Bunny’s permanent log storage.

Because Bunny’s edge servers terminate the TLS connection on my behalf (see “TLS Encryption” below), Bunny technically has access to the decrypted content of each request, not just the connection metadata above, for the moment it takes to route it onward.

I’ve left Bunny’s global edge network enabled rather than restricting it to EU-only locations, so delivering this site can involve processing your connection data at edge locations outside the EU/EEA. That onward transfer is Bunny’s own, to the data center and network providers behind its edge infrastructure, under contracts that oblige those providers to GDPR-level protections; Bunny doesn’t name those specific infrastructure providers, citing business confidentiality. (That’s separate from the published sub-processor list linked below, which covers support and business tools Bunny itself uses — customer support, messaging, and similar services. None of them are involved in delivering this site.) I rely on Bunny’s Article 28 data processing agreement for this rather than a separate transfer safeguard of my own.

**Why:** Faster, more reliable delivery of this site, and reduced load on the origin server.

**Legal basis:** Article 6(1)(f) GDPR — legitimate interest in fast and resilient delivery of the website.

**How long:** Request logs are retained for 3 days at Bunny before automatic deletion. I don’t have access to or store a separate copy of them.

For more information, see Bunny.net’s GDPR page and its (business, not infrastructure) sub-processor list: [https://bunny.net/gdpr/](https://bunny.net/gdpr/) [https://bunny.net/gdpr/sub-processors/](https://bunny.net/gdpr/sub-processors/)

## TLS Encryption

This site uses HTTPS/TLS encryption for security reasons and to protect the transmission of personal data and other confidential content. You can recognize an encrypted connection by the “https://” prefix and the lock icon in your browser’s address bar.

TLS protects your connection from being read or tampered with by anyone eavesdropping on the network in between. It doesn’t extend past the point where it’s terminated: Bunny.net’s edge servers terminate TLS on my behalf as part of delivering this site (see “Content Delivery Network” above), so Bunny, as a processor, technically has access to the decrypted content passing through its edge, the same way any CDN or reverse proxy would.

## What Happens When You Visit a Page

### Server Log Files

Every web server logs incoming requests. Mine does too, using the visitor IP that Bunny’s CDN forwards for this purpose, not Bunny’s own edge IP. For each page view, the following gets written to a log file:

*   Your IP address
*   Date and time of the request
*   The URL you requested
*   HTTP status code and amount of data transferred
*   Your browser’s user agent string
*   The referring URL, if your browser sent one

**Why:** These logs are technically necessary to deliver the website, ensure system security, and troubleshoot errors.

**Legal basis:** Article 6(1)(f) GDPR — legitimate interest in operating a working, secure website.

**How long:** Log files are kept for 7 days, then automatically deleted.

I don’t combine these logs with any other data. I don’t try to identify you from them.

### Analytics with Umami

I use Umami, a privacy-focused analytics tool I run on my own server hosted by netcup GmbH in Germany. No analytics data leaves my infrastructure.

Umami doesn’t set cookies and no persistent identifiers are stored on your device. Your IP address is processed only transiently to derive your approximate geographic region, then immediately discarded. It is not stored. A daily-rotating hash is derived from your IP, user agent, and the current date — this hash is discarded after 24 hours.

The analytics setup is intentionally configured in a privacy-preserving way and is not used to identify or track individual users across sessions or across different websites.

What Umami records:

*   The page you visited
*   Approximate country and region (derived from IP, then discarded)
*   Your browser and operating system
*   Referring page

Notably absent: screen dimensions and language settings. The analytics script is configured to not read any device properties via JavaScript. All data comes from HTTP headers (URL, referrer, user agent) or server-side IP geolocation — not from active JavaScript reads.

**Why:** I want to know which posts people actually read. That’s it.

**Legal basis:** Article 6(1)(f) GDPR — legitimate interest in understanding which content works. No consent is required under § 25 TDDDG because the script does not actively access the end device: no device properties are read via JavaScript, no data is written to or read from storage on your device.

## Contact Form

This website includes a contact form that allows you to send me a message directly. When you use the contact form, the following data is collected:

*   Your name
*   Your email address
*   Your message

Your submission reaches my server the same way any request to this site does, through Bunny.net’s CDN (see “Content Delivery Network” above) on the way in. Each leg of that path is TLS-encrypted, but Bunny terminates the connection first and, as a processor, technically has access to the decrypted form data (your name, email address, and message) for the moment it takes to pass it on, the same way it does for the rest of the site (see “TLS Encryption” above). From there it’s processed on my server and forwarded to me via my email server, both hosted by netcup GmbH in Germany. The data is used exclusively to respond to your inquiry.

**Legal basis:** Article 6(1)(f) GDPR — legitimate interest in providing a way to get in touch, or Article 6(1)(b) GDPR if your inquiry relates to a contractual matter.

**How long:** Contact form submissions are deleted within 3 months after the conversation has concluded, unless a longer retention period is required by law.

I don’t share your contact form data with third parties.

## What I Don’t Do

*   I don’t use cookies
*   I don’t load fonts, scripts, or images from Google, Meta, or any other third party
*   I don’t have ads
*   I don’t have social media share buttons that track you
*   I don’t have a newsletter
*   I don’t do automated decision-making or profiling (Art. 22 GDPR)

## Your Rights

Under the GDPR, you have the following rights regarding your personal data. To exercise any of them, email me at [blog@hmmr.online](mailto:blog@hmmr.online) — no formal request needed, just send a message.

*   **Right of access** (Art. 15 GDPR) — you can ask me whether I process data about you, and if so, get a copy of that data along with information on what I do with it.
*   **Right to rectification** (Art. 16 GDPR) — if any data I hold about you is wrong or incomplete, you can ask me to correct or complete it.
*   **Right to erasure** (Art. 17 GDPR) — also known as the “right to be forgotten.” You can ask me to delete your data, and I will, unless I’m legally required to keep it.
*   **Right to restriction of processing** (Art. 18 GDPR) — instead of deletion, you can ask me to just stop using the data while we sort something out (e.g. while you contest its accuracy).
*   **Right to data portability** (Art. 20 GDPR) — you can ask for a copy of your data in a structured, machine-readable format, so you can take it elsewhere.
*   **Right to object** (Art. 21 GDPR) — you can object to processing based on legitimate interest (which is most of what happens here: logs, analytics, contact form replies). See the notice below.

### Right to Object (Art. 21 GDPR)

**You have the right to object, on grounds relating to your particular situation, at any time to processing of personal data concerning you which is based on legitimate interest (Article 6(1)(f) GDPR). If you object, I will no longer process the personal data unless I can demonstrate compelling legitimate grounds that override your interests, rights and freedoms, or for the establishment, exercise or defence of legal claims.**

To object, email [blog@hmmr.online](mailto:blog@hmmr.online) with a brief description of your situation.

### Right to Lodge a Complaint

Under Art. 77 GDPR, you also have the right to lodge a complaint with a supervisory authority. The authority responsible for me is:

Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen (LDI NRW)  
Kavalleriestraße 2-4  
40213 Düsseldorf  
Germany

Phone: +49 211 38424-0  
Email: [poststelle@ldi.nrw.de](mailto:poststelle@ldi.nrw.de)  
Web: [https://www.ldi.nrw.de](https://www.ldi.nrw.de)

## External Links

This blog may contain links to external websites. When you follow such a link, you leave this website and the privacy policy of the respective external site applies instead.

I have no control over how external websites process personal data and cannot continuously monitor their content or privacy practices. If you notice problematic or unlawful content on a linked site, feel free to contact me.

## Changes to This Policy

If I add features that change how data gets processed (comments, additional forms, etc.), I’ll update this page accordingly. The current version published here always applies.

---

## Search

URL: https://hmmr.online/search/

Search all posts on this blog.

# Search

Search all posts on this blog.

---

## Sitemap

URL: https://hmmr.online/sitemap/

Every post, all on one page.

# Sitemap

Every post, all on one page.

* * *

## 2026

*   [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/) Jul 20
*   [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/) Jul 15
*   [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/) May 22
*   [We got lost in AI](/posts/we-got-lost/) May 19
*   [Blog Updates #1](/posts/blog-updates-1/) May 8
*   [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/) Apr 24
*   [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/) Apr 5
*   [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/) Apr 4
*   [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/) Apr 2
*   [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/) Mar 10
*   [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/) Jan 6

## 2025

*   [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/) Dec 10

---

## #AI

URL: https://hmmr.online/topics/ai/

All posts about AI.

# #AI

2 Posts · [← All Topics](/topics/)

## [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/)

Jul 20, 2026 ·

[#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/)

 [![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp)](/posts/sidekick-skill/)

Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp")

[Read More →](/posts/sidekick-skill/)

## [We got lost in AI](/posts/we-got-lost/)

May 19, 2026 ·

[#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/)

 [![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp)](/posts/we-got-lost/)

Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/)

We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp")

[Read More →](/posts/we-got-lost/)

---

## #Analytics

URL: https://hmmr.online/topics/analytics/

All posts about Analytics.

# #Analytics

1 Post · [← All Topics](/topics/)

## [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/)

Apr 24, 2026 ·

[#Umami](/topics/umami/) [#Analytics](/topics/analytics/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [#Privacy](/topics/privacy/)

 [![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_Z2iEbi5.webp)](/posts/umami-v3-1-0-review/)

Umami v3.1.0 drops with Session Replay, custom Boards and Web Vitals. I updated my self-hosted instance and took it for a spin. Here's what actually works.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&title=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look "Share on Reddit")[](https://bsky.app/intent/compose?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Threads")[](https://mastodon.social/share?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works. "Share on Telegram")[](https://wa.me/?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share via WhatsApp")

[Read More →](/posts/umami-v3-1-0-review/)

---

## #Astro

URL: https://hmmr.online/topics/astro/

All posts about Astro.

# #Astro

1 Post · [← All Topics](/topics/)

## [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/)

Jul 15, 2026 ·

[#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp)](/posts/why-astro-not-hugo/)

I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp")

[Read More →](/posts/why-astro-not-hugo/)

---

## #ChatGPT

URL: https://hmmr.online/topics/chatgpt/

All posts about ChatGPT.

# #ChatGPT

1 Post · [← All Topics](/topics/)

## [We got lost in AI](/posts/we-got-lost/)

May 19, 2026 ·

[#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/)

 [![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp)](/posts/we-got-lost/)

Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/)

We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp")

[Read More →](/posts/we-got-lost/)

---

## #CI/CD

URL: https://hmmr.online/topics/cicd/

All posts about CI/CD.

# #CI/CD

1 Post · [← All Topics](/topics/)

## [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/)

May 22, 2026 ·

[#Codeberg](/topics/codeberg/) [#Forgejo](/topics/forgejo/) [#Docker](/topics/docker/) [#CI/CD](/topics/cicd/)

 [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_2s5POH.webp)](/posts/codeberg-forgejo-runner/)

Codeberg gives you Actions but limited runners. Here is how to host your own Forgejo runner in Docker and connect it.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&title=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions "Share on Reddit")[](https://bsky.app/intent/compose?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Threads")[](https://mastodon.social/share?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it. "Share on Telegram")[](https://wa.me/?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share via WhatsApp")

[Read More →](/posts/codeberg-forgejo-runner/)

---

## #Claude

URL: https://hmmr.online/topics/claude/

All posts about Claude.

# #Claude

3 Posts · [← All Topics](/topics/)

## [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/)

Jul 20, 2026 ·

[#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/)

 [![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp)](/posts/sidekick-skill/)

Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp")

[Read More →](/posts/sidekick-skill/)

## [We got lost in AI](/posts/we-got-lost/)

May 19, 2026 ·

[#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/)

 [![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp)](/posts/we-got-lost/)

Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/)

We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp")

[Read More →](/posts/we-got-lost/)

## [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/)

Jan 6, 2026 ·

[#Hyprland](/topics/hyprland/) [#Claude](/topics/claude/) [#Linux](/topics/linux/) [#Workflow](/topics/workflow/)

 [![Hyprland Desktop with Waybar](/_astro/hyprland-teaser.Cdw2bFv6_29nk4D.webp)](/posts/hyprland-claude-code/)

[Image AI generated](/ai-disclaimer/)

I used Claude Code CLI to rice my Hyprland desktop — Waybar, dotfiles, keybindings, the whole thing. Turns out AI makes configuring Linux way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&title=Ricing%20Hyprland%20with%20Claude%20Code%20CLI "Share on Reddit")[](https://bsky.app/intent/compose?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Threads")[](https://mastodon.social/share?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share via WhatsApp")

[Read More →](/posts/hyprland-claude-code/)

---

## #Codeberg

URL: https://hmmr.online/topics/codeberg/

All posts about Codeberg.

# #Codeberg

1 Post · [← All Topics](/topics/)

## [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/)

May 22, 2026 ·

[#Codeberg](/topics/codeberg/) [#Forgejo](/topics/forgejo/) [#Docker](/topics/docker/) [#CI/CD](/topics/cicd/)

 [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_2s5POH.webp)](/posts/codeberg-forgejo-runner/)

Codeberg gives you Actions but limited runners. Here is how to host your own Forgejo runner in Docker and connect it.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&title=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions "Share on Reddit")[](https://bsky.app/intent/compose?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Threads")[](https://mastodon.social/share?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it. "Share on Telegram")[](https://wa.me/?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share via WhatsApp")

[Read More →](/posts/codeberg-forgejo-runner/)

---

## #Coding

URL: https://hmmr.online/topics/coding/

All posts about Coding.

# #Coding

1 Post · [← All Topics](/topics/)

## [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/)

Jul 20, 2026 ·

[#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/)

 [![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp)](/posts/sidekick-skill/)

Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp")

[Read More →](/posts/sidekick-skill/)

---

## #DevOps

URL: https://hmmr.online/topics/devops/

All posts about DevOps.

# #DevOps

1 Post · [← All Topics](/topics/)

## [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/)

Dec 10, 2025 ·

[#Hugo](/topics/hugo/) [#Docker](/topics/docker/) [#Guide](/topics/guide/) [#DevOps](/topics/devops/)

 [![Neutraler Verlauf als Titelbild](/_astro/docker-teaser.BIxfPpXx_Z1gwKzy.webp)](/posts/hugo-docker-container/)

[Image AI generated](/ai-disclaimer/)

Why I run Hugo in a Docker container instead of installing it bare metal — cleaner builds, no version conflicts, and a dev workflow that just works.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&title=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide "Share on Reddit")[](https://bsky.app/intent/compose?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Threads")[](https://mastodon.social/share?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works. "Share on Telegram")[](https://wa.me/?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share via WhatsApp")

[Read More →](/posts/hugo-docker-container/)

---

## Docker

URL: https://hmmr.online/topics/docker/

Docker guides from a real self-hosted setup: Compose stacks, Traefik as reverse proxy, CI runners in containers, and why everything here runs in one.

![Docker logo](/_astro/docker-logo.cLFSuHxc_t0lC4.svg)

Topic

# Docker

Docker guides from a real self-hosted setup: Compose stacks, Traefik as reverse proxy, CI runners in containers, and why everything here runs in one.

5 Posts · Updated May 22, 2026 · [All Topics](/topics/)

[Start here](#start-here)

[Official site](https://www.docker.com) [Docs](https://docs.docker.com) [Source](https://github.com/moby/moby)

What

Container platform: apps packaged with everything they need

Language

Go

License

Apache 2.0 (Docker Engine)

Best for

Reproducible deployments and keeping your server tidy

Not for

Large-scale multi-node orchestration (Swarm exists, but that is really Kubernetes territory)

## Start here

New to this? Read these in order.

1.  1
    
    [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/)
    
    The gateway drug: run one tool in a container instead of installing it.
    
2.  2
    
    [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/)
    
    Put a reverse proxy in front so every container gets a domain and TLS.
    
3.  3
    
    [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/)
    
    Containers running containers: self-hosted CI for deploys.
    

## Posts about Docker

 [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_1MpPlG.webp)

### Self-Hosting a Forgejo Runner for Codeberg Actions

May 22, 2026](/posts/codeberg-forgejo-runner/) [![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_2nOwkw.webp)

### Blog Updates #1

May 8, 2026](/posts/blog-updates-1/) [![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_18D7nD.webp)

### Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look

Apr 24, 2026](/posts/umami-v3-1-0-review/) [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_Z1HFkiL.webp)

### I Replaced Nginx Proxy Manager with Traefik

Apr 2, 2026](/posts/traefik-reverse-proxy/) [![Neutraler Verlauf als Titelbild](/_astro/docker-teaser.BIxfPpXx_Z2llOdM.webp)

### Hugo in Docker: Benefits and Practical Guide

Dec 10, 2025](/posts/hugo-docker-container/)

More on Docker

Sooner or later, every project on this blog ends up in a container. The blog itself runs in one. The analytics run in one. Even the thing that builds the blog ran in one. Here is why that happened, and what it looks like in practice.

## Why Everything Here Runs in Containers

I don’t install software on my servers anymore. Not directly, anyway.

**Nothing clutters the system.** Every service lives in its own container with its own dependencies. No version conflicts, no leftover packages from something I tried once in 2023.

**Versions are pinned.** A container image is frozen. An update somewhere else can’t silently break my setup, and if a new version misbehaves, rolling back is one line in a Compose file.

**Everything is disposable.** Container breaks? Delete it, recreate it, done. The data lives in mounted volumes, the config lives in git.

That mindset started with the blog itself: I even ran my static site generator in a container instead of installing it, and [wrote up why that’s worth it](/posts/hugo-docker-container/) back when this site ran on Hugo.

## Compose Is Where It Clicks

Plain `docker run` commands are fine for trying something out. But the moment a service needs a network, volumes, and a second container, you want [Docker Compose](https://docs.docker.com/compose/). One YAML file describes the whole stack, and that file doubles as documentation. Six months later you don’t have to remember how you wired something up. It’s written down, in git, next to everything else.

My whole setup works that way. The front door is [Traefik as a reverse proxy](/posts/traefik-reverse-proxy/), which reads labels straight from my Compose files and routes traffic to the right container, TLS certificates included. New service means a few labels in the Compose file. That’s the entire onboarding.

Behind it: this blog in an nginx container, [self-hosted Umami analytics](/posts/umami-v3-1-0-review/), a contact-form gateway, and whatever else I’m currently playing with.

## Containers for CI Too

The pattern doesn’t stop at web services. When I wanted my blog to deploy itself, I [self-hosted a Forgejo runner for Codeberg Actions](/posts/codeberg-forgejo-runner/). The runner is a container that spins up more containers for each CI job. Turtles all the way down, and it works great.

## The Parts That Suck

Docker eats disk. Old images, dangling layers, build caches: if you never run `docker system prune`, your server will remind you eventually, at the worst possible moment.

Updates are on you. A container doesn’t update itself, and “just use latest” is how you get surprise breakage at 11 pm. Pin versions, update deliberately.

And the licensing story around Docker Desktop caused enough confusion that half the internet thinks Docker itself went paid. It didn’t. The engine, the CLI, Compose: all free and open source. On a Linux server none of the Desktop drama matters anyway.

None of this changes the verdict. Containers made my setup boring, in the best possible way. Things just run.

## More Topics

*    [![](/_astro/hugo-logo.CL5Lk52C_Z1A8euh.svg) Hugo](/topics/hugo/)
*   [Self-Hosting](/topics/self-hosting/)
*    [![](/_astro/linux-logo.C_7ld7wB_1vbXgs.svg) Linux](/topics/linux/)

---

## #Forgejo

URL: https://hmmr.online/topics/forgejo/

All posts about Forgejo.

# #Forgejo

1 Post · [← All Topics](/topics/)

## [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/)

May 22, 2026 ·

[#Codeberg](/topics/codeberg/) [#Forgejo](/topics/forgejo/) [#Docker](/topics/docker/) [#CI/CD](/topics/cicd/)

 [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_2s5POH.webp)](/posts/codeberg-forgejo-runner/)

Codeberg gives you Actions but limited runners. Here is how to host your own Forgejo runner in Docker and connect it.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&title=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions "Share on Reddit")[](https://bsky.app/intent/compose?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Threads")[](https://mastodon.social/share?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F&text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it. "Share on Telegram")[](https://wa.me/?text=Self-Hosting%20a%20Forgejo%20Runner%20for%20Codeberg%20Actions%0A%0ACodeberg%20gives%20you%20Actions%20but%20limited%20runners.%20Here%20is%20how%20to%20host%20your%20own%20Forgejo%20runner%20in%20Docker%20and%20connect%20it.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fcodeberg-forgejo-runner%2F "Share via WhatsApp")

[Read More →](/posts/codeberg-forgejo-runner/)

---

## #Guide

URL: https://hmmr.online/topics/guide/

All posts about Guide.

# #Guide

2 Posts · [← All Topics](/topics/)

## [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/)

Apr 4, 2026 ·

[#Hugo](/topics/hugo/) [#Pagefind](/topics/pagefind/) [#Search](/topics/search/) [#Guide](/topics/guide/)

 [![Screenshot of the search page on this blog, showing a search bar and results for "Docker".](/_astro/search-teaser.DLYSs_HW_Z2tFvhq.webp)](/posts/hugo-search-pagefind/)

[Image AI generated](/ai-disclaimer/)

How to add search to a Hugo static site with Pagefind. No backend, no JSON templates, no pain. Just one build command and twenty lines of code.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&title=Adding%20Search%20to%20Hugo%20with%20Pagefind "Share on Reddit")[](https://bsky.app/intent/compose?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Threads")[](https://mastodon.social/share?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code. "Share on Telegram")[](https://wa.me/?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share via WhatsApp")

[Read More →](/posts/hugo-search-pagefind/)

## [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/)

Dec 10, 2025 ·

[#Hugo](/topics/hugo/) [#Docker](/topics/docker/) [#Guide](/topics/guide/) [#DevOps](/topics/devops/)

 [![Neutraler Verlauf als Titelbild](/_astro/docker-teaser.BIxfPpXx_Z1gwKzy.webp)](/posts/hugo-docker-container/)

[Image AI generated](/ai-disclaimer/)

Why I run Hugo in a Docker container instead of installing it bare metal — cleaner builds, no version conflicts, and a dev workflow that just works.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&title=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide "Share on Reddit")[](https://bsky.app/intent/compose?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Threads")[](https://mastodon.social/share?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F&text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works. "Share on Telegram")[](https://wa.me/?text=Hugo%20in%20Docker%3A%20Benefits%20and%20Practical%20Guide%0A%0AWhy%20I%20run%20Hugo%20in%20a%20Docker%20container%20instead%20of%20installing%20it%20bare%20metal%20%E2%80%94%20cleaner%20builds%2C%20no%20version%20conflicts%2C%20and%20a%20dev%20workflow%20that%20just%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-docker-container%2F "Share via WhatsApp")

[Read More →](/posts/hugo-docker-container/)

---

## Hugo

URL: https://hmmr.online/topics/hugo/

Hands-on Hugo guides: running Hugo in Docker, adding search with Pagefind, and honest takes on when Hugo is the right tool and when it is not.

![Hugo logo](/_astro/hugo-logo.CL5Lk52C_Z1A8euh.svg)

Topic

# Hugo

Hands-on Hugo guides: running Hugo in Docker, adding search with Pagefind, and honest takes on when Hugo is the right tool and when it is not.

5 Posts · Updated Jul 15, 2026 · [All Topics](/topics/)

[Start here](#start-here)

[Official site](https://gohugo.io) [Docs](https://gohugo.io/documentation/) [Source](https://github.com/gohugoio/hugo)

What

Open-source static site generator

Language

Go (single binary, no runtime)

License

Apache 2.0

Best for

Blogs, docs, landing pages: sites that are pure content

Not for

Sites that need dynamic, server-side features

## Start here

New to this? Read these in order.

1.  1
    
    [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/)
    
    The why: what made me leave WordPress for a static generator.
    
2.  2
    
    [Hugo in Docker: Benefits and Practical Guide](/posts/hugo-docker-container/)
    
    Run Hugo in a container so it never touches your system.
    
3.  3
    
    [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/)
    
    Add real search to a static site with Pagefind.
    

## Posts about Hugo

 [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_Z1co73j.webp)

### Why I Switched from Hugo to Astro

Jul 15, 2026](/posts/why-astro-not-hugo/) [![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_2nOwkw.webp)

### Blog Updates #1

May 8, 2026](/posts/blog-updates-1/) [![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_e1EuS.webp)

### Why I Switched from WordPress to Hugo

Apr 5, 2026](/posts/why-hugo-not-wordpress/) [![Screenshot of the search page on this blog, showing a search bar and results for "Docker".](/_astro/search-teaser.DLYSs_HW_2waqHW.webp)

### Adding Search to Hugo with Pagefind

Apr 4, 2026](/posts/hugo-search-pagefind/) [![Neutraler Verlauf als Titelbild](/_astro/docker-teaser.BIxfPpXx_Z2llOdM.webp)

### Hugo in Docker: Benefits and Practical Guide

Dec 10, 2025](/posts/hugo-docker-container/)

More on Hugo

I ran this blog on Hugo for over a year before moving it to Astro, so none of what follows is theory. I built with it, broke it, deployed it, and I’d still recommend it. Depends on what you’re building, though.

## Why (and When) to Use Hugo

I came to Hugo after years of WordPress, and it fixed basically everything that made me leave: no plugins nagging about Pro versions, no database to back up, no admin panel to secure, no mystery JavaScript on every page. I wrote the full rant in [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/), including the emoji script that still haunts me.

Hugo is the right call when your site is content. Blogs, documentation, landing pages, portfolios. If “Markdown in, HTML out” describes your entire requirement, Hugo does exactly that and gets out of your way.

The performance story sells itself. This site scored 100/100 on Lighthouse across the board while I barely tried, because static HTML has nothing to be slow. No render-blocking plugin CSS, no jQuery from 2014. Nothing.

## Themes and Templating

Here’s where the honeymoon ends for most people. Hugo templates are Go templates, and Go templates are cursed. I said that when I switched to Hugo and I stand by it. `{{ range where .Pages "Type" "posts" }}` is not something a normal person writes on the first try.

The theme ecosystem softens this. There are hundreds of free themes, and if one fits, you might never touch a template at all. But the moment you want to change how a theme works, not just its colors, you’re learning Go templates. Budget a weekend and lower your expectations.

My advice: pick a theme close to what you want and keep your overrides small. A `layouts/` folder in your site root beats forking the whole theme.

## Organizing Content

Hugo’s content model is genuinely good. Your posts are files in a `content/` folder, front matter on top (TOML or YAML), body below. Page bundles let you keep a post’s images in the same folder as the post itself, which sounds minor until you’ve maintained a blog where images live in a completely different tree.

Taxonomies come for free. Tags, categories, whatever you define, and Hugo generates the listing pages automatically. Archetypes give you templates for new content, so `hugo new posts/my-post.md` starts with your frontmatter skeleton instead of an empty file.

## Deploying a Hugo Site

The output is a folder of static files. That’s the whole deployment story, and it’s the best part: any web server, any static host, any CDN works. No Node process to keep alive, no platform lock-in.

Mine ran as an nginx container behind Traefik, with the built site mounted in. Build, copy, done. And since builds take a second, CI is trivial. There’s no “the deploy takes 20 minutes” with Hugo. Ever.

## Hugo’s Limits

Hugo is radically static, and that cuts both ways. The moment you want anything dynamic, a contact form, a view counter, comments, you’re duct-taping external services onto it. Each one works. None of them feel great.

That’s ultimately why this blog now runs on Astro. Not because Hugo failed, but because my requirements outgrew “purely static”. The whole story is in [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/), and it starts with a love letter to Hugo, not a takedown.

So: content site, no dynamic features, maybe some templating tolerance? Hugo. Still one of the best tools I’ve used.

## More Topics

*    [![](/_astro/docker-logo.cLFSuHxc_t0lC4.svg) Docker](/topics/docker/)
*   [Self-Hosting](/topics/self-hosting/)
*    [![](/_astro/linux-logo.C_7ld7wB_1vbXgs.svg) Linux](/topics/linux/)

---

## #Hyprland

URL: https://hmmr.online/topics/hyprland/

All posts about Hyprland.

# #Hyprland

1 Post · [← All Topics](/topics/)

## [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/)

Jan 6, 2026 ·

[#Hyprland](/topics/hyprland/) [#Claude](/topics/claude/) [#Linux](/topics/linux/) [#Workflow](/topics/workflow/)

 [![Hyprland Desktop with Waybar](/_astro/hyprland-teaser.Cdw2bFv6_29nk4D.webp)](/posts/hyprland-claude-code/)

[Image AI generated](/ai-disclaimer/)

I used Claude Code CLI to rice my Hyprland desktop — Waybar, dotfiles, keybindings, the whole thing. Turns out AI makes configuring Linux way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&title=Ricing%20Hyprland%20with%20Claude%20Code%20CLI "Share on Reddit")[](https://bsky.app/intent/compose?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Threads")[](https://mastodon.social/share?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share via WhatsApp")

[Read More →](/posts/hyprland-claude-code/)

---

## Topics

URL: https://hmmr.online/topics/

Topic hubs: one page per subject with all guides, setups, and honest takes.

# Topics

One page per subject: the guides, the setups, the honest takes. 4 Topics

## ![](/_astro/hugo-logo.CL5Lk52C_Z1A8euh.svg)[Hugo](/topics/hugo/)

Hands-on Hugo guides: running Hugo in Docker, adding search with Pagefind, and honest takes on when Hugo is the right tool and when it is not.

5 Posts [Explore Hugo →](/topics/hugo/)

## ![](/_astro/docker-logo.cLFSuHxc_t0lC4.svg)[Docker](/topics/docker/)

Docker guides from a real self-hosted setup: Compose stacks, Traefik as reverse proxy, CI runners in containers, and why everything here runs in one.

5 Posts [Explore Docker →](/topics/docker/)

## [Self-Hosting](/topics/self-hosting/)

Lessons from running my own services: Traefik, Umami analytics, CI runners, and this blog itself. What works, what breaks, and where to start.

4 Posts [Explore Self-Hosting →](/topics/self-hosting/)

## ![](/_astro/linux-logo.C_7ld7wB_1vbXgs.svg)[Linux](/topics/linux/)

Linux from the desktop side: Hyprland ricing with Claude Code, where to find wallpapers that do not suck, and notes from daily-driving Linux.

2 Posts [Explore Linux →](/topics/linux/)

## All Tags

*   [#Claude (3)](/topics/claude/)
*   [#Opinion (3)](/topics/opinion/)
*   [#AI (2)](/topics/ai/)
*   [#Guide (2)](/topics/guide/)
*   [#Privacy (2)](/topics/privacy/)
*   [#Static Site Generator (2)](/topics/static-site-generator/)
*   [#Web (2)](/topics/web/)
*   [#Workflow (2)](/topics/workflow/)
*   [#Analytics (1)](/topics/analytics/)
*   [#Astro (1)](/topics/astro/)
*   [#ChatGPT (1)](/topics/chatgpt/)
*   [#CI/CD (1)](/topics/cicd/)
*   [#Codeberg (1)](/topics/codeberg/)
*   [#Coding (1)](/topics/coding/)
*   [#DevOps (1)](/topics/devops/)
*   [#Forgejo (1)](/topics/forgejo/)
*   [#Hyprland (1)](/topics/hyprland/)
*   [#Legal (1)](/topics/legal/)
*   [#Let's Encrypt (1)](/topics/lets-encrypt/)
*   [#Pagefind (1)](/topics/pagefind/)
*   [#Resources (1)](/topics/resources/)
*   [#Reverse Proxy (1)](/topics/reverse-proxy/)
*   [#Ricing (1)](/topics/ricing/)
*   [#Search (1)](/topics/search/)
*   [#SSL (1)](/topics/ssl/)
*   [#Traefik (1)](/topics/traefik/)
*   [#Umami (1)](/topics/umami/)
*   [#Wallpaper (1)](/topics/wallpaper/)
*   [#WordPress (1)](/topics/wordpress/)

---

## #Legal

URL: https://hmmr.online/topics/legal/

All posts about Legal.

# #Legal

1 Post · [← All Topics](/topics/)

## [Blog Updates #1](/posts/blog-updates-1/)

May 8, 2026 ·

[#Hugo](/topics/hugo/) [#Privacy](/topics/privacy/) [#Legal](/topics/legal/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/)

 [![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_1ivK2c.webp)](/posts/blog-updates-1/)

Photo from Sami Abdullah // [Pexel](https://www.pexels.com/de-de/foto/nahaufnahme-von-holzklotzen-mit-der-aufschrift-neu-33705550/)

Quick rundown of what I changed on the blog: privacy policy, imprint, contact form, footer, sitemap.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&title=Blog%20Updates%20%231 "Share on Reddit")[](https://bsky.app/intent/compose?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Threads")[](https://mastodon.social/share?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap. "Share on Telegram")[](https://wa.me/?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share via WhatsApp")

[Read More →](/posts/blog-updates-1/)

---

## #Let's Encrypt

URL: https://hmmr.online/topics/lets-encrypt/

All posts about Let's Encrypt.

# #Let's Encrypt

1 Post · [← All Topics](/topics/)

## [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/)

Apr 2, 2026 ·

[#Traefik](/topics/traefik/) [#Docker](/topics/docker/) [#Reverse Proxy](/topics/reverse-proxy/) [#Self-Hosting](/topics/self-hosting/) [#SSL](/topics/ssl/) [#Let's Encrypt](/topics/lets-encrypt/)

 [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_u5ERv.webp)](/posts/traefik-reverse-proxy/)

[Image AI generated](/ai-disclaimer/)

Nginx Proxy Manager stopped renewing SSL certs. Switched to Traefik as Docker reverse proxy - wildcard Let's Encrypt, zero web UI, way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&title=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik "Share on Reddit")[](https://bsky.app/intent/compose?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Bluesky")[](https://threads.net/intent/post?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Threads")[](https://mastodon.social/share?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share via WhatsApp")

[Read More →](/posts/traefik-reverse-proxy/)

---

## Linux

URL: https://hmmr.online/topics/linux/

Linux from the desktop side: Hyprland ricing with Claude Code, where to find wallpapers that do not suck, and notes from daily-driving Linux.

![Linux logo](/_astro/linux-logo.C_7ld7wB_1vbXgs.svg)

Topic

# Linux

Linux from the desktop side: Hyprland ricing with Claude Code, where to find wallpapers that do not suck, and notes from daily-driving Linux.

2 Posts · Updated Mar 10, 2026 · [All Topics](/topics/)

[Start here](#start-here)

[Official site](https://www.kernel.org)

What

Open-source OS kernel plus the whole ecosystem around it

Created

1991, by Linus Torvalds

License

GPL-2.0

Best for

Servers, tinkerers, and desktops you actually own

Not for

Hard dependencies on Windows-only software (games mostly work now)

## Start here

New to this? Read these in order.

1.  1
    
    [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/)
    
    Rice a Hyprland desktop by describing what you want, no config-syntax weekend.
    
2.  2
    
    [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/)
    
    Find wallpapers that set the palette for the whole desktop.
    

## Posts about Linux

 [![I Just Want a Nice Background](/_astro/wallpaper-teaser.DwfQY61S_Z25oWfR.webp)

### Where to Actually Find Good Wallpapers

Mar 10, 2026](/posts/wallpaper-sources/) [![Hyprland Desktop with Waybar](/_astro/hyprland-teaser.Cdw2bFv6_Z2tPHLe.webp)

### Ricing Hyprland with Claude Code CLI

Jan 6, 2026](/posts/hyprland-claude-code/)

More on Linux

Every machine I care about runs Linux. The server that serves you this page, obviously. But also the desktop this post was written on. This hub collects the desktop side of that: the setups, the ricing, the small quality-of-life stuff. The server side has [its own hub](/topics/self-hosting/).

## Linux on the Desktop Is Fine Now. Really.

The old jokes don’t land anymore. Hardware mostly just works, the big desktop environments are polished, and thanks to Proton even gaming went from “dual boot for that one title” to “it usually just runs”.

What Linux still asks of you is a decision. Which distro, which desktop, which of the fifty terminal emulators. That freedom is the feature. It’s also the thing that scares people away, because the first week is one long menu.

My advice: pick something boring and popular first. You can always go weirder later. Everyone does.

## Ricing Without Burning a Weekend

Ricing, for the uninitiated: making your desktop look the way you want, down to the pixel. The [r/unixporn](https://www.reddit.com/r/unixporn/) screenshots everyone envies are riced [Hyprland](https://hypr.land) setups more often than not.

I envied them for years and never had the time to learn the config syntax. Then I threw Claude Code at the problem and [riced my Hyprland setup by just describing what I wanted](/posts/hyprland-claude-code/). Keybindings, window rules, Waybar, the lot. It’s the lazy path and I’m not sorry.

One thing that post taught me the hard way: when a documented feature refuses to work, check your versions before you lose hours. The docs may be newer than your package.

## A Rice Is Only as Good as Its Wallpaper

Sounds shallow. Is true. The wallpaper sets the palette for the entire desktop, and finding good ones is harder than it should be, because the internet is drowning in watermarked stock sites and AI slop.

I keep [a list of the sources that are actually worth your time](/posts/wallpaper-sources/), from the gold standard to the hidden gems.

## And Everywhere Else

The desktop is the visible part. The same kernel runs my whole server setup, every container, every service on this domain. If that end of Linux interests you more, start with the [Self-Hosting hub](/topics/self-hosting/) or go straight to [Docker](/topics/docker/).

That’s the nice thing about Linux: the skills transfer. The shell you learn while ricing is the same shell that fixes your server at midnight.

## More Topics

*    [![](/_astro/hugo-logo.CL5Lk52C_Z1A8euh.svg) Hugo](/topics/hugo/)
*    [![](/_astro/docker-logo.cLFSuHxc_t0lC4.svg) Docker](/topics/docker/)
*   [Self-Hosting](/topics/self-hosting/)

---

## #Opinion

URL: https://hmmr.online/topics/opinion/

All posts about Opinion.

# #Opinion

3 Posts · [← All Topics](/topics/)

## [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/)

Jul 15, 2026 ·

[#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp)](/posts/why-astro-not-hugo/)

I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp")

[Read More →](/posts/why-astro-not-hugo/)

## [We got lost in AI](/posts/we-got-lost/)

May 19, 2026 ·

[#AI](/topics/ai/) [#Claude](/topics/claude/) [#Opinion](/topics/opinion/) [#ChatGPT](/topics/chatgpt/)

 [![Burning paper on a dark background](/_astro/ai-trash.BLNVNNDF_Z1hnQiW.webp)](/posts/we-got-lost/)

Photo from cottonbro studio // [Pexel](https://www.pexels.com/de-de/foto/feuer-verbrennung-brand-flamme-9667177/)

We as humanity took a wrong turn when it comes to our daily AI use. Myself included. But I am done.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&title=We%20got%20lost%20in%20AI "Share on Reddit")[](https://bsky.app/intent/compose?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Bluesky")[](https://threads.net/intent/post?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Threads")[](https://mastodon.social/share?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F&text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done. "Share on Telegram")[](https://wa.me/?text=We%20got%20lost%20in%20AI%0A%0AWe%20as%20humanity%20took%20a%20wrong%20turn%20when%20it%20comes%20to%20our%20daily%20AI%20use.%20Myself%20included.%20But%20I%20am%20done.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwe-got-lost%2F "Share via WhatsApp")

[Read More →](/posts/we-got-lost/)

## [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/)

Apr 5, 2026 ·

[#Hugo](/topics/hugo/) [#WordPress](/topics/wordpress/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_Z2sRgdy.webp)](/posts/why-hugo-not-wordpress/)

[Image AI generated](/ai-disclaimer/)

I used WordPress for years before switching to Hugo. Static HTML, no database, no plugins, 100/100 Lighthouse. Here is why I am not going back.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&title=Why%20I%20Switched%20from%20WordPress%20to%20Hugo "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share via WhatsApp")

[Read More →](/posts/why-hugo-not-wordpress/)

---

## #Pagefind

URL: https://hmmr.online/topics/pagefind/

All posts about Pagefind.

# #Pagefind

1 Post · [← All Topics](/topics/)

## [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/)

Apr 4, 2026 ·

[#Hugo](/topics/hugo/) [#Pagefind](/topics/pagefind/) [#Search](/topics/search/) [#Guide](/topics/guide/)

 [![Screenshot of the search page on this blog, showing a search bar and results for "Docker".](/_astro/search-teaser.DLYSs_HW_Z2tFvhq.webp)](/posts/hugo-search-pagefind/)

[Image AI generated](/ai-disclaimer/)

How to add search to a Hugo static site with Pagefind. No backend, no JSON templates, no pain. Just one build command and twenty lines of code.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&title=Adding%20Search%20to%20Hugo%20with%20Pagefind "Share on Reddit")[](https://bsky.app/intent/compose?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Threads")[](https://mastodon.social/share?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code. "Share on Telegram")[](https://wa.me/?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share via WhatsApp")

[Read More →](/posts/hugo-search-pagefind/)

---

## #Privacy

URL: https://hmmr.online/topics/privacy/

All posts about Privacy.

# #Privacy

2 Posts · [← All Topics](/topics/)

## [Blog Updates #1](/posts/blog-updates-1/)

May 8, 2026 ·

[#Hugo](/topics/hugo/) [#Privacy](/topics/privacy/) [#Legal](/topics/legal/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/)

 [![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_1ivK2c.webp)](/posts/blog-updates-1/)

Photo from Sami Abdullah // [Pexel](https://www.pexels.com/de-de/foto/nahaufnahme-von-holzklotzen-mit-der-aufschrift-neu-33705550/)

Quick rundown of what I changed on the blog: privacy policy, imprint, contact form, footer, sitemap.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&title=Blog%20Updates%20%231 "Share on Reddit")[](https://bsky.app/intent/compose?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Threads")[](https://mastodon.social/share?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F&text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap. "Share on Telegram")[](https://wa.me/?text=Blog%20Updates%20%231%0A%0AQuick%20rundown%20of%20what%20I%20changed%20on%20the%20blog%3A%20privacy%20policy%2C%20imprint%2C%20contact%20form%2C%20footer%2C%20sitemap.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fblog-updates-1%2F "Share via WhatsApp")

[Read More →](/posts/blog-updates-1/)

## [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/)

Apr 24, 2026 ·

[#Umami](/topics/umami/) [#Analytics](/topics/analytics/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [#Privacy](/topics/privacy/)

 [![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_Z2iEbi5.webp)](/posts/umami-v3-1-0-review/)

Umami v3.1.0 drops with Session Replay, custom Boards and Web Vitals. I updated my self-hosted instance and took it for a spin. Here's what actually works.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&title=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look "Share on Reddit")[](https://bsky.app/intent/compose?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Threads")[](https://mastodon.social/share?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works. "Share on Telegram")[](https://wa.me/?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share via WhatsApp")

[Read More →](/posts/umami-v3-1-0-review/)

---

## #Resources

URL: https://hmmr.online/topics/resources/

All posts about Resources.

# #Resources

1 Post · [← All Topics](/topics/)

## [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/)

Mar 10, 2026 ·

[#Wallpaper](/topics/wallpaper/) [#Linux](/topics/linux/) [#Ricing](/topics/ricing/) [#Resources](/topics/resources/)

 [![I Just Want a Nice Background](/_astro/wallpaper-teaser.DwfQY61S_1D0twv.webp)](/posts/wallpaper-sources/)

[Image AI generated](/ai-disclaimer/)

Every wallpaper site promises high-res downloads. Most of them lie. Wallhaven, Unsplash, Reddit — here are the sources that actually deliver quality.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&title=Where%20to%20Actually%20Find%20Good%20Wallpapers "Share on Reddit")[](https://bsky.app/intent/compose?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Threads")[](https://mastodon.social/share?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality. "Share on Telegram")[](https://wa.me/?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share via WhatsApp")

[Read More →](/posts/wallpaper-sources/)

---

## #Reverse Proxy

URL: https://hmmr.online/topics/reverse-proxy/

All posts about Reverse Proxy.

# #Reverse Proxy

1 Post · [← All Topics](/topics/)

## [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/)

Apr 2, 2026 ·

[#Traefik](/topics/traefik/) [#Docker](/topics/docker/) [#Reverse Proxy](/topics/reverse-proxy/) [#Self-Hosting](/topics/self-hosting/) [#SSL](/topics/ssl/) [#Let's Encrypt](/topics/lets-encrypt/)

 [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_u5ERv.webp)](/posts/traefik-reverse-proxy/)

[Image AI generated](/ai-disclaimer/)

Nginx Proxy Manager stopped renewing SSL certs. Switched to Traefik as Docker reverse proxy - wildcard Let's Encrypt, zero web UI, way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&title=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik "Share on Reddit")[](https://bsky.app/intent/compose?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Bluesky")[](https://threads.net/intent/post?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Threads")[](https://mastodon.social/share?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share via WhatsApp")

[Read More →](/posts/traefik-reverse-proxy/)

---

## #Ricing

URL: https://hmmr.online/topics/ricing/

All posts about Ricing.

# #Ricing

1 Post · [← All Topics](/topics/)

## [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/)

Mar 10, 2026 ·

[#Wallpaper](/topics/wallpaper/) [#Linux](/topics/linux/) [#Ricing](/topics/ricing/) [#Resources](/topics/resources/)

 [![I Just Want a Nice Background](/_astro/wallpaper-teaser.DwfQY61S_1D0twv.webp)](/posts/wallpaper-sources/)

[Image AI generated](/ai-disclaimer/)

Every wallpaper site promises high-res downloads. Most of them lie. Wallhaven, Unsplash, Reddit — here are the sources that actually deliver quality.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&title=Where%20to%20Actually%20Find%20Good%20Wallpapers "Share on Reddit")[](https://bsky.app/intent/compose?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Threads")[](https://mastodon.social/share?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality. "Share on Telegram")[](https://wa.me/?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share via WhatsApp")

[Read More →](/posts/wallpaper-sources/)

---

## #Search

URL: https://hmmr.online/topics/search/

All posts about Search.

# #Search

1 Post · [← All Topics](/topics/)

## [Adding Search to Hugo with Pagefind](/posts/hugo-search-pagefind/)

Apr 4, 2026 ·

[#Hugo](/topics/hugo/) [#Pagefind](/topics/pagefind/) [#Search](/topics/search/) [#Guide](/topics/guide/)

 [![Screenshot of the search page on this blog, showing a search bar and results for "Docker".](/_astro/search-teaser.DLYSs_HW_Z2tFvhq.webp)](/posts/hugo-search-pagefind/)

[Image AI generated](/ai-disclaimer/)

How to add search to a Hugo static site with Pagefind. No backend, no JSON templates, no pain. Just one build command and twenty lines of code.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&title=Adding%20Search%20to%20Hugo%20with%20Pagefind "Share on Reddit")[](https://bsky.app/intent/compose?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Threads")[](https://mastodon.social/share?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F&text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code. "Share on Telegram")[](https://wa.me/?text=Adding%20Search%20to%20Hugo%20with%20Pagefind%0A%0AHow%20to%20add%20search%20to%20a%20Hugo%20static%20site%20with%20Pagefind.%20No%20backend%2C%20no%20JSON%20templates%2C%20no%20pain.%20Just%20one%20build%20command%20and%20twenty%20lines%20of%20code.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhugo-search-pagefind%2F "Share via WhatsApp")

[Read More →](/posts/hugo-search-pagefind/)

---

## Self-Hosting

URL: https://hmmr.online/topics/self-hosting/

Lessons from running my own services: Traefik, Umami analytics, CI runners, and this blog itself. What works, what breaks, and where to start.

Topic

# Self-Hosting

Lessons from running my own services: Traefik, Umami analytics, CI runners, and this blog itself. What works, what breaks, and where to start.

4 Posts · Updated May 22, 2026 · [All Topics](/topics/)

[Start here](#start-here)

[Community](https://www.reddit.com/r/selfhosted/)

What

Running your own services instead of renting someone else's

You need

A server (an old PC or a small VPS is plenty), a domain, patience

Best for

Privacy, control, and actually learning how things work

Not for

Set-and-forget people: you are the admin now

## Start here

New to this? Read these in order.

1.  1
    
    [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/)
    
    Start with the front door: a reverse proxy with automatic TLS.
    
2.  2
    
    [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/)
    
    Add your first real service: privacy-friendly analytics.
    
3.  3
    
    [Self-Hosting a Forgejo Runner for Codeberg Actions](/posts/codeberg-forgejo-runner/)
    
    Level up: self-host the CI that ships everything.
    

## Posts about Self-Hosting

 [![Codeberg Forgejo Runner Setup](/_astro/codeberg-runner-teaser.CUuFOBSo_1MpPlG.webp)

### Self-Hosting a Forgejo Runner for Codeberg Actions

May 22, 2026](/posts/codeberg-forgejo-runner/) [![Neutraler Verlauf als Titelbild](/_astro/blog-updates-1-teaser.DCQML9g1_2nOwkw.webp)

### Blog Updates #1

May 8, 2026](/posts/blog-updates-1/) [![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_18D7nD.webp)

### Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look

Apr 24, 2026](/posts/umami-v3-1-0-review/) [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_Z1HFkiL.webp)

### I Replaced Nginx Proxy Manager with Traefik

Apr 2, 2026](/posts/traefik-reverse-proxy/)

More on Self-Hosting

You’re reading a self-hosted blog right now. The analytics behind it: self-hosted. The CI that deploys it: self-hosted. At some point “I could just run that myself” became my default reaction to every SaaS pricing page.

## Why Bother?

Three reasons, honestly.

**Your data stays yours.** No third party gets to log my visitors, read my drafts, or train on my stuff. For a blog that cares about privacy that’s not a nice-to-have, it’s the whole point.

**No subscription creep.** Every hosted tool is another monthly fee that doubles once you’re locked in. A small server has one price and runs everything.

**You learn things.** Networking, TLS, backups, containers. Not from a course, but because your own stuff breaks and you have to fix it. That knowledge compounds.

## The Stack Behind This Blog

The whole setup is a handful of Docker Compose files on one server.

At the front sits [Traefik as the reverse proxy](/posts/traefik-reverse-proxy/). It terminates TLS with wildcard Let’s Encrypt certificates and routes every subdomain to the right container based on labels in the Compose files. I replaced Nginx Proxy Manager with it and haven’t looked back.

Behind it: this blog as a plain nginx container serving static files, a small gateway for the contact form, and [Umami for analytics](/posts/umami-v3-1-0-review/). Cookieless, privacy-friendly, and the dashboard is genuinely nice. The numbers you see in the Popular Posts section come straight from it at build time.

Even the legal side of running a site like this from Germany turned into its own adventure. Privacy policy, imprint, a contact form required by law: [I wrote up that whole compliance sprint](/posts/blog-updates-1/), including how to avoid putting your home address on the internet.

And the deploys? [A self-hosted Forgejo runner](/posts/codeberg-forgejo-runner/) picks up every push to this blog’s Codeberg repo, builds the site, and ships it to the server. My CI minutes are unlimited because they run on my hardware.

## The Honest Part

Self-hosting means you’re on call. Nobody else patches your services, rotates your certificates, or notices that a disk is filling up. When something breaks on a Tuesday night, that’s your Tuesday night.

Backups are not optional. Test your restores, not just your backups. And expose as little as possible to the internet: every open port is a door someone will eventually knock on.

If that sounds like too much, it might be. There’s no shame in paying for hosted services. But don’t decide before you’ve tried it.

## Where to Start

Small. One old PC or the cheapest VPS you can find, Docker on top, and one service you actually want to use. A wiki, an RSS reader, an ad blocker like Pi-hole, whatever scratches an itch.

Get that one service running, put [a reverse proxy](/posts/traefik-reverse-proxy/) in front of it, and let it run for a month. If you enjoyed the process, congratulations: your server will never be empty again.

## More Topics

*    [![](/_astro/hugo-logo.CL5Lk52C_Z1A8euh.svg) Hugo](/topics/hugo/)
*    [![](/_astro/docker-logo.cLFSuHxc_t0lC4.svg) Docker](/topics/docker/)
*    [![](/_astro/linux-logo.C_7ld7wB_1vbXgs.svg) Linux](/topics/linux/)

---

## #SSL

URL: https://hmmr.online/topics/ssl/

All posts about SSL.

# #SSL

1 Post · [← All Topics](/topics/)

## [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/)

Apr 2, 2026 ·

[#Traefik](/topics/traefik/) [#Docker](/topics/docker/) [#Reverse Proxy](/topics/reverse-proxy/) [#Self-Hosting](/topics/self-hosting/) [#SSL](/topics/ssl/) [#Let's Encrypt](/topics/lets-encrypt/)

 [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_u5ERv.webp)](/posts/traefik-reverse-proxy/)

[Image AI generated](/ai-disclaimer/)

Nginx Proxy Manager stopped renewing SSL certs. Switched to Traefik as Docker reverse proxy - wildcard Let's Encrypt, zero web UI, way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&title=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik "Share on Reddit")[](https://bsky.app/intent/compose?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Bluesky")[](https://threads.net/intent/post?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Threads")[](https://mastodon.social/share?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share via WhatsApp")

[Read More →](/posts/traefik-reverse-proxy/)

---

## #Static Site Generator

URL: https://hmmr.online/topics/static-site-generator/

All posts about Static Site Generator.

# #Static Site Generator

2 Posts · [← All Topics](/topics/)

## [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/)

Jul 15, 2026 ·

[#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp)](/posts/why-astro-not-hugo/)

I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp")

[Read More →](/posts/why-astro-not-hugo/)

## [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/)

Apr 5, 2026 ·

[#Hugo](/topics/hugo/) [#WordPress](/topics/wordpress/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_Z2sRgdy.webp)](/posts/why-hugo-not-wordpress/)

[Image AI generated](/ai-disclaimer/)

I used WordPress for years before switching to Hugo. Static HTML, no database, no plugins, 100/100 Lighthouse. Here is why I am not going back.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&title=Why%20I%20Switched%20from%20WordPress%20to%20Hugo "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share via WhatsApp")

[Read More →](/posts/why-hugo-not-wordpress/)

---

## #Traefik

URL: https://hmmr.online/topics/traefik/

All posts about Traefik.

# #Traefik

1 Post · [← All Topics](/topics/)

## [I Replaced Nginx Proxy Manager with Traefik](/posts/traefik-reverse-proxy/)

Apr 2, 2026 ·

[#Traefik](/topics/traefik/) [#Docker](/topics/docker/) [#Reverse Proxy](/topics/reverse-proxy/) [#Self-Hosting](/topics/self-hosting/) [#SSL](/topics/ssl/) [#Let's Encrypt](/topics/lets-encrypt/)

 [![Traefik reverse proxy dashboard showing Docker container routes with SSL certificates](/_astro/traefik-teaser.DUe7a1Jg_u5ERv.webp)](/posts/traefik-reverse-proxy/)

[Image AI generated](/ai-disclaimer/)

Nginx Proxy Manager stopped renewing SSL certs. Switched to Traefik as Docker reverse proxy - wildcard Let's Encrypt, zero web UI, way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&title=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik "Share on Reddit")[](https://bsky.app/intent/compose?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Bluesky")[](https://threads.net/intent/post?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Threads")[](https://mastodon.social/share?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F&text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=I%20Replaced%20Nginx%20Proxy%20Manager%20with%20Traefik%0A%0ANginx%20Proxy%20Manager%20stopped%20renewing%20SSL%20certs.%20Switched%20to%20Traefik%20as%20Docker%20reverse%20proxy%20-%20wildcard%20Let's%20Encrypt%2C%20zero%20web%20UI%2C%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Ftraefik-reverse-proxy%2F "Share via WhatsApp")

[Read More →](/posts/traefik-reverse-proxy/)

---

## #Umami

URL: https://hmmr.online/topics/umami/

All posts about Umami.

# #Umami

1 Post · [← All Topics](/topics/)

## [Umami v3.1.0 Self-Hosted Analytics: Let's Take a Look](/posts/umami-v3-1-0-review/)

Apr 24, 2026 ·

[#Umami](/topics/umami/) [#Analytics](/topics/analytics/) [#Self-Hosting](/topics/self-hosting/) [#Docker](/topics/docker/) [#Privacy](/topics/privacy/)

 [![Umami v3.1.0 analytics dashboard on hmmr.online](/_astro/umami-v3-1-0-teaser.D__nAeoB_Z2iEbi5.webp)](/posts/umami-v3-1-0-review/)

Umami v3.1.0 drops with Session Replay, custom Boards and Web Vitals. I updated my self-hosted instance and took it for a spin. Here's what actually works.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&title=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look "Share on Reddit")[](https://bsky.app/intent/compose?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Threads")[](https://mastodon.social/share?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F&text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works. "Share on Telegram")[](https://wa.me/?text=Umami%20v3.1.0%20Self-Hosted%20Analytics%3A%20Let's%20Take%20a%20Look%0A%0AUmami%20v3.1.0%20drops%20with%20Session%20Replay%2C%20custom%20Boards%20and%20Web%20Vitals.%20I%20updated%20my%20self-hosted%20instance%20and%20took%20it%20for%20a%20spin.%20Here's%20what%20actually%20works.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fumami-v3-1-0-review%2F "Share via WhatsApp")

[Read More →](/posts/umami-v3-1-0-review/)

---

## #Wallpaper

URL: https://hmmr.online/topics/wallpaper/

All posts about Wallpaper.

# #Wallpaper

1 Post · [← All Topics](/topics/)

## [Where to Actually Find Good Wallpapers](/posts/wallpaper-sources/)

Mar 10, 2026 ·

[#Wallpaper](/topics/wallpaper/) [#Linux](/topics/linux/) [#Ricing](/topics/ricing/) [#Resources](/topics/resources/)

 [![I Just Want a Nice Background](/_astro/wallpaper-teaser.DwfQY61S_1D0twv.webp)](/posts/wallpaper-sources/)

[Image AI generated](/ai-disclaimer/)

Every wallpaper site promises high-res downloads. Most of them lie. Wallhaven, Unsplash, Reddit — here are the sources that actually deliver quality.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&title=Where%20to%20Actually%20Find%20Good%20Wallpapers "Share on Reddit")[](https://bsky.app/intent/compose?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Threads")[](https://mastodon.social/share?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F&text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality. "Share on Telegram")[](https://wa.me/?text=Where%20to%20Actually%20Find%20Good%20Wallpapers%0A%0AEvery%20wallpaper%20site%20promises%20high-res%20downloads.%20Most%20of%20them%20lie.%20Wallhaven%2C%20Unsplash%2C%20Reddit%20%E2%80%94%20here%20are%20the%20sources%20that%20actually%20deliver%20quality.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwallpaper-sources%2F "Share via WhatsApp")

[Read More →](/posts/wallpaper-sources/)

---

## #Web

URL: https://hmmr.online/topics/web/

All posts about Web.

# #Web

2 Posts · [← All Topics](/topics/)

## [Why I Switched from Hugo to Astro](/posts/why-astro-not-hugo/)

Jul 15, 2026 ·

[#Astro](/topics/astro/) [#Hugo](/topics/hugo/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Terminal window showing the switch from Hugo to Astro](/_astro/why-astro-teaser.B0vO5Q78_1r4vgQ.webp)](/posts/why-astro-not-hugo/)

I still love Hugo. I moved this blog to Astro anyway. It started with a view counter and ended in a full rebuild: same static HTML, way less duct tape.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&title=Why%20I%20Switched%20from%20Hugo%20to%20Astro "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F&text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20Hugo%20to%20Astro%0A%0AI%20still%20love%20Hugo.%20I%20moved%20this%20blog%20to%20Astro%20anyway.%20It%20started%20with%20a%20view%20counter%20and%20ended%20in%20a%20full%20rebuild%3A%20same%20static%20HTML%2C%20way%20less%20duct%20tape.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-astro-not-hugo%2F "Share via WhatsApp")

[Read More →](/posts/why-astro-not-hugo/)

## [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/)

Apr 5, 2026 ·

[#Hugo](/topics/hugo/) [#WordPress](/topics/wordpress/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_Z2sRgdy.webp)](/posts/why-hugo-not-wordpress/)

[Image AI generated](/ai-disclaimer/)

I used WordPress for years before switching to Hugo. Static HTML, no database, no plugins, 100/100 Lighthouse. Here is why I am not going back.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&title=Why%20I%20Switched%20from%20WordPress%20to%20Hugo "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share via WhatsApp")

[Read More →](/posts/why-hugo-not-wordpress/)

---

## #WordPress

URL: https://hmmr.online/topics/wordpress/

All posts about WordPress.

# #WordPress

1 Post · [← All Topics](/topics/)

## [Why I Switched from WordPress to Hugo](/posts/why-hugo-not-wordpress/)

Apr 5, 2026 ·

[#Hugo](/topics/hugo/) [#WordPress](/topics/wordpress/) [#Static Site Generator](/topics/static-site-generator/) [#Opinion](/topics/opinion/) [#Web](/topics/web/)

 [![Hugo vs WordPress](/_astro/why-hugo-teaser.DvXHvn4m_Z2sRgdy.webp)](/posts/why-hugo-not-wordpress/)

[Image AI generated](/ai-disclaimer/)

I used WordPress for years before switching to Hugo. Static HTML, no database, no plugins, 100/100 Lighthouse. Here is why I am not going back.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&title=Why%20I%20Switched%20from%20WordPress%20to%20Hugo "Share on Reddit")[](https://bsky.app/intent/compose?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Threads")[](https://mastodon.social/share?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F&text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back. "Share on Telegram")[](https://wa.me/?text=Why%20I%20Switched%20from%20WordPress%20to%20Hugo%0A%0AI%20used%20WordPress%20for%20years%20before%20switching%20to%20Hugo.%20Static%20HTML%2C%20no%20database%2C%20no%20plugins%2C%20100%2F100%20Lighthouse.%20Here%20is%20why%20I%20am%20not%20going%20back.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fwhy-hugo-not-wordpress%2F "Share via WhatsApp")

[Read More →](/posts/why-hugo-not-wordpress/)

---

## #Workflow

URL: https://hmmr.online/topics/workflow/

All posts about Workflow.

# #Workflow

2 Posts · [← All Topics](/topics/)

## [Sidekick: A Claude Code Skill Against Vibe Coding](/posts/sidekick-skill/)

Jul 20, 2026 ·

[#Claude](/topics/claude/) [#AI](/topics/ai/) [#Workflow](/topics/workflow/) [#Coding](/topics/coding/)

 [![Claude as a Sidekick, not as an Autopilot](/_astro/sidekick-teaser.DY2NNIIU_mlcnQ.webp)](/posts/sidekick-skill/)

Ranting about vibe coding was easy. So I built a Claude Code skill that turns Claude from an autopilot into a sidekick.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&title=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding "Share on Reddit")[](https://bsky.app/intent/compose?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Threads")[](https://mastodon.social/share?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F&text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick. "Share on Telegram")[](https://wa.me/?text=Sidekick%3A%20A%20Claude%20Code%20Skill%20Against%20Vibe%20Coding%0A%0ARanting%20about%20vibe%20coding%20was%20easy.%20So%20I%20built%20a%20Claude%20Code%20skill%20that%20turns%20Claude%20from%20an%20autopilot%20into%20a%20sidekick.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fsidekick-skill%2F "Share via WhatsApp")

[Read More →](/posts/sidekick-skill/)

## [Ricing Hyprland with Claude Code CLI](/posts/hyprland-claude-code/)

Jan 6, 2026 ·

[#Hyprland](/topics/hyprland/) [#Claude](/topics/claude/) [#Linux](/topics/linux/) [#Workflow](/topics/workflow/)

 [![Hyprland Desktop with Waybar](/_astro/hyprland-teaser.Cdw2bFv6_29nk4D.webp)](/posts/hyprland-claude-code/)

[Image AI generated](/ai-disclaimer/)

I used Claude Code CLI to rice my Hyprland desktop — Waybar, dotfiles, keybindings, the whole thing. Turns out AI makes configuring Linux way less painful.

[](https://www.reddit.com/submit?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&title=Ricing%20Hyprland%20with%20Claude%20Code%20CLI "Share on Reddit")[](https://bsky.app/intent/compose?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Bluesky")[](https://threads.net/intent/post?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Threads")[](https://mastodon.social/share?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on Mastodon")[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share on LinkedIn")[](https://t.me/share/url?url=https%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F&text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful. "Share on Telegram")[](https://wa.me/?text=Ricing%20Hyprland%20with%20Claude%20Code%20CLI%0A%0AI%20used%20Claude%20Code%20CLI%20to%20rice%20my%20Hyprland%20desktop%20%E2%80%94%20Waybar%2C%20dotfiles%2C%20keybindings%2C%20the%20whole%20thing.%20Turns%20out%20AI%20makes%20configuring%20Linux%20way%20less%20painful.%0A%0Ahttps%3A%2F%2Fhmmr.online%2Fposts%2Fhyprland-claude-code%2F "Share via WhatsApp")

[Read More →](/posts/hyprland-claude-code/)

---

## > Achievement Unlocked:
Typed a URL

URL: https://hmmr.online/wp-admin/