This commit fully migrates the Python network service away from external wlan0: connected to Amar 2GNet "MEDIATEK MT7921 802.11ax" wifi (mt7921e), 2C:98:11:76:9B:2B, hw, mtu 1500 ip4 default, ip6 default inet4 192.168.18.70/24 route4 192.168.18.0/24 metric 600 route4 default via 192.168.18.1 metric 600 inet6 2405:acc0:1306:351c:ac94:2135:f9a8:5c89/64 inet6 fe80::4057:8edd:a684:5e33/64 route6 fe80::/64 metric 1024 route6 2405:acc0:1306:351c::/64 metric 600 route6 default via fe80::1 metric 600 lo: connected (externally) to lo "lo" loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536 inet4 127.0.0.1/8 inet6 ::1/128 docker0: connected (externally) to docker0 "docker0" bridge, 0A:89:72:7F:4D:75, sw, mtu 1500 inet4 172.17.0.1/16 route4 172.17.0.0/16 metric 0 p2p-dev-wlan0: disconnected "p2p-dev-wlan0" wifi-p2p, hw enp2s0: unavailable "Realtek RTL8111/8168/8211/8411" ethernet (r8169), 40:C2:BA:53:D5:E4, hw, mtu 1500 DNS configuration: servers: 192.168.18.1 interface: wlan0 servers: fe80::1 interface: wlan0 Use "nmcli device show" to get complete information about known devices and "nmcli connection show" to get an overview on active connection profiles. Consult nmcli(1) and nmcli-examples(7) manual pages for complete usage details. subprocess calls, implementing native D-Bus communication for a more robust and integrated architecture. Key changes: - : - Implemented native D-Bus methods for , , and . - Updated to track , , and state. - Fixed a bug where D-Bus returned a tuple, preventing known networks from being parsed correctly. - : - Wired UI events to the new D-Bus connection methods. - Fixed a race condition in initialization where it missed the synchronous signal, leaving the UI permanently disabled. - Removed the early-return optimization in that was preventing the active CSS state from applying to already-known networks. - Cleaned up unused variables to satisfy linting and removed redundant blocks. - : - Removed the 5-second timeout hack, as the new D-Bus service properly fires callbacks upon connection success/failure. - Removed hardcoded WPA2 text to make the dialog security-type agnostic. - : - Cleaned up active state styling so only the SVG icon box highlights (using ) when a network is connected.
Home Screen:
Lock Screen:
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
-
Install dependencies:
paru -S uv fabric-cli-git uwsm cliphist slurp grim swappy wl-clipboard wtype libnotify playerctl matugen-bin 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 -
Clone and sync:
git clone https://github.com/S4NKALP/Modus ~/.config/Modus cd ~/.config/Modus uv sync -
Build App Switcher backend:
cd src/window/switcher/app-capture meson setup builddir meson compile -C builddir -
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 -
Start Modus:
cd ~/.config/Modus uv run start
Post Installation
- Install recommended Icon theme, GTK theme, and Cursor theme
- Source
config/hypr/modus.luain your Hyprland config - Lock screen bind: set to
uv run lock
Keybinds
| Key | Action |
|---|---|
Super + D |
Spotlight search |
Super + E |
Emoji picker |
Super + V |
Clipboard history |
Super + W |
Wallpaper browser |
Super + I |
Settings |
Super + L |
Lock screen |
Super + Z |
Screencapture toggle |
Super + S |
Screenshot region |
Alt + Tab |
Window switcher |
Alt + Space |
Keyboard layout switch |
Super + Shift + R |
Reload Modus |
Super + Shift + Y |
Reload CSS |
Alt + Shift + W |
Random wallpaper |
Configuration
Three TOML files in config/:
| File | Purpose | Reload |
|---|---|---|
config.toml |
Main settings (features, widgets, paths) | Restart |
mods.toml |
Custom panel buttons | Instant |
dock.toml |
Pinned dock apps | Restart |
You can also toggle most settings from the Settings window (Super + I).
See Configuration Guide for full reference.
Documentation
| Doc | What's inside |
|---|---|
| Installation Guide | Automated & manual install, dependencies |
| Configuration Guide | config.toml, mods.toml, dock.toml, keybinds |
| Styling Guide | Matugen colors, CSS customization |
| Architecture Overview | App Switcher C-backend, Spotlight engine, Services |
| Spotlight Plugins | Install/customize plugins, write your own |
| FAQs & Tips | Troubleshooting, shortcuts, live reload |
Custom Mods
Define panel buttons in config/mods.toml:
[Mods.terminal]
icon = "terminal.svg"
icon-size = 16
order = 1
on-clicked = "kitty"
icon— SVG filename insrc/assets/icons/icon-size— defaults to 16order— button position (lower = first)on-clicked— shell command on clickon-left,on-middle,on-right— per-mouse-button commandsoptions— dropdown menu entries (each withlabel+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.
