microVM Firecracker-isolated Minecraft hosting

Run a fleet of Minecraft servers like cloud infrastructure

Craftling is a control plane for multi-host, Firecracker-microVM Minecraft hosting. Declare the servers you want — a desired-state reconciler schedules them across your host fleet, boots them in hardware-isolated microVMs, and keeps world data durable in object storage.

Hardware-isolated microVMs Per-VM eBPF NAT — no bridge, no iptables Durable world storage
console.craftling.io/servers
Running
8
Players online
169
Fleet vCPU
62/224
ServerStatusVersionPlayers
skyblock-prod
gs-2k9·host-c41d
Running1.20.447/80
vanilla-smp
gs-4f1·scheduling
Starting1.21.40/40
modded-atm9
gs-9e0·retry 28s
Error1.20.1
anarchy-2k
gs-a77·host-5a77
Running1.20.461/100
build-sandbox
gs-b22·unplaced
Stopped1.19.4
Built on Firecracker Go control plane S3-compatible storage eBPF dataplane PostgreSQL
Platform

Everything between "I want a server" and a running world

One reconciler owns every compute side effect. Declare desired state through the API or console; Craftling makes it real and keeps it that way.

Desired-state reconciler

Every two seconds, Craftling diffs what you asked for against what's actually running and converges the gap — the single writer of all compute side effects.

desired vs observedsingle writer

Firecracker isolation

Each server boots in its own microVM with a dedicated kernel and rootfs — true hardware-level isolation between tenants, not shared containers.

dedicated kernelvCPU / mem from spec

Multi-host fleet

Worker hosts dial in and hold one gRPC stream open to the control plane — registering, heartbeating, and taking commands on it. Drop the stream and the host is marked down at once; capacity and liveness are always current.

persistent streamzones

Capacity-aware scheduler

Unplaced servers are assigned to a ready host with room, reserving CPU and memory atomically. Specs too big for any host fail fast as unschedulable.

least-loadedatomic reserve

Durable world storage

Worlds live in S3-compatible object storage, pulled into the VM at boot and flushed back via RCON save-all — so a server can safely move between hosts.

per-server keysafe reschedule

eBPF networking & flow telemetry

Each VM gets a private IP and a published host port — SNAT out, DNAT in — on an eBPF/TCX dataplane riding kernel nf_conntrack. No Linux bridge, no iptables. Every flow emits an event, and per-VM byte, packet, and drop counters are tracked in eBPF maps.

per-VM SNAT/DNATnf_conntrack kfuncsper-flow events
The core loop

Declare desired state. The reconciler does the rest.

Craftling never executes one-off imperative actions. You change what you want; observed status converges toward it, tick after tick.

Desired
running
running
stopped
running
RECONCILE
Observed
running
starting
stopped
unschedulable
The reconciler is the sole writer of compute side effects. New backends slot in behind a Provisioner interface without touching the API.
1

You declare intent

Create a server with a version and size, or flip it between running and stopped — through the console or API. That's a write to desired_state, nothing more.

2

Scheduler places it

If a running server has no host, the scheduler picks a ready host with capacity and reserves it atomically — or marks it unschedulable and retries.

3

Agent enacts on the host

The control plane pushes the command down the gRPC stream the agent holds open, and the agent boots the Firecracker microVM. The control plane itself never touches KVM — and never dials the agent.

4

Status flows back up

Agents report observed per-VM status back up the same stream, which reconciles into each server's status, tick after tick, until it matches what you asked for.

Architecture

A clean seam between control and compute

The control plane decides; host agents act. Neither leaks into the other — which is what makes the fleet safe to scale.

// control plane

Decide

Stateless API + reconciler. HA behind a load balancer; never runs KVM.

Auth · JWT + refreshrotating
Reconciler2s
Schedulerfirst-fit
// host agent

Act

Runs on each KVM host. Owns the microVM runtime; reports status up.

Firecracker runtimeKVM
World disk + snapshotsvsock
eBPF NAT dataplanenf_ct
// state

Persist

Durable record of intent, fleet, and worlds — survives any single node.

PostgreSQLmigrations
World storeS3
World GC reaperhourly
Control-plane-authoritative hybrid. Agents dial in and hold one gRPC stream open: they push observed status up it, and the control plane enacts desired state by pushing commands down it — never dialing agents. Owner-scoped by default, admin-visible across the whole fleet, with soft deletes and audit retained.
Roadmap

From control plane to production fleet

A phased path, each milestone anchored to real code and verified end-to-end. The control plane, fleet, scheduler, agent split, Firecracker runtime, an eBPF NAT dataplane, and durable world persistence have shipped — observability, reliability, and quotas are next.

Foundation

Control plane

Auth, roles, owner-scoped CRUD, the reconciler, and the Provisioner seam — shipped and e2e-tested.

P0

Foundations

Migration tooling, Start/Stop/Status on the Provisioner, and a server/agent mode split.

P1

Host fleet

In-memory fleet inventory, agent-initiated registration + heartbeat over a persistent stream, capacity queries, and a reaper that marks stale hosts down.

P2

Scheduler

Placement onto ready hosts with atomic capacity reservation; oversize specs marked unschedulable.

P3

Agent split

A dedicated host-agent binary and a RemoteProvisioner — the reconciler's call becomes a network hop.

P4

Firecracker runtime

Real microVMs from a versioned Minecraft rootfs — kernel + JRE + server jar, RCON enabled.

P5

World persistence

A per-server world disk overlaid on the read-only rootfs; an S3/dir WorldStore with restore-on-boot, consistent live snapshots, on-demand backups, and orphan GC.

P6

Networking

Per-VM eBPF SNAT/DNAT over nf_conntrack — no bridge, no iptables — with a published host port written back to each server and per-flow telemetry in eBPF maps.

P7

Observability

Deep health via RCON / Server-List-Ping probes (player count, MOTD) and Prometheus /metrics across the control plane and agents.

P8

Reliability

Retry with backoff, host-failure rescheduling with fencing, draining, and optional leader election.

P9

Quotas

Per-user limits on servers, vCPU, and memory — enforced at create and update.

P10

Hardening & ops

Agent-to-plane mTLS, secrets management, isolation review, and the split deploy topology.

Read the full plan

Platform roadmap
Maintainers

Built and maintained in the open

A small core team stewards Craftling across the control plane, the host agent, and storage — alongside everyone who sends a pull request.

Afshin AraniAA

Afshin Arani

@aarani

Project lead. Resident Minecraft player, owns the infra, pays the bills.

infrastructure
Ashkan A. NamiAN

Ashkan A. Nami

@namiashkan16

ghost
Saba EmamjomehSE

Saba Emamjomeh

@SabaEmamjomeh

Mastermind behind the agents, never been invited to play Minecraft

scheduler
Arman MonajemiAM

Arman Monajemi

@monajemi-arman

2nd resident Minecraft player, likes to rewrite everything in RUST

storage / net
Free & open source

Run Craftling on your own fleet

Clone the repo, point it at your hosts, and declare the servers you want. Self-hosted, no vendor lock-in — contributions welcome.