Open source · Rust · bare metal

The operating system where the agent is the driver.

A bare-metal OS, built from scratch in Rust — no POSIX, no libc, no ELF. A tiny language model runs on the silicon, and a capability-checked, audited ABI means it can plan anything and only do what it was granted.

Still in active development — use it at your own risk.
x86_64 + aarch64no_std Rustruns on QEMU · VirtualBox · UEFI metal · Apple M2Apache-2.00 lines of libc

The core idea

A hard determinism boundary

The model’s output is an untrusted plan. It never causes a side effect directly — it is parsed, grammar-constrained, capability- and taint-checked, and only then executed by deterministic native code. Above the line: stochastic. Below: deterministic.

stochastic

Agent plans

A tiny on-device LLM proposes an action as grammar-shaped tool calls.

the boundary

Synapse gate

Grammar-validated, capability-checked, taint-checked, and audited — every call.

deterministic

Native executor

Only vetted primitives touch memory, disk, network, and the screen.

Delegation only ever narrows authority · a skill is bounded by its install-time grant, forever · prompt-injection-as-privilege-escalation is refused at the OS boundary.

See it run

A real boot, start to finish

The shell coming up, a hosted model answering a question by calling a tool, the audit log, the hardware underneath, and an image decoded in-kernel — recorded from the running OS, not a mockup.

Plays here on click — nothing is loaded from YouTube until then. Or watch it on YouTube.
The agent loop
The agent loopA question in plain English. The model asks for a tool, the capability gate decides, the tool runs, and the answer comes back with the real output folded in.
Every effect, audited
Every effect, auditedThe same work seen from the security side — an append-only log of each primitive the agent invoked, with the provenance that justified it.
Panes and media
Panes and mediaA tmux-style split with a JPEG decoded by the kernel itself. No userspace, no library — the decoder is part of the OS.
It explains itself
It explains itselfA searchable command browser, because an OS an agent drives should still be legible to the human sitting in front of it.

What’s inside

A whole OS, from scratch

Everything is hand-built for bare metal — no host OS underneath any of it.

🧠

On-device inference

CPU LLM inference on GGUF models — architecture-dynamic loaders (Qwen hybrid, Gemma), every mainstream quant plus sub-2-bit packs, hand-written SIMD kernels, split across every core. No cloud, no host.

🌐

Real web browser

An in-kernel browser: HTML + CSS/flexbox layout, paint, forms, SVG, text selection and clipboard, and its own small JavaScript engine.

🎬

H.264, HEVC, VP9

Three decoders and a player, each validated frame-for-frame against FFmpeg and libvpx — 1080p30 on bare metal, with HLS over the network.

🎙️

Voice, on-device

Speech-to-text and text-to-speech through an in-kernel ONNX interpreter, fully offline — or a hosted provider if you configure one.

🔒

Capability security

An unforgeable capability ABI with a scope gate and an append-only audit log. Authority is always intersection(requested, granted).

🌍

Networking + TLS

A full TCP/IP stack with real certificate verification against an embedded root store — pure Rust, no ring, built to run no_std.

🪟

Windowed console

A tmux-style compositor: a resizable grid of up to eight panes, tabs you drag between them, a status bar on any edge, mouse, an editor, themes + wallpapers.

🧩

Agents & wasm apps

Installable, signed agent packages (SOUL + skills + manifest) from a public registry, plus sandboxed wasm apps — notes, paint, slides, chess, games.

🔌

MCP client

Connect Model Context Protocol servers over HTTP/JSON-RPC — each remote tool registers as a native agent tool, taint-tracked.

💬

Messaging channels

Drive the shell agent from external inboxes — Telegram live, Discord/Slack next. Every DM runs on a fresh model context.

🔋

Laptop-grade power

An ACPI AML evaluator drives the embedded controller for battery and AC state, a real power button, S5 poweroff, and suspend/resume that puts USB, the NIC and audio back.

🖥️

Real mode setting

The panel picks the resolution: EDID → loader → kernel, with KMS backends for virtio-gpu and VMSVGA, and display settings stored per monitor.

📶

The Wi-Fi stack, above the radio

WPA2 against the published 802.11i vectors, CCMP against RFC 3610’s own packet vector, the 802.11 data path and the join sequencer — all verified off-hardware. The radios are the part that still needs a laptop.

💾

Storage that finds your disk

AHCI, NVMe, virtio, USB mass storage and SD/eMMC over SDHCI — with ext4 read/write, FAT, exFAT and NTFS read.

🔊

Stereo, including USB

Intel HDA, virtio-snd and legacy codecs, plus USB Audio Class over an isochronous endpoint — stereo WAV and MP3, with software volume and mute.

🔗

USB that reaches the far end

Hubs enumerated to the full five tiers USB allows, so a drive behind a dock behind a monitor is found — plus CDC-ECM and RNDIS tethering.

Real hardware

Discovered, not hardcoded

Nothing is pinned to an emulator. Devices are found the way real firmware finds them — ACPI and PCIe, EDID, HID report descriptors, device trees — and degrade gracefully when a facility is absent. Marked wip where the code exists but the hardware hasn’t confirmed it yet.

