GNOME Shell extension that adds rounded corners to all windows (Firefox, VS Code, etc.). Supports GNOME 45-50.
JavaScript
15
9 commits
updated Apr 29, 2026
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.
_
box-shadow replaces GNOME's default rectangular shadow, clipped with the same squircle curveWM_CLASS, Wayland app ID, or desktop file IDWM_CLASS| 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-tools
git clone https://github.com/Nathanaelrc/rounded-windows.git
cd rounded-windows
chmod +x install.sh
./install.sh
The script will:
~/.local/share/gnome-shell/extensions/rounded-windows@marcosgt.github.io/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 rounded-windows@marcosgt.github.io
Option B — GUI: Open the Extensions app (or GNOME Tweaks → Extensions) and toggle Rounded Window Corners on.
gnome-extensions prefs rounded-windows@marcosgt.github.io
Or click the ⚙️ icon next to the extension in the Extensions app.
./install.sh --uninstall
Then 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.
gnome-extensions list --enabled | grep rounded).journalctl -b /usr/bin/gnome-shell | grep -E "rounded-windows|JS ERROR"
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 -100
Then open a bug report with the full log.
Before opening an issue, please:
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:
$$\text{dist}(p, c) = \left( |p_x - c_x|^e + |p_y - c_y|^e \right)^{1/e}$$
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.
JavaScript
92.9%
Shell
6.6%
GNOME Shell extension that adds rounded corners to all windows (Firefox, VS Code, etc.). Supports GNOME 45-50.
JavaScript
15
9 commits
updated Apr 29, 2026
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.
_
box-shadow replaces GNOME's default rectangular shadow, clipped with the same squircle curveWM_CLASS, Wayland app ID, or desktop file IDWM_CLASS| 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-tools
git clone https://github.com/Nathanaelrc/rounded-windows.git
cd rounded-windows
chmod +x install.sh
./install.sh
The script will:
~/.local/share/gnome-shell/extensions/rounded-windows@marcosgt.github.io/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 rounded-windows@marcosgt.github.io
Option B — GUI: Open the Extensions app (or GNOME Tweaks → Extensions) and toggle Rounded Window Corners on.
gnome-extensions prefs rounded-windows@marcosgt.github.io
Or click the ⚙️ icon next to the extension in the Extensions app.
./install.sh --uninstall
Then 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.
gnome-extensions list --enabled | grep rounded).journalctl -b /usr/bin/gnome-shell | grep -E "rounded-windows|JS ERROR"
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 -100
Then open a bug report with the full log.
Before opening an issue, please:
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:
$$\text{dist}(p, c) = \left( |p_x - c_x|^e + |p_y - c_y|^e \right)^{1/e}$$
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.
JavaScript
92.9%
Shell
6.6%