Skip to main content

Beyond HTTP, Part 2: Two-Way Streets

· 9 min read
Pere Pages
Software Engineer
A browser window on the left and a server on the right joined by a broad channel carrying amber arrows flowing right and teal arrows flowing left at the same time, showing full-duplex two-way traffic

In Part 1 the server learned to talk without being asked — but the browser could still only listen. A chat, a multiplayer game, a collaborative editor: these need both sides speaking freely over one connection. This is Part 2 of the series, and it's about the browser's true two-way channels — WebSockets, the workhorse, and WebTransport, its modern successor.

Beyond HTTP, Part 1: When the Server Speaks First

· 11 min read
Pere Pages
Software Engineer
A server on the left streaming a one-way flow of glowing message arrows toward a browser window on the right, with a small notification bell above it

Plain HyperText Transfer Protocol (HTTP) has one stubborn rule: the browser asks, the server answers, and then the line goes dead. So how does a chat notification, a live score, or a stream of tokens from a language model reach a page that never asked again? This is Part 1 of a three-part tour of the browser's networking beyond request–response — and it starts with the three ways a server can reach you.

Generating Blog Covers and Social Cards With an Image MCP Server for Claude Code

· 14 min read
Pere Pages
Software Engineer
A blog post cover being assembled from a title card and an AI-generated illustration

Every post on this blog needs two images that do completely different jobs: a social card that has to earn a click in a feed, and an inline hero that opens the article. This post is about how the blog makes both — a typographic default that costs nothing, an opt-in artificial-intelligence (AI) cover that costs about four cents, and the little Model Context Protocol (MCP) server that wires an image model straight into Claude Code. The cover above was made by that exact pipeline.

What Actually Happens Before (and After) the Cloudflare "Verify you are human" Checkbox

· 13 min read
Pere Pages
Software Engineer
Editorial illustration of a request being intercepted and filtered at a global edge network before reaching an origin server

You've seen this screen a thousand times: a dark page, the domain name in bold, "Performing security verification", and a lonely checkbox with the Cloudflare logo. It feels like a speed bump, but there's a surprisingly rich pipeline behind it — and, importantly, none of it runs on the website's own servers.

How to Measure Developer and Team Performance (Without Gaming It)

· 9 min read
Pere Pages
Software Engineer
A balance scale weighing clustered spheres against stacked cubes, with faint gauges behind, in indigo
Measuring the Immeasurable

Software teams generate an ocean of numbers — commits, tickets, story points, lines of code — yet the thing we actually care about, performance, stubbornly resists measurement. This post is about that gap: why individual output is so easy to misjudge, what signals are worth watching, and how to measure teams without corrupting the very behavior you want.

Automating Pull Requests and Code Review With Claude Code (the Task-and-Review Loop)

· 12 min read
Pere Pages
Software Engineer
A robot assistant opening a pull request while a review checkmark cycles back along a git branch

"Self-maintaining" is a seductive phrase, so let's be honest about it up front. You're not going to walk away for a month and come back to a repo that grew new features on its own. What you can build is a loop where Claude does most of the mechanical work — turning issues into pull requests (PRs) — and a separate Claude pass reviews that work before it ever reaches you. You stay the final gate, but you review a clean, already-critiqued PR instead of a blank diff.

How the Browser Loads Scripts

· 25 min read
Pere Pages
Software Engineer
The browser building a module graph from script tags and imported files

You add a <script> tag, the page runs your code. Underneath that one line the browser does a surprising amount of work: it decides when to run the script, fetches every file it depends on, figures out what each file is asking for, keeps every loaded module in memory so it runs exactly once, and evaluates them all in the right order. This is a tour of that machinery.