Skip to content
Notifications You must be signed in to change notification settings

Stef-00012/ags-desktop-shell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0522f65 · · Aug 27, 2025

History

84 Commits
Aug 27, 2025
Jul 4, 2025
Jun 29, 2025
Aug 18, 2025
Aug 27, 2025
Jul 4, 2025
Jul 4, 2025
Jul 4, 2025
Aug 27, 2025
Jun 30, 2025
Aug 10, 2025
Jul 4, 2025
Aug 27, 2025
Jun 25, 2025
Jun 20, 2025
Aug 27, 2025
Jun 29, 2025
Jun 29, 2025
Aug 13, 2025
Jun 20, 2025

Repository files navigation

This is my linux custom desktop shell.

Features

https://i.stefdp.com/raw/yxrB0y2qvw74.mp4

  • Bar

    • CPU - See the general load and each core's load (on hover)
    • Disk - See the available and used disk space (on hover)
    • RAM - See the available and used RAM & Swap (on hover)ver)
    • Battery - See the percentage, power drain and time to empty/full of the battery (on hover)
    • Time - See current hour, year & month (on click) and calendar (on right click)ick)
    • Media Icon - The cover url of the playing media on Spotify
    • Media Metadata - The Spotify song name & arist, and album & volume (on hover)n hover)
    • Media Lyrics - The spotify song line-synced lyrics when available (sourced from Musixmatch and lrclib.net)
    • Speaker - Volume and device name (on hover)
    • Micrphone - Volume and device name (on hover)
    • Network - Wifi or ethernet info
    • Notifications - Notification count and center (on click)
    • Tray - Tray apps
    • Power - Power actions (see session menu)
  • Notification Daemon

    • Notification popup
    • Notification center
  • OSD:

    • Speaker volume %
    • Microphone volume %
    • Screen brightness %
  • Launcher

    • Apps
    • Calculator
  • Session Menu

    • Lock Screen
    • Sleep
    • Logout
    • Task Manager
    • Hibernate
    • Shutdown
    • Reboot
    • Reboot to Firmware (UEFI/BIOS)

Required Libraries

Important

ags is required to run the desktop shell.

How to run

Important

You must be on Linux with Wayland & have the layer shell protocol enabled.led.

  1. Clone this repository and move its contents to ~/.config/ags
  2. Install all the required libraries
  3. just run ags run

An example for NixOS can be found here.

Configuration

The desktop shell can be configured by creating the ~/.config/stef-shell/config.json file

the avaible properties are:

  • paths.musixmatchToken (string): The path where to store the musixmatch cookie, usertoken and expiration date (default: /tmp/musixmatch_token.json). 1 2

  • paths.backlightBaseDir (string): The path where the backlight data for all devices is stored (default: /sys/class/backlight). 1

  • paths.saveFolder (string): The folder where to save lyrics and song icons when middle clicked (default: $HOME/Music/spotifyData). 1

  • paths.lyricsFolder (string): The path where the local lyrics files will be stored (default: $HOME/.config/stef-shell/lyrics). 1

  • volumeStep.media (number): Percentage of volume increase/decrease when scrolling on the media module (default: 0.05). 3

  • volumeStep.microphone (number): Percentage of volume increase/decrease when scrolling on the microphone module (default: 0.05). 3

  • volumeStep.speaker (number): Percentage of volume increase/decrease when scrolling on the speaker module (default: 0.05). 3

  • animationsDuration.notification (number): How long the notification animation should last (default: 500). 4

  • animationsDuration.launcher (number): How long the launcher animation should last (default: 300). 4

  • animationsDuration.notificationCenter (number): How long the notification center animation should last (default: 500). 4

  • animationsDuration.osd (number): How long the OSD animation should last (default: 300). 4

  • animationsDuration.sessionMenu (number): How long the session menu animation should last (default: 300). 4

  • animationsType.notification (string): The notifications animation type (default: SLIDE_LEFT). 5

  • animationsType.launcher (string): The launcher animation type (default: CROSSFADE). 5

  • animationsType.notificationCenter (string): The notification center animation type (default: SLIDE_LEFT). 5

  • animationsType.osd (string): The OSD animation type (default: CROSSFADE). 5

  • animationsType.sessionMenu (string): The session menu animation type (default: CROSSFADE). 5

  • timeouts.osd: How long the OSD should last before disappearing (default: 3000). 4

  • timeouts.defaultNotificationExpire: How long a notification should last before disappearing (default: 5000). 4 6

  • sessionMenu.buttonWidth (number): How large should a button be in the session menu (default: 120). 7

  • sessionMenu.buttonHeight (number): How high should a button be in the session menu (default: 120). 7

  • sessionMenu.buttonGap (number): How large should the gap between buttons be in the session menu (default: 120). 7

  • mediaMaxLength (number): How many characters should be displayed in the media bar module before it would start scrolling (default: 25). 8

  • systemStatsUpdateInterval (number): How often system stats (CPU, Disk, RAM etc.) should be updated (default: 1000). 9

Suggested Hyprland Config

windowrules:

  • float, class:^(gjs)$ (float normal desktop shell windows)
  • noblur, class:^(gjs)$, title:^(?!AGS Session Menu$).* (remove the blur to normal desktop shell windows (except for session manager))
  • noanim, class:^(gjs)$ (disable the animations normal desktop shell windows)
  • pin, class:^(gjs)$, title:^(AGS Notification Center)$ (pin the notification center so it always stays in the active workspace)
  • pin, class:^(gjs)$, title:^(AGS Session Menu)$ (pin th session menu so it always stays in the active workspace)

layerrules:

  • noanim, gtk4-layer-shell (disable the animations layered desktop shell windows)

Local Lyrics

For local lyrics to work for a song you must follow these steps:

  1. Copy the song's track ID (right click the media module while it's playing that song)
  2. Create a file .lrct;.lrc in your lyrics folder (default is $HOME/.config/stef-shell/lyrics, can be configured through the config.json file)
  3. Add the lyrics in that file, for it work correctly it must follow this format: [mm:ss.ms] Lyric here (example: [01:34.819] Lyric here) mm = minutes (padded, so 1 => t; 01) ss = seconds (padded, so 1 => t; 01) ms = milliseconds (padded, so 1 => t; 001)

Credits

Icons inside the icons folder are from Material Symbols

Footnotes

  1. Must be an absolute path 2 3 4

  2. Must be a .json file

  3. Must be between 0 and 1, 0.01 = 1% 2 3

  4. Must be greater or equal to 0 and defined in milliseconds 2 3 4 5 6 7

  5. Must be one of CROSSFADE, NONE, SLIDE_DOWN, SLIDE_LEFT, SLIDE_RIGHT, SLIDE_DOWN, SWING_UP, SWING_LEFT, SWING_RIGHT, SWING_DOWN 2 3 4 5

  6. A notification can override this expire timeout by specifying an own expiry time (example: notify-send "hello" -t 10000 would last 10 seconds even if the timeout is 5 seconds)

  7. Must be greater than 0 and defined in px 2 3

  8. Must be greater than 0

  9. Must be greater than 100 and defined in milliseconds