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

Where the design came from
The os8088 desktop just after boot: a white menu bar across the top carrying an 11-pixel chip logo and the words File and Special, a 1-pixel checkerboard desktop that reads as gray, two floppy disk icons labelled Disk A and Disk B down the right edge, an arrow cursor in the middle, and an empty white strip along the bottom.
The site's chrome is this picture, measured. The menu bar at the top of this page is the OS's menu bar. The window frames are its window frames. The checkerboard behind everything is the desktop dither: 1-pixel squares, white where x plus y is even. The footer is the dock. Numbers came out of kernel/wm.inc, kernel/menu.inc and kernel/desk.inc, not out of a design tool.

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.

Chrome metrics shared by os8088 and os8088.com
Frames and rules1 pixelBlack, square-cornered, no blur, no radius. There is no second line weight anywhere in the system.
Drop shadow+1, +1Hard black, right edge and bottom edge only. In CSS that is exactly box-shadow: 1px 1px 0 0.
Title bar16 rowsPlus a 1-pixel separator below it. Only the frontmost window is striped; background windows get a plain white bar.
Pinstripes6 lines, 2px pitchInset 3 pixels from each frame edge, punched through by a white gap behind the centred title.
Close and minimize box11 x 111-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 bar20 rowsWhite to row 18, a black rule across row 19. A pressed title inverts across its whole cell and leaves the rule alone.
Menu item cell16 pixels8 pixels of padding each side of the label. Highlight is inversion of the cell interior.
Dock24 rows, 456 to 479A rule at row 456, white below it. The footer of this page is that strip.
Desktop1-pixel checkerboardFrom 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 chrome2Black 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).

The source How it works All the screenshots