Every window on one infinite canvas, for GNOME Shell. Zoom out to see all of it. Click a window and you're in it, for real, at 1:1.
Windows keep their real size on an endless canvas and your screen is a camera looking at it. Zooming never resizes anything, so nothing reflows. At 1:1 it is simply your GNOME desktop: real windows, fully interactive.
| To | Trackpad / mouse | Keys |
|---|---|---|
| Picture in picture | right-click a window › Picture in Picture; on the tile: drag its top bar to a corner (a fling goes where it's heading), drag the corner grip to resize, the home button sends it back, click it over the canvas to go into it | Ctrl+Alt+P (the window under the pointer on the canvas, else the focused one; again to bring it back) |
| Jump to a window | hold Super, point at a window, let go to go into it (a tap is unchanged) |
|
| Zoom | pinch (two fingers on the desktop or canvas, three anywhere) | Super + scroll, anywhere |
| Pan | four-finger swipe anywhere, over windows too; two-finger scroll or drag on the empty desktop or canvas | arrows on the canvas |
| See everything, and back in | three-finger swipe up (down to go back), four-finger tap, Activities, the hot corner | Super, Super+Z |
| App grid | three-finger swipe up again, or the grid button in the canvas's dash: Skylight’s vertical scrolling grid by default (fast; Settings can use GNOME’s overview instead) | |
| Open an app here | double-click the empty canvas or desktop, or right-click › Open Here…, or just start typing on the canvas; click a dash icon (a window already on the canvas is entered centred at 1:1; a new app opens in free space, or in the centre if Centre Launch is on, and goes in unless you turn that off in Settings) or drag one onto empty canvas (opens on that spot) | Super+Return |
| Go into a window | click it (it grows to 1:1 around the click), or pinch out over it | |
| Bring a window to the middle and go in | double-click it | Return over it |
| Move a window | drag it: edges and centres line up with neighbours (pink guides), then it settles onto the grid. Ctrl moves freely, Shift takes its snapped group |
|
| Resize a window | drag its edge or corner on the canvas | |
| Close | hover it: the close pill at its top right | |
| Move & Resize | right-click › Move & Resize | halves Super+Ctrl+arrows (again: ⅔, then ⅓), quarters Ctrl+Alt+U I J K, thirds D F G, two-thirds E R, fill Return, centre C |
| Find a window or open an app | Ctrl+Space opens a spotlight in the middle of the view (typing on the canvas does the same). Settings › Canvas search chooses windows, apps, or both (default). Results split into Windows (enter centred) and Apps (open in free space, or the centre when Centre Launch is on). ↑ ↓ to pick, Return to go in / open, Esc dismisses |
Ctrl+Space |
| Switch windows | Alt+Tab (and Alt+` within an app): opens the canvas if needed, then cycles on it — no GNOME switcher; release Alt to enter |
|
| Frames: named areas | right-click › New Frame (around the windows in view); drag its name to move it with its windows, its edge to resize it, double-click the name to go there; right-click the name to rename or delete | |
| Strip mode: one row, a column per app | right-click › Strip Mode, the top bar menu, or Settings | Ctrl+Alt+S; Super+, Super+. the next column, Super+Alt+↑ ↓ within one |
| Tidy everything | right-click › Tidy (on the strip: sort it again) | Ctrl+Alt+A |
| One workspace (on by default): every window on one canvas | top bar menu › One Workspace, or Settings | |
| Undo a move, resize, tidy or layout | right-click › Undo | Ctrl+Z on the canvas |
| Save / restore a layout | top bar menu, right-click | Ctrl+S / Ctrl+1–9 on the canvas |
| Minimap | click to look there, drag the outline to pan, Fit and 1:1 buttons; a dashed outline is a minimised window: click it to bring it back and go in |
Everything else is in the sun icon in the top bar, and in Settings (gnome-extensions prefs skylight@hadi7546).
- Entering a window keeps the clicked spot under the pointer and the title bar below the top bar; a double-click brings it to the middle instead. Pinching in to 90% over a window enters it.
- Flights between places follow van Wijk and Nuij's pan-and-zoom path on an under-damped spring; pans and pinches coast after your fingers lift.
- The backdrop is your wallpaper, sharp at 100% and blurring and dimming to 50% (or a dot grid or a colour, in Settings).
- Open Here… opens GNOME's own search (apps, files, settings…), and the app you open from it
opens on the spot you picked; on the canvas the camera moves there first. Or, in Settings, Skylight's
own app bar instead (faster, with a ring on the spot): type to filter (
vscfinds Visual Studio Code, keywords count too),↑↓to pick,Returnto open the app's window on the spot you picked (a ring marks it),Ctrl+Returnto open it and go in. Apps you open often come first. An app that is running and can't open another window brings its last one over instead. On the canvas, the borrowed dash enters a window already there, centred at 1:1. A new app opens in free space (the middle of the view if that's clear, otherwise beside its neighbours; Settings › Open new apps in the centre pins it on the view instead) and, by default, goes into it at 1:1 (Settings › Canvas › Enter apps opened from the canvas — also used by the vertical app grid and search); drag an icon onto empty canvas and it opens on that spot without entering. Windows open and close with an effect (Settings › Windows › Opening and closing: Automatic, Sunrise, Unfold, Bloom, Dissolve or None). - New windows open in the middle of what you're looking at if that's free, otherwise in the nearest free spot beside the windows in the way; on the canvas they pop in with a ripple. At 1:1 the camera never moves for a launch: with no free room fully on screen the window opens over the others, as in GNOME.
- One Workspace (on by default) turns GNOME's workspaces off and gathers every window onto one canvas, each workspace's windows side by side as they were arranged, so the canvas and the GNOME overview both show everything. Your workspace settings are kept and come back when you turn it off (or turn Skylight off).
- Follow focus moves the camera only for a window that is really out of view: one whose top is on screen and that mostly shows stays put, so switching between big windows never swings the camera.
- Picking a window in the GNOME overview moves the camera before the overview closes, so it closes straight onto the window.
- Minimised windows keep their place: they leave the canvas and show dashed in the minimap.
- The minimap at 1:1 can sit under your windows (off by default; Settings › Minimap at 1:1).
- The canvas is remembered: after logging in again windows that reopen within two minutes go back to their spots. Layouts keep sizes too, and reopen apps that aren't running.
- The canvas stands in for GNOME's overview: everything that showed the overview (
Super, Activities, the hot corner, three fingers up) shows the canvas, under the top bar, which stays in use, with GNOME's own dash at the bottom (borrowed from the overview while the canvas shows, so its menus, pinning and dragging all work) and a spotlight (Ctrl+Space, or just type) in the middle of the view. Clicking a running app in it, Alt+Tab or a notification goes into the window centred; picking a new app from the dash, vertical app grid, or search places it in free space and enters it by default (dash-enter; off leaves the new window where it landed; Centre Launch in the top bar or Settings pins the new window on the view centre); an app already on the canvas is entered centred. Dragging onto empty canvas places without entering. Spotlight finds windows, launches apps, or both (Settings › Canvas search, default both) without opening the top-bar menu. The dash grid button opens Skylight’s vertical scrolling app grid by default (after gnome-vertical-app-grid; turn off Settings › Vertical app grid to use GNOME’s overview). One switch turns overview replace off. The minimap pops in on the canvas only by default (turn on “Minimap at 1:1” for the live-mode minimap). - Sideways three-finger swipes stay GNOME's (workspaces); four fingers are Skylight's: a swipe pans from anywhere, and a tap shows everything. On GNOME 51, which takes swipes of three fingers or more, Skylight takes four-finger ones first (an event filter).
Escon the canvas goes back into the window you came from (on the Mac it does nothing).- The shortcuts avoid GNOME's own:
Ctrl+Alt+arrows switch workspaces in GNOME, so halves areSuper+Ctrl+arrows, and right two-thirds isCtrl+Alt+R(Topens a terminal on Ubuntu). - No desktop files, widgets, takeover mode or magnetic polarity. Strip mode doesn't reorder the strip when you come back to the canvas, only when a window opens or you drag one.
The code follows the EGO
best practices
(no defensive try/catch, no lifecycle flags, small entry point, modules with one job each,
enable() next to disable(), timeouts removed next to where they're created). The one exception to
"target a single GNOME version" is lib/compat.js, which keeps the 50–51 differences in one place. EGO
also wants the uuid's namespace to be a domain or account you control (for example
[email protected]), so change uuid in metadata.json and the Makefile first.
Experimental builds are on the Releases page: experimental
is always the newest build of main, and tagged versions (vX.Y.Z) are pre-releases too. Download
[email protected], then gnome-extensions install --force it, log out and back in,
and gnome-extensions enable skylight@hadi7546. Or from the source:
make install # copies to ~/.local/share/gnome-shell/extensionsLog out and back in, then gnome-extensions enable skylight@hadi7546. make pack builds
[email protected] for gnome-extensions install (make dist builds the same zip
without GNOME Shell installed).
.github/workflows/ci.yml runs on every push and pull request: make test, make lint, the settings
schema and metadata.json checks, then make dist, kept as a build artifact. A push to main replaces
the rolling experimental pre-release; pushing a tag vX.Y.Z makes a pre-release of that version, with
the version in the zip's metadata.json. The GNOME Shell end-to-end tests aren't in CI yet: they need a
headless GNOME Shell 50 or 51.
Supports GNOME Shell 50 and 51, on Wayland. Tested end to end on 51.1 (Arch Linux).
- Canvas mode. Zoomed out, a full-screen overlay (
lib/canvasView.js) draws every window as aClutter.Clonescaled by the camera, over the backdrop (lib/backdrop.js): the wallpaper with a blur effect, or a dot grid drawn in a fragment shader (lib/dotGrid.js). - Live mode. At 1:1 the overlay fades away and each real window sits at
canvas − camera, moved to the same pixel its clone was on, so the hand-over is invisible. - Parking. Mutter keeps at least 10–75 px of every window on screen, so windows the camera can't see are minimised without animation, and restored when the camera comes back.
- GNOME versions.
lib/compat.jscovers cursors (Clutter.CursorTypein 51,Meta.Cursorin 50); the dot grid usesClutter.ShaderEffecton 51, whereShell.GLSLEffectis gone. - Input (
lib/input.js), persistence (lib/store.js), the right-click menu (lib/canvasMenu.js), Open Here… (lib/launcher.js), One Workspace (lib/oneWorkspace.js), the overview swap (lib/overviewSwap.js) and frames (lib/frames.js) are separate modules, each cleaning up its own timeouts and signals. - Geometry (
lib/geometry.js), strip mode's layout (lib/strip.js) and matching for search (lib/appMatch.js) are pure JavaScript with unit tests:make test.
- Only the primary monitor is a canvas; windows on other monitors are left alone.
- Built for Wayland (GNOME 50 and 51 have no X11 session); X11 apps run through Xwayland as usual.
- Mutter won't move a maximised window. Going into one you haven't moved keeps it maximised (the camera lines up with it); once the canvas has it somewhere else (you moved it, Tidy did, or the camera went on), it becomes a plain window of the same size, so it never hides and going into it never jumps.
- Fullscreen windows are left where they are.
- Layouts can reopen an app's window, but not a particular document or tab.
Much of the canvas behaviour (the camera path and spring, alignment guides and drop grid, edge resizing,
Move & Resize, Tidy and new-window placement) is ported from the pure modules of
Sunlight (MIT, see LICENSE-sunlight). Snapping groups
come from driftwm, and the alternative Tidy style from
Mosaic.

