GNOME has not had a native app tray for a while now. The GNOME team don't see it as necessary for good app design, and I agree. As someone who appreciates a minimalist design, I don't want my top panel cluttered with dozens of icons. The problem is, a lot of apps still rely on tray functionality. For example, Tailscale, an app that lets you remotely connect to devices as if they were on your local network, only lets you switch your network (Tailnet) through a tray icon.
The only tray icon extension that is still supported is Ubuntu's AppIndicator and KStatusNotifierItem Support extension. Despite being intended as a compatibility tool for Ubuntu, it is automatically installed by many distros to maintain functionality. As a compatibility tool without UX in mind, it is missing many basic options, like a proper overflow tray, hiding icons, or customizing the position of tray on the panel. Which is why I built Real Tray.
An extension like this presents a unique challenge. Many attempts at building a better tray solution have eventually been abandoned because extensions of this scale have had years of work to address compatibility and edge cases. That is why, for this project, I relied heavily on GPT-5.6 Sol.
Click here for a more technical justification for why this project would not be possible without AI.
I have neither the time to maintain an extension this vast, nor the capital to hire a maintainer. I don't believe that AI has a place in the creative process, which is why I write all of my articles by hand. Furthermore, I also believe that people are capable of producing higher quality work than AI. However, AI is capable of doing much more work than a single person. I built the POC without AI, but getting the extension in to a stable state on my own would have been an enormous amount of work.
Many tray icons behave in unique ways that would have taken hours of debugging on their own. For example, the Portmaster firewall uses PNG paths instead of icon names, and expects the tray to subscribe to StatusNotifier NewIcon signals for when that path changes. For another example, Dropbox will not re-register if the tray extension reloads, meaning that the extension has to asynchronously watch for applications that employ StatusNotifier signals, even if they do not have a registered tray icon.
Chasing down any of these edge cases on my own would have quickly killed my interest in this project. Which is why I relied heavily on AI to transform this extension from an unstable demo to something actually usable.
Here is a list of features Real Tray provides over Ubuntu's AppIndicator and KStatusNotifierItem Support extension:
- A proper drop down tray with an overflow mode.
- Tray customization including a grid and list layout.
- Moving the icons and tray to a different panel section.
- Hiding tray icons.
- Pinning tray icons to the panel (When using overflow mode).
- Automatic discovery of tray icons for easier customization.
You can download the extension from my Forgejo
https://git.jacksonbarker.ca/jackson/gnome-real-tray/releases/latest