Skip to content
View Mootjelh's full-sized avatar

Block or report Mootjelh

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Mootjelh/README.md

Mootjelh

Backend and request engineering, mostly Go. High-concurrency automation, low-latency monitoring, and the full-stack tooling that operates it.

Open source

  • identlint · check that a request's headers agree with the browser they claim to be: the version in User-Agent against sec-ch-ua, the arbitrary brand Chromium puts in that list and where, the platform and mobile hints, the encodings, a TLS profile name, the header order, the HTTP/2 pseudo-header order and how header names are spelled over HTTP/1.1. Every rule was measured on the wire against Chrome, Edge, Brave, Opera GX and Firefox. Reads a header block or a whole HAR.
  • field-notes · what I learned from being confidently wrong 122 times while reverse engineering a bot-protected site. 117 of them were my own bug.
  • flatread · read FlatBuffers buffers when you don't have the schema. Field access by vtable slot instead of by generated name, for plain and size-prefixed buffers alike. No dependencies, fuzz-tested so it never panics on malformed input.
  • proxypool · rotating proxy pool with cooldowns. Small: no health checks, because only your own traffic can tell you whether an address works.
  • hardiff · compare two HTTP Archive captures. Matches requests by endpoint rather than by full URL, so a cache buster does not turn every call into one request removed and one added, and compares JSON bodies field by field instead of as a blob.
  • flatschema · infer a FlatBuffers schema from sample buffers. Merges what each sample populated and writes the .fbs they imply, keeping the slot numbering right where a field nothing populated would otherwise shift every field after it.

Upstream

  • bogdanfinn/tls-client#266 · a cached transport was reused after the server changed the protocol it negotiated, so an HTTP/1 transport read an HTTP/2 SETTINGS frame as a status line. Merged, in v1.16.0.
  • bogdanfinn/tls-client#270 · the transport cache was written from a reconnecting dial holding a different mutex than the one guarding it, so a read and a write could overlap. Found with the race detector. Merged.
  • bogdanfinn/fhttp#27 · a deflate body was sniffed and buffered while the response was still being built, so over HTTP/2 the request never returned. gzip and brotli on the same host were fine. Merged.
  • mikeknight85/PriceStalker#223, #229 · sec-ch-ua carried a fixed GREASE brand in a fixed place, and Opera's Chromium version was taken from its own OPR number. Ported Chromium's tables and measured Opera's full version with an Accept-CH server. Merged.

Stack

Go · TypeScript · Node · React / Next.js · PostgreSQL · MongoDB · Redis · Docker · REST & GraphQL

What I build

Request-based automation in Go: site modules, CLI tooling, and systems that have to stay fast under heavy concurrency. Real-time Discord tooling, scraping and database sync. Monitoring with sub-second reaction times. Dashboards and API backends to drive all of it.

Available for project work and monthly retainers. Reach me at info@mh-automation.nl.

Pinned Loading

  1. identlint identlint Public

    Checks that request headers agree with the browser they claim to be: User-Agent vs sec-ch-ua client hints, GREASE brand, header order, HTTP/2 pseudo-header order. Reads a header block or a HAR.

    Go

  2. field-notes field-notes Public

    Notes from reverse engineering a bot-protected site. 122 confident conclusions, 117 of them my own bug.

    1

  3. flatread flatread Public

    Read FlatBuffers buffers you have no schema for. Zero dependencies, never panics.

    Go

  4. flatschema flatschema Public

    Infer a FlatBuffers schema from sample buffers. Reads buffers with no .fbs and writes the one they imply.

    Go

  5. hardiff hardiff Public

    Compare two HTTP Archive captures and see what changed. Matches requests by endpoint, diffs JSON bodies by field. Zero dependencies.

    Go

  6. proxypool proxypool Public

    A rotating proxy pool with cooldowns for Go. Zero dependencies, concurrency-safe.

    Go