Colophon
This site is drawn the way the operating system draws itself. Every frame is 1 pixel, every fill is white, every shadow is one hard black pixel down and to the right, and emphasis is inversion rather than weight -- because the OS has exactly one font at exactly one weight and inverts pixels when it wants to say something twice.
13 screendumps · 2 animations · one 8x8 face · 0 third-party requests
The typeface
Headings, the menu bar, window titles, buttons and captions are set in Web437 IBM EGA 8x8 from the Ultimate Oldschool PC Font Pack, an outline conversion of the IBM 8x8 code page 437 ROM character set by VileR, licensed CC BY-SA 4.0. The pack is at int10h.org and the license text ships with the font at /fonts/LICENSE-CC-BY-SA-4.0.txt.
That is the same 8x8 ROM bitmap the OS uses, and the OS does not carry a copy of it. At
boot, font_init calls int 10h with
AX=1130h, BH=03h, which returns a pointer to the video card's own 8x8 character
set, and copies out the printable range only: glyphs 32 to 126, 95 of them, 8 bytes each,
760 bytes total. Anything outside that range draws nothing while the pen still advances --
it renders as a space.
The web font is cut to the same range with
unicode-range: U+0020-007E, so a character the OS could not draw is a character
this site does not draw either. It is designed at 8 pixels and used only at whole multiples
of 8. Body prose is not a web font at all: it is whatever monospace face your own system
supplies, so the reading text costs no download and stays legible at any size.
The design
There is one unit, --u, and it is one OS pixel -- 2 CSS pixels here, 1.5
below 640 pixels of viewport. Every metric on the page is an integer multiple of it, taken
from the kernel rather than estimated.
| Frames and rules | 1 pixel | Black, square-cornered, no blur, no radius. There is no second line weight anywhere in the system. |
|---|---|---|
| Drop shadow | +1, +1 | Hard black, right edge and bottom edge only. In CSS that is exactly box-shadow: 1px 1px 0 0. |
| Title bar | 16 rows | Plus a 1-pixel separator below it. Only the frontmost window is striped; background windows get a plain white bar. |
| Pinstripes | 6 lines, 2px pitch | Inset 3 pixels from each frame edge, punched through by a white gap behind the centred title. |
| Close and minimize box | 11 x 11 | 1-pixel frame, white interior, a 2-pixel white halo that breaks the stripes around it. The minimize glyph is a 7 x 1 bar. |
| Menu bar | 20 rows | White to row 18, a black rule across row 19. A pressed title inverts across its whole cell and leaves the rule alone. |
| Menu item cell | 16 pixels | 8 pixels of padding each side of the label. Highlight is inversion of the cell interior. |
| Dock | 24 rows, 456 to 479 | A rule at row 456, white below it. The footer of this page is that strip. |
| Desktop | 1-pixel checkerboard | From row 20 down. Parity is anchored to absolute screen coordinates, so a repainted patch seams invisibly. Rendered here as a conic gradient. |
| Colors in the chrome | 2 | Black and white. The other fourteen EGA colors exist but only apps reach them, and only Minesweeper uses any. |
Light and dark are the same page. A 1-bit interface does not have themes, it has an inversion, so the dark mode swaps ink and paper and nothing else -- the checkerboard is self-inverting and needs no separate treatment. The Invert button in the dock is the site's version of gfx_xor_fill, the routine the OS uses for every selection it makes. It starts black on white whatever your system prefers, because that is how the machine boots; inverting is a thing you do, not a thing it guesses.
One extrapolation, declared. os8088 has no push button. The buttons on this site -- 1-pixel frame, white face, 8-pixel label, inverting while pressed -- are what a button would look like if it did. Nothing else here was invented.
The logo
The mark in the menu bar and in the browser tab is the OS's own System-menu glyph: an 11 x 11 silhouette of a dual in-line package, the chip outline with an orientation notch and four pairs of pins. It lives in kernel/menu.inc as eleven words of bitmap, one per row, bit 15 leftmost, and the kernel draws it one pixel at a time.
The site's build reads the same eleven words and emits SVG rectangles, one per horizontal run of set bits, so the logo stays exactly the shape the kernel draws at any size instead of being a blurry upscale of a screenshot.
The screenshots
Every image on this site is a screendump of the real operating system, running. Nothing is a mockup, a composite, a re-drawing or a retouch. Nothing was assembled in an image editor and no window on this site was moved after the fact.
tools/capture.py in the website repo boots the same 1.44MB
floppy image the download page ships, headless, in QEMU with
-display none, an emulated Microsoft serial mouse on the serial line, and a QMP
control socket. Each scene in tools/scenes.json is a list of literal
commands run against that socket with the OS repo's own test drivers: move the pointer here,
press the button, drag to there, release, type this key. When the machine is in the state the
scene describes, the harness takes the framebuffer.
The dump is a 640x480 PPM, converted to a 16-color PNG plus a nearest-neighbour 2x copy for high-density displays. Scenes never share a machine -- each one gets its own freshly booted QEMU and its own copies of the floppies -- so no scene can inherit another's state. Thirteen of the fifteen scenes are stills; two are short GIFs, sampled on a fixed cadence while a second thread drives the mouse, because a still cannot show an outline rubber-banding behind the pointer or two clocks ticking at once.
Two details worth stating, because they are the difference between honest capture and flattering capture. The drag outline is drawn in XOR and erased again once per timer tick, so a single dump catches a blank frame about half the time; those scenes take a burst and keep the frame with the most black in it, which is the phase your eye sees on real hardware anyway. And the images are only ever scaled by whole numbers, because the desktop's 1-pixel checkerboard moires immediately under any other ratio.
The browser demo
The live demo runs on v86, an x86 emulator compiled to WebAssembly, under the BSD 2-Clause license -- the copy served here is /vendor/LICENSE.v86. Its firmware is SeaBIOS and SeaVGABIOS, LGPL version 3, at /vendor/COPYING.LESSER.seabios.
One part of that page is not the emulator's work. os8088 drives a Microsoft serial mouse on COM1, because the PS/2 port did not exist when the PC/XT shipped, and v86 has no serial mouse -- so the page synthesises one in JavaScript, encoding pointer movement into the same three-byte packets a real mouse put on the wire and feeding them into the emulated UART one byte at a time. The reason it has to be one byte at a time is on the mouse page.
Nothing about the emulator loads until you press the button.
The hosting
Static files on Cloudflare Workers. There is no server-side code at all: the deployment declares an asset directory and no Worker script, so no program runs on any request.
There are no analytics, no cookies, no trackers, no tag managers, no embedded video, no
fonts or scripts from anyone else's domain, and no third-party requests of any kind. The
content security policy is default-src 'self', which means the browser will
refuse to fetch from anywhere else even if a mistake ever put such a request in the page.
The only thing this site stores in your browser is one localStorage
key remembering whether you pressed Invert.
The source
The operating system is at github.com/jggonz/os8088: the kernel, the boot sector, the two example programs, the packaging and disk-building tools, and SPEC.md, which is the binding contract every module is written against.
It is MIT-licensed. Read it, fork it, lift routines out of it, ship something built on it -- keep the copyright notice and that is the whole obligation. Nothing third-party is vendored into the operating system, so that one license covers the entire tree.
This website is a separate repository, and the pieces of it that are not ours keep their own licenses: v86 (BSD-2-Clause), the SeaBIOS 1.16.2 and SeaVGABIOS binaries at /vendor/seabios.bin and /vendor/vgabios.bin (LGPLv3, source at git.seabios.org, tag rel-1.16.2), and the Web437 font (CC BY-SA 4.0).