How I choose the stack The problem picks the stack — not the other way around
I am not a Rust shop or a Java shop. I’ve shipped Rust-serverless architectures — an e-signature service, an investor data room, and an equity cap-table engine — alongside a Java audit platform over a bitemporal store, streaming Rust ETL, and cross-platform Flutter. Each stack is chosen for what the problem actually demands, not the other way around.
- Rust
- Zero cold start and no idle cost — memory-safe and garbage-collector-free, so serverless endpoints wake instantly and cost nothing when no one is calling.
- Java 25
- Virtual threads — tens of thousands of concurrent I/O operations without exhausting a thread pool or drowning in callbacks.
- Flutter
- One codebase, natively cross-platform — iOS, Android, and web from a single codebase instead of three parallel rewrites.
- Dart on the web
- Behavior that lives inside the browser and cannot be lifted by a scraper — interaction and logic that never reduce to a static page.
- Polars
- Stream 10GB+ files column by column, never loading them whole into memory — where a naive pipeline runs out of RAM.
- XTDB
- Bitemporal by design — answer what the record said and what was known as of any date, the question an audit trail lives on and a relational store cannot.
- Kafka
- Fan one event out to many consumers in real time — device telemetry, operational feeds, and event streams — where a request/response API collapses under the read volume and a nightly batch answers too late.
- S3 + Apache Iceberg
- Warehouse-grade tables — ACID commits, schema evolution, snapshot time-travel — on cheap, open object storage, without paying for a data warehouse.