Anchors the Gitify window to its tray icon on GNOME.
Wayland leaves window placement entirely to the compositor. A native Wayland client cannot ask to be placed next to a tray icon, so on GNOME the Gitify popup opens wherever the shell decides to put it, usually the centre of the screen. GNOME does not support the layer-shell protocol other compositors offer for this, which leaves a shell extension as the only way to anchor the window.
This extension listens for the Gitify window being mapped and moves it directly below the Gitify tray icon, falling back to the top-right corner of the primary monitor when the icon cannot be located.
- GNOME Shell 50 on a Wayland session.
- Gitify 7.8 or newer.
- A tray. GNOME Shell has no tray of its own. Install the AppIndicator and KStatusNotifierItem Support extension (or a distribution that ships it, such as Ubuntu). Without it the window is placed in the top-right corner instead of under the icon.
On an X11 session, or when Gitify's Use X11 backend setting is enabled, Gitify positions its own window and this extension is not needed.
After installing the extension, open its settings in GNOME Extensions or Extension Manager for Set up Gitify. The page links to the Gitify download and AppIndicator setup, and can open Gitify when a desktop installation is detected. Portable AppImages may need to be opened from your files.
Gitify on GNOME Extensions was submitted on 16 September 2026. Version 0.1.0 targets GNOME Shell 50 and is awaiting review. Until it is approved, install the GitHub release bundle below.
Download gitify@gitify.io.shell-extension.zip from the
latest release, then:
gnome-extensions install --force gitify@gitify.io.shell-extension.zipGNOME Shell only discovers new extensions at login on Wayland, so log out and back in, then enable it:
gnome-extensions enable gitify@gitify.ioGitify 7.8.0 users should enable Use white tray icon in Tray settings for the default dark GNOME panel. The automatic white-icon fix is in gitify#3297.
extension.js connects to the window manager's map signal. When the mapped
window belongs to Gitify (its app id contains gitify, or it is a development
build running under the stock Electron binary with the title Gitify), the
extension looks up the Gitify entry in the panel's status area, reads its screen
rectangle, and calls move_frame to centre the window below it, clamped to the
work area. Electron resizes its window shortly after mapping, so the placement
is re-applied a few times over the first half second. Pending timers are
cancelled when the window is unmanaged or the extension is disabled.
The tray lookup reads the _indicator field the AppIndicator extension stores
on each panel entry. That is a private field of a third-party extension, so it
is accessed defensively; if it goes away the extension degrades to corner
placement rather than failing.
Tooling is unified through Vite+ (oxlint and oxfmt), the same setup as the main Gitify repository.
pnpm install
# Lint and format checks
pnpm check
# Auto-fix formatting and lint issues
pnpm check:fix
# Placement and lifecycle regression tests
pnpm test
# Real GNOME Wayland smoke test, with GNOME Shell and PyGObject installed
pnpm test:shell
# Build dist/gitify@gitify.io.shell-extension.zip
pnpm bundleThe extension itself can only run inside GNOME Shell. To try a change without logging out, install it into your user extensions directory and start a nested shell:
ln -s "$PWD/gitify@gitify.io" ~/.local/share/gnome-shell/extensions/gitify@gitify.io
dbus-run-session -- gnome-shell --devkit --waylandGNOME 45–48 use --nested instead of --devkit. GNOME 49 and newer may
require the mutter-devkit package. See the
GNOME debugging guide.
See desktop validation for the isolated compositor test, Gitify tray test, and VM checks before release.
Then enable it inside the nested session and launch Gitify from a terminal in that session. Shell logs, including anything the extension prints, are available with:
journalctl -f -o cat /usr/bin/gnome-shellReleases are cut by release-please
from conventional commits on main. Merging the release PR tags the repo,
updates CHANGELOG.md and the version-name in metadata.json, and attaches
the packed .shell-extension.zip to the GitHub release.
Publishing to extensions.gnome.org is a manual step: upload the zip from the
release at https://extensions.gnome.org/upload/. The site assigns the integer
version in metadata.json itself, so that field is omitted here.
The original extension was written by @SiriusCrain in gitify-app/gitify#3297 and moved here so it can be reviewed and distributed through extensions.gnome.org.