-
- 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