UnoDOS — active development (the forward, contract-driven line; master carries the pc64 x86-64/UEFI world). Frozen legacy (archived): hmofet/unodos-3-legacy.
C
5
228 commits
updated Sep 21, 2026
One source tree, one design, twenty-two machines, from an IBM PC/XT with an 8088 to the modern laptop on your desk.
UnoDOS is a family of graphical operating systems. It began as a GUI-first, 16-bit real-mode OS written entirely in x86 assembly, fitting a kernel, a window manager, two filesystems, cooperative multitasking and a full application set on a single 1.44 MB floppy. It has since grown into a contract-driven family of ports spanning home computers, consoles, handhelds, single-board computers and a phone, and its flagship is now pc64: UnoDOS running bare-metal on any modern 64-bit PC, on its own drivers, with its own network stack, browser, office suite, compiler and hypervisor.

Prebuilt images for every platform are on the releases page: a hybrid ISO and USB disk image for modern PCs, cartridge ROMs for the consoles and handhelds, disk images for the home computers, and SD-card payloads for the boards. Most of them run in an emulator within a minute; the user manual walks through booting real hardware, including one-click USB flasher apps for Windows and macOS.
What has actually been verified is a separate question from what builds, and PLATFORMS.md is the ledger that answers it: per platform, what has booted on real hardware (and on which physical machine), what is emulator-verified only, and every known gap.
pc64 boots bare-metal on essentially any x86-64 PC made since ~2007.
UEFI plays the role the BIOS plays for the classic OS: the firmware hands over
a framebuffer, a keyboard and the boot volume, and then, on most machines,
UnoDOS calls ExitBootServices and the firmware leaves. From that point
the OS runs entirely on its own drivers. A hybrid disk image boots the same OS
on legacy-BIOS machines too.
The shell is built on unoui, the family's cross-platform widget toolkit: a windowed desktop with a taskbar, virtual desktops, window snapping, an animated Alt-Tab switcher, desktop icons and a programs menu. Ten themes are live-switchable, from Aurora (the modern flat default, in light and dark) to faithful retro looks (Mac OS 7, 1-bit Mac Plus, Windows 3.1, Amiga Workbench, C64, Apple II, NeXTSTEP). Text is kerned, anti-aliased TrueType with bundled open fonts, and every control is reachable by pointer or keyboard.
![]() | ![]() |
![]() | ![]() |
.doc, .xls, .ppt) through
the in-tree unodoc library.PYRT.UNO) with a uno
API into the shell, filesystem and network.Apps are loadable .UNO modules carrying their own descriptors: drop one
into APPS\ and the shell discovers it. No rebuild, no reboot.
Everything below the firmware line is native, written for this tree:
unovirt enters VMX operation on Intel hardware and runs guests behind EPT with virtio devices: a real Ubuntu kernel boots under UnoDOS, reaches userspace, answers at its shell, and mounts an ext4 disk served from a file on a UnoDOS volume. The Appliances app and VM manager front it; an AMD/SVM backend is written and awaiting hardware proof.
Validated on a Lenovo ThinkPad X1 Carbon Gen 8 (native trackpad, Wi-Fi, live theme and resolution switching), on an always-on ZimaBlade test box (boots from USB, detaches from the firmware, runs fully native), and on QEMU+OVMF harnesses that boot the real image on every change. The design notes in pc64/README.md record the firmware traps only real hardware exposes; they are half the value of the port.
sudo apt install gcc-mingw-w64-x86-64 qemu-system-x86 ovmf python3 python3-pil
cd pc64
./build.sh # -> build/esp/EFI/BOOT/BOOTX64.EFI
./build.sh run # boot it in QEMU+OVMF
The whole port builds with stock packages, no EDK2. See pc64/DEVELOPMENT.md for Linux and Windows environment setup and pc64/README.md for the full architecture tour.
UnoDOS 3.1 is contract-driven: a single machine-readable Contract (unodef/) defines screen geometry, the window and event layout and the shared enums, and every world is generated from it or checked against it. The assembly ports and the x86 reference consume it byte-identically, and eleven ports were built fresh on the 3.1 architecture rather than migrated, proving that a new target costs a small generated surface. See docs/UNODOS-3.1-MIGRATION.md and docs/CONTRACT-ARCH.md.
Every port boots a UnoDOS desktop with the shared app set: Files, Notepad, Music, Theme, Tracker, Paint and the games (Dostris, OutLast, Pac-Man), scaled to what the machine can hold, down to a launcher profile on 2 KB of RAM. A feature-by-feature comparison lives in docs/FEATURE-MATRIX.md.
Home computers
| Port | CPU | Highlights |
|---|---|---|
| IBM PC/XT (x86) | 8088+ | The reference OS; see below. ✅ real hardware, incl. a cycle-accurate 8088 |
| Amiga | 68000 | Self-booting ADF, copper/bitplanes, Paula audio, disk-loaded apps, PC-interchangeable FAT12 |
| Commodore 64 | 6510 | Hi-res bitmap desktop with per-cell colour, SID, CIA TOD clock, all apps disk-loaded |
| VIC-20 | 6502 | Fresh 3.1 world on the 22×23 character matrix |
| Apple II | 6502 | Own GCR 6-and-2 RWTS, hi-res renderer, disk-loaded apps |
| Apple IIGS | 65C816 | Super Hi-Res desktop, Ensoniq DOC audio, FAT12 over SmartPort, full app parity |
| Mac System 1–7 | 68000+ | Hosted Toolbox port (1-bit and Color QuickDraw), app-free core, loadable modules |
| MacPlus (standalone OS) | 68000 | Bare-metal: own boot blocks, drivers and renderer. ✅ real Mac SE |
| PowerPC Mac | PPC G3/G4 | Open Firmware client, the first big-endian PowerPC world |
Consoles and handhelds
| Port | CPU | Highlights |
|---|---|---|
| Sega Genesis | 68000 | VDP tile desktop, SRAM/tape/Sega-CD storage. ✅ boots on real hardware |
| Super Nintendo | 65816 | Shadow+DMA tilemap model, SPC700 audio driver. 🟡 conditional pass on clone hardware |
| NES | 6502 | 2 KB of RAM. ✅ validated on a real AV Famicom |
| PC Engine | HuC6280 | ✅ validated on a Turbo EverDrive |
| Master System / Game Gear | Z80 | The first contract-driven port and its 12-bit-colour sibling |
| Game Boy / Color | SM83 | One ROM boots DMG greyscale and GBC colour |
| Game Boy Advance | ARM7TDMI | The first ARM world, on a Mode-3 framebuffer |
| WonderSwan | V30MZ | The first x86 handheld |
| PlayStation 2 | R5900 | Portable C core over the Graphics Synthesizer; memory-card storage, USB input |
| Dreamcast | SH-4 | Same C core over PowerVR2; VMU storage; 60 fps in Flycast |
Boards and mobile
| Port | CPU | Highlights |
|---|---|---|
| Raspberry Pi | AArch64 | The first 64-bit world, on the VideoCore mailbox framebuffer |
| PinePhone | AArch64 | Portrait 480×640 on the Allwinner DE2, self-booting microSD |
Several ports are validated on real silicon (NES, PC Engine, Genesis, Mac SE, the x86 line, pc64's laptop and SBC fleet); the rest are verified in emulators or on ROM-free instruction-level harnesses (Unicorn, py65, a from-scratch 65816 core), so no proprietary ROMs are needed to build or test anything.
The original UnoDOS 3: a GUI-first OS for IBM PC XT-compatibles, written entirely in real-mode x86 assembly. No DOS, no runtime, just the BIOS and an Intel 8088 or later.
INT 0x80: graphics in
four video modes (CGA 320×200 to VESA 640×480), a 15-widget GUI toolkit
with file dialogs, FAT12 and FAT16 read/write, cooperative multitasking (5
concurrent apps plus the shell in 640 KB), a system clipboard, three bitmap
fonts and PC-speaker audio.Build and run it:
sudo apt install nasm qemu-system-x86 make python3
make floppy144 # build/unodos-144.img, a bootable FAT12 floppy
make run144 # boot it in QEMU
make hd-image builds the 64 MB FAT16 hard-drive image;
tools/write.ps1 writes images to physical media on Windows
(with system-drive exclusion and read-back verify), and plain dd does it on
Linux.
Apps are flat NASM binaries in their own 64 KB segments; a minimal windowed app is about 60 lines. Start with the app development guide, the API reference (all 106 calls with register-level detail) and docs/ARCHITECTURE.md.
The ports stay small because the heavy machinery is shared:
| Library | What it is |
|---|---|
| unodef | The Contract: one machine-readable definition every world is generated from |
| unoui | Cross-platform widget toolkit and themes (docs/UNOUI.md) |
| uno3d | Portable 3D pipeline with software, PS2 GS and Dreamcast PVR backends (docs/UNO3D.md) |
| unomedia | Image and audio decoders (WAV, MIDI, MP3, AAC-LC, and the common image formats), from scratch |
| unodoc | Microsoft binary document formats: CFB and .doc/.xls/.ppt, read and write |
| unonet | The network stack the pc64 drivers feed |
| unojs / unoweb | JavaScript engine and DOM/HTML/CSS layout engine |
| unofs, unosound, unosched, unobus, unoacpi | Filesystems, audio sequencing, scheduling, buses, ACPI |
master (this repo, hmofet/unodos):
the forward, contract-driven line and the home of pc64. All current
development happens here.legacy-pre-3.1). Frozen and archived, known-good.Copyright (c) 2026 Arin Bakht
This project is licensed under the Mozilla Public License 2.0 (MPL 2.0).
Third-party components keep their own licenses and are unaffected by the above (MIT, Apache-2.0, BSD-3-Clause, public domain, and CC BY for two fonts). Every one of them is listed in THIRD-PARTY.md.
UnoDOS 3, because sometimes the old ways are the best ways.
C
72.5%
Assembly
15.4%
Python
8.4%
Shell
1.3%
UnoDOS — active development (the forward, contract-driven line; master carries the pc64 x86-64/UEFI world). Frozen legacy (archived): hmofet/unodos-3-legacy.
C
5
228 commits
updated Sep 21, 2026
One source tree, one design, twenty-two machines, from an IBM PC/XT with an 8088 to the modern laptop on your desk.
UnoDOS is a family of graphical operating systems. It began as a GUI-first, 16-bit real-mode OS written entirely in x86 assembly, fitting a kernel, a window manager, two filesystems, cooperative multitasking and a full application set on a single 1.44 MB floppy. It has since grown into a contract-driven family of ports spanning home computers, consoles, handhelds, single-board computers and a phone, and its flagship is now pc64: UnoDOS running bare-metal on any modern 64-bit PC, on its own drivers, with its own network stack, browser, office suite, compiler and hypervisor.

