Hi there!

I'm Markus, nice to meet you.

Welcome to my notebook! Here, I share my experiences on the more or less useful things I'm working on.

Posts

Cover Image for A self-watering garden that thinks for itself
home-assistantirrigationshellysmart-homemcp

A self-watering garden that thinks for itself

Turning a single 24V valve into a weather-aware, volume-based irrigation system in Home Assistant — with burst, blockage and leak protection, and not a line of YAML written by hand.

Cover Image for How I build software
softwareopen source

How I build software

Cover Image for One Interface to Rule Them All: Open WebUI with Gemini and Home Assistant
home-assistantopen-webuigeminimcpsmart-home

One Interface to Rule Them All: Open WebUI with Gemini and Home Assistant

Setting up Open WebUI with Gemini 2.5 Flash and the ha-mcp add-on to create a single conversational interface that controls your smart home and answers any question.

Cover Image for Safari incognito and Auth0, or why my login flow kept silently breaking
authsafariauth0

Safari incognito and Auth0, or why my login flow kept silently breaking

Notes on the things that broke when logging in via auth0-spa-js on iOS Safari private mode, and what it took to make them stop breaking.

Cover Image for Notes on building a SAML identity provider
samlauth

Notes on building a SAML identity provider

Notes from building a SAML IDP for a Vimeo integration, including the parts that make it trickier than OIDC.

Cover Image for Installing Coolify on a Raspberry Pi 5
coolifyraspberry-piself-hosting

Installing Coolify on a Raspberry Pi 5

Setting up Coolify as a small self-hosting platform on a Raspberry Pi 5, with Cloudflare Tunnels for external access.

Cover Image for Drizzle migrations on Cloudflare D1
cloudflareD1drizzle

Drizzle migrations on Cloudflare D1

Setting up Drizzle and generating migrations for a Cloudflare D1 database.

Cover Image for Browser compatibility with core-js and eslint
javascripteslint

Browser compatibility with core-js and eslint

Using core-js to polyfill older browsers and eslint-plugin-compat to catch unsupported APIs at lint time.

Cover Image for Monorepos with pnpm and changesets
pnpmchangesets

Monorepos with pnpm and changesets

Setting up a pnpm workspace and using changesets to version and publish packages.

Cover Image for A cookbook for a cheap SaaS stack
OutstaticHonooas

A cookbook for a cheap SaaS stack

The minimum set of pieces I reach for when starting a small SaaS side project — picked so the whole thing can run for free until it actually needs to.

Cover Image for Building a FlexSearch index inside the Next.js build
OutstaticNextJsflexsearch

Building a FlexSearch index inside the Next.js build

Building a FlexSearch index during the Next.js build by piggybacking on sitemap generation.

Cover Image for Generating a sitemap for Outstatic
OutstaticsitemapNextJs

Generating a sitemap for Outstatic

Adding a sitemap to an Outstatic site using the Next.js App Router sitemap convention.

Cover Image for Markdown tables and code highlighting in Outstatic
remarkmarkdownOutstaticrehype

Markdown tables and code highlighting in Outstatic

Adding markdown table support and code highlighting to Outstatic using remark and rehype.

Cover Image for A cheat sheet for OAuth 2.0 endpoints and flows
authsoftware

A cheat sheet for OAuth 2.0 endpoints and flows

A short cheat sheet of the endpoints, parameters and grant types in OAuth 2.0 based on RFC 6749.

Cover Image for REST API guidelines, compared
restapi

REST API guidelines, compared

A side-by-side look at how different REST API guidelines handle filtering, pagination and response metadata — JSON:API, GitHub, Google, React-Admin and Auth0.

Cover Image for Trying Outstatic as a CMS
open sourceOutstatic

Trying Outstatic as a CMS

Why I picked Outstatic as the CMS for this site after looking at Docusaurus, Vitepress, Nextra and TinaCMS.

Projects