opeik
stikic.com
opeik
@stikic.com
Reposted by opeik
Package managers keep using git as a database, it never works out.

https://nesbitt.io/2025/12/24/package-managers-keep-using-git-as-a-database.html
Package managers keep using git as a database, it never works out
Using git as a database is a seductive idea. You get version history for free. Pull requests give you a review workflow. It’s distributed by design. GitHub will host it for free. Everyone already knows how to use it. Package managers keep falling for this. And it keeps not working out. ## Cargo The crates.io index started as a git repository. Every Cargo client cloned it. This worked fine when the registry was small, but the index kept growing. Users would see progress bars like “Resolving deltas: 74.01%, (64415/95919)” hanging for ages, the visible symptom of Cargo’s libgit2 library grinding through delta resolution on a repository with thousands of historic commits. The problem was worst in CI. Stateless environments would download the full index, use a tiny fraction of it, and throw it away. Every build, every time. RFC 2789 introduced a sparse HTTP protocol. Instead of cloning the whole index, Cargo now fetches files directly over HTTPS, downloading only the metadata for dependencies your project actually uses. (This is the “full index replication vs on-demand queries” tradeoff in action.) By April 2025, 99% of crates.io requests came from Cargo versions where sparse is the default. The git index still exists, still growing by thousands of commits per day, but most users never touch it. ## Homebrew GitHub explicitly asked Homebrew to stop using shallow clones. Updating them was “an extremely expensive operation” due to the tree layout and traffic of homebrew-core and homebrew-cask. Users were downloading 331MB just to unshallow homebrew-core. The .git folder approached 1GB on some machines. Every `brew update` meant waiting for git to grind through delta resolution. Homebrew 4.0.0 in February 2023 switched to JSON downloads for tap updates. The reasoning was blunt: “they are expensive to git fetch and git clone and GitHub would rather we didn’t do that… they are slow to git fetch and git clone and this provides a bad experience to end users.” Auto-updates now run every 24 hours instead of every 5 minutes, and they’re much faster because there’s no git fetch involved. ## CocoaPods CocoaPods is the package manager for iOS and macOS development. It hit the limits hard. The Specs repo grew to hundreds of thousands of podspecs across a deeply nested directory structure. Cloning took minutes. Updating took minutes. CI time vanished into git operations. GitHub imposed CPU rate limits. The culprit was shallow clones, which force GitHub’s servers to compute which objects the client already has. The team tried various band-aids: stopping auto-fetch on `pod install`, converting shallow clones to full clones, sharding the repository. The CocoaPods blog captured it well: “Git was invented at a time when ‘slow network’ and ‘no backups’ were legitimate design concerns. Running endless builds as part of continuous integration wasn’t commonplace.” CocoaPods 1.8 gave up on git entirely for most users. A CDN became the default, serving podspec files directly over HTTP. The migration saved users about a gigabyte of disk space and made `pod install` nearly instant for new setups. ## Go modules Grab’s engineering team went from 18 minutes for `go get` to 12 seconds after deploying a module proxy. That’s not a typo. Eighteen minutes down to twelve seconds. The problem was that `go get` needed to fetch each dependency’s source code just to read its go.mod file and resolve transitive dependencies. Cloning entire repositories to get a single file. Go had security concerns too. The original design wanted to remove version control tools entirely because “these fragment the ecosystem: packages developed using Bazaar or Fossil, for example, are effectively unavailable to users who cannot or choose not to install these tools.” Beyond fragmentation, the Go team worried about security bugs in version control systems becoming security bugs in `go get`. You’re not just importing code; you’re importing the attack surface of every VCS tool on the developer’s machine. GOPROXY became the default in Go 1.13. The proxy serves source archives and go.mod files independently over HTTP. Go also introduced a checksum database (sumdb) that records cryptographic hashes of module contents. This protects against force pushes silently changing tagged releases, and ensures modules remain available even if the original repository is deleted. ## Beyond package managers The same pattern shows up wherever developers try to use git as a database. Git-based wikis like Gollum (used by GitHub and GitLab) become “somewhat too slow to be usable” at scale. Browsing directory structure takes seconds per click. Loading pages takes longer. GitLab plans to move away from Gollum entirely. Git-based CMS platforms like Decap hit GitHub’s API rate limits. A Decap project on GitHub scales to about 10,000 entries if you have a lot of collection relations. A new user with an empty cache makes a request per entry to populate it, burning through the 5,000 request limit quickly. If your site has lots of content or updates frequently, use a database instead. Even GitOps tools that embrace git as a source of truth have to work around its limitations. ArgoCD’s repo server can run out of disk space cloning repositories. A single commit invalidates the cache for all applications in that repo. Large monorepos need special scaling considerations. ## The pattern The hosting problems are symptoms. The underlying issue is that git inherits filesystem limitations, and filesystems make terrible databases. **Directory limits.** Directories with too many files become slow. CocoaPods had 16,000 pod directories in a single Specs folder, requiring huge tree objects and expensive computation. Their fix was hash-based sharding: split directories by the first few characters of a hashed name, so no single directory has too many entries. Git itself does this internally with its objects folder, splitting into 256 subdirectories. You’re reinventing B-trees, badly. **Case sensitivity.** Git is case-sensitive, but macOS and Windows filesystems typically aren’t. Check out a repo containing both `File.txt` and `file.txt` on Windows, and the second overwrites the first. Azure DevOps had to add server-side enforcement to block pushes with case-conflicting paths. **Path length limits.** Windows restricts paths to 260 characters, a constraint dating back to DOS. Git supports longer paths, but Git for Windows inherits the OS limitation. This is painful with deeply nested node_modules directories, where `git status` fails with “Filename too long” errors. **Missing database features.** Databases have CHECK constraints and UNIQUE constraints; git has nothing, so every package manager builds its own validation layer. Databases have locking; git doesn’t. Databases have indexes for queries like “all packages depending on X”; with git you either traverse every file or build your own index. Databases have migrations for schema changes; git has “rewrite history and force everyone to re-clone.” The progression is predictable. Start with a flat directory of files. Hit filesystem limits. Implement sharding. Hit cross-platform issues. Build server-side enforcement. Build custom indexes. Eventually give up and use HTTP or an actual database. You’ve built a worse version of what databases already provide, spread across git hooks, CI pipelines, and bespoke tooling. None of this means git is bad. Git excels at what it was designed for: distributed collaboration on source code, with branching, merging, and offline work. The problem is using it for something else entirely. Package registries need fast point queries for metadata. Git gives you a full-document sync protocol when you need a key-value lookup. If you’re building a package manager and git-as-index seems appealing, look at Cargo, Homebrew, CocoaPods, Go. They all had to build workarounds as they grew, causing pain for users and maintainers. The pull request workflow is nice. The version history is nice. You will hit the same walls they did.
nesbitt.io
December 24, 2025 at 4:49 PM
Reposted by opeik
If you pay attention to any large industry long enough and follow it to its logical conclusion you eventually end up sounding like a communist even if you started off testing CPU case fans. youtu.be/cUrJVdF2me0?...
December 22, 2025 at 5:58 PM
Reposted by opeik
New awareness campaign
November 3, 2025 at 3:23 PM
Reposted by opeik
I ran into some ghosts when compiling Rust:
- `cargo-semver-checks` said the code didn't compile.
- `cargo check` said it was fine.

