Repository navigation
Installer and CLI
One script — setup-ii-p3drovfx.sh — installs the shell, updates it, switches it between forks and branches, installs optional feature packages, and diagnoses problems. After the first run it is linked into ~/.local/bin as ii-p3drovfx (and II-P3DROVFX, the fork's written name — same link, so both spellings work). Everything in it is also reachable from the shell: Settings → About & Updates has an update button, a branch and fork switcher, an optional-packages table and a "What's new" changelog.
The script only ever replaces
~/.config/quickshell/ii(the Quickshell config) and, if you agree, overlays the fork's~/.config/hypr. Your own edits in~/.config/hypr/custom/and yourconfig.jsonare protected by default.
ii-p3drovfx help # the full surface (bare `ii-p3drovfx` prints this too)
ii-p3drovfx install # first-time setup: the base illogical-impulse dotfiles, then the fork on top
ii-p3drovfx apply # (re)apply the Quickshell config only — the default for the script file itself
ii-p3drovfx update # refresh the fork and branch you are already on
ii-p3drovfx switch -f mine -b main # change fork and/or branch
ii-p3drovfx fork end4 # shorthand: switch --fork end4
ii-p3drovfx branch dev # shorthand: switch --branch dev
ii-p3drovfx list-forks # the fork presets
ii-p3drovfx list-branches [fork] # remote branches of a fork
ii-p3drovfx restart # restart Quickshell (alias: run)
ii-p3drovfx doctor # resolved paths, active fork/branch/commit, tooling
ii-p3drovfx version # what is deployed (fork, branch, commit)
ii-p3drovfx deps [list|add|remove] # optional feature packages
ii-p3drovfx hyprset <args> # write one Hyprland key or animation
ii-p3drovfx hyprmerge <args> # merge a Hyprland config into your local one
ii-p3drovfx remove-cli # remove the symlinksFork presets: p3drovfx (also mine) — this repository, end4 — end-4/dots-hyprland, vynx (also upstream) — vaguesyntax/ii-vynx; or any GitHub URL. Each preset defaults to its main branch.
| Option | Meaning |
|---|---|
-f, --fork <preset|url>, -b, --branch <name>
|
Target |
-l, --local <path> |
Deploy a local checkout (a fork clone, or an ii config dir) instead of GitHub. update will never guess a local path back: it refuses and prints the --local line to re-run |
-y, --yes |
Answer every confirmation yes |
--keep-config / --reset-config
|
Whether ~/.config/illogical-impulse/config.json survives. Default: kept on updates and branch hops, reset on fork switches (a different fork has a different schema). A backup is always kept |
--hypr / --no-hypr
|
Overlay the fork's ~/.config/hypr (recommended — the shell is written against its binds and rules: Alt+Tab switcher, tiling assistant and Modes may not fully work with an older Hyprland config) or never ask |
--backup / --no-backup
|
Keep (default) or discard the replaced config |
--force |
Redeploy even when already on the remote commit (otherwise update asks first) |
--no-restart |
Leave Quickshell running |
--rebuild-quickshell |
Rebuild Quickshell from source first |
--skip-base-check |
Don't require illogical-impulse underneath |
--ii-subdir <name> |
Override the ii* folder auto-detection in the clone |
--log-file, --no-log, -v, -q, --ascii, --no-color
|
Output control; the run log is ~/.local/state/ii-p3drovfx/setup.log
|
Options accept --flag=value as well as --flag value; everything after a bare -- goes to hyprset/hyprmerge. Old spellings (--no-confirm, --preserve-config, --update, --switch…) still work.
- Runs end-4's own
./setupfor the base (illogical-impulse dotfiles) — never a copy kept in this repository — then deploys the fork's config on top. On Arch it then swaps the base installer's pinnedquickshellfor the AURquickshell-gitthis fork targets, before any config lands (it asks first unless-y). The installer supports Arch, Fedora (COPR-aware), Gentoo and Nix (sdata/dist-*). - Offers the fork's core packages (below).
- Installs the CLI links, restarts Quickshell and opens the Welcome app (Welcome App) once the shell answers. Every successful
apply,installorswitchopens it;updatenever does.
- The remote is fetched into a shallow cache under
~/.cache/ii-p3drovfx/repos; an update downloads only what changed. A cache that fails a check is deleted and fetched once more.updatecompares the remote commit with the deployed one first and asks before redeploying when they match. - The new tree is staged, protected files are carried over (
.env,user/generated/*.json, and the built Rust helpers with their build stamps:workspace_compactor,workspace_profile_manager,osk_autoshow,app_stats,touch_gestures,sni_watcher), and the swap is atomic with a rollback if anything fails — on any failure the previous config stays untouched. The replaced config is backed up under~/.local/state/ii-p3drovfx/backups(last three kept). - State files are written beside the config:
.active-remote,.active-branch,.active-fork,.active-commit(and.active-localfor--localdeployments). The shell reads these to know what it is and whether it is behind. - If you agreed, the fork's Hyprland files are overlaid on
~/.config/hyprexceptcustom/(which is yours) —hyprland/colors.luaandhyprlock/colors.confare only seeded when missing, since matugen rewrites them on every wallpaper change. - Quickshell is restarted (
MALLOC_CONF=narenas:1to keep memory down) and, for everything exceptupdate, the Welcome is opened.
The shell works without these; each turns one feature on. ii-p3drovfx deps prints the table and lets you pick; deps add calendar google-drive installs by id; deps remove … uninstalls only what deps itself installed (recorded in ~/.local/state/ii-p3drovfx). Settings → About & Updates shows the same table (scripts/deps/deps.py, which never installs anything itself — the terminal and sudo belong to the setup script). Which packages a feature needs on your distribution comes from defaults/dependencies.json; a package is "present" when a binary is on PATH, a Python module imports, or the package manager has it. AUR-only packages need yay or paru.
| Id | Installs | Enables |
|---|---|---|
calendar |
khal, vdirsyncer, python-icalendar
|
[[Calendar and Timetable |
google-drive |
rclone |
[[Drive backup |
easyeffects |
easyeffects |
EasyEffects |
phone, phone-camera
|
KDE Connect, scrcpy, adb, DroidCam, v4l2loopback, mpv
|
[[Phone Integration |
fingerprint |
fprintd (+ pam-fprint-grosshack on Arch) |
[[Lock Screen |
tailscale, vpn-proton, vpn-nord, vpn-warp
|
the clients | [[VPN and Tailscale |
hotspot |
iw, dnsmasq, nftables
|
Wi-Fi hotspot |
screen-shaders |
hyprshade |
Screen filter shaders |
video-wallpaper, wallpaper-engine, upscaling
|
mpvpaper, socat, ffmpeg; Linux Wallpaper Engine; Upscayl |
[[Wallpaper System |
dictation, ai-voice, ai-pdf
|
voxtype; whisper; poppler |
Dictation, AI voice input, PDF attachments |
docker |
docker |
Docker widget |
openrgb |
openrgb + Python bindings |
RGB control |
rust-helpers |
cargo |
Building the native helpers (gestures, tray, OSK, workspace, app stats) — see [[App Usage |
preset-signin |
GitHub CLI | [[Preset Store |
updates-widget, clipboard-persist, dock-trash, appimage-icons, monitor-profiles
|
pacman-contrib; wl-clip-persist; nautilus; squashfs-tools; hyprmon
|
Their namesake features |
Core packages (which, git, fd, zip/unzip, bluetoothctl, the Python GObject / D-Bus / Pillow bindings) are offered by install and update after asking.
-
Update — Check now, the last-checked time and a badge on the bar (the "shell updates" indicator) when the remote has commits you don't. The check is one
git ls-remoteplus one GitHub API request; it never touches your config and nothing updates on its own. Automatic check (update.autoCheckInterval): disabled, every 10 minutes, hourly, daily (default) or weekly — plus once shortly after each shell start. Update now opens a terminal running the updater (sosudoand logs work), asks before applying, keeps your settings and restarts the shell. Also update Hyprland config (update.replaceHyprConfig, on) passes--hypr/--no-hypr. -
What's new — the commits you don't have, grouped by kind (New features, fixes, look, internals) from
type(scope): summarysubjects, each linking to GitHub; when up to date, the last N commits of the branch. Summarize new commits with AI (update.aiSummary, off) asks the current model for a short plain-language summary once the update isaiSummaryMinCommits(10) commits deep; results are cached per commit range and never re-run on a reload. Local-only AI mode uses a local model. -
Branch — stable (
main, what has been tested) or dev (features as they land), for this fork only. -
Fork — switching to another fork resets settings to its defaults and keeps a backup; the page documents the terminal command to come back (
II-P3DROVFX fork p3drovfx). -
Optional features — the
depstable; Contributors, links to the repository, issues, docs and this wiki.
| Symptom | Try |
|---|---|
| Something looks off after an update |
ii-p3drovfx doctor (paths, active fork/branch/commit, tooling), then the log at ~/.local/state/ii-p3drovfx/setup.log
|
| Roll back | The previous ii folder is in ~/.local/state/ii-p3drovfx/backups/ (last three) |
| A helper reads "stale" after an update | The built binaries are carried across updates; rebuild with scripts/rust-helpers.sh outdated / build <name>
|
update says "already up to date" |
--force to redeploy |
| Welcome doesn't open | It only opens after apply/install/switch; run qs -c ii ipc call welcome open
|
| Piece | Role |
|---|---|
setup-ii-p3drovfx.sh |
The script (CLI, UI layer, fork/branch logic, staging, rollback, Hyprland overlay) |
update-fork.sh |
Thin compatibility stub |
sdata/ |
The base installer data and per-distro dependency handling (dist-arch, dist-fedora, dist-gentoo, dist-nix) |
defaults/dependencies.json, scripts/deps/deps.py
|
The deps catalogue and planner |
services/ShellUpdates.qml, ShellUpdateSummary.qml
|
In-shell update probe and AI summary |
modules/settings/configs/AboutConfig.qml |
About & Updates |
scripts/rust-helpers.sh |
Rust helper build stamps and rebuild reporting |
- Getting Started
- Welcome App
- Known Issues — "Updating safely"
- Architecture
- Configuration Reference