Universal-Updater: a package manager for Nintendo 3DS homebrew
An easy to use app for installing and updating 3DS homebrew
At a glance
- What is it?
- Universal-Updater is a GPL-3.0 C++ homebrew application for the Nintendo 3DS that installs and updates other homebrew from stores in a Cydia Repositories style, with sorting, search, background installation and translations. The judgement is that its value is the store format and the update loop rather than the installer, and that it depends entirely on third-party stores being maintained.
- Who is it for?
- Universal-Updater fits a 3DS owner with homebrew installed who wants a store interface instead of copying files across SD cards by hand, and who has at least one community store that is still being updated. It does not fit someone with a stock, unmodified console, and it does not fit a user whose only store is abandoned, because the app is a client and the catalogue lives elsewhere.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 24 days ago.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 25, 2026, and from our analysis. They are not legal advice.
Editorial analysis
It is a client for a store format, not a downloader
Universal-Updater is a homebrew application for the Nintendo 3DS with the intention to make downloading other homebrew simple and easy. No need to manually copy files or go through installation processes, as it does that all for you.
The first feature is a store format with a concept similar to the Cydia Repositories. The default is Universal-DB, hosted at db.universal-team.net. To add more, you go to settings, choose Select Unistore, click the plus icon and select one from the list, enter a URL, or scan a QR code.
That last option is the most interesting detail. A store can be added by QR code, which means a store URL can be passed between devices without typing, and the repository carries a `json` topic tag, which fits with a catalogue that is a set of JSON manifests rather than a set of files.
The distinction between the app and the catalogue is the key thing to hold on to. The installer is generic. It knows how to read a store manifest, show a list, download an archive, install it and later replace it with a newer version. What you can install is entirely determined by the stores you add, and those stores are maintained by other people.
The screenshots in the README follow that structure, showing the store list, the download list, the queue menu, the search menu, the sorting and filters menu, the settings menu, the marking menu, and separate screens for screenshots and release notes. There is also a recommended UniStores menu, which is a list of stores the project suggests.
The list features are ordinary, and that is the point
The rest of the feature list is deliberately plain, and reading it tells you what the app spends its complexity budget on.
Customization in sorting and display covers several sorting keys, Title, Author and Last Updated, with direction either Ascending or Descending, and app display shown in either a grid or rows. Background installation means you can keep using the rest of the app while installing. Searching and markings make finding apps easy. You can view screenshots and release notes for apps. There are shortcuts for easily updating frequently updated apps when using the Homebrew Launcher. And there are translations for users of many languages.
That last group of features is the ones that matter for a package manager. The sorting keys are not decorative: the difference between sorting by Title and by Last Updated is the difference between browsing a catalogue and finding the thing that changed this week. The background installation is what makes a manager usable on a device with a small screen, because downloading a homebrew package on a 3DS takes long enough that a blocking install UI would make the app unpleasant. And the release notes and screenshots are the two pieces of information a user needs to decide whether to install something, and they come from the store's manifest rather than from the app.
The Homebrew Launcher shortcuts deserve a note. The Homebrew Launcher shortcuts are a convenience: updating frequently updated apps without opening the full interface is a small thing that makes the difference between an updater people use and one they open occasionally.
The marking system is the counterpart to the search. It is how a user says which applications are in use, and it is a user-side concept rather than something the store provides, which is the correct place for it.
Building it needs devkitARM and a lot of libraries
The compilation section is where the real constraints live, and they are ordinary embedded constraints rather than anything unusual.
To build Universal-Updater from source, you need to install devkitARM and some libraries. The instruction is to follow devkitPro's Getting Started page to install pacman, then run:
(sudo dkp-)pacman -S 3ds-dev 3ds-curl 3ds-bzip2 3ds-libarchive 3ds-liblzma 3ds-libzstdThe `sudo dkp-` prefix may not be needed depending on your OS.
You also need bannertool and makerom in your PATH, which are the two tools that produce the 3DS banner and the encrypted ROM container respectively. Those are the two steps of the 3DS homebrew packaging process that cannot be done with a stock compiler, and the requirement that they be on your PATH is what a build script checks.
Cloning needs the submodules:
git clone --recursive https://github.com/Universal-Team/Universal-Updater.gitAnd if you have already cloned, you update the submodules with:
git submodule update --init --recursiveThen you simply run `make` in the root of the repository.
The Makefile enforces the environment. It checks that `DEVKITARM` is set and stops with an error message telling you to export it, and it includes `$(DEVKITARM)/3ds_rules` for the 3DS build rules, which is the standard devkitPro pattern. The variables in the Makefile are the usual ones, `TOPDIR`, `SOURCES`, `DATA`, `INCLUDES`, `GRAPHICS`, `ROMFS`, `APP_TITLE`, `APP_DESCRIPTION` and `ICON`.
The repository layout also shows a Windows build path, with `compile.bat` and `clean.bat` at the root, alongside a `crowdin-pull.sh` script for pulling translations.
Translations run through Crowdin, and the credits show the lineage
The localisation arrangement is more than a badge, and it involves two tools and a specific division of labour.
Translations for users of many languages are a listed feature. To contribute to translations, you join the Crowdin project at crwd.in/universal-updater, and to request a new language you join the Discord server or contact a project manager on Crowdin. The repository contains `crowdin.yml` and a `crowdin-pull.sh` script, so the source strings live on Crowdin and are pulled into the repository, rather than the other way round.
The credits list names the upstream work that this app depends on, and they are worth reading as a description of what the app actually is. SuperSaiyajinStackZ is the lead developer and reworked quirc to C++. Pk11 is the mockup designer and website maintainer. NightScript is the concept creator and planner. dlbeer is the original developer of quirc, the QR code decoding library. FlagBrew provided the original QR Code Scanner code. Icons8 did the icon design. lvandeve is the original author of LodePNG. PabloMK7 handled the 3D banner and download code improvements, and lividhen did the 3D banner. Nayuki is the original developer of the QR Code generator library.
So the QR code features, which appear in the store selection flow, are assembled from FlagBrew's scanner, Nayuki's generator and quirc reworked in C++ by the lead developer.
The project page is at universal-team.net, and there is a release thread on GBAtemp. The release history shows v3.4.0 on 2026-06-15, described as covering install checking, proxies and more, and v3.4.1 on 2026-06-20 with the single-word release name Whoops. Above those there is a git tag for a continuous build dated 2026-10-01, and the last push to the repository is on the same day, so the project is shipping continuously built artefacts alongside tagged releases.
Where the limits are
There are three things to weigh before you install this, and none of them are about the app's quality.
The first is that the catalogue is somebody else's problem. The app does not host any homebrew. The default store is Universal-DB and additional stores are added by URL or QR code, and every entry in every one of them is maintained by a third party. A store that stops being updated leaves you with an app that lists applications that no longer install, and the app's own update checking will not help with that because the problem is upstream of it.
The second is the platform. This is a Nintendo 3DS application, written in C++ against devkitARM, and the build instructions assume a 3DS homebrew toolchain. It does not run on the Switch. If you are on newer hardware, this is the wrong tool regardless of how well it works on the hardware it targets.
The third is the bootstrap problem. Universal-Updater is itself homebrew, so getting it onto the console requires the manual process the app is designed to eliminate. For someone who already has a homebrew environment, that is a one-time cost. For someone who does not, it is the whole barrier, and the app cannot help.
The alternative, and it is the one most people use, is to keep installing homebrew the manual way. A 3DS homebrew package is a directory of files, and copying them to the right folder on an SD card works reliably enough that many users never feel the need for a manager. What Universal-Updater adds is a catalogue with version information, release notes and screenshots, a searchable index across multiple stores, and automatic replacement of an installed application when a newer version is published. If you install from one source, occasionally, and you are comfortable with a file manager, the manual route is fewer moving parts.
The licence is GPL-3.0, with the `LICENSE` file at the repository root, so you can read, modify and redistribute the app, which is a licensing observation rather than legal advice.
Editorial conclusion
Universal-Updater fits a 3DS owner with homebrew installed who wants a store interface instead of copying files across SD cards by hand, and who has at least one community store that is still being updated. It does not fit someone with a stock, unmodified console, and it does not fit a user whose only store is abandoned, because the app is a client and the catalogue lives elsewhere. Verify first that the store you intend to use is one the app can reach, since stores are added by URL or QR code and a dead store is a dead app, that the version of the app you install matches the homebrew format the store publishes, and that your 3DS has a way to run homebrew at all, since the app is itself homebrew and cannot bootstrap itself.
Frequently asked questions
What is Universal-Updater used for on the Nintendo 3DS?
It is a homebrew application for installing and updating other homebrew. Instead of manually copying files, you pick an entry from a store and the app downloads and installs it for you.
How do I add a store to Universal-Updater?
Go to settings, choose Select Unistore, click the plus icon and select one from the list, enter a URL, or scan a QR code. The default store is Universal-DB at db.universal-team.net.
How do I build Universal-Updater from source?
Install devkitARM and the 3DS libraries with `(sudo dkp-)pacman -S 3ds-dev 3ds-curl 3ds-bzip2 3ds-libarchive 3ds-liblzma 3ds-libzstd`, put bannertool and makerom in your PATH, clone the repository with `git clone --recursive`, and run `make` in the root.
How do I contribute translations for Universal-Updater?
Join the Crowdin project at crwd.in/universal-updater and change the strings there. To request a new language, join the Discord server or contact a project manager on Crowdin. The repository pulls the translated strings back with `crowdin-pull.sh`.
What can I sort and filter by in Universal-Updater?
Several sorting keys are available, Title, Author and Last Updated, with the direction either Ascending or Descending, and app display can be shown in either a grid or rows. The app also has search, marking, and a download queue with background installation so you can keep using the app while an install runs.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/universal-team-universal-updater)Was this useful?