A GNOME Shell extension that adds rounded corners to top-level windows —
including apps that don't use libadwaita or libhandy (Firefox, VS Code, Chromium, Electron apps, JetBrains IDEs, etc.).
GPU-accelerated GLSL shader. No build step, no bundler — pure JavaScript.
- Screenshots
- Features
- Requirements
- Installation — step by step
- Uninstall
- Configuration
- Troubleshooting
- Reporting bugs
- How it works
- Credits
- License
_
- Rounded corners — GLSL fragment shader applied per-window at draw time
- Squircle / superellipse — adjustable smoothing (0 = circle, 1 = squircle)
- Custom shadow — rounded CSS
box-shadowreplaces GNOME's default rectangular shadow, clipped with the same squircle curve - Border — optional inner or outer coloured border with configurable width
- Smart skip — automatically skips libadwaita / libhandy apps to avoid double-rounding
- Blacklist / Whitelist — exclude or exclusively include apps by
WM_CLASS, Wayland app ID, or desktop file ID - GNOME 50 / Wayland aware — matches native Wayland windows without depending on
WM_CLASS - Live settings — all changes apply instantly without restarting the shell
| Requirement | Version |
|---|---|
| GNOME Shell | 45 – 50 |
| GLib (glib-compile-schemas) | any modern version |
Supported distributions (all others with GNOME 45–50 also work):
| Distribution | GNOME Shell |
|---|---|
| Ubuntu 24.04 – 26.04 | 46 – 50 |
| Fedora 40 – 44 | 46 – 50 |
| Arch Linux (rolling) | 45 – 50 |
| Debian Testing / Sid | 45 – 50 |
| openSUSE Tumbleweed | 45 – 50 |
You need glib-compile-schemas to compile the GSettings schema. Install it for your distro:
# Ubuntu / Debian
sudo apt install libglib2.0-bin
# Fedora / RHEL / CentOS
sudo dnf install glib2
# Arch Linux / Manjaro
sudo pacman -S glib2
# openSUSE
sudo zypper install glib2-toolsgit clone https://github.com/Nathanaelrc/rounded-windows.git
cd rounded-windowschmod +x install.sh
./install.shThe script will:
- Detect your GNOME Shell version and confirm it is supported
- Compile the GSettings schema
- Copy all extension files to
~/.local/share/gnome-shell/extensions/[email protected]/
The extension is installed but not loaded yet. You need to restart the shell:
Wayland session (GNOME 50)
Log out and log back in. There is no in-session restart on Wayland.
X11 session (GNOME 45–49)
Press Alt+F2, type
r, press Enter.
After restarting, enable it with one of these methods:
Option A — terminal:
gnome-extensions enable [email protected]Option B — GUI: Open the Extensions app (or GNOME Tweaks → Extensions) and toggle Rounded Window Corners on.
gnome-extensions prefs [email protected]Or click the ⚙️ icon next to the extension in the Extensions app.
./install.sh --uninstallThen restart GNOME Shell (step 4 above).
| Setting | Description | Default |
|---|---|---|
| Radius | Corner radius in logical pixels | 12 |
| Smoothing | 0 = circle · 1 = squircle (superellipse) |
0.6 |
| Clip padding | Extra gap between the window edge and the clip boundary | 1 |
| Border width | Positive = inner border · Negative = outer · 0 = none |
0 |
| Border colour | RGBA colour picker | white |
| Keep rounded when maximised | Apply corners even when a window fills the screen | off |
| Keep rounded when full-screen | Apply corners in full-screen mode | off |
| Setting | Description | Default |
|---|---|---|
| Custom shadow | Replace GNOME's rectangular shadow with a rounded one | on |
| Shadow when maximised | Keep the custom shadow for maximised windows | off |
| Focused / Unfocused | Opacity, blur radius, spread, horizontal and vertical offset | see below |
Default shadow values:
| Focused | Unfocused | |
|---|---|---|
| Opacity | 45 / 255 | 28 / 255 |
| Blur | 18 px | 12 px |
| Spread | −2 px | −2 px |
| Y offset | 4 px | 3 px |
| Setting | Description | Default |
|---|---|---|
| Skip libadwaita apps | Don't round apps that already have built-in rounded corners | on |
| Skip libhandy apps | Same, for legacy Handy apps | off |
| Whitelist mode | Treat the exception list as a whitelist instead of a blacklist | off |
| Exception list | One application identifier per line (WM_CLASS, Wayland app ID, or desktop ID) |
— |
Finding a window identifier:
Use the X11/XWayland WM_CLASS when available. For Wayland-native apps, use the app ID or desktop file ID shown by GNOME Shell / your launcher entry.
- Make sure the extension is enabled (
gnome-extensions list --enabled | grep rounded). - Check the journal for errors:
journalctl -b /usr/bin/gnome-shell | grep -E "rounded-windows|JS ERROR"
- The app may be libadwaita — disable Skip libadwaita apps in settings.
Some apps use a custom identifier. Add its WM_CLASS, Wayland app ID, or desktop file ID to the exception list (in whitelist mode) or disable the libadwaita/libhandy skip option.
GNOME Shell can round top-level windows managed by Mutter. Popup menus, tooltips, override-redirect X11 surfaces, and some client subsurfaces are compositor-limited and may remain square even on GNOME 50 Wayland.
Make sure you are running GNOME 45 or later. If you see TypeError: Gdk.RGBA is not a constructor, reinstall the latest version.
journalctl -b /usr/bin/gnome-shell | tail -100Then open a bug report with the full log.
Before opening an issue, please:
- Check the existing issues to avoid duplicates.
- Make sure you are on a supported GNOME version (45–50).
- Try disabling other extensions to rule out conflicts.
When opening an issue, include:
**GNOME Shell version:** (run: gnome-shell --version)
**Distribution & version:**
**Display server:** Wayland / X11
**Monitor scale:** 100% / 125% / 150% / other
**Extension version:** (from metadata.json or the Extensions app)
**Steps to reproduce:**
1.
2.
3.
**What you expected:**
**What actually happened:**
**Journal log:**
(run: journalctl -b /usr/bin/gnome-shell | grep -E "rounded-windows|JS ERROR" | tail -50)
Window Actor (MetaWindowActor)
└─ RoundedCornersEffect ← Shell.GLSLEffect (offscreen FBO)
Fragment shader:
• converts tex coord → pixel position
• evaluates squircle formula at each corner
• multiplies fragment alpha by the squircle opacity
• result: corners are transparent, edges are anti-aliased
Shadow Actor (St.Bin, inserted below the window in global.windowGroup)
└─ ClipShadowEffect ← Shell.GLSLEffect
Fragment shader:
• same squircle formula as above
• makes the shadow transparent where the window sits
• prevents shadow from bleeding through rounded corners
└─ Inner St.Bin → CSS border-radius + box-shadow
The shader uses a squircle (superellipse) formula:
where e = smoothing × 10 + 2 (2 = circle, 12 = squircle).
This extension was built by studying and adapting code from several open-source projects:
| Project | Author | What we used |
|---|---|---|
| rounded-window-corners | yilozt | Original squircle GLSL shader, shadow actor architecture, ClipShadowEffect concept, per-window signal management |
| Rounded Window Corners Reborn | flexagoon | Updated GJS bindings for GNOME 45–47, shadow style system, actor binding pattern |
| Mutter | GNOME | Understanding of MetaWindowActorX11 paint cycle, shadow architecture (focused/unfocused), FBO pipeline |
| GNOME Shell | GNOME | Shell.GLSLEffect usage patterns, ExtensionPreferences API |
The squircle shader, shadow clipping with squircle masking, GNOME 50 / Mutter 18 compatibility fixes, GSettings schema, preferences UI, and installation script were completely rewritten and heavily modified to bring this project to life and ensure compatibility with modern GNOME environments. While it stands on the shoulders of giants, this specific implementation and its novel improvements are my own work.
This project is licensed under the GNU General Public License v3.0.
You are free to use, modify, and distribute it under the same license.