/etc/apt/auth.conf.d/deb.griffo.io.conf and
apt sends them over HTTPS with every download. There is no account
portal to log into, no token to rotate, no licence file, and no limit on how many
machines use the same credentials.
π§Ύ 1. What happens when you pay
- You complete checkout on Stripe. Card details go to Stripe and never touch this server.
- Stripe confirms the payment and notifies the repository. This is the moment access is created, not the moment the checkout page closes, so a payment still being authorised takes a little longer.
- Your account is created and a password is generated for it, at random, on the server.
- An email is sent to the address you gave Stripe, containing your login, your password, and the four setup commands. It is the only time that password is ever transmitted.
If it has not arrived within a few minutes, check spam first, then ask in Discord. That is the fastest way to get it sorted, and the account can be looked up by the email you paid with.
π 2. What the credentials are
| Field | Value |
|---|---|
| Login | The email address used at checkout, nothing to choose or remember |
| Password | 24 random characters, generated server-side, never chosen by you |
| Stored as | A bcrypt hash. The plaintext is not kept. It cannot be looked up later, by me or by anyone else |
| Expiry | None. The password does not rotate or time out; only the subscription behind it decides access |
| Machines | Unlimited. No seat count, no activation, no device registration |
Because only the hash is stored, a lost password cannot be recovered, but a new one can be issued on request. Reply to the welcome email or ask in Discord, and you get fresh credentials; the old password stops working the moment the new one is issued. Keep the welcome email, or better, put the password in your password manager.
π₯οΈ 3. How apt authenticates
Plain HTTP Basic authentication over HTTPS: the mechanism
apt has supported natively for years, with no plugin, no helper binary and
no extra package. Credentials belong in /etc/apt/auth.conf.d/, never in the
sources.list line, where every user on the machine could read them and apt
would leak them in error messages:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo install -m 600 /dev/null /etc/apt/auth.conf.d/deb.griffo.io.conf
sudo tee /etc/apt/auth.conf.d/deb.griffo.io.conf > /dev/null <<'EOF'
machine deb.griffo.io
login your-email@example.com
password your-subscription-password
EOF
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
install -m 600 /dev/null /etc/apt/auth.conf.d/deb.griffo.io.conf
tee /etc/apt/auth.conf.d/deb.griffo.io.conf > /dev/null <<'EOF'
machine deb.griffo.io
login your-email@example.com
password your-subscription-password
EOF
apt updatesudo apt install extrepo
sudo extrepo enable griffo
sudo install -m 600 /dev/null /etc/apt/auth.conf.d/deb.griffo.io.conf
sudo tee /etc/apt/auth.conf.d/deb.griffo.io.conf > /dev/null <<'EOF'
machine deb.griffo.io
login your-email@example.com
password your-subscription-password
EOF
sudo apt updateπ§© About the extrepo option. extrepo is Debian's own tool for external repositories: it writes the sources file and installs the signing key for you, checking the key against signed metadata first. This repository is registered with it as griffo, and the always-free mirror as griffo-free, so on Debian (bookworm, trixie, forky and sid) the commands above are the whole setup.
extrepo sets up the sources file and the key only, so a subscription's credentials still go in /etc/apt/auth.conf.d/deb.griffo.io.conf. Ubuntu is not covered, because extrepo publishes metadata for Debian suites only: there, use the sudo or root commands.
That is the whole integration. Three details matter, and they are the three things
that go wrong: the machine line is bare, deb.griffo.io, with no https://, no trailing slash and no
/apt path; the filename ends in .conf, because apt silently
ignores any other extension; and the file is root-owned and mode 600,
because apt refuses to read credentials other users can read, which is why the file is
created empty at mode 600 above, before the password is written into it.
If apt returns 401, the full checklist is here β
Every request is checked against the database at the moment it is made: the login, the password hash, and whether a subscription behind that account is currently active. Nothing is cached and nothing is issued to your machine, which is why a renewal, a cancellation or a new password takes effect immediately, with no action on your side.
ποΈ 4. Servers, containers and CI
One set of credentials covers every machine you run, workstation, laptops, servers,
build agents. Drop the same auth.conf.d file on each, or mount it as a
secret in CI. What you should not do is bake it into a container image that gets pushed
to a public registry: it is a password in a file, and it travels with whatever you copy
it into. For images, prefer a build secret, or install the .deb from its
public GitHub release, which needs no credentials at all.
π 5. Yearly subscription, the full lifecycle
| What happens | Effect on your access |
|---|---|
| Renewal, once a year | Silent. Stripe charges the card, the period extends, your credentials do not change: nothing to do, nothing to re-run |
| You cancel | Via the cancellation link in your welcome email. Access continues to the end of the period you already paid for, then stops |
| A payment fails | Access stops. Fixing the card and paying restores it, ask in Discord if you get stuck |
| You resubscribe later | The same account and the same password are reactivated. No new email is sent, because nothing changed |
| You request a refund | Access is revoked immediately when the refund is issued |
| Access ends | You get an email saying so, and apt install starts returning 401. Packages already installed are untouched |
βΎοΈ 6. Lifetime, what is different
Lifetime is a single payment, not a subscription. There is nothing to renew and
nothing to cancel, no card on file to expire, and price changes do not reach you. The
credentials work exactly the same way, same login, same
auth.conf.d file, same everything. If you already had a yearly subscription
and upgrade, you keep the credentials you have; you get a confirmation email rather than
a new password. The one thing that ends lifetime access is a refund.
π¦ 7. What needs no subscription at all
| Command | Needs credentials? |
|---|---|
apt update | No, the indexes stay open to everyone |
apt policy / apt-cache | No |
| Browsing /apt/dists/ | No |
apt install / apt upgrade | Yes |
| Packages already installed | No. They never expire or check a licence |
| deb-free.griffo.io | No, free forever, no account |
The .deb files on GitHub | No, free forever |
So you can add the repository, run apt update and see exactly which
versions are on offer before paying anything. The always-free
mirror is explained here β
ποΈ 8. What is stored about you
Your email address, the Stripe customer reference, the bcrypt hash of your password, and the dates of your subscription. That is the entire record. Payment details are handled by Stripe and never reach this server. The only emails sent are the ones the service itself requires: your credentials, a confirmation when lifetime access is activated, and a notice when access ends. No marketing, no list. Terms & Conditions β
π± 9. Why the subscription exists
Worth answering directly, because it sits underneath every other question on this page. In January 2025 this repository built exactly one package, Ghostty, because Debian shipped none and I wanted a current one. It now builds 55, for eight Debian and Ubuntu suites, and the list still grows most months.
None of that growth is software you are being charged for. Every tool here is
open source, its licence is untouched, and every .deb stays free to
download from the public GitHub releases. What grew is everything around them:
the build machines that rebuild each tool per suite and per architecture on every
upstream release, the storage for the pool, the signing and publishing pipeline,
and the bandwidth to serve all of it to a number of people that stopped being
small some time ago.
That is what a subscription funds, and there are three specific things it buys that occasional donations did not:
- Capacity that keeps up with the catalogue. Every tool added is another build to run on every upstream release, from now on. A predictable income is what makes the answer to the next good package request "yes" rather than "not this year".
- Infrastructure that keeps up with the traffic. The number
of machines running
apt upgradeagainst this mirror has grown faster than anything else here. Headroom bought before it is needed is the difference between a mirror that stays fast and one that starts timing out. - A CDN, planned for early 2027. Everything is served from a single machine today: fine if you are near it, less fine on the other side of the world. Putting a CDN in front of the mirror is the next infrastructure step, and subscriptions are what pay for it.
What is free stays free, and that is not a temporary arrangement: the
always-free mirror at deb-free.griffo.io,
every .deb on GitHub, apt update, and browsing the
indexes. What the free mirror carries β
β Still unsure?
Ask before you pay, the Discord is the fastest way to reach me, and questions about how any of this works are welcome. If you supported the project on Buy Me a Coffee in the past, come and say so there: you get a free lifetime subscription.