Erika
banner
erika.florist
Erika
@erika.florist
Core maintainer on @astro.build, https://volarjs.dev and https://maudit.org. Co-founder @bruits.org - 🦀 as much as I can

https://erika.florist
Reposted by Erika
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
The year is 2017, I'm using a tiling WM and cannot minimize Spotify to the tray. I tell myself, it's okay, surely they'll fix it eventually

The year is now 2025, soon to be 2026, I'm using a scrollable-tiling WM, and you'll never guess where Spotify is on my desktop right now

(not in the tray)
December 18, 2025 at 2:37 AM
Trying Niri for the first time and not enjoying it as much as I expected. The keybinds are not super intuitive compared to sway/i3. Will try to get used to it
December 14, 2025 at 5:53 AM
100 stars 🫡⭐

I've been recently working on porting more parts of my own website to Maudit and, well, everything works as designed. It's been quite gratifying to see! Hoping to share some behind the scene soon.

You can add your star here: github.com/bruits/maudit
December 1, 2025 at 1:10 PM
Reposted by Erika
it's on miro. it's literally on figma. you have to log into okta. it's in jira. it's on zoom. it's on pureref. it's on flow. it's on perforce. it's on slack. you can find it on slack. you can go to slack and find it. log onto slack right now. you can slack it. slack has it for you. it's on slack.
November 12, 2025 at 10:15 PM
Reposted by Erika
🦀 I've improved the implementation behind all the string formatting macros in Rust: println, panic, format, write, log::info, etc. (Everything using format_args!().) They will compile a bit faster, use a bit less memory while compiling, result in smaller binaries, and produce more efficient code! 🎉
November 13, 2025 at 1:31 PM
Made a TUI to manage @railway.com projects to learn @ratatui.rs.

Honestly Ratatui is just absolutely amazing (and their website is using Astro 👀). Hope it leads us toward a TUI revolution!

Throw your stars here if you find this funny
github.com/Princesseuh/...
November 10, 2025 at 11:01 PM
Reposted by Erika
TypeScript is a psychology experiment designed to see if you can read "the JavaScript API you know and love, but with the safety of strong typing!" and get so distracted by how much you like strongly typed languages that you forget that you do not, in fact, neither know nor love the JavaScript API
November 10, 2025 at 5:46 PM
My game SinaRun is now out, like for real, no early access, no nothing, just straight up out.

I'm sure players will find bugs, but overall, it's done, we move on!

store.steampowered.com/app/324470/S...
SinaRun on Steam
SinaRun is a momentum-based platforming and speedrunning game. Find a level you love, play it hundreds of times and try to become the best on the leaderboard!
store.steampowered.com
November 3, 2025 at 1:34 PM
The GitHub CLI cli.github.com is honestly so nice, it's so useful to do mass operations on issues, test the APIs etc. Really really cool!
GitHub CLI
Take GitHub to the command line
cli.github.com
October 29, 2025 at 7:07 PM
Thankfully the new AI chatbox can be disabled, it's a bit buried but it's on this page github.com/settings/cop...
October 28, 2025 at 7:41 PM
Ten years too late, I've finally done it. The final update for my game SinaRun:

store.steampowered.com/news/app/324...
SinaRun - Update 1.6 - Steam News
I'll be the first one to admit it, it's been a while
store.steampowered.com
October 27, 2025 at 2:39 AM
@bluwy.me running into trailing slashes issues in Maudit and your post is helpful, thank you for your service 🫡
October 25, 2025 at 1:51 AM
my CTO
October 22, 2025 at 8:06 PM
@dsherret.bsky.social I just noticed in the Dprint documentation the `x.x.x` version on config examples for WASM plugin changing to the latest version automatically, you're insane man
October 22, 2025 at 1:48 PM
if I did this kind of timelapse for anything I'm doing you'd notice that I'm spending roughly 90% of my time ADHDing doing nothing

Insane work
"Return of the Obra Dinn" is seven years old this week.

For this not-particularly-special anniversary, here's a re-cammed and narrated timelapse of (nearly) all character creation, object modeling, scene posing, and general 3D work for Obra Dinn from 2015 to 2018:

youtu.be/90vqCKEEj3s
Return of the Obra Dinn - Narrated Modeling Mega Timelapse
YouTube video by Lucas Pope
youtu.be
October 22, 2025 at 12:16 AM
I've been spending the last few days trying various solutions to make Tailwind faster in Maudit and I come back with the solution of:

maybe someone should rewrite Tailwind in a native language or something

Just the Bun start up for the TW CLI is very noticeable when everything else is so fast
October 17, 2025 at 7:22 AM
Every time I switch between macOS and Windows, the slightly better keyboard latency on Windows brings me an unexpected amount of joy

(and makes me want to use Linux, where the keyboard latency can be made even lower)
October 15, 2025 at 8:26 PM
Where I've been mentally for the past 5 days www.youtube.com/watch?v=B6mN... great work @girlypop.net
The Sogs Sisters - Don't Stop, Girlyepop! (Don't Stop, Girlyepop! Original OST)
YouTube video by Chloe
www.youtube.com
October 14, 2025 at 3:09 PM
I dream of Rust, as I open my eyes back to a CJS / ESM interop issue
October 14, 2025 at 2:13 AM
jamstack.org has been broken for a week+ now 😔
October 13, 2025 at 12:51 PM
Bluesky isn't a small opengraph kind of platform is it
October 10, 2025 at 8:45 PM
Reached 50 stars on Maudit!
github.com/bruits/maudit

Thank you everyone! We're, as they say, absolutely going viral 😌 I shared the project around on various social network to very positive feedback. It's really cool
GitHub - bruits/maudit: A static site generator 👑 The still scrolls of the web, unchanging and steadfast, at last!
A static site generator 👑 The still scrolls of the web, unchanging and steadfast, at last! - bruits/maudit
github.com
October 9, 2025 at 7:02 PM
Whoever thought of adding the reading ruler feature to ebook readers: you're a champion

It's the only thing I've found that allow me to actually not lose focus all the time while reading, just amazing stuff
October 9, 2025 at 1:01 AM
Been looking forward to semantic highlighting in @zed.dev, super happy to see there's a PR up for it github.com/zed-industri..., hope it goes through!
Add semantic tokens by macmv · Pull Request #39539 · zed-industries/zed
Closes #7450. This PR adds semantic tokens from language servers to the editor. With semantic tokens on the left, without on the right: I find this a very useful feature for the following reasons:...
github.com
October 7, 2025 at 4:46 AM