Roadmap

What’s shipped, what’s being built right now, and what’s next. Dates reflect real engineering plans, not marketing promises.

Shipped Done and working
In Progress Actively being built
Planned Designed, not yet started
Shipped — Live today

☑ Core Platform

End-to-end declarative VM lifecycle on bare metal. Controller, node agent, CLI, networking, storage, mTLS — all working in production.

VM Lifecycle

  • Create, delete, start, stop, update VMs
  • Container workloads via containerd (kctl workload / kctl container)
  • Unified workload API for VMs and containers
  • Desired-state reconciliation via Nix
  • Cloud Hypervisor runtime
  • YAML manifest support (kctl create vm -f)
  • Wait for boot / SSH readiness

Storage & Volumes

  • Filesystem, LVM, and ZFS backends
  • Volume create, delete, attach, detach
  • Per-VM storage provisioning on create
  • Storage overview API (dashboard)

Networking

  • NAT, bridge, and VXLAN network types
  • Cross-host VXLAN with optional outbound NAT
  • VLAN ID support on gateway
  • Security groups with ingress + optional DNAT policy
  • kctl apply -f ... kind-based manifest dispatch (kubectl-style)
  • dnsmasq + nftables per network

Security & Operations

  • Full mTLS PKI (CA, sub-CA, per-node certs)
  • CN-based gRPC authorization
  • Cert rotation (kctl rotate)
  • Node drain and approval flow
  • Compliance reporting

Node Bootstrap

  • Automated node install via kctl node install
  • NixOS ISO with disko integration
  • PKI bootstrap into /etc/kcore/certs
  • Multi-disk layout (OS + data disks)

Platform

  • Capacity-aware scheduler (most-free-first)
  • Image management (URL+SHA256, upload, pull)
  • SSH key management
  • Dashboard (web UI)
  • Terraform provider (separate repo)
April 2026 — Shipped

⚙ Declarative Disk Partitioning

Declarative disk layouts from install through day-2. The live ISO generates disko-config.nix and runs disko --mode format,mount; the kcore.disko NixOS module expresses OS and data disks with optional merged fragments; nodes default to installer-only ownership and can be moved to controller-managed for declarative DiskLayout resources. The controller stores DiskLayout objects in its replicated DB and reconciles them to the target node, which atomically persists the layout to /etc/kcore/disk/current.nix and chains nixos-rebuild test + switch. The node-agent classifier refuses any layout that would touch a disk currently backing an active kcore volume, LVM PV, or ZFS pool member — the controller never touches VMs.

  • Shipped Install-time disko: generates disko-config.nix, runs disko --mode format,mount
  • Shipped modules/kcore-disko.nix with kcore.disko.* (including managementMode, controllerFragments, and persistedLayoutPath)
  • Shipped Ownership split: /etc/kcore/disk-management-mode — default installer-only; controller-managed unlocks declarative apply (legacy disko-management-mode path read as fallback)
  • Shipped Per-node kctl node apply-disk -f … [--apply] [--no-rebuild] → node-agent ApplyDiskLayout: classifier-gated, atomic persist to /etc/kcore/disk/current.nix, automatic nixos-rebuild chain
  • Shipped Declarative fleet rollout: kind: DiskLayout resource, controller CRUD + replication outbox, controller-side reconciler tick that pushes unobserved generations to nodes and writes back observed_generation + phase
  • Shipped Safe / dangerous classifier in kcore-disko-types shared crate (used by both controller pre-flight and node-agent authoritative gate); refusal codes surface on status.refusalReason
April 2026 — Shipped

🔗 High Availability & Replication

Multi-controller clusters with CRDT-based state merge and cross-DC replication. Replication now runs with automatic reconciliation and compensation paths instead of manual conflict resolution.

  • Shipped Replication DB tables, ack frontiers, LWW/MV merge, and anti-entropy fan-out
  • Shipped Domain materialization for node/network/vm/security-group/ssh-key event families
  • Shipped Typed, idempotent compensation executor with zero-manual SLO gating
  • Shipped kctl get replication-status [--require-healthy] for hard runtime gates
  • Shipped Manual kctl resolve conflict removed from operator workflow
April 2026 — Shipped

📐 TLA+ Specifications

Formal models of distributed protocols to catch design bugs before they become code bugs. Models and trace checks are now wired as required CI gates.

  • Shipped Bounded TLA+ specs and required CI integration
  • Shipped ControllerNodeReconcile.tla — reconciliation model
  • Shipped ControllerReplication.tla — single-DC replication
  • Shipped CrossDcReplication.tla — multi-DC model
  • Shipped DiskLayoutReconcile.tla — per-resource state machine for the controller-orchestrated DiskLayout; safety invariant “no Applied transition without classifier approval”
  • Shipped Trace bridge: Rust test traces validated against TLA+ invariants
