One source for every farfarfun package
The APT source and the Homebrew tap are the same repository. Set it up once; every package added later installs by its bare name.
- Signed indexEvery rebuild is re-signed with the same GPG key, and apt verifies it for you.
- amd64 and arm64Each architecture gets its own index, so a machine never sees a package it cannot install.
- Roll backThe source keeps the last few versions of each package, so a bad upgrade has a way back.
- Gitee fallbackWhen GitHub is unreachable, the Homebrew side can run entirely off the Gitee mirror.
Set up
Once is enough
Run this once — the tab for your system is already selected. You never need it again, whatever you install later.
Key fingerprint557A C9DC 98EC A712 0119 F9A7 4CDA D037 2FCA 5BF0
Debian, Ubuntu and derivatives
curl -fsSL https://farfarfun.github.io/packages/farfarfun.gpg \
| sudo tee /usr/share/keyrings/farfarfun.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/farfarfun.gpg] https://farfarfun.github.io/packages/deb stable main" \
| sudo tee /etc/apt/sources.list.d/farfarfun.list
sudo apt updateWhat those three lines do
The key lands in /usr/share/keyrings and the source file in /etc/apt/sources.list.d. The stable main at the end is this repository's only suite and component.
macOS and Linuxbrew
brew tap farfarfun/packages https://github.com/farfarfun/packages
brew trust farfarfun/packagesThe tap line needs the URL
brew tap a/b only looks for a/homebrew-b, and this repository doubles as the APT source — naming it homebrew-packages would put the word homebrew in the middle of every apt URL.
The trust line is not optional
Since Homebrew 6.0 third-party taps are untrusted by default, and a bare name from an untrusted tap is refused outright. Trusting the whole tap means never doing this again per package.
When GitHub is unreachable
brew tap farfarfun/packages https://gitee.com/farfarfun/packages
brew trust farfarfun/packagesThe mirror only replaces the tap step
Every url in the formulae has a Gitee mirror, so brew falls back on its own when downloading. Casks have no such route (a cask url takes no mirror), and neither does APT — the deb tree lives on Pages, not in git.
Packages
9 of them
One page each: install commands, the versions still in the index, and the per-platform builds. Adding a package only touches packages.toml; these pages follow.
- fundeploy0.3.13
Manage development toolchains, local services and package mirrors from one CLI.
- APT
- Homebrew
- Command-line tool
- funget1.2.0
HTTP file transfer tool with ranged concurrency, resume and PUT/POST upload.
- APT
- Homebrew
- Command-line tool
- funbuild1.6.105
One-command release pipeline for Python, frontend, Flutter and Rust repos
- APT
- Homebrew
- Command-line tool
- funclash1.0.5
A multi-platform proxy client based on Clash Meta (mihomo). Simple to use, open source and ad-free.
- APT
- Homebrew Cask
- Desktop app
- funread1.1.127
A self-hosted reader for novels and RSS feeds: connects to your own server, keeps reading offline.
- APT
- Homebrew Cask
- Desktop app
- FunOTP
A two-factor authenticator inside uTools: TOTP / HOTP codes computed offline, searchable straight from the main input box.
- uTools
- uTools plugin
- FunLink
Turns scattered bookmarks into a navigable board — categories, drag-to-order and a recycle bin — searchable and openable straight from the uTools input box.
- uTools
- uTools plugin
- FunChat
A room full of AI friends inside uTools — switch personas, pick from the built-in market, revisit past topics and export in one click.
- uTools
- uTools plugin
- FunDoc
Markdown notes inside uTools: a nested outline, three editing modes and LaTeX formulas rendered fully offline.
- uTools
- uTools plugin
How this repository runs
One manifest, three channels
Each project attaches its build output to its own GitHub Release. This repository collects them per packages.toml, rebuilds the index, signs it and publishes to Pages — and generates the Homebrew formulae and casks from the same manifest.
One build
packages.toml ──┬─► collect .deb → pool → scan index → sign → Pages → install check
└─► render formula / cask → commit to master → mirror to Gitee → check
When it rebuilds
On a ping from a project that just shipped, on a change to packages.toml, by hand, and on a two-hourly scan — so a project that never pings is still picked up within two hours.