- Python 61%
- Shell 21.1%
- JavaScript 16.5%
- CSS 1.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
- install.sh picks distros/fedora.sh or distros/ubuntu.sh from ID / ID_LIKE in /etc/os-release (Debian, Mint, Pop!_OS go with Ubuntu); each file lists the packages and how to check and install them (dnf/rpm, apt/dpkg); unknown distros get the list printed - Ubuntu package names checked against the 26.04 archive (sassc and fonts-inter-variable from universe, dconf-cli, libglib2.0-dev-bin, libxml2-utils, python3-gi, python3-pil) - Ubuntu Dock is turned off for Dash to Dock, and back on by uninstall.sh - theme-sync uses a system-wide User Themes schema (Ubuntu's gnome-shell-extensions) - re-running the extensions step keeps Blur my Shell off when Liquid Glass is on - GNOME version warning covers 50 and 51; APPLISH_OS_RELEASE overrides os-release for tests - README: Ubuntu in requirements, compatibility and steps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| config | ||
| distros | ||
| docs | ||
| extensions | ||
| lib | ||
| systemd | ||
| tools | ||
| .gitignore | ||
| install.sh | ||
| LICENSE | ||
| README.md | ||
| uninstall.sh | ||
applish-gnome
GNOME that looks like macOS Tahoe, and keeps looking like it after you press Dark Style.
Squircle icons that go dark with the system, frosted glass under every popup,
corners that nest the way Apple's HIG says they should, and no second-long freeze on the switch.
Applish (adj.): a Mac at first glance, and at the second one too, as long as nobody opens About This Mac.
Most of the look comes from MacTahoe by vinceliuice and Blur my Shell. Install them by hand and you get something close, and then you hit the gaps. Icons stay white in dark mode. The shell theme stays light when the apps go dark. Blur my Shell's own palette buries the theme's Quick Settings. Every theme switch freezes the screen for a second. This repository is the glue and the fixes for all of that, plus an installer.
✨ What you get
- 🌗 One switch for everything. Quick Settings → Dark Style flips the GTK theme, the libadwaita CSS, the shell theme, the icons and the popup glass together. Nothing else to toggle.
- 🎨 Dark icons, like macOS 26. MacTahoe ships one set of app icons. In dark mode every plate turns dark: on a light plate the symbol stays, on a coloured plate the white symbol takes the plate's colour (a blue plane on a dark plate for Telegram). Apps MacTahoe does not know get the same treatment from their own icon when it is a plate with a white symbol (Claude Desktop), sized like their neighbours and with the faint rim macOS draws. About 1100 icons, rebuilt by themselves after a MacTahoe update; Obsidian is left as it is.
- 🔣 Crisp symbolic icons. MacTahoe draws its small icons as 1 px outlines that turn to mush
at 16 px. The
Applish-darkandApplish-lighticon themes keep MacTahoe for apps, folders and files, but take Quick Settings, top bar and toolbar icons from Adwaita and GNOME Shell, which are filled and sit on the pixel grid, much closer to SF Symbols. - 🧊 Glass. Blur with a macOS-sized radius plus vibrancy (a saturation boost) for Quick
Settings, menus, notifications, OSDs, dialogs and app sidebars. Or, with
--with-liquid-glass, the real thing: refractive, glossy Liquid Glass on the top bar, menus, Quick Settings, notifications, dock and app sidebars. - 📐 Corners that nest. Outer radius = inner radius + inset, as the HIG asks: Quick Settings 44 with a 16 inset, tiles and cards 28, notifications 28, OSD 24, dialogs 36, menus 14. The blur under each popup follows the same radius.
- 🔤 Inter everywhere. GNOME, browsers and Electron apps that ask for
-apple-system,system-uior SF Pro all get Inter Variable. Inter 10 is the size of the macOS 13 pt system font. SF Pro itself is licensed only for mock-ups of Apple platforms, so it is not used. - 🧩 Dock, rounded windows, Launchpad-ish grid. Dash to Dock at the bottom, every window
rounded like a libadwaita one, and apps pinned to the dock still show up in the app grid.
On GNOME 50 the rounding comes from Rounded Windows (radius 24, Steam excluded because it
fights back); GNOME 51 removed the API it is built on, so there it is Rounded Window Corners
Native, which takes the radius and shadow from libadwaita and your
gtk.css. - 🍎 Menu bar like a Mac's. Your distribution's logo where the Apple logo sits (picked from
/etc/os-release), one Control Center glyph instead of the network, sound and power icons, the clock at the right end ("Nov 11 2:48", no AM/PM), and the spacing between items macOS uses. Optionally a black camera notch in the middle, for a webcam that sits on the top edge of the monitor (--with-notch; size it under/org/gnome/shell/extensions/applish-menubar/). - 🔔 Notification Center like a Mac's. The clock opens notifications only (no calendar, world clocks or media players), sliding in from the right edge; with Liquid Glass every card is its own piece of glass. Banners show at the top right of the screen you work on.
- 🗑️ Dock like a Mac's. Trash at the end behind a separator, no app grid button, no plate under the focused app, running apps marked with a small dot: black in light mode, grey in dark mode.
- ⌨️ Layout switch without the popup. The input source shortcut flips straight to the previous layout, like macOS, instead of opening a switcher that steals focus for a moment.
- 🖼️ AppImages get themed icons too. Gear Lever writes launchers with a path to the icon file, so the theme never sees them, and it rewrites them on every update. A watcher puts the themed icon back each time.
- ⚡ No freeze on the switch. Before: about 1.3 s of blocked shell per toggle. Two patches bring it to about 1 s and get re-applied after GNOME auto-updates the extensions; with Liquid Glass instead of Blur my Shell it is about 0.35 s. Details in How it works.
- 🔒 Sleep locks the screen, like a Mac. GNOME ties lock-on-suspend to its automatic screen lock switch; the preset turns it on and locks as the screen blanks.
Optional: Super as Cmd system-wide with keyd.
📦 Requirements
| System | Fedora 44 or 45, Ubuntu 26.04 or 26.10 (other distros: see Compatibility) |
| Desktop | GNOME Shell 50 or 51, Wayland |
| Packages | installed by the script with dnf or apt, the list per distribution is in distros/: git, sassc, the GLib and libxml2 tools, the icon cache tool, Python with GObject and Pillow, Inter Variable, dconf |
| Tested on | GNOME 50.6 and 51.1, NVIDIA RTX 4060, two 1440p monitors |
🚀 Install
git clone https://git.wiseless.net/fureunoir/applish-gnome.git
cd applish-gnome
./install.sh
Run it from a terminal inside your GNOME session, as yourself. sudo is only for missing
packages; GNOME asks you to confirm each extension from extensions.gnome.org; everything else
lands in your home folder. Files it replaces are kept as *.applish-backup-<date>.
Then log out and back in once. GNOME on Wayland loads new extensions and patched extension code only at login. After that, press Dark Style a couple of times and watch everything follow.
Curious first? ./install.sh --dry-run prints every command and changes nothing.
Steps
The installer runs these in order. Pick with --only or drop with --skip, comma-separated.
| Step | What it does |
|---|---|
deps |
missing packages via dnf (Fedora) or apt (Ubuntu, Debian and their family) |
themes |
MacTahoe GTK and shell themes, libadwaita CSS into ~/.config/gtk-4.0 |
icons |
MacTahoe icon theme: MacTahoe, MacTahoe-light, MacTahoe-dark |
extensions |
User Themes, Dash to Dock, Blur my Shell, Logo Menu and window rounding (Rounded Windows on GNOME 50, Rounded Window Corners Native on 51) from extensions.gnome.org |
own-extensions |
the small extensions in extensions/: popup palette, menu bar, favorites in the app grid, layout switch |
settings |
dock, blur, corners and fonts from config/dconf/, glass from lib/glass.sh |
fonts |
~/.config/fontconfig/fonts.conf |
sync |
lib/ into ~/.local/share/applish-gnome, the theme sync service and the launcher icon watcher |
liquid-glass |
opt-in (--with-liquid-glass): Liquid Glass instead of Blur my Shell, see below |
MacTahoe is pinned to the commits this was tested with. --latest takes upstream HEAD
instead, and -y stops the installer from asking before it installs packages.
🧭 How it works
flowchart LR
qs["🌗 Dark Style<br/>(color-scheme)"] --> sync["applish-theme-sync<br/>gsettings monitor"]
sync --> gtk["GTK theme<br/>MacTahoe-Light / Dark"]
sync --> adw["~/.config/gtk-4.0/gtk.css<br/>libadwaita apps"]
sync --> icons["icon theme<br/>Applish-light / dark"]
sync --> shell["shell theme<br/>(User Themes)"]
sync --> bms["Blur my Shell<br/>popup style"]
The service writes a key only when the value is actually different. That matters: every write to a Blur my Shell key rebuilds its effects, and every write to the User Themes key reloads the whole shell theme. On start it also re-applies the patches, rebuilds the dark icons if MacTahoe was reinstalled, and rebuilds icon caches that went stale.
Why the popup palette is an extension. The shell's toolkit sorts CSS by origin before
specificity, so any extension stylesheet beats the shell theme, !important rules included.
Blur my Shell 76 started shipping its own Quick Settings palette, and the only thing that can
override an extension is another extension. applish-popups@applish is a stylesheet and
nothing else; its selectors are just longer than Blur my Shell's.
Why the patches. perf can't attach to gnome-shell as a normal user, so the freeze was
measured another way: ping the shell over D-Bus every 10 ms during a switch and count the late
answers (tools/measure-theme-switch.py does exactly that on your machine). Two culprits:
- User Themes (gnome-shell-extensions 50) calls
disconnectObject()with no argument when it is disabled, which happens on every screen lock. Its handlers pile up, and after N unlocks one switch reloads the shell theme N+1 times. - Blur my Shell answers every event of a switch in every component: color-scheme twice,
gtk-theme, the theme reload, the session mode. Its popup and overview parts also remove a
class from the shell's root actor and add it straight back, which restyles the entire shell
twice each time. Without Blur my Shell a switch cost about 0.3 s; with it, about 1.3 s.
lib/patch-bms.pycoalesces the events and only touches the class when it really changes.
Dark icons. MacTahoe's MacTahoe-dark/apps/scalable is a symlink to the light icons.
lib/gen-dark-icons.py turns it into a real folder. In each SVG it finds the plate (the first
filled shape outside <defs>). If every colour of the plate is light and neutral, the plate
gets a dark gradient, a white rim with the same outline becomes #3c3c3e, and dark glyphs
become #f2f2f2. A coloured plate gets a dark gradient too, and the white shapes on it take
the plate's gradient, raised in lightness where it would be too dark to read; with no white
symbol at all, its dark marks take that colour instead (Spotify's waves). Gradients are cloned
rather than edited, because logos sometimes share them.
Apps' own icons (lib/dark_raster.py, run by build-symbolic-themes.py) are judged by their
pixels: only a plate of one colour with a white symbol is redrawn, and it is written in
several sizes, because the shell scales icons without mipmaps.
Every other icon is a symlink to the original. Fixed icons from lib/icon-overrides/ go in
first; for now that is only Steam, whose upstream logo is clipped at the edge.
Symbolic icons. lib/build-symbolic-themes.py builds two tiny wrapper themes in
~/.local/share/icons: Adwaita's symbolic folders linked in, GNOME Shell's own icons extracted
from its gresource, and Inherits=MacTahoe-<variant>,Adwaita,hicolor. Any *-symbolic name
resolves to Adwaita or the shell, everything else falls through to MacTahoe. They rebuild
themselves when Adwaita, GNOME Shell or MacTahoe change.
🔧 Everyday use
| I want to | Do |
|---|---|
| switch light/dark | Dark Style in Quick Settings |
| change the glass | ~/.local/share/applish-gnome/glass.sh glass (vibrancy), liquid (plus refraction) or plain |
| tweak popup colours or radii | edit lib/gen-popups.py, run it, turn applish-popups@applish off and on; keep set_blur_radii in lib/theme-sync.sh in step |
| rebuild dark icons now | python3 ~/.local/share/applish-gnome/gen-dark-icons.py (--preview DIR name... renders before/after without installing) |
| measure the switch freeze | python3 tools/measure-theme-switch.py |
| frost another app's sidebar | add its window class to Blur my Shell → Applications → whitelist. Each blurred window costs 150-200 MB of video memory, which is why it isn't on for every window |
Note
An app keeps its own logo if its launcher points at an icon file rather than an icon name. AppImages get fixed automatically when MacTahoe has an icon for them. For Flatpaks with an unusual id, and for apps you build yourself, see docs/app-icons.md, which also covers drawing a proper macOS-style icon.
💧 Liquid Glass (optional)
./install.sh --only sync,liquid-glass # on top of an existing install
./install.sh --with-liquid-glass # or as part of a fresh one
Liquid Glass draws Apple-style glass in shaders: blur plus refraction at the edges, a specular highlight and rim light. It replaces Blur my Shell, which the step turns off. It is not on extensions.gnome.org yet, so it comes from GitHub at a pinned commit, and GNOME won't auto-update it.
What the step sets up, and why:
| Glossy, not frosted | the defaults (no highlight, white tint up to 0.5) read as milky frosted glass; config/dconf/liquid-glass.ini turns the highlight on and the tint down to 0.06-0.14 |
| No desktop clock | Liquid Glass puts a glass clock on the desktop by default; off |
| App sidebars | glass behind the windows of libadwaita apps (MacTahoe leaves their sidebars see-through), same list as for Blur my Shell, window content kept fully opaque |
| Astra Monitor menus | Liquid Glass glasses one menu per top bar button; Astra has one per sensor. lib/patch-liquid-glass.py adds them, re-applied by the sync service |
| Control Center tiles | every Quick Settings tile is its own piece of glass with no panel behind it; "on" is a solid circle behind the icon, not a filled tile. Liquid Glass would clear that circle too, the patch keeps it |
| Notification Center | the clock menu gets a piece of glass per card instead of one pane behind the whole menu (same patch), and Liquid Glass's spring animation for it is off: the menu slides in from the right |
| Light and dark material | in light mode menus, tiles and notifications are a light, nearly opaque material (dark text needs it over a dark wallpaper), in dark mode thin clear glass. The sync service switches the tint |
| Smooth top bar menus | picking a readable text color screenshots the backdrop and round-trips it through PNG on the shell's main thread at every open; sweeping over big menus stutters, so top bar menus keep the theme's text colors |
Measured on GNOME 51, two 1440p screens: a Dark Style switch blocks the shell about 0.35 s (about 1 s with patched Blur my Shell), gnome-shell holds about 400-450 MB of video memory. Known upstream issues mention high CPU after resume from sleep on some setups; switch back by turning Liquid Glass off and Blur my Shell on in Extensions.
⌨️ Super as Cmd (optional)
config/keyd/default.conf turns Super+letter into Ctrl+letter
everywhere with keyd, so Super+C/V/X/Z/S/W/Q/T behave like
Cmd. Super+C sends Ctrl+Insert, which makes copying work in terminals too: set yours to copy
on Ctrl+Insert and paste on Ctrl+V. GNOME keeps Super+L, Super+Space, Super+Tab and
Super+arrows. keyd needs root, so install.sh leaves this one to you; the steps are at the
top of the file.
🧪 Compatibility
- Tested on Fedora 44 and 45, GNOME Shell 50.6 and 51.1, Wayland, NVIDIA.
- Ubuntu 26.04 (GNOME 50) and 26.10 (GNOME 51): the package names are checked against the
Ubuntu archive, a run on real Ubuntu is still to come. Ubuntu Dock, Ubuntu's fork of Dash to
Dock, is turned off by
install.sh(both at once fight over the dock) and back on byuninstall.sh. User Themes from Ubuntu's own package works too. - The own extensions declare
shell-version50 and 51. On another version, edit theirmetadata.jsonand see what breaks. - The Blur my Shell patch expects version 77. If upstream code moves, the patch skips the
file instead of half-patching it, and says so in
journalctl --user -u applish-theme-sync. - Other distros: only
depsknows the package manager. The installer picksdistros/fedora.shordistros/ubuntu.shfromIDandID_LIKEin/etc/os-release; elsewhere it prints the package list. Another family is one more small file there: package names,pkg_installed,pkg_install. The rest is shell and Python with GObject.
🩺 Troubleshooting
| Symptom | Try |
|---|---|
| a new extension or patch does nothing | log out and back in; Wayland loads extension code only at login |
| the switch still freezes for a second | python3 tools/measure-theme-switch.py, then docs/troubleshooting.md |
| an icon stays light in dark mode | the app isn't using a theme icon, or its plate is coloured on purpose; see docs/app-icons.md |
| something changed after a login | GNOME auto-updated an extension; stat ~/.local/share/gnome-shell/extensions/*/ and journalctl --user -u applish-theme-sync -b |
| gnome-shell eats video memory | nvidia-smi; if Blur my Shell → Applications has "blur all windows" on, turn it off (about 1.5 GB) |
More in docs/troubleshooting.md.
🧹 Uninstall
./uninstall.sh
This removes the services, the applish extensions, Liquid Glass if the installer put it
there, the dark icon plates, the Blur my Shell
patch and the fontconfig file (your backup comes back). MacTahoe (install.sh -r in its own
repositories) and the extensions from extensions.gnome.org stay. Log in again afterwards.
📜 License
GPL-3.0 © 2026 Egor Gorbunov. lib/icon-overrides/steam.svg is derived from the
MacTahoe icon theme.
Built on MacTahoe GTK and MacTahoe icons by vinceliuice (GPL-3.0), Blur my Shell by aunetx (GPL-3.0), Dash to Dock (GPL-2.0), Rounded Windows, Rounded Window Corners Native (GPL-3.0), Liquid Glass by ryohsuke1231 (MIT), Logo Menu by Aryan Kaushik (GPL-2.0) and Inter by Rasmus Andersson (OFL-1.1).
Not affiliated with Apple. macOS, Tahoe and SF Pro are trademarks of Apple Inc.