# FFUpdater: keeping privacy focused browsers current on Android

> FFUpdater is a Kotlin application that installs and updates Firefox derived browsers, Tor Browser, Brave, Chromium based builds and a few mail apps on Android, and it can do the downloading without user interaction when the device allows it. It suits a self hosting user of privacy focused browsers on Android, and the install path determines whether the automatic updates work.

**Tobi823/ffupdater** — FFUpdater: Updater for privacy friendly browser

- Repository: https://github.com/Tobi823/ffupdater
- Website: https://f-droid.org/en/packages/de.marmaro.krt.ffupdater
- Stars: 1,103 · Forks: 54
- Language: Kotlin
- License: GPL-3.0
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/tobi823-ffupdater

## The catalogue of what it can update

FFUpdater installs and updates a specific list of browsers and applications on Android, and the list is the clearest statement of what the app is for.

The first group is software from Mozilla or based on Firefox. That covers Fennec F-Droid, which is the build distributed through the F-Droid repository rather than the Play Store, and the main Firefox Browser plus Firefox for Android Beta and Firefox Nightly. Then Firefox Focus, Firefox Focus Beta and Firefox Klar, which are the stripped down variants. Then Iceraven, which is a fork of Firefox maintained by fork-maintainers, and Tor Browser with Tor Browser Alpha. And Thunderbird for Android with its beta channel.

The second group is headed browsers which are better than Google Chrome, and the list includes Brave Private Browser with its beta and nightly channels, Cromite, plain Chromium, the DuckDuckGo Browser, Privacy Browser, Vivaldi with a note that its source code is incomplete, and Thorium-Android.

The third group is other applications: FairEmail, K-9 Mail and Orbot, the last of which is the Guardian Project's Tor proxy for Android.

The grouping is deliberate. The Fennec and Ice Raven entries exist because those builds are distributed outside the Play Store and therefore do not update themselves, which is the gap this project fills. The Brave and Vivaldi entries exist for the same reason, since a Play Store build is on a schedule the project has no control over, and for some users the F-Droid or direct APK is the build they want.

The application is available on F-Droid under the package identifier de.marmaro.krt.ffupdater, and the repository has a GOALS.md at the top level alongside a HOW_TO_CONTRIBUTE.md and a THANKS.md.

## Background updates need a permission you may not have

The most important functional detail in the documentation is a short list of conditions, and it decides whether the app is useful to you or merely convenient.

FFUpdater checks for updates in the background and downloads them as well, and apps can be updated without user interaction with three possible routes. Android 12 or higher. A rooted smartphone. Or Shizuku or Sui with Android 6 or higher.

The reason for that list is structural. Installing or updating a package on Android requires the installer permission, and on a stock device that permission belongs to the person tapping the button. Android 12 changed the rules so that a package installer can update apps it installed itself without a prompt for the ones it owns. Root removes the restriction entirely. And Shizuku is the third route, an application that uses the same privileged interface through ADB, so an app holding a Shizuku or Sui permission can install and update without root, and Sui is an alternative implementation of that idea.

So the answer to whether the background behaviour works is a property of your device, not of the app, and a user on Android 11 without root and without Shizuku will get background update checks but will have to tap to install.

The FAQ adds two more behavioural details that are easy to miss. Clicking on the i-Icon shows the time of the last successful background update check, which is the answer to the question every user of a background updater eventually asks, which is whether it is actually running.

And the power save mode changes the behaviour in a specific way. If the mode is on for less than 24 hours, FFUpdater will not perform any background update checks. However, if it remains on for longer, it will check for updates in the background, but it will not download them in the background.

That is an odd curve and it presumably reflects Android's own behaviour around restricted background work, where a power saver that has just been switched on puts the app into a restricted state for a period before the restriction becomes permanent. The practical consequence is that a user who just enabled power saving should not conclude the app is broken, and a user who has had it on for a while will find that checks run but downloads do not.

There is also a note to reopen FFUpdater after moving it to the internal or external storage, which is a process restart requirement rather than a bug.

## The FAQ answers the question every background updater gets

The FAQ section is short, and its entries are about the same thing, which is whether the app is actually doing what it claims when you are not looking at it.

The first entry is the visibility one. By clicking on the i-Icon, you can see the time of the last successful background update check. That is a small interface decision with a disproportionate effect on trust. A background service that never tells you when it last ran is indistinguishable from one that is broken, and users who suspect the second tend to uninstall the first. Putting the last successful check on the main screen turns an invisible subsystem into an observable one, and it costs one icon.

The second entry is a lifecycle one. Please reopen FFUpdater after moving it to the internal or external storage. Moving an Android app's data directory breaks the paths the app has cached, and a restart is the remedy. This is the same class of problem as any app that keeps state about where its own files are, and the documentation handles it in one line rather than leaving it to a bug report.

Neither entry is glamorous, and both are the kind of thing that separates a utility that people keep installed from one that gets removed after a week. The power save mode behaviour described in the same section is a third example of the same instinct, documenting the degradation curve rather than only the ideal path.

Taken together, the three behaviours in the FAQ and the background section describe an app that is explicit about its limits. It tells you when it last checked, it tells you when it will not check, and it tells you when it will check but not download. None of that is exciting, and all of it is the difference between a tool you can rely on and one you test.

The section header for contributors follows immediately after, and it points at two different tracks. The translation work is on Weblate with the progress widgets and the promise that a translation contribution is acknowledged in every release changelog. For advanced users there is a separate HOW_TO_CONTRIBUTE.md, which is the file for the people who want to help beyond translations and the code.

The acknowledgements section above the FAQ is empty, with only a Thanks heading, which is worth noting as a small inconsistency in the document. The THANKS.md file at the repository root presumably carries that content instead.

## The build setup and the contributor surface

