A desktop shell for Hyprland on Quickshell. Everything is a plugin: the bar, the widgets you add to it, every panel, every background service. A small fixed core starts the shell, hosts the surfaces and loads plugins, and each plugin ships with the check that proves it is built and handed what it asked for.
VGS needs Hyprland 0.56 or later, configured in Lua (~/.config/hypr/hyprland.lua), Quickshell 0.3.1 or later, node 18 or later, python3 and git. vgsh run checks them before it starts and names the first one that is missing or too old.
Install one of the two packages. The latest release:
yay -S vgsThe development version, built from main:
yay -S vgs-gitThe two packages conflict with each other and with v1's vgs-shell, so pacman offers to remove the one installed before.
install.sh installs VGS into your home directory: the tree in ~/.local/share/vgs, and vgsh in ~/.local/bin. It never uses sudo, checks every download against the release's SHA256SUMS, and names the package to install when a required tool is missing. Read it first: install.sh.
curl -fsSL https://raw.githubusercontent.com/vanillagreencom/vgs/main/install.sh | bash
# a pinned release, the development version, or removal
curl -fsSL https://raw.githubusercontent.com/vanillagreencom/vgs/main/install.sh | bash -s -- --version v0.1.0
curl -fsSL https://raw.githubusercontent.com/vanillagreencom/vgs/main/install.sh | bash -s -- --git
curl -fsSL https://raw.githubusercontent.com/vanillagreencom/vgs/main/install.sh | bash -s -- --uninstallvgsh self update updates a release install and the --git clone. --uninstall keeps your settings in ~/.config/vgs.
nix run github:vanillagreencom/vgs/v0.1.0 -- runEvery vgsh command works after --. To install VGS, add the flake's packages.<system>.default to your configuration, for x86_64-linux or aarch64-linux. The package puts Quickshell and the tools the core needs, the rows of config/requirements.json, on the PATH of vgsh. A plugin feature can need more tools, which its README names and vgsh plugin list reports as missing. Hyprland comes from your session, not from the package.
git clone https://github.com/vanillagreencom/vgs
vgs/bin/vgsh runvgsh self update fast-forwards the checkout.
Add this line to ~/.config/hypr/hyprland.lua:
hl.on("hyprland.start", function () hl.exec_cmd("vgsh run") end)The line needs vgsh on the PATH Hyprland starts programs with. When that PATH lacks ~/.local/bin, use the absolute path the install script prints. From a checkout, use the absolute path of bin/vgsh.
On its first run VGS adds one line to the top of hyprland.lua. That line loads the keys, border colours and blur rules VGS generates. vgsh hypr unwire removes it.
Fedora follows in 0.1.x through the COPR vanillagreen/vgs. Debian, Ubuntu, openSUSE, Gentoo and Void wait until their repositories carry Quickshell 0.3.1 and Hyprland with Lua configuration. Until then, the install script or a checkout works on them when you install those tools yourself.
- Everything is a plugin. A plugin is one directory with a manifest; the shell shows it on every surface it declares.
- One manifest format, judged once, with every field in docs/architecture/plugins.md.
- A Settings window,
SUPER+Mor the gear in the bar: every plugin with a page of its details, its settings and its keys, and a switch to turn it on or off. - A plugin manager on the command line:
bin/vgsh plugin list,enable,disable,validate,requirements, andadd <git url>,updateandremove. Install runs no code from the plugin and leaves it disabled until you enable it. It names the commands the plugin needs that are missing and, on a terminal, offers to install their packages.bin/vgsh doctorlists what VGS itself and every enabled plugin need, and what is missing. - Plugins never depend on each other. When the surface a plugin draws on is absent, that part is hidden and the rest keeps working.
- A validation sandbox that runs the whole shell inside a nested compositor and never touches your session.
- Hyprland keys and blur from plugins, and window borders in the theme's colours. Hyprland is configured in Lua only: the shell writes one Lua file, and one line in your
hyprland.lualoads it. A classichyprland.confis not supported.
| Plugin | What it does |
|---|---|
| Bar | The bar across the top of every screen, with its built-in workspaces and clock, and three sections for plugin widgets. |
| Settings | A window that lists every plugin and opens a page for each, with its details, settings and keys. SUPER+M or the gear in the bar opens it. |
| Themes | A bar button and a panel that list every theme package and apply one with a click, and the applied theme's wallpaper on every screen, with Previous and Next in the panel. bin/vgsh plugin enable vgs.themes adds the button to the bar. |
| Launcher | A search field over the screen that finds applications, menu entries and files. SUPER+SPACE opens it. |
| Notifications | The desktop notification daemon: notifications at the top of every screen, an Inbox and History panel, and Silence. SUPER+N opens the panel. |
| Gallery | Every component of the design system in every variant and state, to preview a theme. bin/vgsh ipc call shell summon panel vgs.gallery '{}' opens it. |
bin/vgsh runtakes the instance lock and starts one shell for the session.bin/vgsh restartrefuses while locked, then stops the recorded pid and relaunches through Hyprland. It returns after the new shell answers as the guarded instance.- The shell reads
config/shell.json, then your~/.config/vgs/shell.json, and enables the plugins those name. - Each plugin is shown on the surfaces it declares. A widget appears in the bar, a service runs with no surface.
bin/vgsh plugin disable <id>writes your file; the shell watches it and updates the screen. Disable keeps the plugin's placement and settings, so enable restores it as it was.- The shell writes
~/.local/state/vgs/hypr/vgs.luawith the theme's border colours and each enabled plugin's keys and blur rules, and reloads Hyprland when it changes. On its first run it addspcall(dofile, "…/vgs.lua")as the first line of~/.config/hypr/hyprland.luaif that file exists;bin/vgsh hypr wireandunwireadd and remove the line. Settings after that line win. See docs/architecture/hyprland.md.
~/.config/vgs/shell.json: which bar is active, which widgets sit in which section, which plugins are on.~/.config/vgs/theme.json: the theme, a document that overrides any design token every plugin reads: colours, fonts, spacing, radius and motion.- A widget's settings sit inline on its layout entry, for example
{ "id": "acme.weather", "units": "metric" }; every other plugin's sit on its row inplugins, for example{ "id": "vgs.bar", "clockFormat": "HH:mm" }. A change reaches the running plugin without a restart. - A plugin's Hyprland keys sit in
keyson its row inplugins, for example{ "id": "vgs.launcher", "keys": { "toggle": "SUPER+ALT+SPACE" } };nullunbinds a key. The Settings window writes both.
Read docs/architecture/plugins.md. An agent loads the vgs-plugin skill, which scaffolds a plugin from templates and checks it.
VGS is under the MIT licence: LICENSE. The bundled fonts, JetBrains Mono and Inter, are under the SIL Open Font License 1.1 (shell/assets/fonts/*-OFL.txt), and the Lucide icons under ISC (shell/Ui/icons/LICENSE). The package licence is MIT AND OFL-1.1 AND ISC.