<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Platform-Engineering on johanneskueber.com</title><link>https://johanneskueber.com/tags/platform-engineering/</link><description>Recent content in Platform-Engineering on johanneskueber.com</description><generator>Hugo</generator><language>en_US</language><lastBuildDate>Sat, 31 Oct 2026 10:00:00 +0100</lastBuildDate><atom:link href="https://johanneskueber.com/tags/platform-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>One TofuWorkspace per app: OpenTofu inside Crossplane, now with Keycloak clients</title><link>https://johanneskueber.com/posts/2026-10-31-crossplane-opentofu-workspaces/</link><pubDate>Sat, 31 Oct 2026 10:00:00 +0100</pubDate><guid>https://johanneskueber.com/posts/2026-10-31-crossplane-opentofu-workspaces/</guid><description>&lt;p&gt;Every app in my homelab needs a few things that do not live inside Kubernetes: a bucket for its backups, a DNS record so I can reach it over NetBird, and - since I retired LLDAP in October - an OIDC client in Keycloak. For a long time these were handled in a central OpenTofu environment on my laptop, plus a SOPS-encrypted secret per app into which I copied the client secret by hand. Adding an app meant touching three places, and removing one meant remembering all three. I usually remembered two.&lt;/p&gt;</description></item></channel></rss>