Display

  • UEFI GOP / Limine framebuffer, mode chosen from the monitor’s EDID
  • KMS mode setting: virtio-gpu
  • KMS mode setting: VMSVGA (VirtualBox, vmware-svga)
  • Logical desktop + font scale, saved per monitor
  • i915 / AMD / AGX display engines — not yet

Storage

  • virtio-blk, NVMe (active-namespace list), AHCI (every controller, every port)
  • GPT + MBR, ext4 (default) and FAT32 — read and write
  • Self-install to a disk, updating in place
  • Install alongside an existing OS on its own ESP — in progress

Input

  • USB xHCI HID keyboard + mouse, driven by the report descriptor
  • HID-over-I2C touchpad, located through the ACPI namespace
  • virtio-input, PL050 / PS-2
  • Software key auto-repeat, mouse selection, host clipboard bridge

Networking

  • virtio-net over MMIO and PCI
  • Intel e1000 / e1000e / igb / igc, claimed by device ID
  • Realtek RTL8168 / 8111 / 8125 — in progress
  • USB Ethernet (CDC-ECM) over the xHCI bulk transport
  • Broadcom tg3, Atheros alx, Aquantia — not yet

Wireless

  • WPA2-PSK, CCMP, the 802.11 data path and the join sequencer — each pinned to a published vector
  • Intel WiFi: firmware handover, alive, scan, contexts, station + key, transmit — written from Linux’s headers — in progress
  • Any of it proven against a real radio — no emulator has one — not yet
  • Broadcom on Apple Silicon — in progress

Sound

  • virtio-snd PCM in + out
  • Intel HDA (VirtualBox and real hardware)
  • AC’97 and Sound Blaster 16 (x86 legacy)
  • WAV / MP3 / AAC decoding in-kernel

Power & platform

  • ACPI table mapping, AML evaluator, embedded controller
  • Battery percentage + AC adapter, power button, S5 poweroff
  • Suspend / resume: S3 trampoline on x86, PSCI on aarch64
  • HPET + local-APIC timer, GICv3 from device tree or MADT
  • SMP compute fleet on both architectures

Accelerators

  • Apple AGX GPU coprocessor booted to RUNNING on a real M2
  • Firmware dequeues commands the OS submits
  • Compute dispatch — the doorbell handshake is the open blocker — in progress
  • GEMM offload from the inference path — not yet

Get started

Download it and boot

One image per architecture on theReleases page — no account, no installer. Or build it from source. It is still in active development, so run it in a VM or off a USB stick, not on a machine whose data you care about.

⬇ Download the latest releasechitti-x86_64.iso for a PC ·chitti-aarch64.img for ARM
1 · verify what you downloaded
# each image ships a .sha256 beside it
sha256sum -c chitti-x86_64.sha256   # Linux
shasum -a 256 -c chitti-x86_64.sha256  # macOS

# a truncated download boots into a failure that
# looks like a broken OS, not a broken transfer
2 · boot it — x86_64
# in QEMU (it is a hybrid ISO)
qemu-system-x86_64 -M q35 -cpu max -m 2G \
  -cdrom chitti-x86_64.iso -serial stdio

# or write it to a USB stick (⚠ erases the target)
sudo dd if=chitti-x86_64.iso of=/dev/sdX bs=4M status=progress
2 · boot it — aarch64
# a GPT disk image with its own ESP: it boots
# itself, so it needs UEFI firmware and a drive
cp /usr/share/AAVMF/AAVMF_VARS.fd .

qemu-system-aarch64 -M virt -cpu max -m 2G \
  -drive if=pflash,format=raw,readonly=on,\
file=/usr/share/AAVMF/AAVMF_CODE.fd \
  -drive if=pflash,format=raw,file=AAVMF_VARS.fd \
  -drive if=none,id=hd,format=raw,\
file=chitti-aarch64.img \
  -device virtio-blk-pci,drive=hd -serial stdio

# easier: UTM on an Apple-silicon Mac — new VM,
# Virtualize, attach the .img as a drive
3 · give it a model
# no model is bundled — a GGUF is far too large
# for a release asset. Point it at a hosted one:
/model remote http://host:port [name]

# or load one off any mounted disk
/model load /path/to/file.gguf

# or fetch one, then load it
/http -O <url>
…or build from source
git clone https://github.com/chittios/chitti
cd chitti

make run ARCH=aarch64   # QEMU + HVF on Apple Silicon
make image ARCH=x86_64  # build a bootable ISO
make test              # in-kernel unit suite
first things to type
/help          # searchable command browser
/about         # version and build
/disks         # what storage was found
/network dhcp  # get an address

# in a VM: set the pointer to USB Tablet and the
# keyboard to USB, and enable EFI
Heads up: ChittiOS is under active development and is not stable. It is a research OS — interfaces and on-disk formats change without notice; it may crash or fail to boot. On real hardware there isno Wi-Fi driver that can join a network and no GPU driver;HARDWARE.md records exactly what works, what is written but unproven, and what is absent. If it will not boot on your machine, say so in the Discord — a boot log from hardware we do not have is the most useful thing you can send.

Honest status

What works today

It’s early and audacious. Here’s what actually runs on the metal right now:

* in progress — not finished yet.