Kraken

served live by kraken · cold start

This page was served by a web server I wrote in C.

No framework and no nginx in front. Kraken accepts the TCP connection with POSIX sockets, parses HTTP/1.1 by hand, hands the request to a thread pool and renders this HTML from a template. Below is exactly what it saw when you asked for this page.

Request#1to this process
Process uptime1spid 5
Handled byworker #1from a pool of 20 threads
Handler time120 µsparse to render

This process was just started to serve you. Before your request, nothing was running. Started 2026-10-06 18:28:22 UTC.

1 The bytes that arrived

This is the request as recv() returned it, 1737 bytes. Control characters are shown, so you can see the \r\n after every line and the empty line that ends the headers.

GET / HTTP/1.1\r\n
cf-worker: rahulgpt.com\r\n
cdn-loop: cloudflare; loops=1\r\n
x-amzn-tls-version: [hidden]\r\n
cf-ray: a466b9bbfdb5a0ea-CMH\r\n
x-forwarded-proto: https\r\n
x-forwarded-port: 443\r\n
x-forwarded-for: 216.73.216.105\r\n
accept: */*\r\n
x-amzn-tls-cipher-suite: [hidden]\r\n
x-amzn-trace-id: [hidden]\r\n
cf-visitor: {"scheme":"https"}\r\n
host: vxdacx4huakl7juwnhoa6imery0punao.lambda-url.ap-south-1.on.aws\r\n
cf-connecting-ip: 216.73.216.105\r\n
cf-ew-via: 15\r\n
accept-encoding: gzip, br\r\n
user-agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)\r\n
x-amzn-request-context: [hidden]\r\n
x-amzn-lambda-context: [hidden]\r\n
content-length: 0\r\n
\r\n
Same bytes as a hex dump
00000000  47 45 54 20 2f 20 48 54  54 50 2f 31 2e 31 0d 0a  GET / HTTP/1.1..
00000010  63 66 2d 77 6f 72 6b 65  72 3a 20 72 61 68 75 6c  cf-worker: rahul
00000020  67 70 74 2e 63 6f 6d 0d  0a 63 64 6e 2d 6c 6f 6f  gpt.com..cdn-loo
00000030  70 3a 20 63 6c 6f 75 64  66 6c 61 72 65 3b 20 6c  p: cloudflare; l
00000040  6f 6f 70 73 3d 31 0d 0a  78 2d 61 6d 7a 6e 2d 74  oops=1..x-amzn-t
00000050  6c 73 2d 76 65 72 73 69  6f 6e 3a 20 5b 68 69 64  ls-version: [hid
00000060  64 65 6e 5d 0d 0a 63 66  2d 72 61 79 3a 20 61 34  den]..cf-ray: a4
00000070  36 36 62 39 62 62 66 64  62 35 61 30 65 61 2d 43  66b9bbfdb5a0ea-C
00000080  4d 48 0d 0a 78 2d 66 6f  72 77 61 72 64 65 64 2d  MH..x-forwarded-
00000090  70 72 6f 74 6f 3a 20 68  74 74 70 73 0d 0a 78 2d  proto: https..x-
000000a0  66 6f 72 77 61 72 64 65  64 2d 70 6f 72 74 3a 20  forwarded-port: 
000000b0  34 34 33 0d 0a 78 2d 66  6f 72 77 61 72 64 65 64  443..x-forwarded
000000c0  2d 66 6f 72 3a 20 32 31  36 2e 37 33 2e 32 31 36  -for: 216.73.216
000000d0  2e 31 30 35 0d 0a 61 63  63 65 70 74 3a 20 2a 2f  .105..accept: */
000000e0  2a 0d 0a 78 2d 61 6d 7a  6e 2d 74 6c 73 2d 63 69  *..x-amzn-tls-ci
000000f0  70 68 65 72 2d 73 75 69  74 65 3a 20 5b 68 69 64  pher-suite: [hid
00000100  64 65 6e 5d 0d 0a 78 2d  61 6d 7a 6e 2d 74 72 61  den]..x-amzn-tra
00000110  63 65 2d 69 64 3a 20 5b  68 69 64 64 65 6e 5d 0d  ce-id: [hidden].
00000120  0a 63 66 2d 76 69 73 69  74 6f 72 3a 20 7b 22 73  .cf-visitor: {"s
00000130  63 68 65 6d 65 22 3a 22  68 74 74 70 73 22 7d 0d  cheme":"https"}.
00000140  0a 68 6f 73 74 3a 20 76  78 64 61 63 78 34 68 75  .host: vxdacx4hu
00000150  61 6b 6c 37 6a 75 77 6e  68 6f 61 36 69 6d 65 72  akl7juwnhoa6imer
00000160  79 30 70 75 6e 61 6f 2e  6c 61 6d 62 64 61 2d 75  y0punao.lambda-u
00000170  72 6c 2e 61 70 2d 73 6f  75 74 68 2d 31 2e 6f 6e  rl.ap-south-1.on
00000180  2e 61 77 73 0d 0a 63 66  2d 63 6f 6e 6e 65 63 74  .aws..cf-connect
00000190  69 6e 67 2d 69 70 3a 20  32 31 36 2e 37 33 2e 32  ing-ip: 216.73.2
000001a0  31 36 2e 31 30 35 0d 0a  63 66 2d 65 77 2d 76 69  16.105..cf-ew-vi
000001b0  61 3a 20 31 35 0d 0a 61  63 63 65 70 74 2d 65 6e  a: 15..accept-en
000001c0  63 6f 64 69 6e 67 3a 20  67 7a 69 70 2c 20 62 72  coding: gzip, br
000001d0  0d 0a 75 73 65 72 2d 61  67 65 6e 74 3a 20 4d 6f  ..user-agent: Mo
000001e0  7a 69 6c 6c 61 2f 35 2e  30 20 41 70 70 6c 65 57  zilla/5.0 AppleW
000001f0  65 62 4b 69 74 2f 35 33  37 2e 33 36 20 28 4b 48  ebKit/537.36 (KH
... 159 more bytes

2 What the parser made of it

Kraken splits the request line, decodes the path and query string, and stores the headers in a hash map (SipHash) with lowercased names.

Method
GET
Path
/
Query
none
Version
HTTP/1.1
Body
0 bytes
Socket peer
127.0.0.1:57400
19 headers
cf-ew-via15
user-agentMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
x-amzn-trace-id[hidden]
x-forwarded-protohttps
x-forwarded-port443
accept-encodinggzip, br
cf-visitor{"scheme":"https"}
hostvxdacx4huakl7juwnhoa6imery0punao.lambda-url.ap-south-1.on.aws
content-length0
x-amzn-tls-cipher-suite[hidden]
x-amzn-tls-version[hidden]
x-amzn-lambda-context[hidden]
cf-workerrahulgpt.com
cf-connecting-ip216.73.216.105
x-forwarded-for216.73.216.105
cf-raya466b9bbfdb5a0ea-CMH
accept*/*
cdn-loopcloudflare; loops=1
x-amzn-request-context[hidden]

3 How your request got here

  1. Cloudflare terminated TLS for kraken.rahulgpt.com and a tiny Worker forwarded the request to AWS.
  2. AWS Lambda started this process if none was warm. Kraken is a normal long running server, so Lambda runs it as is and pays nothing while idle.
  3. The Lambda Web Adapter turned the event back into plain HTTP and opened a TCP connection to 127.0.0.1:8000. That is the socket peer you see above.
  4. Kraken accept()ed it, queued it on the thread pool, read the bytes, parsed them, looked up / in the route table and ran the handler that rendered this page.

4 Try it

Or from a terminal:

$ curl -i https://kraken.rahulgpt.com/api/request
$ curl -X POST -d 'hello kraken' https://kraken.rahulgpt.com/echo
$ curl -I https://kraken.rahulgpt.com/

What's inside