April 2026 — Shipped

🔬 Property-Based Testing & Bounded Model Checking

The remaining three phases of the formal-methods plan landed alongside TLA+: generative property tests across every Rust crate, Kani bounded proofs on the security-critical sanitisers, and proptest coverage of database CRUD invariants. All four phases (proptest, Kani, DB invariants, TLA+) are now required CI gates.

  • Shipped proptest on Nix generation: escape round-trip, attribute-key sanitisation, structural validity (controller, node-agent, kctl, dashboard)
  • Shipped Kani harnesses for path traversal, NUL injection, segment validation, and Nix string escaping in the dedicated kcore-sanitize leaf crate (zero non-std deps, so proofs compile in seconds)
  • Shipped Kani harnesses on the DiskLayout diff parser in kcore-disko-types: extract_target_devices never panics, comment stripper preserves length, every emitted path is /dev/-prefixed, extraction is deterministic
  • Shipped Per-harness CI matrix — each #[kani::proof] runs on its own GitHub Actions runner with shared toolchain cache, completing the gate in ~1–2 min on warm cache
  • Shipped proptest on database CRUD invariants: VM, node, network, security-group, SSH-key, and DiskLayout round-trips, idempotent upserts, foreign-key integrity, cascading delete, and the reconciler queue (list_disk_layouts_needing_reconcile)
  • Shipped proptest fuzzers for the DiskLayout safe/dangerous classifier: safe verdicts never overlap an active-VM, system-mount, LVM PV, or zpool-member device; classifier is deterministic on identical inputs
  • Shipped 575 workspace tests (incl. proptest fuzzers) + Kani matrix + TLA+ trace bridge run on every pull request
August 2026 — Shipped

💻 Dashboard Web Console

In-browser serial console in the dashboard for datacenter use: a CLI terminal for day-to-day work, rescue, and installers. Also available from the CLI via kctl console. Console opens are recorded in the append-only audit log (actor, VM, timestamp). If you need a graphical desktop, install a VNC server (or equivalent) inside the guest OS yourself and reach it over the network. kcore does not provide a hypervisor-level graphical console — that would add complexity we do not need for headless workloads.

  • Shipped Serial / CLI console in the browser (xterm.js) via WebSocket to the node-agent serial endpoint
  • Shipped “Console” action on each VM in the dashboard, with paste, resize, and disconnect
  • Shipped mTLS-authenticated proxy through the dashboard — same trust model as the rest of the UI
  • Shipped kctl console <vm> for operator serial access from a terminal
  • Shipped Session audit: who opened which console, and when
September 2026 — Shipped

🔒 Security & Compliance

RBAC, audit logging, certificate lifecycle, SBOM export, and per-identity gRPC rate limiting. Node certificates rotate on their own, and revoked certificates are published over CRL and OCSP — see certificates & encryption. kctl get crypto-config reports the cryptographic posture. kctl get sbom exports the CycloneDX document, and release artifacts are signed with Sigstore.

  • Shipped RBAC roles: read-only, vm-admin, cluster-admin (per-operator certs CN=kctl:<name>, kctl operator)
  • Shipped Append-only audit log with actor, action, resource, timestamp (includes console session opens)
  • Shipped ListAuditEvents API (+ kctl audit / dashboard)
  • Shipped Console session audit: AttachVmConsole records who opened which VM console, and when
  • Shipped Automated certificate rotation and CRL/OCSP revocation — nodes generate their own keys and CSRs so private keys never leave the node, the sub-CA publishes a signed CRL and answers OCSP, and revoked peers are rejected on every RPC (kctl rotate node-certs, kctl revoke cert, kctl get pki-status)
  • Shipped SBOM generation and signed release artifacts — CycloneDX SBOMs in the GitHub release, SHA256SUMS signed with Sigstore keyless signing
  • Shipped New APIs: GetCryptoConfig, ExportSbom (kctl get crypto-config, kctl get sbom)
  • Shipped gRPC rate limiting — per-identity token bucket on the controller and node-agent (default 100 req/s, burst 200)
September 2026 — Shipped

💾 kcore SAN (Ceph)

Distributed shared block storage for the cluster — a vSAN-class fabric powered by Ceph on NixOS, with the controller filling the gaps NixOS does not declare. Replicated VM disks, cold drain without copying disks, and Cloud Hypervisor live migration over shared RBD all work today. See kcore SAN docs.

  • Shipped Declarative CephCluster resource (MON / MGR / OSD) with dedicated Ceph network
  • Shipped NixOS services.ceph + controller-owned bootstrap (keys, ceph-volume, health)
  • Shipped RBD storage backend for VMs (--storage-backend ceph)
  • Shipped Cold migrate / drain without copying disks (shared RBD)
  • Shipped Cloud Hypervisor live migration over shared RBD
