Tim Perry

Creator of HTTP Toolkit: powerful tools to debug, test & build with HTTP(S).

Passionate tech speaker, open-source contributor, and maintainer of Loglevel, Git‑Confirm and notes.

HTTP/3 has been in development since at least 2016, while QUIC (the protocol beneath it) was first introduced by Google way back in 2013. Both are now standardized, supported in 95% of users' browsers, already used in 32% of HTTP requests to Cloudflare, and support is advertised by 35% of websites (through alt-svc or DNS) in the HTTP Archive datase...
If you're using a local debugging proxy tool like HTTP Toolkit, you might run into the dreaded ERR_PROXY_CONNECTION_FAILED error in Chrome and other similar apps. This can be a very frustrating and unhelpful error! There's only a few possible causes though, and it's usually easy to fix. The Simple Case The simplest explanation is exactly what it sa...
Designing API Errors
When everything goes smoothly with an API, life is pretty straightforward: you request a resource, and voilà, you get it. You trigger a procedure, and the API politely informs you it’s all gone to plan. But what happens when something goes pear-shaped? Well, that’s where things can get a bit tricky. HTTP Status Codes HTTP status codes are like a fi...
The Open Source Pledge is a new push to make companies commit to funding the maintainers of the open-source software they depend on, and to publicly recognize the ones that do. HTTP Toolkit has donated back to maintainers for a few years now, but joining the Open Source Pledge today means formally committing to that, and to doing so publicly with a...
As of February 14th 2024, RFC 9512 formally registers application/yaml as the media type for all YAML content, and adds +yaml as a standard structured suffix for all YAML-based more specific media types. With this registration, it's now included in the official media types list maintained by the IANA. Media types like this (also known as the MIME t...
The X-Forwarded-For (XFF) HTTP header provides crucial insight into the origin of web requests. The header works as a mechanism for conveying the original source IP addresses of clients, and not just across one hop, but through chains of multiple intermediaries. This list of IPv4 and IPv6 addresses is helpful to understand where requests have reall...
Idempotency is when doing an operation multiple times is guaranteed to have the same effect as doing it just once. When working with APIs this is exceptionally helpful on slow or unreliable internet connections, or when dealing with particularly sensitive actions such as payments, because it makes retrying operations safe and reliable. This is why ...
It's hard to work on APIs without hearing about OpenAPI. OpenAPI is an API description format, which is essentially metadata that describes an HTTP API: where it lives, how it works, what data is available, and how it's authenticated. Additional keywords can be used to provide all sorts of validation information, adding a type system to what would ...
Everything crashes. Sometimes things crash when they're running inside a Docker container though, and then all of a sudden it can get much more difficult to work out why, or what the hell to do next. Docker's great, but it's an extra layer of complexity that means you can't always easily poke your app up close any more, and that can really hinder d...
A couple of weeks ago I published a post about changes in Android 14 that fundamentally break existing approaches to installing system-level CA certificates, even with root access. This has triggered some fascinating discussion! I highly recommend a skim through the debate on Mastodon and Hacker News. Since that was posted, quite a few people have ...
Update: This post sparked a lot of excellent discussion and debate on workarounds, and there are now multple working solutions to allow certificate injection on Android 14, despite the restrictions discussed here. See the update post for more details. When Android was initially announced in 2007 by the Open Handset Alliance (headed by Google) their...
There's been a lot of concern recently about the Web Environment Integrity proposal, developed by a selection of authors from Google, and apparently being prototyped in Chromium. There's good reason for anger here (though I'm not sure yelling at people on GitHub is necessarily the best outlet). This proposal amounts to attestation on the web, limit...
Caching is hard. Unfortunately though, caching is quite important. Hosted caching & CDNs offer incredible powers that can provide amazing performance boosts, cost savings & downtime protection, essential for most modern sites with any serious volume of users. Unfortunately, while there are strict standards for how caching is supposed to work with H...
This week, at long last, GitHub announced granular access tokens for npm. This is a big deal! It's great for security generally, but also particularly useful if you maintain any npm packages, as it removes the main downside of automating npm publishing, by allowing you to give CI jobs only a very limited token instead of full 2FA-free access to you...
Styled components has officially moved into maintenance-only mode: https://opencollective.com/styled-component...
Styled components has officially moved into maintenance-only mode: https://opencollective.com/styled-component...
Change default EC point formats to 'uncompressed' only
require(esm) was just enabled by default in the latest Node v20!Node v18 LTS support ends on April 30th, and a...
require(esm) was just enabled by default in the latest Node v20!Node v18 LTS support ends on April 30th, and a...
I was basically just setting up k8s because I'd gone past the limits of Scaleway's serverless containe...
I was basically just setting up k8s because I'd gone past the limits of Scaleway's serverless containe...
Just discovered Bunny's new magic containers feature and I've immediately stopped trying to learn Kube...
Just discovered Bunny's new magic containers feature and I've immediately stopped trying to learn Kube...
Personally I'm mostly interested in doing this from Node, which will still need to update OpenSSL (long pa...
Personally I'm mostly interested in doing this from Node, which will still need to update OpenSSL (long pa...
This is part of an ongoing personal campaign to kill TLS fingerprinting.With this change + https://github.com/...
This is part of an ongoing personal campaign to kill TLS fingerprinting.With this change + https://github.com/...
Made my 2nd PR to OpenSSL: https://github.com/openssl/openssl/pull/26990.More than any other project, I feel v...
Made my 2nd PR to OpenSSL: https://github.com/openssl/openssl/pull/26990.More than any other project, I feel v...
Add SSL_CTX_set_ec_point_formats() and SSL_set_ec_point_formats()
I'm testing out Zerossl's ACME certificate issuance here, and surprise surprise as soon as it hits the...
I'm testing out Zerossl's ACME certificate issuance here, and surprise surprise as soon as it hits the...
Publish a new site, and within 2 seconds loads of people will immediately jump in to help you test the securit...
Publish a new site, and within 2 seconds loads of people will immediately jump in to help you test the securit...
Been playing with monitoring tools recently - it's very refreshing to find a space where self-hosted OSS t...
Been playing with monitoring tools recently - it's very refreshing to find a space where self-hosted OSS t...
Signed up for my first Node.js collaborators summit! Paris here we come (in April): https://github.com/openjs-...
Signed up for my first Node.js collaborators summit! Paris here we come (in April): https://github.com/openjs-...
Current naming options are 'WallMapp' (two Ps because it's an app you see) vs 'MapPaper'.....
Current naming options are 'WallMapp' (two Ps because it's an app you see) vs 'MapPaper'.....
In the end I have doubled down on this (slightly silly) watercolour map live-wallpaper project!Very happy with...
In the end I have doubled down on this (slightly silly) watercolour map live-wallpaper project!Very happy with...
That wallpaper above is also a really nice example of the juxtaposition between the very ordered Eixample bloc...
That wallpaper above is also a really nice example of the juxtaposition between the very ordered Eixample bloc...
Deeply satisfying building & shipping little apps (none of the baggage of a real product) and for all AI&#...
Deeply satisfying building & shipping little apps (none of the baggage of a real product) and for all AI&#...
Here's the stamen maps by the way if you want to check them out, I just love the style: https://maps.stame...
Here's the stamen maps by the way if you want to check them out, I just love the style: https://maps.stame...
Whipped up a quick Android app over the weekend: a live Android wallpaper of the beautiful Stamen Watercolour ...
Whipped up a quick Android app over the weekend: a live Android wallpaper of the beautiful Stamen Watercolour ...
Seems the main alternatives now are Google Fit/Apple Health (limited , very phone focused, not at all open) or...
Seems the main alternatives now are Google Fit/Apple Health (limited , very phone focused, not at all open) or...
Since it seems Strava are deciding to intentionally give up their position as API hub for health data - is any...
Since it seems Strava are deciding to intentionally give up their position as API hub for health data - is any...
Primarily that means Syncthing (https://syncthing.net), so I now have a functional self-hosted dropbox equival...
Primarily that means Syncthing (https://syncthing.net), so I now have a functional self-hosted dropbox equival...
Answer by Tim Perry for http-toolkit : Connection aborted even though I'm using the security config
This is due to Flutter, which ignores external certificate configuration (on Android and all systems, as far a...
Answer by Tim Perry for docker volume ls shows httptoolkit-injected-data-1.15.0 volume
This means you've used HTTP Toolkit for Docker interception on your machine at some point. The volume is just ...
How to treat missing & undefined properties as equivalent in Lodash's isEqualWith
I'm fighting with a custom comparison functions for Lodash's _.isEqualWith. I'd like a function such that this...