# Chameleon Ultra GUI: one Flutter front end, five distribution channels

> Chameleon Ultra GUI is a cross-platform Flutter client for the Chameleon Ultra and Chameleon Lite devices. The interesting engineering is in the packaging, with an NSIS installer on Windows, four Linux flavours, an AUR package, a Flathub entry that is not built in CI, the Apple App Store and TestFlight, and Google Play alongside an unsigned APK.

**GameTec-live/ChameleonUltraGUI** — A GUI for the Chameleon Ultra written in Flutter for crossplatform

- Repository: https://github.com/GameTec-live/ChameleonUltraGUI
- Stars: 1,204 · Forks: 133
- Language: C
- License: GPL-3.0
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/gametec-live-chameleonultragui

## A Flutter front end for a USB device

Chameleon Ultra GUI is a graphical interface for the Chameleon Ultra and the Chameleon Lite, written in Flutter so that the same code runs on every platform the device is used from. The repository description says it plainly: a GUI for the Chameleon Ultra written in Flutter for cross-platform operation.

The interesting part of this project is not the interface. It is that the same application has to be shipped as an NSIS installer on Windows, four different Linux packages, a macOS and iOS app, an Android app, and a set of standalone archives, and each of those has a different installation story and a different set of failure modes on the machine it lands on.

The application itself lives in `chameleonultragui/`, and the repository is GPL-3.0 licensed with the text in the `LICENSE` file. The primary language is reported as C, which reflects the native side of the project rather than the Flutter application, and the last push was on 2026-10-15. The releases are 1.3 from 2025-08-26, 1.2 from 2025-07-19, and a `dev` tag from 2025-07-27, so there is a rolling development release channel alongside the numbered ones.

The documentation lives in the `docs/` directory of the repository, and the screenshots in `screenshots/` show the shape of the application: a connect page, a home page with its settings, a slot manager, a saved cards page and the card reading pages, one of them for Mifare Classic.

A device is required. The README points at three places to buy the hardware, Sneak Tech, KSEC and Lab401, and that is the first thing to settle before anything else.

## Five channels, and a legacy build that still matters

The download section is a good map of the platform support, and the details differ more than the headings suggest.

On Windows there are two artefacts, an installer and a portable zip. The installer is NSIS based, installs the Windows build and creates shortcuts; the zip is the same build to run manually.

On Linux there are four. The Debian package is installed with dpkg or apt. The AUR package is `chameleonultragui-git`, which tracks the development branch rather than a release. There is a generic zip for other distributions, and there is a legacy zip, built on Ubuntu 20.04 LTS, which the key describes as suited to users on old glibc. That last one exists because a Flutter build links against the C library of the system it was built on, and a distribution still on an old glibc cannot run a build made on a newer one.

Flathub is listed separately and with a caveat: the Flathub app is not built in the project's CI, so updates may be slower. The reasoning is plain, since the project only ships the artefacts its own pipeline produces, and Flathub has its own build system that is not part of that pipeline.

On Apple platforms the app is in the App Store for macOS, iOS and iPadOS, and TestFlight gives earlier builds to people who join it.

On Android there is a Google Play release and a plain APK, and the key says the plain APK is not signed and is incompatible with the Google Play version, which means it cannot update an installed Play copy.

Two stores are on the pending list and marked as not yet: F-Store and Chocolatey for Windows.

## Linux, dialout and ModemManager

The Linux notes in the README are the part of this article most likely to save somebody an afternoon, because the failures they describe look like application bugs.

The first is permissions. The application talks to the device over a serial port, and a user who is not in the right group gets serial or permission errors. The fix is to add the user to the `dialout` group, or to the `uucp` group on Arch Linux.

The second is ModemManager. It is highly recommended to uninstall or disable it:

```bash
sudo systemctl disable --now modemmanager
```

The reason given is that many distributions ship ModemManager and it may interfere with communication. A modem manager is exactly the kind of daemon that claims serial ports on a machine, and on a laptop with a WWAN modem it is very likely to be running and very likely to be holding the port the device is on.

The third is the file picker. Under some Linux systems, especially ones running KDE desktop environments, the `zenity` package may need to be installed for the file picker to work correctly. That is a Flutter desktop behaviour rather than something specific to this application, and the README is right to call it out, because the symptom is a broken dialog rather than an error message.

Together these three notes describe the reality of shipping a serial-port application on Linux desktops: the port belongs to a group, the port may be claimed by another daemon, and the file dialog needs a toolkit that may not be installed.

## Translations live in Crowdin, not in the repository

The translation policy is the one part of the contribution rules that is stated as a prohibition, and it is stated clearly.

Translations are added through the Crowdin project, and the instruction is not to contribute files into `chameleonultragui/lib/l10n/app_*.arb`. All translations should be added only to Crowdin. If a language is missing, the request is to open an issue and ask for it to be enabled.

There is a good reason for that rule, even if it is not spelled out. The `.arb` files are the application localisation resources that Flutter loads at runtime, and a Crowdin project keeps them consistent: the same string appears in every locale file, and adding a locale by hand means adding it in a dozen places at once. With Crowdin, the translation arrives in the same pull request as the rest of the change, and the platform handles the format.

There is a second condition in the same paragraph. The names `Chameleon Ultra GUI`, `Chameleon` and other trademarks should not be translated, which is a detail that only matters to a project whose product name happens to be a common word in several languages, and which is exactly the kind of thing that goes wrong in a localisation round if nobody says it.