The repository is a standard Gradle Android project with a couple of things that indicate a maintained rather than a dormant codebase.

The top level has `build.gradle`, `settings.gradle`, `gradle.properties`, the `gradlew` and `gradlew.bat` wrappers and a `gradle/` directory. There is a `ffupdater/` directory holding the application module, a `dev/` directory, a `docs/` directory, a `fastlane/` directory for release automation. The `settings.gradle` name is the older Groovy-based one, which is a sign of a project that predates the Kotlin DSL migration and has not needed to move.

There is a `.clang-format` file, which is an interesting detail for a Kotlin project, because it implies native code somewhere in the tree, and it means the C or C++ portions are formatted by a tool rather than by hand. There is also a `.gitconfig` file in the repository root, which is a common way to ship a project specific git configuration, and a `.gitattributes` file alongside it.

The translation workflow is the part that tells you most about the project. Translations are managed on Weblate, and the documentation includes the Weblate widgets for both the overall progress and a per-language status. The stated consequence is that a translation contribution is acknowledged in every release changelog, which is a real motivator for translators and a marker of how the project treats that work.

The contributors are listed with the all-contributors format, and the README shows the distinction between the contribution types. The icons attached to each name tell you what the person did, with a globe for translation, a laptop for code and a book for documentation. The badge says 20 contributors.

The code is written in Kotlin, the licence is GPL-3.0, and the recent release history shows the version scheme, which is the browser version rather than the app version. 79.3.1 in November 2024, 80.0.0 in March 2025 and 81.0.0 in June 2025. So the app's version number tracks the Firefox release it was built around, which tells you the release cadence is tied to Firefox's rather than to the app's own development.

## Where the approach stops, and what to use instead

There are three cases where a dedicated updater is the wrong answer, and they are worth being concrete about.

The first is when the app updates itself. The Play Store versions of Firefox, Brave and Thunderbird all update through the store, and the store handles the download, the staging, the permission prompt and the rollback if an update breaks. An updater that competes with the store for the same package is solving a problem the store already solves, with more moving parts and no store's crash telemetry when it goes wrong.

The second is the F-Droid case, and it is the one this project exists for. The F-Droid build of Firefox updates when the F-Droid client checks, which is a matter of the user's own schedule, and some users want the beta or nightly channel rather than the F-Droid stable one, which F-Droid does not carry. Installing the upstream APK directly and letting the updater take over is the answer to a real gap, and the project covers exactly those builds.

The third is the boundary of the app list itself. This is a browser and mail updater, not a general package manager. It does not update your launcher, your keyboard, your messaging app or your system, and it does not manage the Play Store's own updates. Anyone expecting a full system updater will find it does not exist here.

There is also a maintenance consideration that follows from the version scheme. Because the app version tracks the Firefox version, a Firefox release every few weeks means a corresponding app release, and the rate of releases in the history, 79.3.1 in late 2024, 80.0.0 in early 2025 and 81.0.0 in mid 2025, is consistent with that. The last push was on 2026-06-27, so the work is happening, and the gap between the last release and the last commit is the sort of thing to check if you are deciding whether the app is still current for your browser version.

The alternative approach for a user who wants none of this is a F-Droid client with a short update interval, or installing the browser from the Play Store and letting it self update, and the value FFUpdater adds is concentrated in the cases where neither works, chiefly the non-Play-Store Firefox builds and the beta and nightly channels.

## Conclusion

FFUpdater fits a person who runs Firefox on Android and wants the browser updated without relying on a store that may not carry the build they want, since it can install and update directly from the upstream project including beta and nightly channels. Skip it if the app you use updates itself already, since the app covers a specific list of browsers and mail clients rather than everything on the device, and note that the background downloading of updates needs one of three conditions, Android 12 or higher, a rooted phone, or Shizuku or Sui. Before you install, check the list of supported apps against what you actually run, and note the maintenance state, with the last release 81.0.0 from 2025-06-15 and a last push on 2026-06-27.

## FAQ

### Which browsers and apps can FFUpdater install or update?

Software from Mozilla or based on Firefox including Fennec F-Droid, Firefox Browser with beta and nightly, Firefox Focus, Firefox Klar, Iceraven, Tor Browser with Alpha and Thunderbird for Android, plus Brave with beta and nightly, Cromite, Chromium, the DuckDuckGo Browser, Privacy Browser, Vivaldi and Thorium, and the FairEmail, K-9 Mail and Orbot applications.

### What does FFUpdater need to update apps without user interaction?

One of three things: Android 12 or higher, a rooted smartphone, or Shizuku or Sui with Android 6 or higher. Without one of those it can still check for updates in the background but the install needs a tap.

### How does power save mode change FFUpdater behaviour?

If the mode is on for less than 24 hours, FFUpdater will not perform any background update checks. If it stays on for longer, it will check for updates in the background but will not download them in the background.

### How do I tell when FFUpdater last checked for updates?

Clicking on the i-Icon shows the time of the last successful background update check.

### How is FFUpdater licensed and how is it versioned?

It is GPL-3.0 licensed and published on F-Droid as de.marmaro.krt.ffupdater. The app version tracks the Firefox version, with 79.3.1 in November 2024, 80.0.0 in March 2025 and 81.0.0 in June 2025, and the last push was on 2026-06-27.

## Sources

- [License: GPL-3.0](https://github.com/Tobi823/ffupdater/blob/master/LICENSE)
- [Project website](https://f-droid.org/en/packages/de.marmaro.krt.ffupdater)
- [README](https://github.com/Tobi823/ffupdater/blob/master/README.md)
- [Releases](https://github.com/Tobi823/ffupdater/releases)
- [Tobi823/ffupdater on GitHub](https://github.com/Tobi823/ffupdater)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/tobi823-ffupdater
