Start here
Going further
Under the hood
For people who dislike how Linux desktops look and want the interface quality of macOS, without switching operating systems.
Aurora is not a distribution or a compositor — it is an interface layer that sits on top of an existing KDE Plasma installation. The underlying system (KWin, Wayland, window management) stays as it is; Aurora only changes the part you see and touch.
The goal is not "similar" but identical: the icon magnification curve, spacing ratios, animation durations and colors are derived from Apple's own measurements. Details are in the design system section below.
| 🎯 Pixel-accurate dock | macOS's cosine magnification wave, drag-and-drop reordering, context menu, tooltips, bounce animation, running indicators and trash |
| 🧭 All four edges | Bottom, top, left or right — the layout, menus and tooltips all follow |
| ⚙️ Settings app | A separate window in the macOS System Settings layout: traffic lights, rounded corners, shadow, sidebar. Eight Desktop & Dock options |
| 🪟 Window management | The right-click menu lists an app's open windows by title; clicking the icon raises all of them |
| 🧞 Genie minimize | Windows shrink toward their own dock icon — not the cursor. See how this was solved |
| 💾 Everything persists | Icon order, pins, sizes and every toggle survive a reboot |
Magnification, window switching and the Genie minimize animation:
The magnification wave — icons scale with distance from the pointer, following macOS's cosine curve:
Right-click menu with the application's open windows listed by title. The active window is marked:
| System Settings | Vertical dock |
|---|---|
![]() |
![]() |
| The Desktop & Dock panel | The dock works on all four edges |
From a release (recommended):
curl -LO https://github.com/azateser/aurora/releases/latest/download/aurora-dock-0.1.0.tar.gz
tar -xzf aurora-dock-0.1.0.tar.gz && cd aurora-dock-0.1.0
./scripts/install.shFrom source:
git clone https://github.com/azateser/aurora.git && cd aurora
./scripts/install.shThat's the whole setup. Aurora starts by itself on every login from then on — see Starting on every login.
The install script does the following:
- checks dependencies
- builds the helper program (for the minimize animation, optional)
- sets up the Wayland protocol permission and the KWin window rule
- creates an autostart entry so it starts on every login
- hides the Plasma panel (so it does not conflict with Aurora's dock)
- checks for the SF Pro font and reports the fallback to Inter if missing
To uninstall and restore the system to its previous state:
./scripts/uninstall.sh
The Plasma panel comes back, the autostart entry is removed, and the KWin
rule is deleted. Your settings are preserved under ~/.config/aurora/.
macOS's font cannot be bundled with the package because of Apple's license. If you want to install it on your own machine:
./scripts/install-font.sh
It downloads from Apple (~207 MB) and installs into the user directory. If it is not installed, Aurora uses the openly licensed Inter.
Requirements: quickshell (noctalia-qs on Arch), qt6-tools,
KDE Plasma 6 (Wayland). Optional: gcc and wayland-scanner
(so the minimize animation targets the dock icon).
You only need to do this once. The installer already set up autostart, so after a reboot Aurora comes up on its own — nothing to launch, nothing to configure.
To start it right now without rebooting:
./scripts/dock.shThe settings window opens by right-clicking the settings icon in the dock and choosing Aurora Settings.
./scripts/install.sh writes ~/.config/autostart/aurora-dock.desktop,
which KDE runs after the desktop has loaded (X-KDE-autostart-phase=2).
The helper that positions the minimize animation starts alongside the dock.
To check that it is in place:
cat ~/.config/autostart/aurora-dock.desktopTo turn autostart off but keep Aurora installed, delete that file. To
remove everything, run ./scripts/uninstall.sh.
Note: the autostart entry points at the folder you installed from. If you move or rename that folder, re-run
./scripts/install.shso the path is updated.
The full shell (wallpaper + top bar + dock) in an isolated KWin session, with hot reload — this does not touch your running desktop:
./scripts/dev.shRoughly ordered by priority.
- Top bar — currently only a clock. A menu bar, status icons and a control center are needed.
- Minimized window preview — macOS shows an image of the minimized
window; we show the application icon. KWin has a
ScreenShot2.CaptureWindowmethod, but it returns raw pixel data over a file descriptor, so a separate helper is required. - Settings panels — the Appearance, Wallpaper and Displays panels are present in the sidebar but empty.
- Launchpad — the Apps icon currently opens Vicinae; we should have our own launcher.
- Application design system — there are nine controls under
Aurora/Controls/(slider, toggle, popup, checkbox…). They need to be extended for applications like Finder and Terminal. - Notification center and Spotlight-like search.
- Running application detection looks at the process list; background
services without windows can sometimes show up. Since
wlr-foreign-toplevelis not supported in KWin, a direct window list cannot be obtained. - Memory baseline ~110 MB — the Qt/Mesa GPU context. It cannot be reduced without leaving Qt. Since applications added later will run in the same process, this cost is paid once.
- Multiple monitors have not been tested.
shell/
shell.qml full shell entry point
dock-only.qml dock only (on top of the existing desktop)
Aurora/Design/ design system (Tokens, Config)
Aurora/Services/ data layer (Apps, Settings, WindowFx, AuroraApps)
Aurora/Controls/ reusable controls
modules/ Dock, TopBar, Wallpaper
components/ ContextMenu, MenuPanel
apps/settings/ System Settings application
assets/icons/ dock icons (named after the .desktop id)
assets/settings-icons/ settings panel icons (512px)
assets/glyphs/ SF Symbols (check mark, window)
helper/ Wayland helper program (minimize target)
scripts/ install, run and development scripts
All visual values live in shell/Aurora/Design/Tokens.qml. Raw colors or
measurements are never written in QML files; every value is read from
here. Changing a token propagates through the whole interface.
Dock measurements were taken from the reference image published by Apple and scaled proportionally (reference: 110 px icon):
| Value | Ratio | Token |
|---|---|---|
| Icon size | 1.00 | dockIcon = 50 |
| Gap between icons | 0.327 | dockGap = 16 |
| Icon corner radius | 0.236 | dockIconRadius |
| Plate corner radius | 0.509 | dockPlateRadius |
| Horizontal padding | 0.291 | dockPadding = 14 |
| Vertical padding | 0.309 | dockPadY = 15 |
The vertical padding is equal at the top and the bottom; the indicator dot sits inside the bottom padding and does not require extra height.
The magnification curve is cosine-based: (1 - cos θ) / 2. This is the
curve reverse-engineered from macOS; linear scaling or smoothstep does
not give the same feel.
The dockCurve exponent determines how flat the skirts stay. At low
values neighboring icons react early; at high values only the icon under
the cursor grows.
The light and dark themes share the same token names; changing
Tokens.dark switches the entire interface. Glass surfaces are
semi-transparent and are tuned to work together with KWin's blur effect —
they look more opaque when blur is off.
This section records the constraints encountered during development that shaped the code. The decisions here are not arbitrary; read the reasoning before changing them.
ToplevelManager.toplevels is always empty — this protocol is specific
to wlroots and does not exist in KDE. Because of this:
- Running application detection is done from the process list (
ps). Since window ownership is unknown, background services can also appear. - Window operations (focus, close, hide) are done by loading a
temporary script into KWin. Killing processes (
pkill) cannot be used: theExecname in the.desktopfile often does not match the real process name, the pattern expands and other applications get closed too.
Process name matching is attempted in four ways: the full name, the form
truncated to 15 characters by ps, the first segment
(helium-browser → helium), and the last segment of the .desktop id
(org.kde.konsole → konsole).
The Genie (magiclamp) effect shrinks the window toward
Window.iconGeometry. This value is read-only and is only filled in from
the org_kde_plasma_window_management protocol. Without a target, the
effect goes to the cursor position.
The protocol is invisible in the Wayland registry — KWin hides it
behind a global filter. Its absence from wayland-info output gives the
impression that it was "not compiled in", but it can in fact be enabled:
add the key
X-KDE-Wayland-Interfaces=org_kde_plasma_window_management
to the application's .desktop file and run kbuildsycoca6. The Exec
path must be the real (canonical) path of the binary.
Two more subtleties: set_minimized_geometry requires a surface that
KWin recognizes (the helper opens its own layer-shell surface), and KWin
drops the geometry when the surface closes (the process must stay
running).
helper/README.md covers the build and installation details.
This API does not work in the package used (noctalia-qs). The
application list is built by scanning .desktop files directly.
There is no rounded rectangle for the blur region. It is built by combining two rectangles (horizontal + vertical body) and four corner ellipses. If a plain rectangle is used, square blur spill is visible at the bottom corners.
- If
scaleandtransformare defined together,scaleis ignored. If both are needed, they must be given in a singletransformlist. Behaviorcannot be placed on areadonly property.- A component cannot be instantiated inside itself; this is why
ContextMenuandMenuPanelare in separate files (the submenu uses the same panel a second time). - The
commandbinding ofProcessobjects may not yet see the object's other properties while it is being constructed; it is assigned explicitly insideComponent.onCompleted. - Changes to JS objects are not reported to QML. For dictionaries such as
entriesandlocalIcons, a separate counter (revision) is kept and bindings read that. nativeis a reserved word and cannot be used as a property name.
The dock layout is computed in a single pass and cached in layout. If
size and position are read from separate sources (one from the raw index,
the other from the sorted index), icons overlap.
There are two indexes and they must not be mixed up:
- raw index — the icon's place in the model; its size is read from this one
- sorted index (
order(i)) — the icon's visual slot; its position is read from this one
During dragging, the swap thresholds are taken from the fixed resting
positions. If they are bound to live values such as centerOf,
dropIndex feeds itself and icons land in the same slot during fast
movement.
Memory usage is ~140 MB (PSS), idle CPU 0.3%. About ~110 MB of that is Qt/Mesa's GPU context — the application code's share is ~20 MB. Shrinking the icons does not change this baseline; this has been verified by measurement.
The process scan runs at 1500 ms intervals when idle, and at 180 ms
intervals while an application is opening or closing. The scan result is
applied immediately inside Process.onExited; if it is deferred to the
next round, the response time doubles.
~/.config/aurora/dock.json
{
"removed": {}, // applications removed from the dock
"order": [], // the order chosen by the user
"extra": [] // applications added that are not in the default list
}Launching at login works separately: the application's .desktop file is
copied under ~/.config/autostart.
Files under assets/icons/ take precedence over the system theme. The
file name must match the .desktop id:
org.kde.konsole.png Terminal
aurora.trash.png Trash (empty)
aurora.trash-full.png Trash (full)
_blank.png empty macOS square that theme icons are placed into
Icons are scaled to 256 px; the dock displays at most 93 px.
Icons in macOS format come with their own squircle shapes and are drawn
directly. Icons coming from the system theme are placed inside the
_blank.png square, so the appearance stays consistent across the dock.
All rights reserved. Aurora can be used free of charge, but
redistribution, modification and commercial use are subject to
permission. See the LICENSE file for details.
The source code is present in the package because QML is an interpreted language and it is required for the software to run. Its visibility does not change the terms of use.
Assets are also out of scope. The copyright of the icons under
assets/ belongs to Apple Inc.
The SF Pro font is not included in the package. If it is installed on
your system Aurora uses it, otherwise it falls back to the openly
licensed Inter (hasSF in Tokens.qml).
Aurora is not affiliated with Apple Inc.





