• gasm: 1.5 KB Gopher server that runs on 24 KB of RAM
  • _
  • __ _ __ _ ___ _ __ (_)
  • / _` | / _` | (_-< | ' \ _
  • \__, | \__,_| /__/ |_|_|_| (_)
  • |___/
  • _ ___
  • / | | __|
  • | | _ |__ \
  • |_| (_) |___/
  • _ __ ___
  • | |/ / | _ )
  • | ' < | _ \
  • |_|\_\ |___/
  • ___ _
  • / __| ___ _ __ | |_ ___ _ _
  • | (_ | / _ \ | '_ \ | ' \ / -_) | '_|
  • \___| \___/ | .__/ |_||_| \___| |_|
  • |_|
  • ___ ___ _ _ __ __ ___ _ _
  • (_-< / -_) | '_| \ V / / -_) | '_|
  • /__/ \___| |_| \_/ \___| |_|
  • _ _ _
  • | |_ | |_ __ _ | |_
  • | _| | ' \ / _` | | _|
  • \__| |_||_| \__,_| \__|
  • _ _ _ _ _ _ ___
  • | '_| | || | | ' \ (_-<
  • |_| \_,_| |_||_| /__/
  • ___ _ _
  • / _ \ | ' \
  • \___/ |_||_|
  • ___ _ _
  • |_ ) | | |
  • / / |_ _|
  • /___| |_|
  • _ __ ___
  • | |/ / | _ )
  • | ' < | _ \
  • |_|\_\ |___/
  • __
  • ___ / _|
  • / _ \ | _|
  • \___/ |_|
  • ___ _ __ __
  • | _ \ /_\ | \/ |
  • | / / _ \ | |\/| |
  • |_|_\ /_/ \_\ |_| |_|
  • ╔─*──*──*──*──*──*──*──*──*──*──*──*──*──*──*──*─╗
  • ║1 ........................................ 1║
  • ║2* ........................................ *2║
  • ║3 ........................................ 3║
  • ║1 ...........Posted: 2026-01-15........... 1║
  • ║2* ......Tags: linux gopher my_warez ...... *2║
  • ║3 ........................................ 3║
  • ║1 ........................................ 1║
  • ╚────────────────────────────────────────────────╝
  • I wanted to find the absolute floor.
  • We know that abstractions cost resources, but I wanted to quantify exactly how
  • much. So, I wrote a fully functional Gopher server in pure i386 assembly with
  • zero dependencies—no libc, no runtime, just raw `int 0x80` syscalls.
  • The result is GASM.
  • A whacky photo of me showing the file size of the gasm binary
  • Whacky photo of gasm's binary size
  • By manually managing the ELF headers, disabling page alignment, and using the
  • legacy Linux `socketcall` interface, the final efficiency metrics are distinct:
  • * Binary Size: 1,512 bytes (static, stripped)
  • * RAM Usage: 24 KB (Verified RSS via pmap)
  • * Deps: None.
  • It serves Directory listings (Type 1), Text (Type 0), and Binary (Type 9). It
  • implements bounds checking and traversal blocking manually, without the overhead
  • of a standard library.
  • Because it targets the original i386 instruction set, it runs natively on
  • everything from a 1985 386DX to a modern Ryzen 9.
  • It is not a replacement for Nginx. It is a study in how much computer you
  • actually need to serve a file.
  • The source is available for audit.
  • Source Code and Download (GitHub)[1]
  • ## Footnotes
  • [1]: Source Code and Download (GitHub): https://github.com/someodd/gasm