Mark Christian Klass
Platform · DevOps · AI infrastructure · Singapore

Infrastructure that runs unattended, and says so when it doesn't.

Eight years across Linux, AWS and Kubernetes. Below are three systems I built and operate: a public monitoring tool, a publishing pipeline that has run without me since June 2026, and a homelab managed entirely through git. Every claim carries a label saying how it was verified.

Systems boardverified 2026-09-21
pvewatchPublic sourcev0.2.0 · 2026-07-22 The Kopi LogLivenewest post 2026-11-04 Absurd VaultHistoricalretired · 2026 Homelab / GitOpsPublic sourceFlux commit 2026-09-15
Live = checked against a public system at build time · Public source = GitHub · Sample data = generated in your browser · Historical = ran, now retired
v0.2.0pvewatch, latest release 2026-07-22. Multi-arch container image on GitHub Container Registry.Source: GitHub releases, checked 2026-11-04
289 postslisted on The Kopi Log, newest 2026-11-04. Unattended since June 2026; still publishing three times a week.Source: live site, checked 2026-11-04
80 deployscommitted to the cluster repo by Flux image automation, June 2026 to September 2026. No kubectl involved.Source: cluster repo API, checked 2026-09-21
01Public sourceSample data

pvewatch

Problem. Proxmox buries backup failures in a task log, and a "back up all VMs" job leaves no per-VM record at all.

What I built. One container with a read-only API token: per-VM backup history, a heatmap dashboard, email and Discord alerts carrying the last 20 log lines, Prometheus metrics, and a heartbeat so the monitor's own death is noticed.

Decision. Parse the batch task log into per-VM results with synthetic IDs instead of asking users to change how they back up.

pvewatch dashboard: summary tiles, a per-VM backup heatmap with a 7-day range, and storage pool usage cards. Node and VM names are synthetic.
  • Evidence: releases v0.1.0 and v0.2.0 · CI with ruff, pytest and a SonarQube gate · amd64 + arm64 image
  • Above: the shipped dashboard. The demo reproduces it on sample data generated in your browser.
02LivePublic sourceHistorical

AI automation pipelines

Problem. Content pipelines fail quietly: a stuck LLM backend, a red CI gate, a missed schedule, and nobody notices for days.

What I built. The Kopi Log turns RSS feeds into original tech analysis three times a week on a Kubernetes CronJob and publishes through git, so every run is a reviewable commit. Absurd Vault turned Reddit threads into captioned short videos with scheduled uploads; retired when the local GPU host that ran its model backends was decommissioned.

Decision. Decouple the content deploy from the quality gate after a dependency drift froze the site for a week. A red gate now alerts; it cannot hold posts hostage.

Source material → published output
ingestRSS, dedup
clusterTF-IDF, local
synthesiseLLM, strict JSON
publishgit commit
CI gateruff mypy pytest
web imagedecoupled build
Fluxtag bump, rollout
live sitenewest post 2026-11-04
Failure handling: a 30-minute freshness probe creates a catch-up job when a slot is missed.
  • Evidence: live site, bot-authored commits in the public repo, freshness-probe manifest, CI config
  • Absurd Vault: retired; the pipeline is shown, the channel is not linked. Private source, historical outputs only.
03Public source

Homelab and GitOps

Problem. Hand-applied changes drift, and after a power cut nobody remembers what was applied by hand.

What I built. Proxmox guests defined in Terraform, a two-node Kubernetes cluster reconciled by Flux from git, SOPS-encrypted secrets, self-hosted GitLab CI building images that Flux rolls out by itself, and monitoring that heals the boring failures before it pages me.

Decision. A monitor must be simpler and more available than what it watches: detection and self-heal live on an always-on host, notification lives in n8n.

A change, end to end
  1. 1Edit a manifest, kubectl diff against live, commit explicit paths, push.
  2. 2CI gate runs; the image is tagged main-<timestamp>-<sha> so "newest" is sortable.
  3. 3Flux's image policy picks the newest tag and commits the bump back to git under its own name.
  4. 4Rollout. Alertmanager and a freshness probe confirm; a manual kubectl scale is reverted within one reconcile.
  • Evidence: 80 automation commits by the Flux bot · a Terraform file per guest · the latest deploys and this page's own build stamp on the case page
Also public
How this site was made

Two separate statements about AI

This website. Designed and built with AI assistance, including Claude Design and Claude Code. Project selection, technical claims and final review by me.

The projects shown. Built by me over 2026 with varying degrees of AI-assisted development. Where a project uses AI at runtime (article synthesis in The Kopi Log, script generation in Absurd Vault) its page says so. Neither statement implies the other.

The longer version →