
window-motion
Wobble and tilt for spatial windows, driven through the public motion API.
View source ↗Extend your desktop
Explore real headless captures of every available plugin, alongside shipped defaults, optional native plugins, and the core modules they build on.
Shipped defaults
These ship as shared libraries and load automatically after config.lua when their build options are enabled. The plugin manager reports them as builtin = true. Safe mode disables their automatic loading.

Wobble and tilt for spatial windows, driven through the public motion API.
View source ↗
Loads OBJ environments, including authored collision geometry.
View source ↗Load what you need
Optional native plugins loaded explicitly through shady.plugins.load(). All entries below are repository examples, not a third-party directory. Most are built by ./tools/build.sh, but none are auto-loaded or installed by default.

A camera-aware sky and sea, four times of day, and sinking close animations.
Requires spatial + close-animation. Super+T cycles the hour.
shady.plugins.load("afterglow")View source ↗
Animated liquid surfaces on live windows.
Requires spatial. Super+W toggles the effect.
shady.plugins.load("water-windows")View source ↗
Moves focused and background windows through depth while preserving screen-space placement.
Requires spatial.
shady.plugins.load("focus-depth")View source ↗
A native 3D window overview that restores the original layout when closed.
Requires spatial. Avoid combining with other position writers.
shady.plugins.load("spatial-overview")View source ↗
Spring-docks nearby windows into spatial structures, with ABI v2 state migration.
Requires spatial. Super+M toggles docking.
shady.plugins.load("magnetic-windows")View source ↗
Orbits windows around the focused window and spring-restores their original layout.
Requires spatial. Super+C toggles the constellation.
shady.plugins.load("window-constellation")View source ↗
A refractive circular portal into another live Wayland window.
Requires spatial. Super+P toggles the portal.
shady.plugins.load("window-portal")View source ↗
Swallows workspace windows into a black hole and releases them through a white hole.
Requires spatial. Super+H toggles the effect.
shady.plugins.load("black-hole")View source ↗
Frost crystallises across a window and melts away again, without touching its layout or input.
Requires spatial. Super+Z freezes the focused window; Super+Shift+Z the workspace.
shady.plugins.load("frozen-window")View source ↗
Procedural sky, glass window representations, and animated spatial layouts.
Requires spatial. Includes shaders; the associated rice is archived.
shady.plugins.load("astral-loom")View source ↗
Cube-shaped window bodies for FPS interaction.
Requires fps. Choose one FPS representation plugin at a time.
shady.plugins.load("fps-cube")View source ↗
Animated squash representations for FPS window bodies.
Requires fps. Choose one FPS representation plugin at a time.
shady.plugins.load("fps-squash")View source ↗
Springy jelly window bodies for FPS interaction.
Requires fps. Choose one FPS representation plugin at a time.
shady.plugins.load("fps-jelly")View source ↗
Folded-paper mesh window bodies with convex collision geometry.
Requires fps. Choose one FPS representation plugin at a time.
shady.plugins.load("fps-folded-paper")View source ↗
Spring-driven origami meshes with compound collision bodies.
Requires fps. Choose one FPS representation plugin at a time.
shady.plugins.load("fps-origami")View source ↗
Toggles a per-window border accent on the focused window.
Super+B toggles the accent.
shady.plugins.load("border-accent")View source ↗
Replaces the default crumple close animation with a slide and fade.
Requires spatial + close-animation. Choose one close-effect plugin.
shady.plugins.load("close-slide-fade")View source ↗
Adds a shader-driven burn effect to closing windows.
Requires spatial + close-animation. Choose one close-effect plugin.
shady.plugins.load("close-burn")View source ↗
A fullscreen animated shader overlay using host-managed render hooks.
Includes external shader files.
shady.plugins.load("shader-overlay")View source ↗
Places the focused window in a primary slot with surrounding satellite windows.
Requires spatial. Build explicitly.
shady.plugins.load("orbit-layout")View source ↗
A minimal native plugin example for learning the entry and lifecycle APIs.
Build explicitly. Module name: hello-plugin.
shady.plugins.load("hello")View source ↗
A stateful example for testing ABI v2 reload and state migration.
Build explicitly. Module name: counter-plugin.
shady.plugins.load("counter")View source ↗Compositor foundation
Compiled into the compositor and selected with shady.module() or shady.modules(). Optional modules depend on your Meson build options; these are not shared-library plugins.
Desktop Wayland protocol integration.
Named workspaces, window membership, and visibility.
Shared 3D world, camera, and window depth.
Gravity, velocity, and spatial collisions.
First-person capture, grabbing, and expanded window bodies.
Per-window close animation lifecycle.
Scene rendering effects.
Runtime scripting, events, and key bindings.
Try a plugin
Add the load call to the config you launch with. Names resolve to libshady-plugin-<name>.so, including in the executable's build directory. Loading new plugins happens at startup; runtime Lua supports inspection, reload, and eligible unloads.
# From the repository root
nix develop
./tools/build.sh
# Examples marked "Build explicitly"
ninja -C build libshady-plugin-orbit-layout.so
# Keep shader assets available to shader-based plugins
export SHADY_ROOT="$PWD"
./build/shady -c examples/config.lua-- config.lua — load before module dependency resolution
shady.plugins.load("water-windows")
-- Optional: add a directory for your own plugins
shady.plugins.path("~/.local/share/shady/plugins")
-- Shipped defaults can be disabled here
-- shady.plugins.disable("obj-loader")