What better day to talk about it than Halloween? 🎃👻

predr.ag/blog/ghosts-...
Ghosts in the Compilation
When two tools disagree whether a crate compiles or not
predr.ag
October 31, 2025 at 1:28 PM
Reposted by opeik
It is genuinely shocking how bad executives are allowed to be at their jobs
October 29, 2025 at 1:23 AM
Reposted by opeik
My friend who did market research for them would always tell me that they would literally never listen to what they’d say and just blindly follow through with what they wanted to believe. And yep, exactly
October 29, 2025 at 1:26 AM
Reposted by opeik
The royal 'we' feels like it applies here too. They probably had a thousand people telling them exactly why Steam was as popular as it is but the Very Smart Money People almost certainly refused to listen.

Dude straight-up says 'We had more money so we thought we'd win automatically'.
October 29, 2025 at 1:24 AM
Reposted by opeik
you could not waterboard this out of me. “we didn’t understand why people use steam”
I legitimately didn't know they were competing with Steam and it's crazy to me that they burnt so much money on what sounds like something with very little (or wildly misguided) market research.
October 29, 2025 at 1:21 AM
Reposted by opeik
October 2, 2025 at 3:01 PM
Reposted by opeik
it's just weird how we phrase it as "remote doesn't work" despite all the evidence pointing otherwise, rather than an abject failure of management "i can only run teams if i can physically touch them" and "three hours of traffic and wearing headphones all day is peak productivity"
October 13, 2025 at 5:13 PM
Reposted by opeik
it's kinda weird that all the software i am expected to use for work are all written by distributed teams, go, python, postgres, linux, chrome, k8s etc

