Why I Host a Tiny apt Repo for Dev Tools — and the signing mess I didn't expect

I stopped having newbies download and re-download binaries. I host a small apt repo for team developer tools — what I run, why it saves hours, and the GPG mistake that broke provisioning.

Written by: Arjun Malhotra

A person typing on a laptop at a wooden desk with a notebook and coffee
Photo by Claudio Schwarz on Unsplash

I remember watching a new joiner on her first day struggle through the same five downloads I’d seen every quarter: gh, bat, ripgrep, a specific terraform binary, and a private helper we ship as .deb. She had slow home internet, and the office policy refused snaps. By lunch she had stalled. By the end of the day I’d done three manual installs for her over my laptop’s hotspot while I lost focus on my own task.

That was the friction. Repeated downloads, flaky mirrors, corporate restrictions, and mobile data costs for people in tier‑2 cities. We needed installs that were fast, repeatable, and worked for fresh laptops the first time. I built a tiny apt repository and it solved most of those problems. But not without a week of teeth‑grinding when I learned I’d ignored two boring things: package naming and GPG key hygiene.

Why an apt repo (not just GitHub releases or a script)

What I actually run

Immediate wins

The thing that broke onboarding (and why it was on me) Two weeks after launch I started getting panicked messages: apt update failed with “The following signatures couldn’t be verified”, and multiple new machines couldn’t install anything from the repo. I had rotated the GPG key earlier in the week (because I like to be tidy) and pushed the new public key, but the Release file was still signed by the old key for a subset of packages due to a CI race. Some machines had the new key cached; some didn’t. Chaos.

That would have been a minor hiccup if not for the second mistake: one of our packages used the same package name as an Ubuntu package in an LTS backport. During an apt upgrade, my package was marked as a candidate and apt forcibly upgraded a system library dependency in a few laptops, breaking an internal GUI. I had not checked “Conflicts” or chosen a sufficiently unique package name like org-team-tool. I also hadn’t taught our tooling to set the Origin/Label fields properly, which made troubleshooting take longer.

What I changed (actionable, specific)

Tradeoffs you should know

When it actually paid off The clean moment: we gave three interns fresh company machines at 9am on the same day. They all had the exact dev toolchain by 9:10. No follow‑up installs. No mobile data tethering. That hour saved me more context switches than the 30 minutes/week I now spend on the repo.

One thing I still don’t love Key management is fiddly. Even with automation, there’s a subtle trust question: how many machines should automatically accept a rotated key? We settled on a staged rollout: new key for packages added after a date, old key still accepted for 90 days. It’s not elegant, but it stops us from bricking provisioning.

If you have a small team and provisioning is a recurring pain, hosting a tiny apt repository is one of those infra moves that pays for itself quickly. But be boring about package names and GPG keys; if you ignore those, you’ll spend a week fixing what you could have avoided.