Timo Tijhof
banner
timotijhof.net
Timo Tijhof
@timotijhof.net
Dutch expat in London.

Principal Engineer at Wikimedia Foundation, QUnit project lead @qunit, jQuery Infra Team @jquery, W3C Web Perf WG.

Avatar: I look up […]

🌉 bridged from ⁂ https://fosstodon.org/@krinkle, follow @ap.brid.gy to interact
Pinned
📝 Wikimedia blog: Unifying our mobile and desktop domains

Reduced mobile response times by 20% worldwide and un-broke Google indexing.

https://techblog.wikimedia.org/2025/11/21/unifying-mobile-and-desktop-domains/

#wikimedia #mediawiki #wikipedia
Unifying our mobile and desktop domains
How we achieved 20% faster mobile response times, improved SEO, and reduced infrastructure load.
techblog.wikimedia.org
Reposted by Timo Tijhof
It occurs to me that people outside the security field might find it odd that we openly publish stuff like this. Why help people who might use the knowledge to do bad things?

There are a number of reasons. The first is that only through open discussion are we able to identify and fix problems […]
Original post on federate.social
federate.social
December 29, 2025 at 3:33 AM
Reposted by Timo Tijhof
Being aesthetically impaired I rarely post photos or art, but this…

A Man Feeding Swans in the Snow, Poland | Marcin Ryczek
December 28, 2025 at 7:37 PM
Reposted by Timo Tijhof
How did uv get so fast? (Spoiler: not just because it’s written in rust) https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html
How uv got so fast
uv installs packages faster than pip by an order of magnitude. The usual explanation is “it’s written in Rust.” That’s true, but it doesn’t explain much. Plenty of tools are written in Rust without being notably fast. The interesting question is what design decisions made the difference. Charlie Marsh’s Jane Street talk and a Xebia engineering deep-dive do an excellent job at covering the technical details. Let’s dig into the design decisions that led to it: standards that enable fast paths, things uv drops that pip supports, and optimizations that don’t require Rust at all. ## The standards that made uv possible pip’s slowness isn’t a failure of implementation. For years, Python packaging required executing code to find out what a package needed. The problem was setup.py. You couldn’t know a package’s dependencies without running its setup script. But you couldn’t run its setup script without installing its build dependencies. PEP 518 in 2016 called this out explicitly: “You can’t execute a setup.py file without knowing its dependencies, but currently there is no standard way to know what those dependencies are in an automated fashion without executing the setup.py file.” This chicken-and-egg problem forced pip to download packages, execute untrusted code, fail, install missing build tools, and try again. Every install was potentially a cascade of subprocess spawns and arbitrary code execution. Installing a source distribution was essentially `curl | bash` with extra steps. The fix came in stages: * PEP 518 (2016) created pyproject.toml, giving packages a place to declare build dependencies without code execution. The TOML format was borrowed from Rust’s Cargo, which makes a Rust tool returning to fix Python packaging feel less like coincidence. * PEP 517 (2017) separated build frontends from backends, so pip didn’t need to understand setuptools internals. * PEP 621 (2020) standardized the `[project]` table, so dependencies could be read by parsing TOML rather than running Python. * PEP 658 (2022) put package metadata directly in the Simple Repository API, so resolvers could fetch dependency information without downloading wheels at all. PEP 658 went live on PyPI in May 2023. uv launched in February 2024. The timing isn’t coincidental. uv could be fast because the ecosystem finally had the infrastructure to support it. A tool like uv couldn’t have shipped in 2020. The standards weren’t there yet. Other ecosystems figured this out earlier. Cargo has had static metadata from the start. npm’s package.json is declarative. Python’s packaging standards finally bring it to parity. ## What uv drops Speed comes from elimination. Every code path you don’t have is a code path you don’t wait for. uv’s compatibility documentation is a list of things it doesn’t do: **No .egg support.** Eggs were the pre-wheel binary format. pip still handles them; uv doesn’t even try. The format has been obsolete for over a decade. **No pip.conf.** uv ignores pip’s configuration files entirely. No parsing, no environment variable lookups, no inheritance from system-wide and per-user locations. **No bytecode compilation by default.** pip compiles .py files to .pyc during installation. uv skips this step, shaving time off every install. You can opt in if you want it. **Virtual environments required.** pip lets you install into system Python by default. uv inverts this, refusing to touch system Python without explicit flags. This removes a whole category of permission checks and safety code. **Stricter spec enforcement.** pip accepts malformed packages that technically violate packaging specs. uv rejects them. Less tolerance means less fallback logic. **Ignoring requires-python upper bounds.** When a package says it requires `python<4.0`, uv ignores the upper bound and only checks the lower. This reduces resolver backtracking dramatically since upper bounds are almost always wrong. Packages declare `python<4.0` because they haven’t tested on Python 4, not because they’ll actually break. The constraint is defensive, not predictive. **First-index wins by default.** When multiple package indexes are configured, pip checks all of them. uv picks from the first index that has the package, stopping there. This prevents dependency confusion attacks and avoids extra network requests. Each of these is a code path pip has to execute and uv doesn’t. ## Optimizations that don’t need Rust Some of uv’s speed comes from Rust. But not as much as you’d think. Several key optimizations could be implemented in pip today: **HTTP range requests for metadata.** Wheel files are zip archives, and zip archives put their file listing at the end. uv tries PEP 658 metadata first, falls back to HTTP range requests for the zip central directory, then full wheel download, then building from source. Each step is slower and riskier. The design makes the fast path cover 99% of cases. This is HTTP protocol work, not Rust. **Parallel downloads.** pip downloads packages one at a time. uv downloads many at once. This is concurrency, not language magic. **Global cache with hardlinks.** pip copies packages into each virtual environment. uv keeps one copy globally and uses hardlinks (or copy-on-write on filesystems that support it). Installing the same package into ten venvs takes the same disk space as one. This is filesystem ops, not language-dependent. **Python-free resolution.** pip needs Python running to do anything, and invokes build backends as subprocesses to get metadata from legacy packages. uv parses TOML and wheel metadata natively, only spawning Python when it hits a setup.py-only package that has no other option. **PubGrub resolver.** uv uses the PubGrub algorithm, originally from Dart’s pub package manager. pip uses a backtracking resolver. PubGrub is faster at finding solutions and better at explaining failures. It’s an algorithm choice, not a language choice. ## Where Rust actually matters Some optimizations do require Rust: **Zero-copy deserialization.** uv uses rkyv to deserialize cached data without copying it. The data format is the in-memory format. This is a Rust-specific technique. **Lock-free concurrent data structures.** Rust’s ownership model makes concurrent access safe without locks. Python’s GIL makes this difficult. **No interpreter startup.** Every time pip spawns a subprocess, it pays Python’s startup cost. uv is a single static binary with no runtime to initialize. **Compact version representation.** uv packs versions into u64 integers where possible, making comparison and hashing fast. Over 90% of versions fit in one u64. This is micro-optimization that compounds across millions of comparisons. These are real advantages. But they’re smaller than the architectural wins from dropping legacy support and exploiting modern standards. ## The actual lesson uv is fast because of what it doesn’t do, not because of what language it’s written in. The standards work of PEP 518, 517, 621, and 658 made fast package management possible. Dropping eggs, pip.conf, and permissive parsing made it achievable. Rust makes it a bit faster still. pip could implement parallel downloads, global caching, and metadata-only resolution tomorrow. It doesn’t, largely because backwards compatibility with fifteen years of edge cases takes precedence. But it means pip will always be slower than a tool that starts fresh with modern assumptions. The takeaway for other package managers: the things that make uv fast are static metadata, no code execution to discover dependencies, and the ability to resolve everything upfront before downloading. Cargo and npm have operated this way for years. If your ecosystem requires running arbitrary code to find out what a package needs, you’ve already lost.
nesbitt.io
December 26, 2025 at 5:05 PM
Reposted by Timo Tijhof
There will be more video later (there's a TV news crew there) but here's a bit that Jon Duerig has sent from on-site
December 19, 2025 at 7:51 PM
Schrödinger's screen
December 25, 2025 at 8:32 PM
Reposted by Timo Tijhof
1. User complains to #hackerone that I named his *previous* name when he renamed himself to a silly name after I banned them in a #curl report filed back in October.

2. Hackerone asks me to respond on their support forum, on which I have no account. Grrr. I […]

[Original post on mastodon.social]
December 23, 2025 at 10:25 AM
Reposted by Timo Tijhof
Santa knows me so well.🎄
December 25, 2025 at 11:57 AM
Reposted by Timo Tijhof
Now that "cancel culture" warrior Bari Weiss holds real power at CBS, she is wielding it by trying to cancel a short 60 Minutes segment about one of the Trump administration's worst human rights abuses of this year -- the #cecot deportations.

The footage did make it onto Canadian TV where […]
Original post on social.coop
social.coop
December 23, 2025 at 12:05 AM
Reposted by Timo Tijhof
While I’m waiting for this to get TestFlight approval, some findings from reverse engineering parts of this system:
- This uses the same method that QuickTime, Keynote uses. If you set kCMIOHardwarePropertyAllowScreenCaptureDevices, a connected device will appear as an AVCaptureDevice […]
Original post on hachyderm.io
hachyderm.io
December 24, 2025 at 4:46 PM
Reposted by Timo Tijhof
Google sues SerpApi for scraping the Google search results. "Google called SerpApi's "business model is parasitic," adding "SerpApi uses automated means to scrape these other services." This generates "billions of artificial requests and then copying and selling the responses. SerpApi does not […]
Original post on social.vivaldi.net
social.vivaldi.net
December 22, 2025 at 9:07 AM
Reposted by Timo Tijhof
it paints a hell of a story
December 22, 2025 at 2:26 AM
Reposted by Timo Tijhof
Excuse me? Average of 10.2 drinks per week? And that's their lowest figure on record? www.ft.com/content/0f42...

Given how averages work, and that most people in my "bubble" only have a few occasional pints... who are all these people who go into dozens?
December 22, 2025 at 12:18 AM
Reposted by Timo Tijhof
When web specs are not clear, just go to the source code
December 22, 2025 at 9:24 PM
Anna’s Archive scraped most of Spotify and has begun distributing it via bulk torrents. Metadata is published, audio coming in later drops.

With so much stuck behind subscription walls, this seems the closest thing we have to preserving our fragile digital-only culture.

It does make for an […]
Original post on fosstodon.org
fosstodon.org
December 22, 2025 at 5:05 PM
Reposted by Timo Tijhof
React just announced their new logo. Pretty bold for them, I must say
December 21, 2025 at 2:01 PM
Why Does A.I. Write Like … That?

Sam Kriss for the New York Times:

"""
According to the data, post-ChatGPT papers lean more on words like “underscore,” “highlight” and “showcase” than pre-ChatGPT papers [..] And “delve” [..] shot up by 2,700 percent.
""" […]
Original post on fosstodon.org
fosstodon.org
December 18, 2025 at 5:00 PM
Reposted by Timo Tijhof
Reposted by Timo Tijhof
GitHub Actions charging per build minute for *self-hosted-runners*? Shit's about to hit the fan lol
December 16, 2025 at 5:57 PM
Reposted by Timo Tijhof
A short snappy breakdown of some lovely attention to detail you can apply with CSS. Surprisingly high browser support too!

https://webkit.org/blog/17628/target-text-an-easy-way-to-style-text-fragments/
::target-text: An easy way to style text fragments
You’re reading a great blog post.
webkit.org
December 16, 2025 at 2:01 PM
Reposted by Timo Tijhof
December 16, 2025 at 10:10 AM
Reposted by Timo Tijhof
Just show the prompt and save us all time and resources.

https://distantprovince.by/posts/its-rude-to-show-ai-output-to-people/
It's rude to show AI output to people | Alex Martsinovich
Feeding slop is an act of war
distantprovince.by
December 11, 2025 at 4:03 PM