/ home / stack / compute

The right language for the right contract.

A monolingual backend is a confession that you didn't read the workload. We pick runtimes the way a kitchen picks knives — by the cut they make, not the brand on the handle. Go does I/O. Rust holds the hot path. Elixir handles the fan-out. The boundary between them is a contract, not an accident.

Every millisecond, audited.

STREAMING · jvn-network us-east-1
Requests / second
47.2k
across 23 services · 4 regions
p99 latency
180ms
p50 47ms · p95 112ms
Memory peak
340mb
per pod · GC stable
Error rate
0.003%
3 in every 100k · auto-retried

A runtime is a commitment. We pick by shape.

Five axes that matter once a service is on the production rota. Concurrency model is whether the runtime can handle 10k concurrent things gracefully. Cold start is what your CFO pays for at 3am. Type safety is what saves you at the boundary between teams.

Runtime
Concurrency
p99 ceiling
Cold start
Type safety
Verdict
Go1.23 · default for services
USE
Rust1.84 · for the hot path
USE
Elixir / PhoenixOTP 27 · fan-out & realtime
USE
Node.js22 LTS · BFFs & glue
USE
Python / FastAPI3.13 · ML & AI orchestration
USE
Java / Kotlin21 LTS · enterprise inheritance
WATCH
Ruby on Rails7.2 · monolith inheritance
RESCUE

Use means first-pick for a new service. Watch means we'll work in it cleanly if you already have it. Rescue means we modernize you off it — we don't add to it.

Three runtimes. One graph.

A real polyglot architecture under load — measured live across the JVN Network. Each runtime owns a contract; together they handle 340k concurrent connections without a single language having to be everything.

Go
Service plane · default
82% OF TRAFFIC
38.7k rps
stable across 14 services
HTTP routers · workers · BFFs · most CRUD
Rust
Hot path · crypto & codecs
12% OF TRAFFIC
5.6k rps
p99 4.2ms · zero GC
JWT signing · video transcode · SIMD scoring
Elixir
Realtime · fan-out
6% OF TRAFFIC
340k conns
concurrent · 6 nodes · 47ms p50
websockets · presence · pub-sub spine

From edge to disk and back — 47ms p50.

A production request as it crosses three runtimes, two datastores, and the event spine. Every hop is bounded, every boundary is a contract, every span ends up in OpenTelemetry.

EDGE GATEWAY SERVICE DATA cf.workers · POP 7ms · auth verify go.gateway 3ms · route + ratelimit go.svc / catalog 12ms · business rules rust.core / score 4ms · SIMD ranking elixir.realtime 2ms · broadcast postgres · primary 18ms · indexed read redis · cache 0.4ms · 91% hit total: 47ms p50 p99 ceiling 180ms · 4-region replicated
Each box is a span; each line is a propagated trace context. Every hop ends up in Grafana.

The patterns we keep when the runtime changes.

/ 01
The boundary is the product, not the language
Every service has a versioned, language-agnostic contract — protobuf, JSON Schema, or OpenAPI. The runtime behind it is a private decision. Replace the runtime, keep the boundary.
/ 02
Concurrency model dictates topology
Goroutines, async/await, OTP processes, threads — each implies a different deployment shape. We pick the model first, then let it choose pod size, replica count, and scheduler.
/ 03
Observability ships with the first endpoint
No service goes to staging without OTel traces, structured logs, and a Grafana dashboard. If you can't see it on day one, you'll never see it on day ninety.
/ 04
Cold starts are a budget line
Every runtime carries a startup cost we measure in cents per million invocations. We pick warm pools, edge-resident binaries, and lazy modules deliberately — not by default.

From servlets to edge functions.

2002 — 2009
The servlet years
J2EE, Tomcat, Apache + mod_perl, ASP.NET. Compute meant a long-running process glued to a thread pool. We learned what a leaky abstraction was the hard way.
TomcatPerl CGIASP.NET 1.xJBoss
2010 — 2014
Rails, Django, and the monolith
The framework was the architecture. Convention-over-configuration won fast, then aged into a deployment problem nobody admitted. Heroku abstracted the box; we paid the bill.
Rails 3Django 1.xHerokuSidekiq
2015 — 2019
Microservices, then regret
Docker shipped, Kubernetes shipped, and every team became 47 services that needed to talk to each other. The network became the bug surface. Service mesh was sold as a cure; it was a tax.
DockerK8s 1.0gRPCIstio
2020 — 2023
Go & Rust become boring
Two languages quietly became the default for new infrastructure. Boring is the highest compliment we pay a runtime. Elixir held its ground for the realtime path.
Go 1.21Rust 1.70PhoenixTokio
2024 — 2025
The edge runtime moment
Cloudflare Workers, Fly Machines, Deno Deploy. The cold start became a marketing line — and then it became a real number. Compute moved closer to the human, not the rack.
CF WorkersFly.ioDeno DeployWasm
2026 — now
Polyglot is operationally cheap
OpenTelemetry, gRPC and a shared event spine made running 3+ runtimes in production no harder than running 1. We pick the language for the workload — finally without paying twice.
OTel 1.0NATS JetStreamWasm componentsPulumi

Three runtimes carrying 340k concurrent humans.

JVN Network needed a real-time backbone that could carry hundreds of thousands of concurrent participants without buying a stadium of servers. A single-language stack would have either underrun the sockets or overpaid for the math.

We split the architecture along three contracts. Go owns the service plane — catalog, billing, identity, the things that look like CRUD. Rust takes the hot path — JWT signing, video transcode, ranking — anywhere a microsecond per call multiplies into a region. Elixir handles the fan-out — presence, broadcast, the websocket spine that makes 340k connections feel like one room.

The boundary between them is gRPC and a NATS event spine. No service knows what language its neighbour is. A team can rewrite a service overnight; the contract doesn't move.

"We didn't pick three languages. We picked three contracts and let the languages fall out of them."

— Jordan Hammond, founder, 404inc

Measured in production

CONCURRENT_CONNS340k
P50_LATENCY47ms
P99_LATENCY180ms
RUNTIMES_FRONTED3
SERVICES_BEHIND23
REGIONS_LIVE4

Compute is one of four.

Wrong language for the wrong job?

Bring us your slowest service. We'll tell you whether the runtime is the bottleneck — or whether the boundary is.