this page is alive right now Zero Dependency Hackathon 2026 · Track C

zdh

You are looking at a webpage. Groundbreaking.
The thing that sent it, however, does not know what a webpage is.

It knows frames. It knows streams. It knows flow-control windows and Huffman tables and the exact wording of RFC 9113 §5.1 at 4am. It does not know net/http, because we never introduced them.

0dependencies. zero. none. nada.
0/147 h2spec tests passed
0times we broke it on purpose
protocol your browser used

scroll. it gets worse.

Act I

We deleted the good one on purpose

Go ships a perfectly excellent HTTP/2 implementation. Battle-tested. Maintained by people with actual credentials. Free. Right there. import "net/http". Done in one line.

We looked at it. We said "no thank you."

Then we spent 72 hours reimplementing the entire protocol by hand from the RFCs, because the rules of this hackathon said zero dependencies and we are the kind of people who read that as a dare.

Our build gate physically refuses to compile if net/http appears anywhere in the dependency graph. We didn't trust ourselves. Correctly.

the receipts

    
What "zero dependencies" actually means here: go.mod is three lines and lists nothing. go.sum does not exist — that file only exists when you've let someone else's code in. The compiled binary reports its own dependency count as 0, read out of its embedded build info, so you don't have to take our word for any of it.

Act II · the main event

Follow one request. All the way there and all the way back.

Press the button. A real request leaves your browser, crawls through every layer we wrote by hand, and comes back with a file. The dot below is the dramatization. The numbers at the bottom are the actual measurements from the actual request. We are narrating our own crime scene.

idle · nothing has happened yet · disappointing

YOUR BROWSER

the click "give me that file"
rendered pixels. finally.

zdh · EVERY BOX IS OURS

net.Listeneraccept
crypto/tls + ALPNnegotiate "h2"
connection preface§3.4 · SETTINGS
internal/frameparse HEADERS
internal/hpackRFC 7541 · Huffman
internal/stream§5.1 open stream 1
internal/request§8 pseudo-headers
internal/staticopen · ETag · range
internal/responseencode + compress
DATA framesflow-controlled
0/ 12

Nothing is happening

Press the button. I'm not going to beg.

Every step below is a real layer in this server, and every citation is a real sentence in a real RFC that we have read more times than is healthy.

Act III

Exactly one goroutine is allowed to touch the socket

If two goroutines write frames to the same socket, their bytes interleave and the entire connection becomes cursed nonsense forever. The peer reads a header, takes the next N bytes as payload, and every frame after that is misaligned until the heat death of the connection.

So we made it structurally impossible. One writer. It owns the pen.

1 per connection reader goroutine

Reads frames. Dispatches them. Never writes. Not allowed. Doesn't have the pen.

dispatch →
N per connection stream goroutines

Build responses in parallel. When they want to send something they politely Enqueue() it and go away.

Enqueue() →
exactly 1. ever. writer goroutine

SOLE OWNER of the write half. The only one with the pen. Everything on the wire went through here, in order, alone.

internal/frameAll 10 frame types. RFC 9113 §4, §6. 211 tests, 5 fuzz targets.
internal/hpackRFC 7541 header compression + Huffman, hand-built tables.
internal/stream§5.1 state machine, §5.1.2 concurrency, CONTINUATION reassembly.
internal/flowBoth flow-control windows. Negative windows are legal. Ask us why.
internal/request§8 semantics, pseudo-header validation, malformed-request rules.
internal/staticConditional requests, byte ranges, strong ETags (RFC 9110).
internal/priorityRFC 9218 extensible priorities + a real write scheduler.
internal/sfvRFC 9651 structured fields. Replaces a third-party library. Package killed.

Act IV

HTTP/1.1 stands in a queue. HTTP/2 does not.

HTTP/1.1 needs one connection per request in flight. Your browser opens six and makes everything else wait in line like it's 1997. HTTP/2 interleaves all of them on a single connection.

Don't take our word for it. Fire 64 requests and watch. Every bar is one real request. Count the new connections. We'll wait.

Act V

Things this server will refuse to your face

A file server that serves any path you ask for is not a file server, it's a data breach with extra steps. Each row below is a real request going out right now. The first one is the control — proof the file is really there and really servable. Every other row is the same file, asked for in a way that deserves a 404.

what we asked forgotwhy it deserved that

Act VI

We broke our own code 1,218 times to check the tests were awake

A green test suite proves your code passes your tests. It says absolutely nothing about whether your tests would notice if the code stopped working. That thought kept us up. So we did something about it.

For every single guard in this server — every deadline, every bound, every protocol rule — there is a script that deletes that guard and demands that a specific named test fail as a result. If the test doesn't fail, we don't get to say the guard is tested. That's 1,218 deliberate self-inflicted wounds across 18 campaigns, and every single one of them is caught.

147/147

h2spec --strict

Somebody else's conformance suite. Not ours. You can run it against this exact server yourself, and you should.
1218

guards, each observed failing

If a guard has never been seen failing, nobody has tested it. It's decoration. We don't ship decoration.
327

RFC quotations, verified

A script checks every quoted sentence in our comments actually appears in the RFC we credited. We caught ourselves misquoting nine times. From memory. Confidently.
2

real CVEs defended

Rapid reset (CVE-2023-44487) and the CONTINUATION flood (CVE-2023-45288). Both attacks are in our own test suite, both bounce.
Our favourite catch: returning a refused stream's verdict before decoding its header block passes every test a normal person would write — and silently desynchronises the HPACK dynamic table, so every later request on that connection decodes into header fields nobody ever sent. No crash. No error. Just quiet, confident nonsense forever. A green suite would never have told us. The break did.

Act VII

This page is also evidence

Everything you just read was delivered by the thing it's describing. Here is every asset this page loaded, with the protocol your browser reports for each one — not what we claim, what it observed.

resourceprotocolhowbytesms

And no, this page has no dependencies either. No React. No Tailwind. No charting library. No font from a CDN. Every diagram is hand-written SVG and every animation is CSS. It would have been deeply embarrassing to ship a zero-dependency server with a demo page that dragged in three megabytes of somebody else's JavaScript.