Prebuilt images for every platform are on the releases page: a hybrid ISO and USB disk image for modern PCs, cartridge ROMs for the consoles and handhelds, disk images for the home computers, and SD-card payloads for the boards. Most of them run in an emulator within a minute; the user manual walks through booting real hardware, including one-click USB flasher apps for Windows and macOS.
What has actually been verified is a separate question from what builds, and PLATFORMS.md is the ledger that answers it: per platform, what has booted on real hardware (and on which physical machine), what is emulator-verified only, and every known gap.
pc64 boots bare-metal on essentially any x86-64 PC made since ~2007.
UEFI plays the role the BIOS plays for the classic OS: the firmware hands over
a framebuffer, a keyboard and the boot volume, and then, on most machines,
UnoDOS calls ExitBootServices and the firmware leaves. From that point
the OS runs entirely on its own drivers. A hybrid disk image boots the same OS
on legacy-BIOS machines too.
The shell is built on unoui, the family's cross-platform widget toolkit: a windowed desktop with a taskbar, virtual desktops, window snapping, an animated Alt-Tab switcher, desktop icons and a programs menu. Ten themes are live-switchable, from Aurora (the modern flat default, in light and dark) to faithful retro looks (Mac OS 7, 1-bit Mac Plus, Windows 3.1, Amiga Workbench, C64, Apple II, NeXTSTEP). Text is kerned, anti-aliased TrueType with bundled open fonts, and every control is reachable by pointer or keyboard.
![]() | ![]() |
![]() | ![]() |
.doc, .xls, .ppt) through
the in-tree unodoc library.PYRT.UNO) with a uno
API into the shell, filesystem and network.Apps are loadable .UNO modules carrying their own descriptors: drop one
into APPS\ and the shell discovers it. No rebuild, no reboot.
Everything below the firmware line is native, written for this tree:
unovirt enters VMX operation on Intel hardware and runs guests behind EPT with virtio devices: a real Ubuntu kernel boots under UnoDOS, reaches userspace, answers at its shell, and mounts an ext4 disk served from a file on a UnoDOS volume. The Appliances app and VM manager front it; an AMD/SVM backend is written and awaiting hardware proof.
Validated on a Lenovo ThinkPad X1 Carbon Gen 8 (native trackpad, Wi-Fi, live theme and resolution switching), on an always-on ZimaBlade test box (boots from USB, detaches from the firmware, runs fully native), and on QEMU+OVMF harnesses that boot the real image on every change. The design notes in pc64/README.md record the firmware traps only real hardware exposes; they are half the value of the port.
sudo apt install gcc-mingw-w64-x86-64 qemu-system-x86 ovmf python3 python3-pil
cd pc64
./build.sh # -> build/esp/EFI/BOOT/BOOTX64.EFI
./build.sh run # boot it in QEMU+OVMF
The whole port builds with stock packages, no EDK2. See pc64/DEVELOPMENT.md for Linux and Windows environment setup and pc64/README.md for the full architecture tour.
UnoDOS 3.1 is contract-driven: a single machine-readable Contract (unodef/) defines screen geometry, the window and event layout and the shared enums, and every world is generated from it or checked against it. The assembly ports and the x86 reference consume it byte-identically, and eleven ports were built fresh on the 3.1 architecture rather than migrated, proving that a new target costs a small generated surface. See docs/UNODOS-3.1-MIGRATION.md and docs/CONTRACT-ARCH.md.
Every port boots a UnoDOS desktop with the shared app set: Files, Notepad, Music, Theme, Tracker, Paint and the games (Dostris, OutLast, Pac-Man), scaled to what the machine can hold, down to a launcher profile on 2 KB of RAM. A feature-by-feature comparison lives in docs/FEATURE-MATRIX.md.
Home computers
| Port | CPU | Highlights |
|---|---|---|
| IBM PC/XT (x86) | 8088+ | The reference OS; see below. ✅ real hardware, incl. a cycle-accurate 8088 |
| Amiga | 68000 | Self-booting ADF, copper/bitplanes, Paula audio, disk-loaded apps, PC-interchangeable FAT12 |
| Commodore 64 | 6510 | Hi-res bitmap desktop with per-cell colour, SID, CIA TOD clock, all apps disk-loaded |
| VIC-20 | 6502 | Fresh 3.1 world on the 22×23 character matrix |
| Apple II | 6502 | Own GCR 6-and-2 RWTS, hi-res renderer, disk-loaded apps |
| Apple IIGS | 65C816 | Super Hi-Res desktop, Ensoniq DOC audio, FAT12 over SmartPort, full app parity |
| Mac System 1–7 | 68000+ | Hosted Toolbox port (1-bit and Color QuickDraw), app-free core, loadable modules |
| MacPlus (standalone OS) | 68000 | Bare-metal: own boot blocks, drivers and renderer. ✅ real Mac SE |
| PowerPC Mac | PPC G3/G4 | Open Firmware client, the first big-endian PowerPC world |
Consoles and handhelds
| Port | CPU | Highlights |
|---|---|---|
| Sega Genesis | 68000 | VDP tile desktop, SRAM/tape/Sega-CD storage. ✅ boots on real hardware |
| Super Nintendo | 65816 | Shadow+DMA tilemap model, SPC700 audio driver. 🟡 conditional pass on clone hardware |
| NES | 6502 | 2 KB of RAM. ✅ validated on a real AV Famicom |
| PC Engine | HuC6280 | ✅ validated on a Turbo EverDrive |
| Master System / Game Gear | Z80 | The first contract-driven port and its 12-bit-colour sibling |
| Game Boy / Color | SM83 | One ROM boots DMG greyscale and GBC colour |
| Game Boy Advance | ARM7TDMI | The first ARM world, on a Mode-3 framebuffer |
| WonderSwan | V30MZ | The first x86 handheld |
| PlayStation 2 | R5900 | Portable C core over the Graphics Synthesizer; memory-card storage, USB input |
| Dreamcast | SH-4 | Same C core over PowerVR2; VMU storage; 60 fps in Flycast |
Boards and mobile
| Port | CPU | Highlights |
|---|---|---|
| Raspberry Pi | AArch64 | The first 64-bit world, on the VideoCore mailbox framebuffer |
| PinePhone | AArch64 | Portrait 480×640 on the Allwinner DE2, self-booting microSD |
Several ports are validated on real silicon (NES, PC Engine, Genesis, Mac SE, the x86 line, pc64's laptop and SBC fleet); the rest are verified in emulators or on ROM-free instruction-level harnesses (Unicorn, py65, a from-scratch 65816 core), so no proprietary ROMs are needed to build or test anything.
The original UnoDOS 3: a GUI-first OS for IBM PC XT-compatibles, written entirely in real-mode x86 assembly. No DOS, no runtime, just the BIOS and an Intel 8088 or later.
INT 0x80: graphics in
four video modes (CGA 320×200 to VESA 640×480), a 15-widget GUI toolkit
with file dialogs, FAT12 and FAT16 read/write, cooperative multitasking (5
concurrent apps plus the shell in 640 KB), a system clipboard, three bitmap
fonts and PC-speaker audio.Build and run it:
sudo apt install nasm qemu-system-x86 make python3
make floppy144 # build/unodos-144.img, a bootable FAT12 floppy
make run144 # boot it in QEMU
make hd-image builds the 64 MB FAT16 hard-drive image;
tools/write.ps1 writes images to physical media on Windows
(with system-drive exclusion and read-back verify), and plain dd does it on
Linux.
Apps are flat NASM binaries in their own 64 KB segments; a minimal windowed app is about 60 lines. Start with the app development guide, the API reference (all 106 calls with register-level detail) and docs/ARCHITECTURE.md.
The ports stay small because the heavy machinery is shared:
| Library | What it is |
|---|---|
| unodef | The Contract: one machine-readable definition every world is generated from |
| unoui | Cross-platform widget toolkit and themes (docs/UNOUI.md) |
| uno3d | Portable 3D pipeline with software, PS2 GS and Dreamcast PVR backends (docs/UNO3D.md) |
| unomedia | Image and audio decoders (WAV, MIDI, MP3, AAC-LC, and the common image formats), from scratch |
| unodoc | Microsoft binary document formats: CFB and .doc/.xls/.ppt, read and write |
| unonet | The network stack the pc64 drivers feed |
| unojs / unoweb | JavaScript engine and DOM/HTML/CSS layout engine |
| unofs, unosound, unosched, unobus, unoacpi | Filesystems, audio sequencing, scheduling, buses, ACPI |
master (this repo, hmofet/unodos):
the forward, contract-driven line and the home of pc64. All current
development happens here.legacy-pre-3.1). Frozen and archived, known-good.Copyright (c) 2026 Arin Bakht
This project is licensed under the Mozilla Public License 2.0 (MPL 2.0).
Third-party components keep their own licenses and are unaffected by the above (MIT, Apache-2.0, BSD-3-Clause, public domain, and CC BY for two fonts). Every one of them is listed in THIRD-PARTY.md.
UnoDOS 3, because sometimes the old ways are the best ways.
C
72.5%
Assembly
15.4%
Python
8.4%
Shell
1.3%