sankalp d97477b2b9 refactor(network): replace nmcli with native D-Bus for Wi-Fi management
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.
2026-07-21 14:33:35 +05:45

Logo

Sparkles A hackable shell for Hyprland Powered by Fabric Sparkles

GitHub stars Hyprland Maintained Discord


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 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
    
  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

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 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.
V1.0.0
Latest
2026-07-12 12:39:17 +00:00
Languages
Python 91.3%
CSS 4.6%
C 1.9%
Shell 1.3%
Lua 0.6%
Other 0.3%