Every phase after the next one, in the order it will be built, with its items from the roadmap document.
Phase 13Toolkit, desktop shell and applications
plannedWidget toolkit, desktop shell, and the apps in §12 (Ember terminal, Crate files, Slate editor, Gauge, Dial, Tally, Frame, Daub, Chronos, Warren, lsh, CLI utils).
- Facet, the widget toolkit: layout containers, buttons, text boxes, lists, menus, scroll bars, tabs, dialogs, theming, keyboard navigation and accessibility basics (SPEC §10).
- The desktop shell: taskbar, launcher, notifications, wallpaper, settings for theme and layout (SPEC §11).
- Applications (SPEC §12):
- Ember — terminal (selection, scrollback, colours and escape sequences, tabs).
- Crate — file manager.
- Slate — text editor.
- Gauge — system monitor.
- Dial — settings.
11 more items in the full plan.
Done when: boot to the desktop, open a text file from the file manager, edit and save it in the editor, reopen it and see the change, run commands in the terminal, all with mouse and keyboard.
Phase 14Networking and internet
plannedvirtio-net + e1000; netd userland stack (Ethernet, ARP, IPv4, ICMP, UDP, TCP, DHCP, DNS, loopback); socket syscalls 70–83; default-deny inbound firewall; per-app network permission…
- Network card drivers: virtio-net (QEMU) and e1000 (VirtualBox and QEMU).
netd, a user-mode network server: Ethernet, ARP, IPv4 (with fragment reassembly), ICMP (ping), UDP, TCP (full state machine, retransmission, congestion control, window scaling), loopback.- DHCP (get an address automatically) and DNS (look up names).
- Socket system calls (
socket, bind, connect, listen, accept, send, recv, …) usable with event waiting and non-blocking mode. - Tools:
ping, ifconfig, nslookup, fetch (download a web page), netstat. - Network page in Settings; connection indicator on the taskbar.
- Firewall: incoming connections blocked by default; rules in
/etc/cerberus/firewall.conf. - Per-application network permission.
2 more items in the full plan.
Done when: DHCP gets an address; ping, name lookup and fetching http://example.com/ work; a 100 MB transfer matches by checksum; a blocked port drops and logs; a program without permission can't open a socket.
Decision to make first: write the TCP/IP stack ourselves or port lwIP.
Phase 15Users, passwords, sandboxing and secure connections
plannedUsers and groups, Argon2id password hashes, credentials, authd broker (no setuid), login and lock screens, restrict sandbox, permission prompts, keyring, TLS client with certificate store, audit log.
- User accounts and groups; passwords stored as Argon2id hashes.
- Login screen and lock screen (Super+L, idle timeout); no auto-login by default.
- Process identities (user and group IDs). No setuid programs: admin actions go through
authd, which asks for the password and logs the action. restrict: a program can permanently give up network, files outside given folders, starting programs, or raw devices. The desktop applies each app's declared permissions with it.- Permission prompts (screen capture, clipboard history, network), remembered per app.
- Keyring (password manager) for the user's own secrets, encrypted with a key from the login password.
- TLS (HTTPS) for
fetch and the package manager, with a certificate store. - Audit log of logins, failures, privilege use and permission decisions.
Done when: one user can't read another's files; wrong passwords are refused with growing delays; Argon2id matches the official test vectors; a sandboxed program is refused network, outside files and fork; killing the lock screen doesn't unlock it; fetch https://example.com/ works and a bad certificate is refused.
Decision to make first: TLS/crypto library: port Mbed TLS (recommended), port BearSSL, or write our own.
Phase 15BOur own web browser
plannedDecided on 2026-10-04. Needs phases 13–15 (toolkit, networking, HTTPS and the sandbox). Name still to choose.
- HTTP/1.1 client (keep-alive, redirects, chunked, gzip) and HTTPS.
- Cache and cookies (per site, per user, clearable; third-party cookies off by default).
- HTML parser following the web standard for common pages, tolerant of broken markup; a document tree (DOM).
- CSS for a documented subset: selectors, box model, colours, fonts, borders, backgrounds, block/inline/flex basics, positioning.
- Layout and painting: text wrapping, images (PNG, JPEG, GIF), basic tables, smooth scrolling.
- Browser window: address bar, back/forward/reload, tabs, bookmarks, history, downloads, find in page, zoom.
- Later (separate decision): JavaScript — write an engine or port QuickJS.
- Runs sandboxed: network and its own folder only; files only through the trusted dialogs; tabs isolated from each other.
2 more items in the full plan.
Done when: http://example.com/ and https://example.com/ render readably; a set of test pages matches reference screenshots; fuzzing finds no crash; a page can't read files or other tabs.
Phase 16The Spec language compiles for Cerberus
plannedNothing of the compiler exists yet (spec/ holds only empty folders).
- The language itself (SPEC §13.1) and the compiler pipeline: lexer, parser, type checker, intermediate code (§13.2).
- x86-64 code generation and an ELF writer.
- Standard library and Cerberus system-call bindings (§13.3).
- Tooling: formatter, test runner, build tool (§13.4).
- At least three applications rewritten in Spec, one with a GUI.
Done when: specc hello.spec -o hello makes a program that runs on Cerberus, and a Spec GUI application runs on the desktop.
Phase 17Running real software
plannedDynamic linking with full RELRO, POSIX-subset libc (docs/LIBC.md), ptys and job control, full signals, signed package manager pkg; proof ports: zlib, Lua, tinycc, make.
- Shared libraries and a dynamic linker (
/lib/ld-cerberus.so, full RELRO), dlopen. - A POSIX-compatible C library big enough to build unmodified programs (listed in
docs/LIBC.md). Proof: zlib, lua, tinycc, make. - Pseudo-terminals, job control (Ctrl+Z,
fg, bg), full signals. - Package manager
pkg (install, remove, list, search, upgrade) with signed (Ed25519) packages; install scripts sandboxed. - (speed) Measure program start-up and dynamic-link time.
Done when: Lua and the Tiny C Compiler built from upstream source run on Cerberus; tcc compiles and runs a C program on Cerberus; a tampered package is refused; a 50-library GUI app starts in under 200 ms.
Decision to make first: grow our own C library or port mlibc.
Phase 18Installing to a disk, updates, encryption, recovery
plannedDesign notes for the installer and dual boot: docs/INSTALLER.md.
- Live installer, like Windows Setup:
- pick a disk (model, size, partitions and existing systems shown);
- "Erase this disk and install Cerberus", or "Install alongside the existing system" in free space;
- review every change before anything is written; erasing needs the disk's name typed;
- create a user, copy the system, install the boot loader, reboot.
- Boot menu listing Cerberus, the previous Cerberus kernel, Cerberus recovery and Windows (or other systems found).
- UEFI boot entry so the PC starts Cerberus's menu; BitLocker, Secure Boot and Fast Startup checks with clear instructions.
- GPT and FAT32 support; making a bootable USB documented (Rufus "DD image" mode or balenaEtcher).
4 more items in the full plan.
Done when: installed to a blank disk it boots without the ISO; an encrypted disk shows only ciphertext; an interrupted update still boots; recovery repairs a damaged disk. Proposed addition: installing beside a fake Windows leaves every Windows byte unchanged and both boot from the menu.
Phase 19Stretch goals
stretch(was phase 15).
- USB (XHCI controller, keyboards and mice, USB sticks).
- Sound (Intel HD Audio, a mixing server).
- IPv6.
- Kernel address randomisation (KASLR).
- Booting on real PCs (and installing beside Windows on them).
- The Spec compiler compiling itself; a Spec package ecosystem.
- HiDPI scaling; more accessibility features.
- ARM64 port.