Date: 2026-05-30
Accepted
Islandr's backend needs to:
wg, ip, and nft CLIs on the hub VM (long-lived process, file descriptors, real-time exit codes).wg show <iface> dump every 30s and persist samples.The Rust path was considered seriously and dropped. Rust would give us a smaller binary and lower idle memory, but the iteration cycle (slow rebuilds, more friction around ORM and HTTP boilerplate, smaller talent pool on the team) cost more than the runtime savings were worth for a single-VM self-hosted tool.
The team is JVM-fluent. The artifact must run with no JVM installed on the target VM, so a native-image story is required.
Use Quarkus 3.x on Java 21 as the backend framework.
java.lang.ProcessBuilder for wg and nft — no special framework abstraction needed.@Scheduled (Quarkus Scheduler).quarkus dev) and Dev Services for the database.Scoring vs. Quarkus as the baseline. +1 better, 0 equal, -1 worse, ? not enough information.
| Criterion (weight) | Quarkus (baseline) | Spring Boot | Rust (Axum + sqlx) | Go (chi + sqlc) |
|---|---|---|---|---|
| Iteration speed (5) | 0 | -1 | -1 | 0 |
| Single-binary deployment (4) | 0 | -1 | +1 | +1 |
| Idle memory footprint (3) | 0 | -1 | +1 | +1 |
| Team familiarity (4) | 0 | +1 | -1 | -1 |
| ORM / migration ergonomics (3) | 0 | 0 | -1 | -1 |
| Native-image maturity (3) | 0 | -1 | n/a (native) | n/a (native) |
| Process-invocation ergonomics (2) | 0 | 0 | 0 | 0 |
| Weighted total | 0 | −9 | −2 | −1 |
The matrix says Quarkus wins by a clear margin against Spring Boot and a thin margin against Go/Rust. The thin margins are real, not noise: Go and Rust both give better idle footprint and single-binary stories, but lose enough on iteration speed and ORM ergonomics that for a single-VM, single-team product, the trade goes the other way.
Notes on individual cells:
sqlx and sea-orm are good but migration tooling and the Panache find().list() style of ad-hoc query are missing.sqlc is excellent but more boilerplate than Panache for the simple CRUD that makes up most endpoints here.Positive
@Scheduled covers the activity poller with no extra dependency.Risks created
ProcessBuilder calls for nft -f can block a worker thread. Mitigation: run them on Quarkus's worker pool, not the I/O thread; bound execution time.Accepted trade-offs
quarkus dev keeps the process warm.