CHasm

A small Linux desktop suite written entirely in x86_64 assembly. No libc. No toolkit. No dynamic linking. Zero runtime.

x86_64 asm Unlicense Linux zero runtime
CHasm desktop screenshot

Every binary on screen is x86_64 assembly. tile holds the layout. strip drives the status row, fed by the asmites in chasm-bits. glass renders each pane (pseudo-transparency picks up the wallpaper). bare is the shell behind every prompt. show renders the syntax-highlighted source.

Why assembly?

Modern stacks are deep. A normal terminal loads 30+ shared libraries before drawing a single character. A shell pulls in Python, GLib, OpenSSL transitively. A window manager depends on a toolkit that depends on a compositor that depends on... CHasm strips all of that away to find out what you actually need.

The answer turns out to be: very little. The Linux kernel gives you syscalls. X11 is a documented Unix-socket wire protocol. Everything else is a choice. CHasm is the choice to write that everything else, by hand, in the smallest reasonable language.

No libc, no toolkit

Direct syscall for kernel work, the X11 wire protocol over a Unix socket for graphics. No dynamic linker, no malloc, no glibc, no Xlib, no GTK, no Qt. BSS-allocated buffers and that's it.

Single static ELF

Each tool is one self-contained binary, typically 20-150 KB. The whole desktop, display server included, fits in under 1 MB of executable code. Nothing to update, nothing to break, no dependency graph to audit.

Microsecond startup

bare comes up in roughly 9 microseconds. No interpreter, no runtime initialisation, no library loading. The kernel hands control straight to your entry point.

Designed for battery

Polling, waking, and forking on a timer are suspect. Status segments use blocking reads on the right file/socket; X11 work compares target state to last- applied state before issuing requests. CPU goes back to sleep, fast.

Measured 10 September 2026 on a Dell XPS 14 with the whole desktop up on frame: 2.63 W at the battery with the screen at 60 %, 1.64 W with it blank. The CHasm programs themselves account for about 7 mW of that.

The tools

Seven asm binaries that together form a complete X session, plus four Rust TUI configurators (the only non-asm parts of the suite: writing a configurator in pure asm would defeat the whole point).

bare

Shell (asm binary)
~20k LOC · ~175 KB

Interactive shell with line editing, history, completion, nicks, multi-pipes, redirects, here-strings, abbreviations, undo, and smart hotkeys. ~9 µs startup.

isene/bare

glass

Terminal Emulator (asm binary)
~22k LOC · ~206 KB

X11 wire protocol direct, kitty graphics, color emoji via XRender, pseudo-transparency, configurable fonts and keys. No toolkit, no Xlib, just the wire.

isene/glass

tile

Window Manager + Bar (asm binary)
~15k LOC · ~143 KB

Tiling window manager: 10 workspaces, per-workspace tabs, row-of-squares bar, smart cycling, stash. Bundles strip, the X11 status bar that hosts the asmites.

isene/tile

frame

Display Server (asm binary)
~26k LOC · ~193 KB

X11 display server that speaks the wire protocol straight to DRM/KMS and evdev: window tree, damage-driven compositor, RENDER, SHAPE, XKB, RandR, MIT-SHM, XInput2, XFIXES. Runs the whole CHasm desktop plus Firefox, GIMP and Discord, with no Xorg, no libdrm and no Mesa anywhere in the path.

isene/frame

show

Pager / Viewer (asm binary)
~4.3k LOC · ~47 KB

File viewer with syntax highlighting, ESC sanitisation, cat / pane / pipe modes. Drop-in replacement for less when reading source.

isene/show

chasm-bits

Asmites (asm binaries)
~5k LOC · ~9 KB each

Tiny status-bar segment programs fed into strip: clock, cpu, mem, disk, battery, brightness, network, mailbox, moonphase, wintitle, and more. Each one a self-contained binary.

isene/chasm-bits

glyph

Font Rasterizer (asm binary)
~5.7k LOC · ~47 KB

TrueType / OpenType rasterizer: TTF parser, quadratic Bezier flatten, scanline NZW with 4×4 supersample AA, composite glyphs, UTF-8, variable fonts (fvar + gvar + IUP).

isene/glyph

bolt

Screen Locker (asm binary)
~6.2k LOC · ~29 KB

Fullscreen override-redirect locker with keyboard + pointer grab and a baked raw-RGB lock-screen image. A small suid-root C helper handles crypt() / shadow auth.

isene/bolt

spot

Presenter Overlays (asm binary)
~2.4k LOC · ~23 KB

Four modes from one binary: spotlight (dimmed screen with a circular hole that follows the cursor), draw (click-drag to annotate, colour + width configurable), highlight (click-drag a rectangle that stays bright while the surround stays dim), and ocr (drag a rectangle to grab its text to the clipboard, even where the text cannot be selected). Works across workspaces and over screen-share (Teams / Discord / Meet). Toggle from the launch keybinding.

isene/spot

hyperlist-display

Claude Code Hook (asm binary)
~4.8k LOC · ~50 KB

Claude Code MessageDisplay hook that renders every answer as a tab-indented HyperList: one idea per line, numbered by depth. Display only, so the transcript keeps its markdown. /hl turns it on and off.

isene/hyperlist-display
Configurators

bareconf

Rush Config (Rust TUI)
edits ~/.barerc

TUI configuration tool for the bare shell. Browse and modify all settings with live previews. Atomic save: tmp → bak → publish.

isene/bareconf

glassconf

Glass Config (Rust TUI)
edits ~/.glassrc

Edit glass's bg / fg / cursor as 24-bit hex, step font size through nine presets, adjust opacity and cursor blink, manage the bg-cycle palette. Six built-in themes.

isene/glassconf

tileconf

Tile Config (Rust TUI)
edits ~/.tilerc

Configure tile's bar height, padding, workspace and tab colors, border widths, layout ratios. Live preview shows what the bar will look like as you tweak.

isene/tileconf

stripconf

Strip Config (Rust TUI)
edits ~/.striprc

Reorder, toggle, and edit strip's asmite-driven status segments without ever opening the rc file. Live colour swatches, per-segment refresh interval, comment-preserving save.

isene/stripconf

Try it

Three commands. The whole desktop: display server, window manager, status bar, terminal, shell, locker, greeter, five wallpapers. Prebuilt static binaries, a 300 KB download.

git clone https://github.com/isene/chasm
cd chasm
./chasm-install

The installer puts the binaries in /usr/local/bin, installs the fonts the suite reads, drops default config files into your home (yours are kept), bakes the first wallpaper and adds a CHasm entry to your login screen. It asks one question: whether bolt-greet should become the login screen. Say no and your boot is untouched.

Then log out and pick CHasm. Or stop the login screen, go to a text console and run sudo chasm-session: that is the whole suite on frame, the assembly X server, with no Xorg anywhere. Inside, Mod4+Return opens a terminal and Mod4+? shows every key.

Prefer to build? Each tool is one .asm file (or a small set), assembled with NASM and linked with ld. No autotools, no ./configure. ./chasm-install --build does it for every repo, or by hand:

git clone https://github.com/isene/bare && cd bare
nasm -f elf64 bare.asm -o bare.o && ld bare.o -o bare
install -m 755 bare ~/bin/