slides(tappaas): recast The Bad around amortisation, not personal cost
All checks were successful
Build docs site / build (push) Successful in 46s
Build slides / build (push) Successful in 1m11s

Drop the commit-graph slide and the two cost slides. Replace all three with
one argument: the platform is expensive to build, but that cost is fixed and
per-site cost is near zero — so it only makes sense shared across many home
labs and SMB sites.

"What I got wrong" becomes "Did I get it all right?" — no, two large rewrites
(ADR-007 numbering to dependsOn, ADR-014 zone tiers to checked state) plus a
predecessor system run for years before this one.

36 slides; the agenda line and the quiet-months slide no longer refer to the
graph that left.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lars Rossen 2026-08-25 17:44:40 +02:00
parent 485f53f48d
commit a133efe3bf

View file

@ -104,7 +104,7 @@ Community repo: codeberg.org/TAPPaaS/Community.
## What I am actually going to do to you ## What I am actually going to do to you
1. **The Good** — it runs. Here is what "it runs" means, and one surprise. 1. **The Good** — it runs. Here is what "it runs" means, and one surprise.
2. **The Bad** — what this really cost. The commit graph is not pretty. 2. **The Bad** — what it really costs, and why that only works if it is shared.
3. **The Ugly** — the confession. I gave an AI root on every node. 3. **The Ugly** — the confession. I gave an AI root on every node.
4. **Your turn** — why you should build one, and how to start small. 4. **Your turn** — why you should build one, and how to start small.
@ -352,39 +352,7 @@ What it actually cost.
--- ---
## The brutal commit graph of a side project ## The quiet months are the honest part
```text
2025-05 99 ██████████ ← the honeymoon
2025-06 21 ██
2025-07 53 █████
2025-08 141 ██████████████ ← Sommerhack 2025
2025-09 6 █ ← life
2025-10 9 █ ← still life
2025-11 41 ████
2025-12 47 █████
2026-01 66 ██████
2026-02 141 ██████████████
2026-03 33 ███
2026-04 19 ██
2026-05 190 ██████████████████
2026-06 351 ██████████████████████████████████ ← something changed
2026-07 164 ████████████████
2026-08 83 ████████ (to the 20th)
```
This is what a real side project looks like. Not a burndown chart. A heartbeat
with two near-death experiences in it.
<!--
Point at Sept/Oct 2025: six and nine commits. Two months of nearly nothing.
Be honest about why — the audience has all had that autumn.
TODO below is yours to fill in.
-->
---
## The two dips are the honest part
**September–October 2025: 15 commits in two months.** **September–October 2025: 15 commits in two months.**
@ -393,7 +361,7 @@ TODO below is yours to fill in.
The lesson I take from it: a self-hosted platform that needs *you* every week The lesson I take from it: a self-hosted platform that needs *you* every week
is not a platform, it is a pet. is not a platform, it is a pet.
The dips are the real test. The services stayed up. Those two months are the real test. The services stayed up.
Because updates, backups and tests do not need me to be enthusiastic. Because updates, backups and tests do not need me to be enthusiastic.
<!-- <!--
@ -441,58 +409,59 @@ Source: src/STATISTICS.md, regenerated 2026-08-23.
--- ---
## What it costs in money ## It is a lot of work. That is the argument for sharing it.
| | | Building this was not cheap, and I will not pretend otherwise:
**112,000 lines**, 1,507 commits, 24 ADRs, six unfamiliar stacks, a year of evenings.
But look at *where* that cost sits:
| Paid **once**, by whoever writes it | Paid by **you**, per site |
| --- | --- | | --- | --- |
| Hardware | `TODO: what you actually spent, be honest, include the mistakes` | | the 8 foundation modules | a box and an afternoon |
| Electricity | `TODO: measured W → kr/year at current DK prices` | | 145 test suites that gate every update | `module-manager module add <app>` |
| Satellite VPS | `TODO: kr/month` | | every install, update and repair script | nothing — patches arrive tested |
| Domain + DNS | `TODO:` |
| Licences | 0 |
| **Versus the hyperscaler equivalent** | `TODO: the comparison, done fairly — include your time at 0` |
The honest framing: this is **not** cheaper if you value your time at anything. A hyperscaler amortises a datacentre across a million tenants.
It is cheaper if you were going to tinker anyway, and it is *ownable* at any price. **We amortise a platform across a thousand basements.**
Erik's 13 modules and Andreas's 6 cost me nothing and made my system better.
Yours would too. That is the economic case: not that self-hosting is cheap,
but that **the expensive part only has to happen once.**
<!-- <!--
Do not oversell the economics. This audience will smell it instantly, and the This is the slide that turns The Bad from a complaint into an invitation.
sovereignty argument does not need a fake cost argument propping it up. The honest concession first — it IS a lot of work — then the pivot: almost
none of it is per-site work. Land on the last line and pause.
If someone objects "a thousand basements do not exist yet" — agree, and say
that is precisely why you are standing here.
TODO: your own hours-per-week number makes the concession land harder.
--> -->
--- ---
## What it costs in things that are not money ## Did I get it all right?
- **Learning curve you cannot delegate** — Proxmox, NixOS, OPNsense, ZFS, **No. There have been at least two large rewrites — and a whole system before this one.**
VLANs, PKI, OIDC. Any one of those is a weekend. You need all six.
- **You are the on-call.** At 22:00. On holiday.
- **Family SLA.** The moment calendars are on it, downtime is a domestic matter,
not a technical one.
- **Decision fatigue** — which is precisely why the project reduces flexibility.
- **The "why don't you just" tax** — from every friend, every time.
`TODO: your best war story — the outage that taught you the most` - **The predecessor.** I ran a hand-built setup for a few years before TAPPaaS
existed. Every design decision here is an argument I already lost once, at home.
- **Rewrite 1 — ADR-007.** Foundation modules used to be *numbered*:
`05-ProxmoxNode`, `10-firewall`, `30-tappaas-cicd`. The number **was** the
install order. Retired: order is now computed from `dependsOn`.
- **Rewrite 2 — ADR-014.** Zone tiers lived in prose in a README. Now `tier` and
`isolated` are state, and four invariants are machine-checked on every reconcile.
--- Both times the same lesson: something I had encoded as a **convention**
had to become a **declaration**.
## What I got wrong `TODO: name the predecessor, and say how long you ran it`
`TODO: pick three, be specific, be unflattering — this slide buys credibility for everything else`
Candidates from the graph and the repo:
- Numbered foundation modules (`05-`, `10-`, `30-`…) — retired in the ADR-007
refactor once ordering had to come from `dependsOn` instead
- `TODO:`
- `TODO:`
The pattern: everywhere I encoded an ordering or a name as a *convention*,
I later had to make it a *declaration*.
<!-- <!--
The 05-/10-/30- → dependsOn story is a genuinely good, concrete lesson and it This is the credibility slide. Do not soften the "No" — an audience that has
is in the repo history. Tell it properly if the other two are thin. just been told you gave an AI root needs to hear that you rebuild things when
they are wrong. The ADR-007 and ADR-014 stories are both in the repo if
anyone wants to check.
--> -->
--- ---