Repository navigation
Releases: waxdred/skyland
Release list
v0.6.0
Glyph style
[decoration] ui-style = 'glyph'(or Glyph in the settings window): a Nothing OS like look
for skyland's panels. Opaque panels in the theme's panel color on a faint dot grid, a thin
line around; numbers and titles in a dot matrix font (Doto: overview workspaces, switcher,
mode HUD, startup HUD, settings title), labels in Space Mono caps, text in Space Grotesk;
the one live thing (shown workspace, selection, startup runner) in the theme's highlight.- The wallpaper picker (alt-w) too: glyph panel, Space Mono names, Doto counts, the selection
outlined with the red dot. - Themes
glyph-darkandglyph-light: black, white dots, one red (#D71921), palette after
glyph-rice. The focused window border goes
white to red.theme.envgetsHIGHLIGHT(the red) for the bar. - Fonts bundled in Skyland.app (
resources/fonts, SIL OFL) and registered for skyland only:
nothing installed. The media widget keeps the metal look for now.
Monitors settings
- A Monitors tab in the settings window: the screens laid out as in Displays, each workspace a
chip to drag (or pick from its menu) onto a screen; written to
[workspace-to-monitor-force-assignment]and applied at once.
Config file: ~/.config/skyland/skyland.toml (or ~/.skyland.toml), no longer
~/.config/aerospace/aerospace.toml / ~/.aerospace.toml. skyland-env (run at login)
copies an existing ~/.config/aerospace/aerospace.toml there once; the old file stays for
AeroSpace. A clone's ~/.config/skyland may now be a real folder: the profile entries it
misses (themes...) are linked into it.
CLI: skyland-cli (.build/skyland-cli, was .build/aerospace), called through the
skyland command as before; its messages say skyland. The release keeps a copy at the old
path for sketchybar items of 0.5 until skyland bar rebuilds them. skyland-keys reads the
new config path.
Wallpaper colors
[wallpaper] dynamic-colors = falsestill generates the wallpaper colors on a wallpaper
change, without applying them:skyland-cyberdeck theme wallpaperkeeps using them.
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.5.0
No window lost
- Dock guard: the payload remembers the windows it made see-through, moved or darker, and
shows them again (alpha 1, real frame, no dim) when Skyland ends, a crash orkill -9
included. A Skyland gone mid-fade left windows invisible until it ran again. - A floating window found off screen is centered on its monitor: an app quit while its
window sat in a hidden workspace's corner reopened there, 1 px from the edge. tools/e2e-visibility.swift: switches, moves, closes and opens windows at random on two
spare workspaces and fails if one ends up off screen or see-through.docs/compatibility.md: what is checked on which macOS (27.0.1, 15.6.1), what an update
can break, how to check a version.
Faster
alt-wopens at once: the wallpaper picker stays running, hidden (22 MB), and a key shows
or hides it (about 85 ms, 180 to 255 ms before); it reads the folder, the theme and the
style again at each opening.- The menu bar icon is drawn on the CPU: each workspace switch allocated about 200 MB of
graphics memory for a second (25 MB now). - Workspace memory written 1 s after the last change, not on every refresh; the apps
showing a popup found once per decoration pass (it scanned every window for each one);
skylandbar's lock tested without taking it (a starting bar could exit as already running).
Switcher
- Opened with no modifier held (a script, the CLI): skyland comes forward so its keys work,
and it closes on a workspace change, a closed window or when another window takes the
keyboard. - Thumbnails of windows on hidden workspaces: their last picture, taken while shown.
Focus
- Focus follows the mouse only if the focus has not moved since the mouse did.
- A Dock click on the app already in front goes to its window, on whatever workspace.
- Sheets and dialogs stay opaque, and the windows of an app showing one (a save panel took
no clicks); System Settings and security windows stay opaque and undimmed. - Popups and alerts at the normal level stay over the windows.
Layout
- Profile:
cmd-shift-h/j/k/lswap with the neighbour (Hyprland movewindow). masteroff: the windows laid out again as dwindle, in the same order.fullscreen --no-outer-gapsstays below a bar taller than the menu bar.
Mouse
- alt + drag a tile onto another tile's edge (its outer quarter): it goes beside it on that
side, a preview of the place in the theme accent while dragging; the middle still swaps.
Startup
- A "starting" HUD (skyland's icon, the windows found, a running line) while skyland lays
the windows out, gone with a short scale and fade;[decoration] startup-hud = falseturns
it off.
Liquid Glass
glasspanels never use the metal engine (its screen capture blacked protected videos):
Apple's glass on macOS 26 and later, the backdrop blur before.- Protected videos (Netflix, Prime Video) play again: the metal glass takes snapshots of
what is behind instead of running a capture stream (macOS hides protected content while
one runs, and the media widget's never stopped). A new snapshot when the front app
changes, when the panel moves, and every 30 s. - The media widget's audio bars and wave read the system's audio from a Core Audio tap
(macOS 14.2), not a ScreenCaptureKit stream: protected videos went black as soon as they
played with the widget open. macOS may ask once to let Skyland record the system's audio. [decoration] glass-blur, also in the settings window.
Fixes
- An alpha track over, the window's opacity is sent again (a window could stay faded).
- Startup: windows put back to their real frame (a transform left by an animation); quit:
popups (bars, panels) are not centered with the windows. - The animated border is placed again after an unlock, a wake or a screen change.
- The media widget's audio tap starts off the main thread (it hung with a spinning cursor).
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.4.0
Liquid Glass
- skylandbar's glass in skyland's panels (
ui-style = 'glass'): lightly tinted glass, the
selection a lens of glass flowing on springs and leaving a drop behind, a lighter drop
under the mouse. The window switcher, the overview and the wallpaper / theme pickers use
it (GlassSurface); big blocks (cards, thumbnails) take a lens that slides in one piece,
with rounder corners. - The refraction stays within a shape's corner radius: it broke along the diagonal of the
corners. - No flash when a panel opens: Core Animation's glass stands in until the first capture,
which used to show the panel clear, then darker for a few frames. - Settings window in glass: the theme tint in the glass, under its rim, the save bar lightly
tinted. - Pickers: room around the thumbnails, whole ones only (none cut at the edge).
- Fixes: glass views added at 0 x 0 never grew (the media widget's glass was not drawn), the
capture did not restart after a drag, and the Metal texture cache kept every frame's
surface.
Media widget
- Its own drag from the mouse position: it no longer lags behind or keeps moving after the
button is released, and the audio wave keeps playing while it moves. - A defined glass edge (one rim, no hairline over it), radius 26.
skylandbar
subscribeeventworkspace-swipe: while a trackpad swipe moves,workspace,
targetWorkspaceandprogress. skylandbar's workspace lens follows the fingers.
Process name
- The process is named
Skyland(it wasAeroSpaceApp) in Activity Monitor, btop and
pkill -x Skyland; the app's executable isSkyland.app/Contents/MacOS/Skyland.
Fixes
- Quitting never waits for good on a window's frame: a window whose frame could not be read,
or an app that did not answer, left skyland stuck (no CLI, no keys,kill -9only).
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.3.0
Overview
- Typing searches the windows by app or title (
/for the letters the overview binds):
the others are dimmed, on the cards and behind; enter focuses the selection. - Keyboard selection of windows (
j/k, up / down, tab),enterfocuses it,xor a
middle click closes a window, the overview stays open. - A
+card: a window dropped there goes to the first empty workspace of the screen. - alt + drag a card onto another: the two workspaces swap their windows, layout and
floating windows included. - Pinned windows show on every card of their screen.
overview next|prev|confirm|close|searchcommand for[mode.overview.binding].
Login
- skyland starts skylandbar when it is installed (
~/.local/binor Homebrew) and not
running yet, at login too: a new session came up without a bar (the login LaunchAgent
only starts skyland, and launchd kills what a LaunchAgent leaves running). skyland
starts either way.
Safety
- skyland quits at once when its Accessibility permission is taken back while it runs:
its active event taps (alt + mouse, arrow keys) froze every key and click until a
forced reboot.
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.2.0
Animations
- Hyprland's animation system:
[animations] preset = 'hyprland' | 'slide' | 'gnome' | 'vertical' | 'cyberspace'(or several stacked,['cyberspace', 'gnome']: the later
one replaces the nodes it sets), andbezier/animationlines pasted from a hyprland.conf
(tree with inheritance, named curves,slide,slidevert,popin,gnomed,fade,
slidefade, and skyland'scyberspacethat rezzes windows in through a white-hot scan
line). Window open, close, move, workspace and scratchpad switches play as tracks in
the Dock payload; the older keys keep skyland's look. Preset choice in the settings
window. Needs the payload (skyland sa build,killall Dock; skyland sa load).
Liquid Glass
[decoration] ui-style = 'metal' | 'glass'(also in the settings window): skyland's
panels (overview, window switcher, mode and on / off HUDs, settings window, wallpaper
picker, media widget) in Liquid Glass, the engine of skylandbar: Apple's glass on macOS
26, a refraction shader with Screen Recording, Core Animation's backdrop otherwise.
metalkeeps the theme tinted blur.
Bar height
bar-height <px>|defaultcommand: a bar (SkylandBar, sketchybar) sends its own height
over the socket and the windows are laid out below it, over the config'sbar-height
(defaultgoes back to it, no argument prints the height in use). The hypr profile's
sketchybar sends it at every load.
Border
- The animated border hides while a window is dragged or resized with the mouse (title
bar, edges, or the mouse modifier) instead of lagging behind it, and comes back at
mouse up.
Binding modes
mode-indicator = 'hud' | 'bar' | 'off': a mode other thanmain(Hyprland submap)
shows its name and keys in a HUD, or in theskyland.modesketchybar item with a
skyland_modeevent (MODE=<name>). Exampleresizemode onalt-shift-rin the hypr
profile.
Window switcher
switcher [next|prev] [--workspace focused|all](alt-backtick): windows of every
workspace, most recently focused first, with live thumbnails (app icons without Screen
Recording). Held likecmd-tab, releasing the modifier focuses the selection;
switcheralone stays open and filters as you type. Thumbnails freed on close.
Window rules
window-rulecommand, Hyprland's windowrule v2 foron-window-detected:size/
move(points or % of the screen),center,opacity <active> [<inactive>],
rounding,noborder,nodim,noanimper window. Editable in the Rules tab
("More").
Shadows
[decoration] shadow = 'on' | 'off' | 'floating': macOS window shadows off, or only on
floating windows (Hyprlanddecoration:shadow); each window gets its own shadow back
when skyland is turned off or quits. Needs the payload (skyland sa build, then
killall Dock; skyland sa load).
Smart gaps, workspace rules
smart-gaps/smart-border: a workspace's single tiled window fills the screen
below the bar, without border nor rounded corners (Hyprlandw[tv1]rules, formerly
no_gaps_when_only); switches in the settings window.[workspace-rules.<name>]:gaps.outer,gaps.innerandlayout = 'master' | 'dwindle'
per workspace.
Pin
- New
pin [on|off|toggle]command (Hyprlandpin,alt-ctrl-p): a floating window
stays on screen at the same place on every workspace of its monitor (picture in
picture, a call, a timer), remembered across restarts,%{window-is-pinned}.
Trackpad
[gestures] workspace-swipe: a 3 (or 4) finger swipe switches the screen under the
cursor to the previous / next workspace (Hyprlandworkspace_swipe), with distance,
threshold, direction and invert options, a Trackpad section in the settings window,
and askyland doctorcheck for the macOS gesture using as many fingers.- The windows follow the fingers: the current workspace's tiles slide with the swipe and
the next one's come in from the edge; let go past the threshold and the switch goes
on from there, before it they spring back (rubber band past the last workspace).
Scratchpads
- New
scratchpad toggle [name] [--app <bundle id>] | move [name]command: the
scratchpad windows slide in from the top, floating and centered, and slide back up;
done inside skyland (a toggle took 6 to 10 CLI processes, an app start polled the CLI
up to 40 times).skyland scratch …still works. Your config: bind
alt-s = 'scratchpad toggle'instead ofexec-and-forget skyland scratch toggle
(same formoveand named ones) to skip the process.
Performance
- Skyland.app and the
aerospaceCLI are built in release mode (they shipped as
debug builds): half the CPU for a workspace switch, faster CLI queries (sketchybar,
scripts). The CLI moves to.build/aerospace;bin/skyland-build --debugfor
development. - Input: alt + drag no longer runs a refresh per mouse event (one at the drop),
focus follows mouse does nothing while the cursor stays over the focused window,
and the key / mouse taps run on their own thread, so typing and clicking in other
apps never wait for skyland. - sketchybar: skyland pushes the workspaces and the window title itself, with one
sketchybarcall when they change, instead of a script with ~20 processes and 4
CLI calls on up to 3 events per change. CLI queries (list-*,config,echo)
no longer run a refresh session. Your config: drop
exec-and-forget sketchybar --trigger skyland_updatefromon-focus-changedand
theexec-on-workspace-changeline (they still work, but cost for nothing). - Animations: the Dock payload steps every running animation (slides, fades, dim)
in one loop synced to the display, and applies each frame of all windows in one
SkyLight transaction: the windows of a workspace switch move together, without
judder, and one thread instead of one per window. Several payload commands go in
one connection. Needsskyland sa buildthenkillall Dock; skyland sa load. - Idle: skyland no longer polls the window list all day (the menu bar check runs
only while the cursor is near the top of a screen, the system prompt check on app
activation and once a second), reads the theme once per change, and decorates
once per command: about 0.2% CPU at rest instead of 0.7%. - Media widget: no work while nothing plays (the 30 fps timer stops once the wave
is flat, and while the widget is hidden), the now playing check backs off to 15 s
when paused, the artwork is decoded once per track, and the audio analysis no
longer wakes the main thread ~100 times a second. - Media widget
audioware: the wave is drawn with Metal on the GPU (blur too) instead
of Core Graphics bitmaps: about 9% CPU while playing instead of 21%, the same look.
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.1.9
Performance
- Media widget
audiowarestyle: about 26% CPU instead of 38% while playing (each
plane of the wave drawn into its own bitmap, the blurred planes repaint at 15 fps,
the wave shape is capped at 260 points).
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.1.8
Media widget
- New
audiowarestyle ([media] style = 'audioware'): a light wave after the
Audioware cover art, driven by the audio (flat when silent, the center line is the
progress), in the theme's colors, live. - Fixes: play / pause and a new track or video are always picked up (the now playing
stream could go silent), a non-square artwork (video thumbnail) fills its square
instead of showing grey bands, leftover background helpers are cleaned up.
cyberdeck
alt-shift-dopens the skyland-cyberdeck
HUD (clock, calendar, connections, system, herdr agents), needs skyland-cyberdeck 0.2.0.
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.1.7
Performance
- Memory: skyland uses about 42 MB instead of 137 MB with the rotating border on
(its gradient is computed at a quarter of the resolution, the stroke stays sharp), and
the workspace overview frees its thumbnails and full-screen panel when it closes
instead of keeping them all day (stable around 76 MB after using it).
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.1.6
Fixes
- alt + mouse works again on the focused window with the rotating border on (the
border window was taken for the window under the cursor).
Docs
- New README demo: rotating border, dim inactive, alt + mouse.
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.
v0.1.5
Hyprland
- Dim inactive windows (
[decoration] dim-inactive, percent, also in the settings
window): unfocused windows are darkened, fading with focus. Needs the Dock payload
rebuilt (skyland sa build && skyland sa load). - Rotating border (
[decoration] border-rotate-ms, Hyprlandborderangleloop): the
focused window border gradient turns. skyland draws it itself, rotated by Core
Animation (no measurable CPU); hidden while windows animate and in the overview.
Install
skyland sa loadoffers to write the sudoers rule (payload injected at login without
a password) and renews it after each rebuild of the payload.
Docs
CONTRIBUTING.mdfor the fork.
Known issue: with border-rotate-ms on, alt + mouse does nothing on the focused window. Fixed in v0.1.6.
Install: brew install waxdred/tap/skyland && skyland install, or download the zip and run bin/skyland-install.