carlos / todomvc-bakeoff Public
docs: where you'd use each setup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 files changed,
+17
−0
docs/writeup.md+15 −0report/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's builder had to patch a copy of the standard library'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'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's code is straightforward.</p> |
| +<h2>Where you'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'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's own framework</td></tr><tr><td><strong>Go</strong></td><td>You want CARLOS's defaults without a framework, or a small service or tool</td><td>You'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'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'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'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't empty or reset an instance'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't see an instance'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's own log events are accurate. And the edge'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> |