10-day current streak·68-day longest streak
> whoami Hi! I'm Kai. Platform engineer, 10+ years in. Day job: accelerating engineers as their work goes agentic, with observability for LLM consumers as the current bet. Off-hours I…
$ ssh kai@kai-server
┌────────────────────────────────────┐
│ kai-server · lights-out │
│ uptime: ten years counting │
│ operator: kai siren · east bay, ca │
└────────────────────────────────────┘
● platform.target
Active: active (running)
Status: "27 devices · 48 pods
· 2 ✗ · agents on shift"
⚙⚒ agents on the line ⚒⚙
> whoami
Hi! I'm Kai. Platform engineer, 10+ years in. Day job: accelerating engineers as their work goes agentic, with observability for LLM consumers as the current bet. Off-hours I run a small lights-out factory: single-node k3s homelab, a herd of agents building and breaking my own services in the dark, a steady output of small tools. Wire it in, instrument it, push on it until it breaks.
> Most excited about Gauntlet: a two-agent adversarial loop that infers software correctness under sustained, targeted attack. - /now
> lights_out
The factory framing is not a bit. The goal is a dark factory: code written by agents, verified by attack, shipped while I sleep. The pieces that make that safe instead of terrifying:
- A security boundary first. Agents on this fleet route privileged operations through ward, an escape-hatch-resistant CLI wrapper that grew out of the retiring coily. Every privileged call lands in an audit log. The interesting design constraint is that the boundary must hold against the agent operating inside it, which rules out most of the obvious implementations.
- Verification by adversary, not by vibes. gauntlet runs a two-role loop, an attacker and an inspector, against a running service and infers correctness from how the service behaves under sustained attack. Built for the case where a human never reads the diff.
- Observability over the whole substrate. repo-recall joins OTel spans, git state, and Claude Code sessions into one queryable surface. session-lattice maintains incremental views over it. Agent-to-agent traffic rides otel-a2a-relay, so even the agents talking to each other shows up as spans.
tailnet section below.
> production_floor
The floor is organized into three bays. Two starting points if you're browsing: gauntlet is the thesis in code, and ward is the hard design problem. If you want to click something that runs right now, the galaxy sim is live at galaxy-gen.coilysiren.me.
coilyco-flight-deck - the flight deck, where the builds launch.
The flagship is gauntlet RUNNING HOT, the two-agent adversarial loop from the thesis above: point it at a running service and it infers correctness from how the service holds up under sustained, targeted attack. The boundary those agents operate inside is ward ACTIVE, an escape-hatch-resistant CLI wrapper that privileged operations route through, audit-logging every call - the hard part is that it has to hold against the agent operating inside it. Feeding it context is the observability substrate: repo-recall ACTIVE indexes every Claude Code session on the fleet, and session-lattice SCAFFOLDED keeps incremental materialized views over that data (Feldera, DBSP) for luca to answer questions with. infrastructure OPERATIONAL is the factory floor everything else stands on - the single-node k3s cluster, GH Actions deploys, SSM-backed secrets, Tailscale. And for something with no agents in it at all, galaxy-gen LIVE draws procedural galaxies in Rust-compiled-to-WASM at galaxy-gen.coilysiren.me.
coilyco-bridge - the bridge, where the controls live.
coily RETIRING is the security boundary the lights-out bet was first built on: the escape-hatch-resistant CLI wrapper whose design coily proved and ward now carries. It has not gone dark - coily still runs the game servers on kai-server until gaming ports over. Its neighbor eco-cycle-prep ACTIVE runs the automation that stands up each new Eco server cycle.
coilyco-gaming - the gaming bay, newest on the floor.
Everything for the Eco via Sirens game server lives here. eco-app is the companion-services monorepo - the MCP server Claude Desktop talks to, the player-professions dashboard, the replay browser, and the telemetry mod, four former repos fused into one deployable. eco-mods carries the C# gameplay mods that run inside the server itself.
coilysiren - the operator's own bay.
The personal namespace: this profile you're reading, and the site at coilysiren.me, where the resume and the /now page live.
> shift_report
yaml
role: Senior Platform Engineer
employer: Kapwing
shift: lights-out
fleet: 27 devices · 1 tailnet
specialties:
- platform / SRE
- AI agents + MCP
- observability
- adversarial testing
prior_art:
- urfave/cli maintainer
- HHS gov site @ Nava
- DevOps EM @ EnergyHub
- BGP VPN @ Textio
- Crypto product @ Callisto
> tailnet
Everything above is claims. From here down, receipts.
"Homelab" undersells it. The fleet is joined by Tailscale into a single tailnet across two physical sites, and the device list is most of the story: the machines, the phones, the WSL guests, and every k3s service that publishes itself onto the mesh as its own node.
site 1 · east bay
├─ kai-server k3s · always-on
├─ kai-tower-3026 3090 ti · llm
├─ kai-desktop-tower rtx 2080 · dark
└─ kasa hs300 hard-reset path
site 2
└─ ser8 warm standby · DR
roaming
├─ kais-macbook-pro
├─ kai-windows-laptop
└─ pixel-9
ephemeral
└─ gha runners · wsl · k8s proxies
> fleet_inventory
| Node | Notes |
|------|-------|
| kai-server | Intel i7-14700, 32 GB, no dGPU. The always-on box: single-node k3s running every personal service, plus game servers (Eco, Factorio, Icarus, Core Keeper). The only machine allowed to hold state. |
| kai-tower-3026 | Brand new AM5 build: Ryzen 9 9950X3D, 64 GB DDR5, RTX 3090 Ti 24 GB. Daily driver and heavy LLM machine one of two. |
| kai-desktop-tower | The previous tower, i7-8700 with an RTX 2080. Heavy LLM machine two of two, currently dark: the new build is borrowing its power cable. Showing ○ offline above until a second cable arrives. |
| kai-windows-laptop | i7-11800H, 16 GB, RTX 3060 mobile. Travel Windows host, burst inference when open. |
| kais-macbook-pro | Apple Silicon. Travel default, where most Claude Code sessions originate. Runs a local Qwen 9B (MLX) through Ollama with OpenCode pointed at it, scoped to trivial tasks. |
| ser8 | Beelink SER8, Ryzen 7 PRO 8845HS, 64 GB. Cross-site warm standby for the k3s control plane. Separate power, ISP, and site, which is what makes the DR story real. |
Footnotes: a worker-only Radxa Zero 3W appears in the standby topology but is unfit to hold state (WiFi plus SD card, no thanks), and a Kasa HS300 smart power strip feeds the site-1 fleet as the hard-power-cycle path of last resort. When software observability fails, there is always the physical layer.
> tailscale_status
The live mesh, regenerated by [scripts/fleet-readout.sh](scripts/fleet-readout.sh). Hostnames real, everything opaque redacted, third-party devices excluded.
$ tailscale status
● kais-macbook-pro macos
● api linux
● backend-db linux
○ coilysiren-backend-coilysir… linux
● coilysiren-eco-mcp-app-coil… linux
● coilysiren-eco-spec-tracker… linux
○ coilysiren-galaxy-gen-coily… linux
● forgejo-1 linux
○ forgejo linux
● galaxy-gen linux
○ kai-desktop-tower-wsl linux
○ kai-desktop-tower windows
○ kai-mac-kapwing macos
○ kai-macbook-pro-vm linux
● kai-server linux
● kai-tower-3026-wsl linux
● kai-tower-3026 windows
○ kai-windows-laptop windows
○ kais-macbook-pro-1 macos
● ntfy linux
○ observability-vmsingle-tail… linux
● pixel-9 android
● repo-recall linux
● ser8 linux
● signoz linux
● tailscale-operator linux
● vmsingle linux
27 devices · 1 tailnet · 2 sites
Yes, the phone is a tailnet node. Yes, the Forgejo instance, the notification daemon, and the metrics store are each their own device. The Tailscale operator publishes k3s services onto the mesh, so the cluster's insides show up on the device list like roommates.
> kubectl_get_pods
The same factory from the cluster's point of view, same redaction rules (hash suffixes are opaque ids, so they drop).
$ kubectl get pods -A
cert-manager/
● cert-manager
● cert-manager-cainjector
● cert-manager-webhook
coilysiren-backend/
● coilysiren-backend-app
● coilysiren-backend-db
coilysiren-eco-mcp-app/
● coilysiren-eco-mcp-app-app
coilysiren-eco-spec-tracker/
● coilysiren-eco-spec-tracker-a…
coilysiren-galaxy-gen/
● coilysiren-galaxy-gen-app
default/
● null-db
external-secrets/
● external-secrets
● external-secrets-cert-control…
● external-secrets-webhook
forgejo/
● forgejo-db
● forgejo
◌ forgejo-runner
✗ forgejo-runner-tap-writer
● ts-forgejo
kube-system/
● coredns
✓ helm-install-traefik-crd
✓ helm-install-traefik
● local-path-provisioner
● metrics-server
● svclb-traefik ×3
● traefik
lunch-money/
● lunch-money-lunch-money-k8s
ntfy/
● ntfy
observability/
● chi-signoz-clickhouse-cluster
● grafana
✗ node-exporter-prometheus-node…
● node-exporter-prometheus-node… ×2
● signoz
● signoz-clickhouse-operator
● signoz-otel-collector
✓ signoz-telemetrystore-migrator
● signoz-zookeeper
● ts-signoz
● ts-vmsingle
● victoria-metrics-victoria-met…
● vmagent-victoria-metrics-agent
openclaw/
◌ openclaw
registry/
● registry
repo-recall/
● repo-recall
tailscale/
● operator
● ts-coilysiren-eco-mcp-app-ser…
● ts-coilysiren-eco-spec-tracke…
48 pods · 16 namespaces · 1/3 nodes
The ✗ marks are real. So is the 1/3 nodes: two joined workers (the WSL guest and a Mac VM from the tailnet list above) sit NotReady while kai-server carries everything. A lights-out factory that only ever shows green is lying to you.
> local_llm_modes
The fleet maps onto a three-mode local-model plan:
- Mode 1 (burst) - the dGPU machines, when they happen to be on and plugged in. The new tower's 3090 Ti is the workhorse, the old tower's 2080 rejoins the line once it gets its power cable back, and the laptop's 3060 pitches in.
- Mode 2 (always-on) - kai-server orchestrates, calls into a tower GPU over the tailnet when reachable, falls back to CPU-only inference or an API otherwise. CPU-only on the i7-14700 is real but humble.
- Mode 3 (api) - frontier models over the wire for everything that deserves them.
> stack
Python, Go, TypeScript, Bash, C#. AWS, Kubernetes (k3s), Terraform, Docker, Tailscale. Prometheus, Grafana, Sentry, OpenTelemetry. Claude Code, MCP.
> service_history
2025-now Kapwing Senior SWE
2023-2025 Nava Principal Infra
2022-2023 Textio Staff Infra
2021-2022 EnergyHub DevOps EM
2020-2021 Bluelink Senior Backend
2018-2020 Textio Senior Infra
2016-2018 Callisto Senior SWE
Older: Harlot, Quirell/CollectQT, NASA Goddard. Full résumé: coilysiren.me/resume. What I'm doing right now: coilysiren.me/now.
> faq
Why does a profile README have a network diagram and a pod listing? Because this repo is the one place in the fleet with no size cap, no managed hooks, and no validators. Every other repo I own answers to a pre-commit suite rolled out from a central baseline. This one carries an exemption marker and does what it wants. Naturally it became the long-form surface.
Are the readouts real? Yes. They're generated by [scripts/fleet-readout.sh](scripts/fleet-readout.sh) against the live tailnet and cluster, then pasted in. The redaction is the interesting part: tailnet IPs, FQDNs, account labels, pod hash suffixes, and other people's devices are all stripped before anything lands in git, because opaque identifiers stay out of tracked files on principle. The systemd unit in the banner is aspirational - the numbers in its status line are not.
> comms
coilysiren.me · Bluesky · X · LinkedIn
See also
- [AGENTS.md](AGENTS.md) - agent bootstrap guide and operating rules.
- [docs/FEATURES.md](docs/FEATURES.md) - inventory of what ships today.
- [.ward/ward.yaml](.ward/ward.yaml) - allowlisted commands.
-
AGuideToClassMobility ▣
Helping people work their way up!
JavaScript ★ 30 12y agoExplain → -
algo-zone ▣
A workshop for algorithms and data-structure puzzles — pronounced like "auto zone"
Python ★ 12 14d agoExplain → -
py-sh ▣
A static binary for doing your shell grunt work in python
Makefile ★ 10 3mo agoExplain → -
TumblrDevKit ▣
Tumblr SASS building kit
Python ★ 10 9y agoExplain → -
website
coilysiren.me — personal site and technical writing on platform engineering, systems, and side projects
TypeScript ★ 8 14h agoExplain → -
galaxySim ▣
Simulates galaxy formation / generation via gas / star behavior in a region of space, via equations for gravitational and diffusive force (or simplified versions thereof).
Python ★ 6 2mo agoExplain → -
assets ▣
re-usable things
Shell ★ 5 2y agoExplain → -
firestarter ▣
Start a flask site really fast!
HTML ★ 4 9y agoExplain → -
spaceplan-optimizer ▣
find the best purchases for spaceplan
JavaScript ★ 3 8y agoExplain → -
personal-dashboard ▣
Phone-first Pulse-style personal dashboard. Tailscale-only daemon on kai-server. Reads daily-* outputs, vault inbox, repo-recall, Sentry, Grafana, Phoenix, Bluesky, Discord, Reddit, Steam, Hue, Sonos, Cast. Writes through coily web-ops MCP.
Go ★ 2 1mo agoExplain → -
json-api-template ▣
No description.
Python ★ 2 2y agoExplain → -
docker-images ▣
personal docker images
Dockerfile ★ 2 6y agoExplain → -
lynncyrin.github.io ▣
website moved to `lynncyrin-dot-me`
HTML ★ 2 8y agoExplain → -
djangocms_server ▣
For managing multiple DjangoCMS installations on a server
Shell ★ 2 8y agoExplain → -
polygot-template ▣
a skeleton for doing work in any given language, using local docker
Shell ★ 2 7y agoExplain → -
twitter_unfollow ▣
Twitter automatic (with some command line feedback) unfollow tool
Ruby ★ 2 5y agoExplain → -
coilysiren
GitHub profile README. Landing page for the lights-out factory.
Shell ★ 1 14h agoExplain → -
linuxbrew-operator ▣
Kubernetes operator that reconciles BrewFormula custom resources by running Linuxbrew. Yes, really.
Go ★ 1 1mo agoExplain → -
cli-web-ops ▣
urfave/cli v3 extension: mobile-first web executor (Tailscale-bound, asymmetric-key auth). Intended for the urfave/cli ecosystem.
Go ★ 1 1mo agoExplain → -
cli-web-docs ▣
urfave/cli v3 extension: static HTML documentation generator from a command tree. Intended for the urfave/cli ecosystem.
Go ★ 1 1mo agoExplain → -
cli-mcp ▣
urfave/cli v3 extension: project a command tree as an MCP server (stdio + SSE). Intended for the urfave/cli ecosystem.
Go ★ 1 1mo agoExplain → -
homebrew-tap ▣
Homebrew tap for coilysiren tools
Ruby ★ 1 1mo agoExplain → -
honeycomb-battleships ▣
Kai's bot for the Honeycomb Battleships workshop at o11yCon 2026. Python + OpenTelemetry + Honeycomb.
Python ★ 1 1mo agoExplain → -
public-tap-private-s3 ▣
a homebrew download strategy that uses a public tap backed by a private s3 bucket
★ 1 7y agoExplain → -
claude-code-render-tricks ▣
Color rendering tricks for Claude Code Desktop chat using the fenced-block syntax highlighter. Skillsmp-compatible.
★ 1 2mo agoExplain → -
claude-code-pulse ▣
Statusline + rollup hook for Claude Code: per-turn ctx/token/cache/cost vitals with deltas, pattern-triggered session rollup injection.
Python ★ 1 2mo agoExplain → -
claude-skill-discipline ▣
Pre-commit hooks for Claude Code skill repositories. Skill conventions, dead cross-links, commit-closes-issue.
Python ★ 1 1mo agoExplain → -
bluesky-apps ▣
Small apps and experiments on the AT Protocol / Bluesky.
TypeScript ★ 1 2mo agoExplain → -
scratchpad ▣
No description.
Python ★ 1 6mo agoExplain → -
deploy ▣
deployment for python API + react frontend, via pulumi and typescript
TypeScript ★ 1 5mo agoExplain → -
leetcode-snippets ▣
snippets from leetcode exercises
Python ★ 1 6y agoExplain → -
github-service ▣
a service for collecting personal github information
HCL ★ 1 3y agoExplain → -
YouTokenToMe ⑂ ▣
Unsupervised text tokenizer focused on computational efficiency
★ 1 11mo agoExplain → -
Eco-Mods-1 ⑂ ▣
A mod for Eco to encourage continued player spending in the economy by offering QoL bonuses
★ 1 1y agoExplain → -
skeeter-deleter ⑂ ▣
A script for auto-deleting Bluesky posts
★ 1 1y agoExplain → -
simpler-grants-pdf-builder ⑂ ▣
PDF builder that's used by the SimplerNOFOs project, part of the Simpler Grants initiative at HHS.
★ 1 1y agoExplain → -
scratchpad-o11y ▣
No description.
Rust ★ 1 2mo agoExplain → -
eco-agent ▣
Python FastAPI companion service for an Eco (Strange Loop Games) multiplayer server: Discord bot, REST API, OpenTelemetry, Sentry, AWS SSM, k3s deploy
Python ★ 1 2mo agoExplain → -
images ▣
generic purpose docker images for personal use
Dockerfile ★ 1 3y agoExplain → -
rails-twitter-tools ▣
an array of twitter tools, including mute-till-election
Ruby ★ 1 3y agoExplain → -
lynn-cli ▣
a mono-cli local developement strategy
Go ★ 1 6y agoExplain → -
twitter-poet ▣
No description.
Python ★ 1 8y agoExplain → -
djangocms ▣
No description.
Python ★ 1 12y agoExplain → -
blog ▣
WIP redo for website things
Python ★ 1 10y agoExplain → -
community-health-monitor ▣
"thinking of a web app that [voluntarily] tracks people who are members of a certain community so that you can track community health"
CSS ★ 1 12y agoExplain → -
gatsby-starter-netlify-cms ▣
No description.
JavaScript ★ 1 7y agoExplain → -
tracky-mouse ⑂ ▣
Mouse control via head tracking, as a cross platform desktop app and JS library. eViacam alternative.
JavaScript ★ 0 1mo agoExplain → -
example ▣
example repo used as a placeholder ward repo authority target
★ 0 5d agoExplain → -
cli-mcp-go-ecosystem ▣
MCP server exposing proxy.golang.org + vuln.go.dev read tools, built on cli-mcp
Go ★ 0 1mo agoExplain → -
ONI ▣
Tooling and notes for Oxygen Not Included.
★ 0 4y agoExplain → -
wezterm ⑂ ▣
A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust
★ 0 2mo agoExplain → -
TimberbornModsUnity ▣
No description.
Python ★ 0 3y agoExplain → -
k8s-gcp ▣
deploying a generic application to Kubernetes on Google Cloud Platform
HCL ★ 0 2y agoExplain → -
writespeakcode.com ⑂ ▣
New website for Write Speak Code Organization and conferences
JavaScript ★ 0 3y agoExplain → -
github-issue-templates ⑂ ▣
:symbols: A collection of GitHub issue and pull request templates
★ 0 6y agoExplain → -
django_migration_testcase ⑂ ▣
For testing migrations in Django
Python ★ 0 7y agoExplain → -
cpython ⑂ ▣
The Python programming language
Python ★ 0 8y agoExplain → -
fetch ⑂ ▣
A window.fetch JavaScript polyfill.
★ 0 6y agoExplain → -
selfdefined ⑂ ▣
Dictionary database with future API and bot integrations
★ 0 6y agoExplain → -
empire ⑂ ▣
A PaaS built on top of Amazon EC2 Container Service (ECS)
Go ★ 0 7y agoExplain → -
logrus ⑂ ▣
Structured, pluggable logging for Go.
Go ★ 0 3y agoExplain → -
go-github ⑂ ▣
Go library for accessing the GitHub API
★ 0 3y agoExplain → -
NeverSink-Filter ⑂ ▣
This is a "lootfilter" for the game "Path of Exile". It's designed with the intention to provide quick detection/evaluation of good drops, while preserving a polished visual style and filtering junk.
★ 0 9y agoExplain → -
invandringsbot ⑂ ▣
When people post unreclaimed neo-nazi slurs, the bot (sometimes) replies with a callout, in between bland centre-right posts.
Python ★ 0 8y agoExplain → -
django ⑂ ▣
The Web framework for perfectionists with deadlines.
Python ★ 0 8y agoExplain → -
django-session-security ⑂ ▣
A little javascript and middleware work together to ensure that the user was active during the past X minutes in any tab he has open. Otherwise, display a warning leaving a couple of minutes to show any kind of activity like moving the mouse. Otherwise, logout the user.
Python ★ 0 9y agoExplain → -
eco-mod-cache ▣
No description.
C# ★ 0 4y agoExplain → -
twitter-service ▣
a service for collecting personal twitter information
Makefile ★ 0 3y agoExplain → -
todo ▣
various project / TODO list ideas
★ 0 7y agoExplain → -
toolkit ▣
Personal toolkit!
Python ★ 0 12y agoExplain → -
heroku-cli-pgcli ▣
pgcli plugin for Heroku Toolbelt
JavaScript ★ 0 9y agoExplain → -
resume ▣
~ my resume ~
★ 0 10y agoExplain → -
spacegame ▣
Rougelike space adventure
Python ★ 0 12y agoExplain → -
markdown2pdf ⑂ ▣
A python command line tool to convert markdown files to pdf
CSS ★ 0 8y agoExplain → -
css_server ▣
No description.
CSS ★ 0 9y agoExplain → -
sj2neo ▣
No description.
CSS ★ 0 10y agoExplain → -
harlot-media-archive ▣
(archived) The Dirtiest Well-known Secret
CSS ★ 0 9y agoExplain → -
lita-timecard ▣
Allows users to create timecards with entries like 10m, 2h
Ruby ★ 0 9y agoExplain → -
prosaic ⑂ ▣
cut-up poetry generation over large corpora
Python ★ 0 5y agoExplain → -
libsodium-type-generator ⑂ ▣
Generate TypeScript definitions for libsodium.js
TypeScript ★ 0 5y agoExplain → -
protractor-console ⑂ ▣
No description.
JavaScript ★ 0 5y agoExplain → -
mastodon ⑂ ▣
A GNU Social-compatible microblogging server
Ruby ★ 0 5y agoExplain →
No repos match these filters.