Skip to content

Repository files navigation

Logo

SparklesA hackable shell for HyprlandPowered by FabricSparkles

GitHub starsHyprlandMaintainedDiscord


Home Screen:

fabric


Lock Screen:

fabric


Quick Start

curl -fsSL https://raw.githubusercontent.com/S4NKALP/Modus/macos/install.sh -o install.sh && bash install.sh

The interactive installer handles dependencies, builds C-extensions, and configures Hyprland.

Manual Installation

Click to expand manual install steps
  1. Install dependencies:

    paru -S uv fabric-cli-git uwsm cliphist slurp grim swappy wl-clipboard wtype libnotify matugen hypridle hyprsunset hyprpicker hyprshot gtk-session-lock awww otf-apple-sf-pro webp-pixbuf-loader cinnamon-desktop libmediaart acpi brightnessctl power-profiles-daemon at-spi2-core networkmanager network-manager-applet blueman pipewire libpulse gcc make pkgconf meson ninja wayland-protocols gobject-introspection gtk-layer-shell librsvg libqalculate appmenu-gtk-module libdbusmenu-gtk3 libdbusmenu-qt5 pciutils wf-recorder ffmpeg --needed
  2. Clone and sync:

    git clone https://github.com/S4NKALP/Modus ~/.config/Modus
    cd~/.config/Modus
    uv sync
  3. Build App Switcher backend:

    cd src/window/switcher/app-capture
    meson setup builddir
    meson compile -C builddir
  4. Build Global Menu shim:

    cd src/window/globalmenu
    gcc -shared -fPIC -O2 -o libmenu_button_shim.so libmenu_button_shim.c $(pkg-config --cflags --libs gtk+-3.0) -ldl
  5. Start Modus:

    cd~/.config/Modus
    uv run start

Post Installation

Keybinds

KeyAction
Super + DSpotlight search
Super + EEmoji picker
Super + VClipboard history
Super + WWallpaper browser
Super + ISettings
Super + LLock screen
Super + ZScreencapture toggle
Super + SScreenshot region
Alt + TabWindow switcher
Alt + SpaceKeyboard layout switch
Super + Shift + RReload Modus
Super + Shift + YReload CSS
Alt + Shift + WRandom wallpaper

Configuration

Three TOML files in config/:

FilePurposeReload
config.tomlMain settings (features, widgets, paths)Restart
mods.tomlCustom panel buttonsInstant
dock.tomlPinned dock appsRestart

Settings are organized into sections: [general], [dock], [panel], [switcher], [notification].

You can also toggle most settings from the Settings window (Super + I).

See Configuration Guide for full reference.

Desktop Widgets

Drop a .py file in config/desktop/ and it appears on your desktop instantly:

cp examples/desktop/example.py config/desktop/example.py

Edit positions in config/desktop.toml or drag widgets in edit mode (right-click → Edit Widgets).

nvim config/desktop/example.py # live reload, no restart needed
rm config/desktop/example.py # widget disappears within 2s

See Desktop Widgets Guide for full docs and examples.

Documentation

Note: These docs were written with the assistance of LLM tools. Some phrasing may reflect that.

DocWhat's inside
Installation GuideAutomated & manual install, dependencies
Configuration Guideconfig.toml, mods.toml, dock.toml, keybinds
Styling GuideMatugen colors, CSS customization
Architecture OverviewApp Switcher C-backend, Spotlight engine, Services
Spotlight PluginsInstall/customize plugins, write your own
Desktop WidgetsCustom desktop widgets, user widget system
FAQs & TipsTroubleshooting, shortcuts, live reload

Custom Mods

Define panel buttons in config/mods.toml:

[Mods.terminal]
icon = "terminal.svg"icon-size = 16order = 1on-clicked = "kitty"
  • icon — SVG filename in src/assets/icons/
  • icon-size — defaults to 16
  • order — button position (lower = first)
  • on-clicked — shell command on click
  • on-left, on-middle, on-right — per-mouse-button commands
  • options — dropdown menu entries (each with label + on-clicked)
  • Live reload — edits apply instantly

Spotlight Plugins

Drop a .py file in config/plugins/ and it works instantly:

cp examples/plugins/hello.py config/plugins/hello.py
# Hit Super+D, type "hi" — greeting appears

Plugin development with hot reload:

nvim config/plugins/hello.py
fabric-cli exec modus 'deep_reload hello'# no restart needed

See Spotlight Plugins for full docs and examples.

Global Menu Compatibility

Modus injects libmenu_button_shim.so only into GTK3 apps launched through Modus (dock, spotlight, panel). GTK4 apps are never touched.

For terminal-launched GTK3 apps, use a wrapper:

#!/usr/bin/env bash
SHIM=~/.config/Modus/src/window/globalmenu/libmenu_button_shim.so
BIN="$(command -v "$1")"if [[ -n"$BIN" ]] && readelf -d "$BIN"2>/dev/null | grep -q 'libgtk-3\.so\.0';then
LD_PRELOAD="$SHIM""$@"else"$@"fi

Save as ~/.local/bin/modus-launch, make executable, run GTK3 apps as modus-launch gedit.

Team

Special Thanks

  • darsh: for creating Fabric, which made everything possible.
  • gummy bear album: for sharing fantastic code snippets that saved me time and effort.
  • axenide: for the amazing config that not only inspired parts of mine but also provided some gems I couldn't resist borrowing.
  • E3nviction: for code snippets and ideas that were incredibly helpful.

Releases

Sponsor this project

Used by

Contributors

Languages