Automatic system tray for applications using the StatusNotifierItem/DBusMenu protocol. Displays tray icons for apps like Discord, Slack, Dropbox, Nextcloud, Steam, and more. Supports symbolic (monochrome) and original icon modes, per-app icon customization, drag-and-drop reordering, and individual icon effect tuning. No external daemon required.
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
| Version | Status |
|---|---|
| 1.4 (7) | Unreviewed |
| 1.3 (6) | Active |
| 1.2 (5) | Active |
| 1.1 (4) | Active |
| 1.1 (3) | Rejected |
| 1.0 (2) | Active |
| 1.0 (1) | Rejected |
1. Please remove `schemas/gschemas.compiled`. Not needed for 45+ packages. 2. Remove `assets/status-tray-dark.png`: [EGO Review Guidelines: unnecessary files](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#don-t-include-unnecessary-files) 3. Avoid using `log()` (line 27 `prefs.js`): [Port Guide 45: Logging](https://gjs.guide/extensions/upgrading/gnome-shell-45.html#logging) 4. Don't create instances of objects in global scope and leave it there after disable (line 125, 135 `extension.js`): [EGO Review Guidelines: Destroy](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#destroy-all-objects) 5. `signal_unsubscribe()` and `unexport()` don't throw. So, don't wrap them with try-catch. 6. Instead of using `connect()` and store the signal id, use `connectObject()` and `disconnectObject()` (line 1707-1740 `extension.js`). That's much easier to cleanup. 7. Avoid holding multiple timeout ids in one property (line 1810, 1873 `extension.js`). Use a helper function, if they are doing the same thing. 8. You need to clean up all properties in window close request (the default class you are exporting in `prefs.js`). You can also add `donations` to the `metadata.json`, so people can donate to you if they want: [Extension Anatomy: donations](https://gjs.guide/extensions/overview/anatomy.html#donations) If you need any help with your extension you can ask us on: - [GNOME Extensions Matrix Channel](https://matrix.to/#/#extensions:gnome.org) - IRC Bridge: irc://irc.gimpnet.org/shell-extensions
1. Please remove `schemas/gschemas.compiled`. Not needed for 45+ packages. **Fixed:** Removed `src/schemas/gschemas.compiled`. 2. Remove `assets/status-tray-dark.png`: [EGO Review Guidelines: unnecessary files](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#don-t-include-unnecessary-files) **Fixed:** Removed `src/assets/status-tray-dark.png` (351KB) and the empty `assets/` folder. Updated `prefs.js` to use the system icon `preferences-system-symbolic` instead of loading a custom image file. 3. Avoid using `log()` (line 27 `prefs.js`): [Port Guide 45: Logging](https://gjs.guide/extensions/upgrading/gnome-shell-45.html#logging) **Fixed:** Removed deprecated `log()` call from `prefs.js` debug function. Now uses only `console.log()`. 4. Don't create instances of objects in global scope and leave it there after disable (line 125, 135 `extension.js`): [EGO Review Guidelines: Destroy](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#destroy-all-objects) **Fixed:** Added cleanup in `disable()` method to nullify module-level cached objects: - `_sniInterfaceInfo` (D-Bus interface info cache) - `_interfaceSettings` (Gio.Settings for dark mode detection) These are now set to `null` when the extension is disabled, ensuring proper cleanup. Also added `_draggedRow = null` cleanup in `prefs.js` `_cleanup()` method for consistency. 5. `signal_unsubscribe()` and `unexport()` don't throw. So, don't wrap them with try-catch. **Fixed:** Removed unnecessary try-catch wrappers from 4 locations: - `prefs.js:1954-1955` - `signal_unsubscribe` in `_cleanup()` - `extension.js:1322-1323` - `signal_unsubscribe` in `TrayItem.destroy()` - `extension.js:1662-1663` - `signal_unsubscribe` in `StatusNotifierWatcher.destroy()` - `extension.js:1671` - `unexport` in `StatusNotifierWatcher.destroy()` 6. Instead of using `connect()` and store the signal id, use `connectObject()` and `disconnectObject()` (line 1707-1740 `extension.js`). That's much easier to cleanup. **Fixed:** Replaced manual signal ID tracking with `connectObject()`/`disconnectObject()` pattern: - Removed `_settingsConnections` array - Changed 5 individual `connect()` calls to single `connectObject()` call (lines 1693-1715) - Replaced manual disconnect loop with `this._settings.disconnectObject(this)` (line 1735) 7. Avoid holding multiple timeout ids in one property (line 1810, 1873 `extension.js`). Use a helper function, if they are doing the same thing. **Fixed:** Created `_scheduleReorder()` helper function (lines 1867-1878) that: - Cancels any existing reorder timeout - Schedules a new 100ms debounced timeout to call `_reorderItems()` Replaced duplicate inline timeout code at two locations: - `_onItemRegistered()` callback (line 1782) - `_refreshItems()` end (line 1837-1838) 8. You need to clean up all properties in window close request (the default class you are exporting in `prefs.js`). **Fixed:** Updated `_cleanup()` method (lines 1950-1968) to nullify all instance properties: - `_signalIds` - `_appRows` - `_appsGroup` - `_infoRow` - `_bus` - `_settings` - `_window` All references are now released when the preferences window closes. 9. You can also add `donations` to the `metadata.json`, so people can donate to you if they want: [Extension Anatomy: donations](https://gjs.guide/extensions/overview/anatomy.html#donations) **Fixed:** Added `donations` field to `metadata.json` with GitHub Sponsors link: ```json "donations": { "github": "keithvassallomt" } ```