and despite being told "the best teams work in an office together" i don't know of any software i use that's actually written that way
October 13, 2025 at 5:00 PM
Reposted by opeik
Sometimes you receive a commission so powerful, you could stare at it for hours.

Thank you @hiimbleep.bsky.social for this vision.
September 9, 2025 at 3:26 AM
Reposted by opeik
Whoops I got annoyed at C advocates again
September 7, 2025 at 8:58 PM
Reposted by opeik
Australians, spread this petition far and wide. Demands Parliament “open anti-trust investigations and penalize the unregulated monopoly of a key part of everyday infrastructure,” as “payment processors are not there to regulate what legal content people consume.”

www.aph.gov.au/e-petitions/...
September 6, 2025 at 4:36 AM
Reposted by opeik
here’s a version where the POV is blacked out whenever the driver takes their eyes off the road
August 31, 2025 at 12:07 AM
Reposted by opeik
If the AI bubble really is bursting, please take this lesson from it:

Nothing marketed to you this relentlessly is ever worth it. If it was, they wouldn’t need to beg you.
August 20, 2025 at 5:17 PM
Reposted by opeik
Remember when GitHub was about hosting code with a nice interface to work on it collaboratively? I would love it if they could do something useful like showing diffs across force pushes to PRs. The enshittification must continue and Satya’s investment in OpenAI must be justified to the board
GitHub is no longer independent at Microsoft, as CEO Thomas Dohmke resigns. GitHub is now moving to Microsoft's AI engineering team, CoreAI, with a new structure for GitHub's leadership team. Details 👇 www.theverge.com/news/757461/...
GitHub is no longer independent at Microsoft after CEO resignation
GitHub will be part of Microsoft’s AI engineering team
www.theverge.com
August 11, 2025 at 5:23 PM
Reposted by opeik
hey friends if you put scrolling text in your game, and it does this

Happy birt

Happy
birthday!

then you have fucked up. You have fucked up real bad and i am going to notice every time it happens and i will be so very sad about it
August 9, 2025 at 2:29 PM
Reposted by opeik
Every time.
August 4, 2025 at 12:07 AM
Reposted by opeik
Reposted by opeik
This battle will keep playing out over and over again until they achieve something that their own citizens have made it clear they don’t want. www.techradar.com/vpn/vpn-priv...
The EU wants to decrypt your private data by 2030
The EU Commission unveiled the first step in its security strategy to ensure "lawful and effective" law enforcement access to data
www.techradar.com
July 5, 2025 at 5:39 PM
Reposted by opeik
I feel like there would be a HUGE amount of ecosystem value for Rust and async/await, if there was funding and the right dev(s) available to focus on improving:

* Memory usage + copies of futures/async fns: particularly wrt overlapping data across yield
* Improving codegen size/perf
* opt-footguns
June 26, 2025 at 10:40 AM
Reposted by opeik
I got to talk to Ross on my Stream a while back about the Stop Killing Games initiative, and it's a shame the traction has stopped, so even if I'm a relatively tiny streamer, let's see if we can't give this another push?

If you're in an EU citizen, it'll take 2 mins:

www.stopkillinggames.com/eci
June 24, 2025 at 1:53 AM
Reposted by opeik
what’s your favorite unhinged programming language feature? something that seemed ok to whoever designed it but is truly the stuff of nightmares
June 14, 2025 at 9:50 PM
Reposted by opeik
Rob Pike blocked me on here for this comment about nil pointers 🙃 deer.social/profile/did:...
moll.dev Tom @moll.dev · Dec 10
I’m gonna send Rob Pike an invoice for wasting my time because they couldn’t be bothered to implement a proper nil type in go
June 3, 2025 at 8:19 PM