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.
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-via | 15 |
| user-agent | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
| x-amzn-trace-id | [hidden] |
| x-forwarded-proto | https |
| x-forwarded-port | 443 |
| accept-encoding | gzip, br |
| cf-visitor | {"scheme":"https"} |
| host | vxdacx4huakl7juwnhoa6imery0punao.lambda-url.ap-south-1.on.aws |
| content-length | 0 |
| x-amzn-tls-cipher-suite | [hidden] |
| x-amzn-tls-version | [hidden] |
| x-amzn-lambda-context | [hidden] |
| cf-worker | rahulgpt.com |
| cf-connecting-ip | 216.73.216.105 |
| x-forwarded-for | 216.73.216.105 |
| cf-ray | a466b9bbfdb5a0ea-CMH |
| accept | */* |
| cdn-loop | cloudflare; loops=1 |
| x-amzn-request-context | [hidden] |
3 How your request got here
- Cloudflare terminated TLS for
kraken.rahulgpt.comand a tiny Worker forwarded the request to AWS. - 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.
- 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. - 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
GET /hello?name=recruiterQuery parameters in a template
GET /api/requestYour request as JSON
GET /homeTemplate file rendered on the server
GET /style.cssStatic file with MIME detection
GET /echo405 with an Allow header
GET /this/does/not/exist404 page
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
- Socketssocket, bind, listen and accept on a plain TCP port, with receive timeouts so idle clients can't pin a worker.
- Thread poolConnections are queued and handled by 20 worker threads from owl, my C utility library.
- HTTP/1.1 parserRequest line, headers, Content-Length bodies, url decoding and query strings. Malformed requests get a 400.
- RoutingExpress style
register_route(server, "/hello", handler)with O(1) hash map lookup. - Static filesMultiple static directories, index.html for folders, MIME types, chunked file reads and path traversal protection.
- TemplatesSingle pass
{{placeholder}}rendering from strings or files, the same thing that built this page.