Panacea Shell # Panacea Shell **One pill for everything.** A Hyprland desktop where the whole shell is a single capsule at the edge of the screen. Arch Linux Ubuntu Debian Fedora Hyprland Niri Quickshell Fish MIT
--- No bar, no tray, no scattered popups. Wi‑Fi, Bluetooth, power profiles, the launcher, notifications, the media player, a file manager, a password manager, the power menu and the settings all live inside one pill that morphs into whatever you asked for and flows back when you're done. It hugs its screen edge with two concave corners, like a hardware notch: no floating rectangle, no gap, no border — only the content changes. The island can sit at any edge — top, bottom, left or right — and always opens towards the centre of the screen. At the side edges it turns vertical and stacks its text letter under letter, so nothing has to be read with a tilted head. ## Demo https://github.com/user-attachments/assets/854260b8-e96e-4773-8267-2decab779d6e A short tour recorded with the pill's own screen recorder. The same clip is committed as demo.mp4; the link above is GitHub's own upload, since it only plays videos inline when they come from its editor rather than from a file in the repository. ## Pages Every panel is the same capsule at a different size, so the whole shell shares one geometry, one palette and one animation timeline. | Page | Opens with | What it does | |---|---|---| | Quick settings | `Super + Z` | Wi‑Fi, Bluetooth, sound, now playing with transport and seeking straight on the equaliser, recorder, battery, passwords, tray | | Networks / Bluetooth | `Super + Shift + W` / `+ B` | Scan, connect, pair | | Notifications | `Super + Shift + N` | Live cards that open what they are about, one history list, do‑not‑disturb | | Wallpapers | `Super + Shift + T` | Full‑screen carousel with parallax previews, stills and live video | | Workspaces | `Super + Tab` | Live previews of every workspace, switch from the grid | | Launcher | `Super + A` | App search + calculator, recents first; also the agent panel and the other systems on the disk | | Launchpad | `Super + G` | Every app as a full-screen grid over the blurred desktop; drop an app on another to make a folder, right-click for the same actions. Layout lives in `~/.local/share/panacea/launchpad.json` | | Clipboard | `Super + V` | Smart clipboard: automatic detection of HEX colors (swatch preview & RGB/HSL copy), URLs (open in browser), files/images (thumbnails), and pinned snippets | | Files | `Super + E` | Bookmarks, disks, sorting, trash, context menu, drag between windows | | Media | opens a file | Images, GIFs, video — trim and crop | | Recorder | `Super + P` | FPS, folder, system audio, microphone | | Passwords | `Super + Shift + P` | Encrypted vault, browser import, save prompts | | Battery | from quick settings | Power profiles, charge state, capacity and wear | | Lock screen | `Super + L` | Lock current session (or `Mod + Alt + L` on Niri) | | Power | `Ctrl + Alt + Del` | Sleep, lock, log out, restart, shut down | | Settings | `Super + I` | Pill, system, displays, keys — with live mock‑ups | | Shortcuts | `Super + /` | Every binding in one place, rebindable | Hovering the pill opens it too — the player if something is playing, quick settings otherwise. Every page closes with the same key, `Escape`, or a click outside. Collapsed, it shows day, clock, workspace, layout and battery. ### Nothing OS Desktop Widgets Minimalist desktop cards that live directly on your wallpaper (`Super + I` → *Appearance* → *Desktop widgets*): - **Nothing Analog Clock**: Signature 12-dot dial with cardinal points, double dot at 12 o'clock, clean white hands, and an orbiting red accent second hand (`colCrit`). Click to toggle between Analog and Digital Dot Clock. - **Concentric System Monitor**: Dual concentric minimalist arcs (outer ring for RAM %, inner ring for root SSD %) with dot-matrix percentage in the center. Click the card or icon to toggle between Weather details and the System monitor. - **Life Bar / Day & Year Progress**: A 24-segment dot bar representing the hours of the day (elapsed hours in solid white, current hour pulsing red, future hours dimmed) and time remaining. Click to switch between 24-hour Day Progress and 365-day Year Progress. **Settings** has twelve sections, searchable from the top of the panel: *Bar & Island* (a mock‑up of your desktop with the real island on it, its screen edge and geometry), *Media*, *Clock & Date*, *Appearance* (palette, fonts, interface language), *Motion*, *Launcher*, *Notifications*, *Control Center* (the quick settings tiles, rearranged by dragging), *Lock Screen*, *Display* (resolution, refresh rate, scale, orientation, VRR, multi‑monitor arrangement, brightness and digital vibrance), *Mouse* and *System*. ## Dual boot If this machine has more than one operating system on it, three separate things here know about that. **The boot menu is themed.** `grub/panacea/` is a GRUB theme in the same language as the island — the wallpaper, a capsule highlight on the selected entry, nothing else. The installer copies it to `/boot/grub/themes/panacea`, points `/etc/default/grub` at it and regenerates the config. Skip it with `--no-grub`. **Other systems are made to show up.** Arch disables `os-prober` by default, which is why a fresh GRUB config often lists only Linux and quietly loses the Windows that is still sitting on the disk. The installer sets `GRUB_DISABLE_OS_PROBER=false` when `os-prober` is installed, and says so if it is missing. **You can restart into another system from the launcher.** Open it, type `windows` — or whatever the system is called — and press Enter. There is no fixed list of two: `panacea/scripts/bootos.sh` finds what is actually there, so three systems give three entries and one system gives none at all. Names are tidied for reading, so `Windows Boot Manager (on /dev/nvme0n1p1)` becomes `Windows`, while distributions keep their versions. The choice is **one‑shot**: it sets the next boot only, through `grub-reboot` (or `BootNext` in EFI variables when GRUB is not the bootloader). Your default system does not change, and the boot after that comes back here. Touching the bootloader needs root, so `pkexec` asks for a password — that prompt is also the confirmation, which is why there is no separate "are you sure". These entries never appear in an empty launcher and are never remembered as recent: a line that reboots the machine should not sit one careless Enter away from the browser. > [!NOTE] > A theme that copies successfully and a config that regenerates without error > can still both be ignored. The `grubx64.efi` image carries a **prefix** inside > it — the directory it reads the config, modules and themes from — and if that > points somewhere else, everything above lands in a folder the bootloader never > opens. Nothing reports an error; the menu simply never changes. The classic > case is an ESP mounted at `/boot` over a non‑empty directory, leaving the > prefix pointing at the old `/boot/grub` now hidden under the mount point. The > installer checks for exactly this after regenerating and prints the fix: > `sudo grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB`. ## Colours and wallpapers There is **one palette** for the whole system, in `hypr/palette.conf`. `hypr/scripts/palette.sh` spreads it across the terminal, btop, fish, neovim and the login screen. Changing the wallpaper never touches the colours — and never touches a file that Hyprland sources, so your windows are left alone. ## What's inside | | | |---|---| | **Compositor** | [Hyprland](https://hyprland.org) (primary, Lua config) · [Niri](https://github.com/YaLTeR/niri) (scrollable-tiling, beta) | | **Shell** | [Quickshell](https://quickshell.org) — the pill, in QML | | **CLI** | Fish + eza + zoxide | | **Terminal** | [foot](https://codeberg.org/dnkl/foot), as a server — `foot --server` starts with the session and `footclient` opens windows instantly | | **Lock / wallpaper** | the pill's own lock screen, hyprpaper, hyprsunset | | **Boot / login** | GRUB theme, SDDM theme — both matching the palette | The pill is also the notification daemon and the polkit agent, so don't run `mako`, `dunst` or `hyprpolkitagent` alongside it. Only one process can own `org.freedesktop.Notifications`, and the rival never has to be launched to win — D‑Bus starts it on the first notification, and from then on it draws them in its own window instead of the island. The installer masks `dunst` and `mako` for that reason; `systemctl --user unmask dunst.service` puts one back. ## Install these dotfiles > [!TIP] > **Cross-Distribution Support (Ubuntu, Debian, Linux Mint, Fedora, openSUSE, Arch)** > The installer automatically detects your distribution and package manager (`pacman`, `apt`, `dnf`, `zypper`). > Running on Ubuntu, Debian or Linux Mint? See [**docs/other-distros.md**](docs/other-distros.md) for build instructions, dependencies, and compatibility notes. > [!NOTE] > **Experimental Niri Support** > Panacea features dual-compositor support: while **Hyprland** is the default, fully supported compositor, preliminary integration for the **[Niri](https://github.com/YaLTeR/niri)** scrollable-tiling compositor is now available in `niri/`. The shell automatically detects Niri at launch via `$NIRI_SOCKET` and switches its IPC hooks accordingly. > *Notice:* Niri support is experimental and actively being refined. Certain features (such as layer blur, screen shaders, and specific gesture transitions) are Hyprland-specific, and you may encounter minor edge cases or glitches under Niri. If you use Niri, your personal overrides belong in `~/.config/niri/custom/custom.kdl` so they are preserved across updates. > [!WARNING] > **The installer is young.** It has been run on a handful of machines, mostly > the author's. It backs up everything it replaces as `*.bak-`, but > mistakes are still possible — back up your own `~/.config` first, and read the > flags below before running it on a setup you care about. ```bash git clone https://github.com/EnsixD/Panacea.git cd Panacea ./install.sh ``` The script checks the dependencies, then checks for an AUR helper — `yay`, `paru` or `pikaur`. If you have one it says which and moves on; if you have none it offers to build `yay-bin` there and then, since `quickshell` itself lives in the AUR. Declining is fine: everything from the repos still installs. It then backs up anything it would overwrite, copies the configs, enables Bluetooth / power‑profiles / iwd, spreads the palette across the applications, restores the wallpaper and warms up its thumbnails. It then offers, one prompt at a time: the wallpaper pack (300+ wallpapers bundled in `wallpapers/`), the GRUB boot theme and the SDDM login theme. Flags: `--no-deps`, `--no-sddm`, `--no-grub`, `--no-services`, `--no-wallpapers`, `--no-restart`, `--yes`. ### Updating Panacea checks GitHub for new commits on its own and offers an **Update** button in *Settings → System*. If your copy predates that — it was installed before the updater existed, or `~/.config/panacea/.version` is missing — run the updater by hand once: ```bash curl -fsSL https://raw.githubusercontent.com/EnsixD/Panacea/main/panacea/scripts/update.sh | bash -s apply ``` No reinstall, and nothing to do to Hyprland itself. The script clones the repo, carries your `settings.json`, your keybindings, your wallpapers and anything you put in `panacea/assets` across the install, reinstalls the configs, records the version and restarts the shell. Packages, the login theme and the boot theme are left alone — those are installed once. From then on updates arrive through the button. Prefer to do it by hand? Copy `panacea hypr foot fish fastfetch nano` into `~/.config`, `nano/nanorc` to `~/.nanorc`, `bin/*` to `~/.local/bin`, then run `hypr/scripts/palette.sh`, `hypr/scripts/switch_theme.sh --restore` and `hyprctl reload`. The real config is `hypr/hyprland.lua` with the modules under `hypr/lua/`. `hypr/hyprland.conf` beside it is a fallback for Hyprland versions that cannot read Lua configs: they would otherwise come up bare — no bindings, no pill, no way to open a terminal. It carries only the essentials and makes no attempt to mirror `lua/`; if something is missing there, the answer is to update Hyprland. Networking supports both **NetworkManager** (`nmcli`, standard on Fedora / Ubuntu) and **iwd** (`iwctl`, common on minimal Arch). Panacea detects the active daemon automatically — no manual configuration required. Power profiles go through `power-profiles-daemon` over D‑Bus. Everything resolves `$HOME` at runtime — no hardcoded paths. ### Language Choose a system locale in **Settings → Appearance**. Panacea's interface has built-in Russian, English and Turkish translations. For any other system locale, the Panacea interface uses English while applications use the selected locale after the next login. There is no online translation service or API key. If you would like another interface language, please open a GitHub issue with the language and locale code so it can be added to the built-in translations. ### Customising and keeping changes across updates Panacea is designed so your personal tweaks — shell aliases, terminal fonts, window rules, keybindings — survive all updates without conflicts or overwrites: | Component | Where your custom settings live | Kept on update? | |---|---|:---:| | **Hyprland** | `~/.config/hypr/custom/` (`custom.conf`, `keybinds.conf`, `rules.conf` or `custom.lua`) | ✅ Yes | | **Terminal (foot)** | `~/.config/foot/custom.ini` (or edits in `foot.ini`) | ✅ Yes | | **Shell (fish)** | `~/.config/fish/custom.fish`, `custom/*.fish`, and `fish_variables` | ✅ Yes | | **Niri** | `~/.config/niri/custom/custom.kdl` (and `config.kdl`) | ✅ Yes | | **Fastfetch** | `~/.config/fastfetch/config.jsonc` or `custom.jsonc` | ✅ Yes | | **Nano** | `~/.nanorc` (existing file is never overwritten) | ✅ Yes | | **Panacea** | `~/.config/panacea/settings.json` (merged with defaults via `jq`) | ✅ Yes | | **Clipboard pins and Wi-Fi history** | `clipboard_pins.json` and `last_wifi_ssid` in `~/.config/panacea/` | ✅ Yes | | **Post-update hook** | `~/.config/panacea/custom/post-update.sh` (executed after update) | ✅ Yes | As an extra safety net, the updater backs up modified configurations to `~/.config/.bak-update` before applying changes and retains two earlier update snapshots. Files owned by the shell, such as `panacea/shell.qml` and `hypr/lua/keybindings.lua`, are replaced to deliver code updates. Put durable overrides in `settings.json` or the `custom/` directories above; a direct edit to an owned file remains in the `.bak-update` copy for manual recovery. ### Voice to text Hold **Right Alt**, speak, let go — the recognised text lands in the focused field. It runs offline through [voxtype](https://voxtype.io); the installer sets it up, but the speech model is a separate ~1.5 GB download. If dictation does nothing, the model is what's missing — the one used here is Whisper **medium**: ```bash mkdir -p ~/.local/share/voxtype/models curl -L --progress-bar \ https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin \ -o ~/.local/share/voxtype/models/ggml-medium.bin curl -sL \ https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-silero-vad.bin \ -o ~/.local/share/voxtype/models/ggml-silero-vad.bin systemctl --user restart voxtype ``` The second file is the Silero VAD model — it drops silence and background noise, and transcription stalls without it because the config enables VAD. A smaller model is fine too (`ggml-small.bin`, `ggml-base.bin`); set the name in `model = ` under `[whisper]` in `~/.config/voxtype/config.toml`. ## Layout ``` panacea/ the pill: QML, scripts, settings.json hypr/ Hyprland (Lua config, palette, wallpapers, scripts) wallpapers/ bundled collection of 300+ wallpapers niri/ Niri (config.kdl, custom overrides, scripts) grub/ boot theme + the script that generates its assets sddm/ login theme bin/ standalone helper scripts fish/ shell config and prompt foot/ terminal applications/ desktop entries that make the shell the default handler fastfetch/ nano/ ``` Nothing on a fresh Arch install decides what opens a file, so the fallbacks decide instead: images end up in the browser and folders in a KDE file manager that is not otherwise used here. The installer fixes that by pointing images, video and directories at the shell's own viewer and file manager — they reach the running instance over its IPC rather than starting a second copy — and leaves the browser handling what belongs to a browser. Set them by hand with `xdg-mime default`, or skip the whole step by not running the installer. Shortcuts live in `panacea/settings.json` and compile into `hypr/lua/binds_data.lua` from the settings panel; that generated file is gitignored, and without it the defaults in `keybindings.lua` apply. Every ordinary Hyprland shortcut, including workspace switching and window movement for desks 1–10, can be changed in **Super+/**. Mouse, media, and lid bindings accept a typed Hyprland combination in the same editor. Keyboard layouts and switching options live in **Settings → Devices → Input** and are generated from `settings.json`; on Niri, edit the preserved `~/.config/niri/config.kdl`. ## Credits No wallpaper here is mine — each belongs to its author, and they are bundled only so a fresh install has something to show. Author of one and want it gone? Open an issue. - [matteogini/dotfiles](https://github.com/matteogini/dotfiles) — `ember_stripes.jpg` and `misty_peaks.jpg`; the rice this setup grew out of. - [HyDE](https://github.com/HyDE-Project/HyDE) — `spring_bloom.jpg`, from its Graphite Mono theme; `hypr/palette.conf` is derived from it. - [ilyamiro/shell-wallpapers](https://github.com/ilyamiro/shell-wallpapers) — the wallpaper collection bundled in `wallpapers/`. Video wallpapers play through [mpvpaper](https://github.com/GhostNaN/mpvpaper); none are bundled. Drop `.mp4`, `.webm`, `.mkv` or `.mov` into `~/.config/hypr/wallpaper/live`, or take them from [DesktopHut](https://www.desktophut.com), [Wallper](https://wallper.app), [TuxPapers](https://tuxpapers.com) or [Papyrus](https://github.com/PSGtatitos/papyrus) — each on its own terms. Interface font: [JetBrains Mono Nerd Font](https://www.nerdfonts.com) (SIL OFL), with [Material Design Icons](https://pictogrammers.com/library/mdi/) for every glyph. `assets/logo*.png` is drawn for this project, same licence as the code. Built on [Hyprland](https://hyprland.org) · [Quickshell](https://quickshell.org) · [cava](https://github.com/karlstav/cava) · [cliphist](https://github.com/sentriz/cliphist) · [hyprpaper / hyprsunset](https://github.com/hyprwm) · [wf-recorder](https://github.com/ammen99/wf-recorder) · [fish](https://fishshell.com) ## Licence MIT — see [LICENSE](LICENSE). It covers the configs, the QML and the scripts. Wallpapers, fonts and anything else bundled from elsewhere keep the terms of their own authors.