September 2026 — Shipped

📡 Webhooks & Events

Push-based event system for external integrations and alerting. Endpoints are configured in controller.yaml and receive a JSON POST, optionally signed with HMAC-SHA256.

  • Shipped Events: node.heartbeat.missed, cert.expiry.warning, vm.state.changed
  • Shipped Configurable webhook endpoints in controller.yaml
October 2026 — Shipped

📊 Advanced Scheduler

Topology-aware placement beyond most-free-first. The controller still spreads a new VM onto the ready node with the most free memory, then CPU. Free capacity is live heartbeat load subtracted from physical capacity times the overcommit ratio in controller.yaml.

  • Shipped Label-based affinity (--label dc=dc-a)
  • Shipped Anti-affinity rules for HA workloads
  • Shipped Overcommit ratio and load-aware placement
October 2026 — Shipped

🌐 Networking Improvements

A VM can join more than one network. A network can add an IPv6 /64 beside IPv4, drop VM-to-VM traffic on its bridge, and reuse VXLAN addresses after a guest is deleted. Security groups still control north-south exposure, and named target-IP rules stay open when the east-west filter is on.

  • Shipped Multi-NIC / multi-homed VMs
  • Shipped IPv6 support
  • Shipped East-west firewall between VMs on the same bridge
  • Shipped Security groups with YAML apply flow and nftables rendering on nodes
  • Shipped VXLAN IP reclamation and improved peer discovery
Q4 2026 — Planned

🔄 Migrations

Importers that bring existing guests into kcore. Still to do in Q4.

  • Planned VMware importer
  • Planned Proxmox importer
Q4 2026 — Planned

📈 Observability & Logging

Metrics and logs from the controller and the nodes. Still to do in Q4.

  • Planned Observability for cluster and node health
  • Planned Logging from the controller and node agents
Q4 2026 — Planned

🖥 Bare-Metal

PostgreSQL, MySQL, and Kubernetes installed on kcoreOS itself. Each one is a declarative NixOS service on the node, the same way the rest of the host is configured. They do not run inside a VM.

  • Planned PostgreSQL from the NixOS services.postgresql package, declared through kcore and applied on the node
  • Planned MySQL from the NixOS package, declared and applied on the node the same way
  • Planned Kubernetes from the NixOS package, running on kcoreOS rather than in a guest
Q1 2027 — Planned

🗃 PostgreSQL Cluster

A PostgreSQL cluster on kcoreOS, built from the NixOS services.postgresql package. Members run on the nodes themselves, declared through kcore. The cluster does not run inside a VM.

  • Planned Multi-node PostgreSQL on kcoreOS, following the single-database bare-metal service
  • Planned Declarative membership, replication, and failover through the same kcore apply path
2027

🔬 Formal Verification — Next Iteration

Building on the four shipped phases (proptest, Kani, DB invariants, TLA+), extending depth and coverage in places where the current bounds or fuzz domains leave room for higher-confidence guarantees.

  • Planned Raise Kani MAX_INPUT_LEN bound once the per-harness matrix budget allows it
  • Planned Kani harness for validate_path_under_root alongside the already-shipped segment validator
  • Planned TLA+ invariants for the compensation executor and replication reservations
  • Planned Extend proptest coverage to security-group rule rendering and replication outbox state machines
Planned

💾 Immutable backups

Backups that cannot be changed after they are written. This is not shipped. kctl backup today copies the controller database.

October 2026 — Shipped

🛠 Operations & Node Lifecycle

Day-2 tooling for node removal, cluster health, a copy of the controller database, and moving shared-disk VMs when a node stops heartbeating.

  • Shipped GetClusterHealth API — kctl get cluster-health reports ready nodes, VMs left on not-ready nodes, certificates inside 30 days, and unresolved replication conflicts
  • Shipped Controller database copy — kctl backup -o snapshot.sqlite and kctl restore controller -f snapshot.sqlite --confirm. This is not guest backup.
  • Shipped Automatic VM migration on node failure — after 90 seconds without a heartbeat, Ceph VMs move to another healthy member; local-disk VMs stay on the failed node
  • Shipped Node cordon and certificate invalidation on delete — kctl node cordon stops new placement without moving VMs; kctl node delete refuses while VMs, workloads, or networks remain, then revokes the node's certificates (RFC 5280 reason 5) and removes the row
  • Shipped Bare-metal provisioner. It configures servers over IPMI and Redfish, and netboots kcore with UEFI HTTP boot.

Explicitly not planned

  • CSR approval flow (Kubernetes-style certificate signing requests)
  • Admission webhooks
  • Formal API versioning contract

Want to shape the roadmap?

Open an issue on GitHub or reach out directly. We prioritise based on real usage.