I build self-hosted tools, and the homelab they run in.
Go on the inside, React on the outside, PostgreSQL underneath.
Three finished things, each self-hosted, each with accounts, sharing and a privacy page — not demos.
|
A wiki with nested pages, backlinks and a knowledge graph. Full text search, versions, comments, attachments in S3, import from Obsidian, Notion and Confluence. Go · React · PostgreSQL · two containers plus a database |
A collaborative whiteboard. Live cursors over WebSocket, boards that persist, and two share links per board — one to draw, one to watch. Go · React · CRDT-style last-write-wins merge |
A floor plan editor to scale: walls, doors, windows, furniture, room areas, a 3D view, and export as DXF, SVG, PNG or a shareable file. Go · React · three.js · server-side export |
Everything above runs at home, on hardware I can touch. Managed by Ansible from one control node, backed up nightly to a Proxmox Backup Server.
| Layer | What runs there |
|---|---|
| Virtualisation | Two Proxmox hosts, nine guests, GPU passthrough for a local LLM |
| Kubernetes | k3s, carrying the public web services |
| Identity | Keycloak as the single sign-on for every web interface |
| Observability | Prometheus, Grafana, Loki, Alertmanager — and Wazuh for the security side |
| Automation | Ansible, 33 roles, plus self-hosted GitHub runners that build and roll out |
| Backup | Proxmox Backup Server, nightly, plus database dumps to a NAS |
Each one is a repository you clone and work through in levels, with tests that tell you whether the level is done. No slides, no video.
| Course | Levels | How it is checked |
|---|---|---|
| Go | 4 | go test -race |
| React | 4 | Vitest and the TypeScript compiler |
| Container | 5 | Docker, Compose and Podman, a probe per level |
| Ansible | 4 | Playbooks against your own machine |
| Terraform / OpenTofu | 4 | Local providers only, no cloud account |
| Shell | 5 | A probe script per level |
| PowerShell | 9 | Fill-in tasks, starting from zero |
The material is German — the products are the English part of this profile.
Both cards are drawn by karten.py in this repository and redrawn nightly by a workflow — the usual service for this answers 503 often enough that a broken image would be the normal state. Private contributions are counted in the commit figure; the repository count and the languages are the public ones. Most of my work sits in private repositories, so these numbers say less than they look like.
Licence note: Nexora, Blankr and Planr are under the Business Source License 1.1 — run them yourself, commercially, for free; a handful of extras need a key, and each turns into Apache 2.0 on its date.