docs: where you'd use each setup

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 7c4ec8d52587a04441a041ded080d3016fc91084 parent 0ac20d3
2 files changed, +17 −0
  • docs/writeup.md +15 −0
  • report/site/writeup.html +2 −0
diff --git a/docs/writeup.md b/docs/writeup.md
index aa066fc..817e380 100644
--- a/docs/writeup.md
+++ b/docs/writeup.md
@@ -72,6 +72,21 @@ Use Rust when you want a mature server stack without giving much away. It runs a
Whatever you pick, check the route to a static ARM executable first. A hard route costs more time and money even when the app's code is straightforward.
+## Where you'd use each
+
+| Setup | Use it when | Think twice when | From the bakeoff |
+|---|---|---|---|
+| **Go + Rastrillo** | Building a real CARLOS product: sessions, migrations, identity, the family's conventions | You need high write rates in a single instance | 336 reads/s, 309 writes/s; 10 s cold build, 0.1 s rebuild; the platform's own framework |
+| **Go** | You want CARLOS's defaults without a framework, or a small service or tool | You'd end up rebuilding what Rastrillo gives you | 349 reads/s, 810 writes/s; same 10 s / 0.1 s builds; 1 dependency |
+| **Rust** | One instance takes heavy traffic, and you want a mature, production server stack | Fast edit-and-rebuild matters more than speed in production | 1,398 reads/s uncapped; 14 MB at rest; 3 MB binary; never failed under load; cheapest to build ($2.92) |
+| **Nim** | Footprint is everything: many busy tenants per box, tiny binaries | It's exposed to the internet and needs a hardened server (timeouts, keep-alive limits) | Top throughput (1,491 reads/s, 3,561 writes/s); 3.5 / 11.5 MB memory; 1.8 MB binary; patched stdlib server; 502s at 256 connections |
+| **Zig** | Same as Nim, with a C-like control over memory and almost no dependencies | You want a stable language to maintain for years (0.x; standard library APIs still change) | 1,382 reads/s, 3,113 writes/s; 2.5 MB at rest; 1.9 MB binary; an invalid-UTF-8 crash caught in review |
+| **OCaml** | Your team likes strong types and wants low, steady memory | You need native ARM builds without an emulator or a native ARM machine | 992 reads/s; peak memory only 17 MB; 18-minute emulated cold build |
+| **Haskell** | Your team already writes Haskell and values its type system | Build times and binary size matter | 400 reads/s; 77 MB peak (the highest); 29 MB binary; 19-minute emulated cold build, 27 s rebuild |
+| **Swift** | Your team writes Swift (say, sharing models with an iOS app) | Memory at rest matters (it had the highest) | 537 reads/s, 1,453 writes/s; 24 MB at rest; 22 MB binary; 81 s cold build |
+| **Spinel** | Experiments, and Ruby developers curious about compiled Ruby | Anything in production yet | 722 reads/s; tiny memory (13 MB peak); but the process exited 16 times under load; whole-program rebuild of 104 s; the costliest build ($10.70) |
+| **Mojo** | Not on Carloku today | — | Can't make a single self-contained binary; platform [Idea 360](https://amadan.net/carlos/platform/-/discussion/360) |
+
## What it means for Carloku
Mojo couldn't ship because its runtime comes only as shared libraries, which led to [Idea 360](https://amadan.net/carlos/platform/-/discussion/360): binary releases that carry their own shared libraries. Members can't empty or reset an instance's database, and deleting an instance parks its hostname until an operator purges it, which is [Feature Request 364](https://amadan.net/carlos/platform/-/discussion/364). Members also can't see an instance's memory use ([discussion 365](https://amadan.net/carlos/platform/-/discussion/365)).
diff --git a/report/site/writeup.html b/report/site/writeup.html
index 665cd41..f4c4615 100644
--- a/report/site/writeup.html
+++ b/report/site/writeup.html
@@ -85,6 +85,8 @@ dt { color: var(--muted); } dd { margin: 0; color: var(--ink-2); }
<p>Use Nim or Zig when memory, executable size and request rate matter. Both made executables under 2 MB, used a few megabytes at rest, and served about four times as many page loads as Go. The catch is maturity: Nim&#39;s builder had to patch a copy of the standard library&#39;s basic HTTP server to listen on a Unix socket, and that server has no request timeouts.</p>
<p>Use Rust when you want a mature server stack without giving much away. It runs axum on tokio, reached 1,398 page loads a second when the edge didn&#39;t intervene, used 14 MB at rest, and was the cheapest to build with AI.</p>
<p>Whatever you pick, check the route to a static ARM executable first. A hard route costs more time and money even when the app&#39;s code is straightforward.</p>
+<h2>Where you&#39;d use each</h2>
+<div class="scroll"><table><tr><th>Setup</th><th>Use it when</th><th>Think twice when</th><th>From the bakeoff</th></tr><tr><td><strong>Go + Rastrillo</strong></td><td>Building a real CARLOS product: sessions, migrations, identity, the family&#39;s conventions</td><td>You need high write rates in a single instance</td><td>336 reads/s, 309 writes/s; 10 s cold build, 0.1 s rebuild; the platform&#39;s own framework</td></tr><tr><td><strong>Go</strong></td><td>You want CARLOS&#39;s defaults without a framework, or a small service or tool</td><td>You&#39;d end up rebuilding what Rastrillo gives you</td><td>349 reads/s, 810 writes/s; same 10 s / 0.1 s builds; 1 dependency</td></tr><tr><td><strong>Rust</strong></td><td>One instance takes heavy traffic, and you want a mature, production server stack</td><td>Fast edit-and-rebuild matters more than speed in production</td><td>1,398 reads/s uncapped; 14 MB at rest; 3 MB binary; never failed under load; cheapest to build ($2.92)</td></tr><tr><td><strong>Nim</strong></td><td>Footprint is everything: many busy tenants per box, tiny binaries</td><td>It&#39;s exposed to the internet and needs a hardened server (timeouts, keep-alive limits)</td><td>Top throughput (1,491 reads/s, 3,561 writes/s); 3.5 / 11.5 MB memory; 1.8 MB binary; patched stdlib server; 502s at 256 connections</td></tr><tr><td><strong>Zig</strong></td><td>Same as Nim, with a C-like control over memory and almost no dependencies</td><td>You want a stable language to maintain for years (0.x; standard library APIs still change)</td><td>1,382 reads/s, 3,113 writes/s; 2.5 MB at rest; 1.9 MB binary; an invalid-UTF-8 crash caught in review</td></tr><tr><td><strong>OCaml</strong></td><td>Your team likes strong types and wants low, steady memory</td><td>You need native ARM builds without an emulator or a native ARM machine</td><td>992 reads/s; peak memory only 17 MB; 18-minute emulated cold build</td></tr><tr><td><strong>Haskell</strong></td><td>Your team already writes Haskell and values its type system</td><td>Build times and binary size matter</td><td>400 reads/s; 77 MB peak (the highest); 29 MB binary; 19-minute emulated cold build, 27 s rebuild</td></tr><tr><td><strong>Swift</strong></td><td>Your team writes Swift (say, sharing models with an iOS app)</td><td>Memory at rest matters (it had the highest)</td><td>537 reads/s, 1,453 writes/s; 24 MB at rest; 22 MB binary; 81 s cold build</td></tr><tr><td><strong>Spinel</strong></td><td>Experiments, and Ruby developers curious about compiled Ruby</td><td>Anything in production yet</td><td>722 reads/s; tiny memory (13 MB peak); but the process exited 16 times under load; whole-program rebuild of 104 s; the costliest build ($10.70)</td></tr><tr><td><strong>Mojo</strong></td><td>Not on Carloku today</td><td>—</td><td>Can&#39;t make a single self-contained binary; platform <a href="https://amadan.net/carlos/platform/-/discussion/360">Idea 360</a></td></tr></table></div>
<h2>What it means for Carloku</h2>
<p>Mojo couldn&#39;t ship because its runtime comes only as shared libraries, which led to <a href="https://amadan.net/carlos/platform/-/discussion/360">Idea 360</a>: binary releases that carry their own shared libraries. Members can&#39;t empty or reset an instance&#39;s database, and deleting an instance parks its hostname until an operator purges it, which is <a href="https://amadan.net/carlos/platform/-/discussion/364">Feature Request 364</a>. Members also can&#39;t see an instance&#39;s memory use (<a href="https://amadan.net/carlos/platform/-/discussion/365">discussion 365</a>).</p>
<p>Three smaller things came up. <code>carlos vet</code> is listed as a member command but needs operator access. The health column in <code>carlos instances list</code> lags by minutes, while the platform&#39;s own log events are accurate. And the edge&#39;s 64-request limit shapes any load test run from one machine. None of this stopped the apps from running, but it limits what members can measure and diagnose.</p>