It starts signed.
Kernel, initramfs and command line ship as one unified kernel image, signed for Secure Boot. Flip a byte and it won't boot.
littlestar is a Rust-built operating system that boots signed, stays immutable, stays reachable over iroh and updates itself. Nobody logs in. Nobody needs to.
Kernel, initramfs and command line ship as one unified kernel image, signed for Secure Boot. Flip a byte and it won't boot.
A purpose-built image where every file is accounted for. Less to download over thin links, less to attack.
No SSH daemon. Root locked. Boot failures reboot instead of opening a shell. There is nothing to log into.
Every node is reachable by its key over iroh, through any NAT or firewall, without opening a port. Offline for days? It keeps its last state and catches up exactly once.
Nodes, Apps, Models and Rollouts are declared resources. lsctl and the console are generated from the same spec.
Apps roll out in batches behind health gates. New OS images stage, apply with one reboot and return to the last image if they aren't healthy.
Every package compiled from upstream source by a toolchain that rebuilds itself. Rust where it matters: uutils coreutils, bootc, netavark, and every littlestar component.
The OS is one signed container image on a composefs root. No package manager on the node, nothing drifting, nothing to patch by hand.
Nodes dial out over QUIC and are addressed by key, not IP. Through any NAT, carrier network or firewall, with zero inbound ports and no VPN.
Root is locked, early-boot failures reboot instead of dropping to a shell, and the kernel command line can't be edited. There is nothing to log into.
Every Node, App, Model and Rollout is a resource in an OpenAPI 3.1 spec, with ETags, problem+json and live SSE watches. lsctl and the console are generated from it.
Apps roll out in batches behind health gates. New OS images stage, apply with one reboot and roll back on their own if the health check fails.
Kernel, initramfs and command line ship as one signed UKI under Secure Boot. Change one byte and it doesn't boot.
Placement is decided by Cedar policy, deny by default, and recorded as an Agreement you can query.
A minimal, immutable bootc image built entirely from upstream source. 0.15 GB compressed. Boots only a signed kernel image under Secure Boot.
Rust services that hold the fleet's desired state (apps, models, OS images, host config and policy) and record why every workload runs where it does.
A Rust service on every node. Pulls desired state over NATS, applies it with Podman Quadlets and bootc, and reports what is actually running.
Data-center tooling assumes reachable, connected, physically secure machines. The edge is none of those.
A small, purpose-built distribution, compiled from verified upstream source, where every file is accounted for.
We compile littlestar ourselves from verified upstream source. No binaries from other distributions, nothing we can't account for.
Each image ships with an SBOM, and every file in it traces back to the package that built it.
Every littlestar component is written in Rust, and we use mature Rust implementations wherever they exist.
The OS ships as one signed bootc image on a read-only composefs root. Updates replace the whole image, never pieces of it.
About a sixth the size of a general-purpose bootc image: faster over thin links, quicker to update, less to attack.
Kernel, initramfs, OS release and command line are one EFI binary, signed for Secure Boot and loaded by a signed systemd-boot.
With Secure Boot on, the UKI ignores any command line from the boot loader, a boot entry or SMBIOS. init=/bin/sh and rd.shell=1 do nothing.
One changed byte, a stripped signature or an unsigned boot loader: it does not boot.
Shipped images lock root and boot with rd.shell=0 rd.emergency=reboot. Emergency and rescue modes reboot; debug shells are removed or masked.
The config starts from allnoconfig and enables only what containers, VMs, microVMs, storage, networking and security need.
Each node's desired state is one NATS KV key, written only by the hub's controller.
ls-apiServes every resource from the OpenAPI 3.1 spec, backed by Postgres
ls-controllerDecides placement and drives rollouts
ls-caIssues node and user identities
ls-policyEvaluates Cedar, deny by default
zotStores images and models, with a registry view of digests and signatures
ConsoleBuilt on starlight-ui, on the generated API client
Kubernetes-style, with spec, status and conditions. ETags, problem+json errors and server-sent-event watches. lsctl and the console are generated from the spec.
$ lsctl apply -f - <<'EOF'
kind: App
metadata: { name: thermal-cam }
spec:
image: zot.hub/cams/thermal@sha256:9c1e…
quadlet: thermal-cam.container
rollout: { batch: 10%, healthGate: Ready, autoRollback: true }
EOF
app/thermal-cam configured ✓
$ lsctl why thermal-cam --node yard-07
Agreement ag-31f2 state=running
policy: site-has-camera ✓ permit
policy: gpu-not-required ✓ permitPlacement is decided by Cedar policy, deny by default. Every placement is recorded as an Agreement: which App, which node, which policies decided it, and its state (proposed, accepted, running, cancelled).
A read view over zot lists every image and model, its digests and signatures, and the Apps and Models that use it.
health gate failed? → back to v41 automatically, no truck roll.
An App is an image digest plus a Podman Quadlet. The hub places it by policy, writes it into each node's desired state, and the agent starts it and reports Ready. Rollouts go in batches with health gates and roll back on their own.
The OS image is part of each node's Machine resource. A new bootc image is staged, applied with one reboot inside the maintenance window, and rolled back if its health gate fails. Kernel args, network, storage and firewall changes use the same flow, and a network change that leaves a node less connected reverts on its own.
Every subject, key, protocol and port is versioned with its own breaking-change check.
Carries Every connection between machines: the NATS uplink, console, file transfer, Machine control
Why Nodes are addressed by key, not IP. Connections punch through NAT and fall back to the hub's own relays.
Carries Desired state (KV), status and events (streams), artifacts (object store), model requests (request/reply)
Why Each node runs a NATS leaf uplinked over iroh. Messages queue locally while the WAN is down and drain on reconnect.
Carries Device data at the site: sensors, cameras, SDRs
Why Low-latency peer-to-peer pub/sub between machines on one site. Multicast scouting is off.
The controller writes desired state to the ls_desired KV bucket; agents publish status on ls.status.<node> and events on ls.events.>. Every littlestar listener is authenticated, declared and bound to the one interface it serves.
Shipped as signed OCI artifacts, placed by Cedar policy, served on the node and reached over NATS.
A Model names an artifact digest, a runtime (llama.cpp, vLLM or mistral.rs) and its GPU needs. Pulled once, cached in the NATS object store, served on the node. GPUs via CDI.
Every model answers on models.<id>.{chat,embed,status} with request/reply and queue groups. A remote provider can stand behind the same subjects.
Edge agents speak the Synadia Agent Protocol and discover tools through NATS micro services. Every tool call is authorised by Cedar; model output is data, never instructions.
Send a share of nodes the new model, gate on eval scores, roll back automatically.
The hub's operations assistant answers “is the fleet healthy, and if not, why and what do I do?” from the docs and live, read-only fleet state. It acts as the asking user and is authorised by the same Cedar decision.
Hub services ship as container images and Quadlet units in a Starlight plugin, and also run standalone.
Starlight is the OIDC issuer and pushes users and groups over SCIM. Starlight tokens never reach nodes.
Starlight's Cedar policies are a parent set: littlestar can narrow access, never widen it.
Nodes enforce their last signed policy bundle for as long as they're offline. A monotonic serial stops an older bundle replacing it.
littlestar-x turns any littlestar site into a private Kubernetes cloud. It adds two integrated components: x0 delivers isolated clusters, each node in its own microVM, and s0 turns the local NVMe in your nodes into replicated block storage under them. Same OS, same hub, same API, switched on as an upgrade, from a minimum of two nodes and a small witness.
Thoroughly tested against server loss, power cuts and network splits.
x0 Real clusters. Real isolation. Your servers.Every controller and worker runs in its own libkrun microVM with its own kernel, disk and network identity. One cluster can't see or starve another.
k0s or k3s (Kubernetes 1.36), with the same kubectl, Helm charts and operators teams use today.
Capacity is reserved up front across servers. A request that won't fit is refused at once, never left half-built.
x0ctl (CLI and terminal UI) creates, scales, upgrades and deletes clusters; x0ctl kube runs kubectl with credentials delivered for you.
x0d runs active/passive behind one floating address, with its own state on a replicated s0 volume.
Mutual TLS between every component, an identity per host and cluster, SELinux enforcing and FIPS mode.
s0 Replicated block storage that never guesses.Every acknowledged write is on two servers. A small witness breaks ties so a split network never produces two writers.
The s0-csi driver gives clusters dynamic volumes, online expansion, snapshots and clones through standard StorageClasses.
OpenZFS for data, kernel NVMe/TCP for transport, DRBD 9 for replication. s0 adds identity, placement, writer ownership, fencing and audit.
Thin volumes with overcommit limits and capacity alarms; thick volumes keep writing even when thin space runs out.
A copy takes over only after a majority agrees and the old writer is fenced. When copies diverge, s0 never picks a side.
mTLS 1.3 API with per-scope authorization, NQN allow-lists and bidirectional DH-HMAC-CHAP on NVMe/TCP.
There is no “accept data loss” override anywhere. If a step can't be done safely, Starlight refuses it and says why.
We love Rust. It's memory-safe, fast and a joy to build with, so every littlestar component is written in it, and we reach for mature Rust tools wherever they exist. Everything else is built from verified source with security best practices at every step.
Source available to qualified government and critical-infrastructure partners.