Pony mascot

pony

a workhorse, not a unicorn
v0.0 - still booting

the stack

the bottom is borrowed. everything above it, we wrote.

coreutilscat · echo · head · ls · wc · mkdir · rm · chmod · ln · cp · mv · … building
oatssyscalls · malloc · stdio · printf done
reinsinit & supervisor, PID 1 - runit-style, restart + backoff done
stablepackage manager - source-based, like portage scaffolding
bashyour shell, standard issue kept
Linux kernelthe one part we keep kept

what is this

Pony is a Linux distribution I'm building from the userland up - by hand.

No systemd. No glibc. No borrowed coreutils. Every piece between you and the kernel is written from scratch and, more to the point, written to be read: the C library, the shell tools, the init that runs as PID 1, the service supervisor, and a source-based package manager in the spirit of Gentoo's portage. The kernel, bash, and the bootstrap compiler are the only things I didn't reinvent - everything else is fair game.

9 milestones cleared· 0 bytes of glibc· 63/63 printf == glibc· -Wpedantic clean

the rules

  • WRITE  oats - our own C library: syscalls, crt0, errno, malloc, stdio, printf.
  • WRITE  coreutils - the everyday tools, small and single-purpose.
  • WRITE  reins - our init & service supervisor in one (PID 1), runit-style; our answer to systemd.
  • WRITE  stable - our package manager: fetch, build from source, track files.
  • KEEP   the Linux kernel, bash, and gcc/binutils - reinventing those is a different decade.
  • FLOOR  musl, used only to bootstrap until oats can stand on its own.

status - what actually runs

milestonestate
Static binary on oats - zero glibc/musl linkedDONE
errno · open/close · strerror/perrorDONE
Hardening pass - types, archive, strict-warning-cleanDONE
malloc/free/calloc/realloc - boundary-tag allocatorDONE
Buffered stdio + printf - matches glibc byte-for-byteDONE
Coreutils - cat · echo · true/false · head · ls · wc · mkdir · rm · chmod · ln · cp · mvDONE
Boot kernel + oats userland in QEMUDONE
own init as PID 1 - QEMU boot demoDONE
reins - init & service supervisor, restart + crash backoffDONE
stable - package manager (CLI scaffold; install awaits fs syscalls)SCAFFOLD
oats - filesystem-mutation syscalls (mkdir, unlink, …)SOON

build log

d349b0bMilestone 3h: rm - files & directories, + oats unlink/rmdir/access - 2026-06
3bfd178Milestone 3i: chmod - octal + symbolic modes (shared parser) - 2026-06
456bf6bMilestone 3j: ln / cp / mv - linking and moving - 2026-06
b9cde9fMilestone 3g: mkdir - -p/-v/-m, + oats mkdir/chmod syscalls - 2026-06
2f5a5d7Milestone 6 (scaffold): stable - package manager - 2026-06
839dee5Rename the C library: mylibc → oats - 2026-06
6f0cf7cMilestone 3f: wc - lines, words, bytes, chars - 2026-06
70eb1a5ls - -u/-c, GNU column & symlink fidelity - 2026-06
6ef7e04Milestone 5: reins - init & service supervisor (PID 1) - 2026-06
9be9507Milestone 4: Pony boots in QEMU (own init as PID 1) - 2026-06
f7fc6fcMilestone 3e: ls - the big one - 2026-06
2e2d0edMilestone 3a-3d: cat · echo · true/false · head - 2026-06
2a301caMilestone 2c: buffered stdio + printf - 2026-06
c4efd35Milestone 2b: boundary-tag heap allocator - 2026-06
aba167cHardening pass: types, archive, full docs - 2026-06
34cb8e4Milestone 2a: errno, open/close, strerror - 2026-06
66d055fMilestone 1: a static binary on hand-written oats - 2026-06

build it yourself

It's a Makefile and a C compiler - that's the whole story.

$ git clone …/pony $ cd pony $ make $ make check

browse the source →