The rest of the contribution guidance is conventional. Contributions are welcome, most of the work needed can be found in the issues or on the project board, and the README credits St.Ricky with designing the app icons. The repository also carries a `CODE_OF_CONDUCT.md` and a `SECURITY.md`.

## Packaging scripts in the repository, and a CI that does not cover Flathub

The packaging artefacts are visible in the repository, and they explain the shape of the download matrix.

The Windows installer has its own NSIS script, `nsis-installer.nsi`, which is why the README can describe it as NSIS based and say that it creates shortcuts. The Arch packages are in the repository as well, with `git-PKGBUILD` and `release-PKGBUILD` next to the matching `git-.SRCINFO` and `release-.SRCINFO` files, which are the metadata files the AUR requires and which have to be regenerated whenever the PKGBUILD changes. The two variants exist because one follows the development branch and one follows a release.

The continuous integration is a single workflow, an auto build, and it produces the Windows and Linux artefacts that the download links point at. The Flathub build is explicitly not part of it, and that is why the Flathub entry carries the caveat that updates may be slower: a separate build path means a separate release rhythm.

The funding arrangements are also part of the picture. The project has an Open Collective tier for the app, and the README explains what the money is for: keeping the app free and making it easier to publish on the Apple App Store, which is a specific and real cost that a volunteer project has to pay. Cryptocurrency donations are accepted as well, with a BTC address and an ETH address listed, and the Open Collective route is described as preferred.

The Crowdin badge and the Open Collective badge in the header are therefore not decoration. Crowdin is how the interface reaches languages the maintainers do not speak, and Open Collective is how the app store fees get paid.

## Where this GUI is the wrong tool

Two limits are obvious and one is structural.

The obvious one is the hardware. The application is a front end for a physical device, so there is nothing to try it on without buying the device, and the README points at three vendors rather than at a generic specification. For a reader evaluating open source projects, that is the first fact to establish, because the software is worthless without the peripheral and the peripheral is not free.

The second is the release discipline. The numbered releases are 1.2 and 1.3 from July and August 2025, while the last push to the repository was on 2026-10-15 and a `dev` tag exists. So the published, store-delivered versions are more than a year old, and the current work is on the development channel. A user on the App Store or Google Play is running a build that predates a year of commits, which for a device client is not a small thing, since the device firmware and the protocol can move.

The structural limit is the support model. This is a community application, funded by donations, with issues and a project board, and no support contract. The alternative for a user who is comfortable with a terminal is to drive the device with its own command line tooling and skip the GUI entirely, which is fewer moving parts and one fewer version of the protocol to keep in step. The GUI earns its place when the device has saved cards and slots to manage and the text interface for that is tedious, and it earns it on mobile, where the alternative does not exist at all.

For a team that wants to integrate the device into a larger system, the honest alternative is to talk to the device protocol directly and build the small amount of tooling that the workflow needs, rather than to depend on a community GUI that is funded by donations and versioned on its own schedule.

## Conclusion

Chameleon Ultra GUI fits a user of the Chameleon Ultra or Chameleon Lite who wants a graphical interface instead of a command line, on whichever platform their device is plugged into, and who is willing to accept that a community-maintained front end is a moving target. It is the wrong choice for a team that needs a supported interface to a device protocol, because the project is a community app funded by donations with no support contract, and it is the wrong choice on a Linux distribution where the Flathub build lags. Before installing it, read the packaging key in the README, because the Linux artefacts differ in glibc baseline and in how they are installed, and on Linux add your user to the `dialout` group and disable ModemManager before blaming the app.

## FAQ

### How do I install Chameleon Ultra GUI on Linux?

Download the Debian based build and install it with dpkg or apt, or use the AUR package `chameleonultragui-git`, or take the generic zip and run the binary manually or install it with cmake. A legacy build made on Ubuntu 20.04 LTS exists for users on an old glibc, and on KDE systems you may need the `zenity` package for the file picker.

### Why can my Linux user not talk to the Chameleon device?

Add your user to the `dialout` group, or to `uucp` on Arch Linux, otherwise the serial connection fails with permission errors. The README also recommends disabling ModemManager, since many distributions ship it and it can interfere with the communication.

### How can I get early builds of Chameleon Ultra GUI?

On Apple platforms you can join TestFlight to receive builds before they reach the App Store. On Android the plain APK in the release assets is not signed and is incompatible with the Google Play version, so it cannot replace an installed Play build.

### How do I add a translation to Chameleon Ultra GUI?

Through the Crowdin project. The README asks that files under `chameleonultragui/lib/l10n/app_*.arb` are not contributed directly, and that a missing language should be requested by opening an issue so it can be enabled.

## Sources

- [GameTec-live/ChameleonUltraGUI on GitHub](https://github.com/GameTec-live/ChameleonUltraGUI)
- [Issues](https://github.com/GameTec-live/ChameleonUltraGUI/issues)
- [License: GPL-3.0](https://github.com/GameTec-live/ChameleonUltraGUI/blob/main/LICENSE)
- [README](https://github.com/GameTec-live/ChameleonUltraGUI/blob/main/README.md)
- [Releases](https://github.com/GameTec-live/ChameleonUltraGUI/releases)

---

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