v2.0.0 — Modular plugin architecture
A rewritten install.sh that defaults to zero prompts, and the start of a real modular plugin architecture: AI capabilities are no longer bundled into the ai layer — each one is now independently installable and removable, the same way a third-party plugin would be.
⚠️ If you're upgrading from before 2.0.0, read this first
Claude Code, Codex, and OpenCode agent-hook wiring, and Agent Graph, no longer install automatically with the ai layer. They're opt-in plugins now. If you had live per-session agent tracking in the bar/dashboard before, git pull && ./install.sh (or --config-only) will not bring it back on its own — you'll just lose it silently otherwise. Run this once after updating:
aphotic plugin install claude-hooks # or codex-hooks / opencode-hooks, matching whichever harness you use
aphotic plugin install agent-graph # if you want the Dashboard's live tool-call graph back too
Each is independent — install only the ones for the harness(es) you actually use. aphotic plugin list --remote shows everything currently available. See the README's Plugin System section for the full picture, or the Install section's upgrade callout for the short version.
Highlights
Modular plugin architecture — Aphotic base is now shell + rice/theming + Settings + core Quickshell modules only. A plugin is a directory with a plugin.toml manifest (manifest v3) declaring exactly what it is and what it touches:
[ui.dashboard_tab]lets a plugin contribute a real Command Center tab, loaded dynamically at runtime — no shell rebuild to add or remove one. Agent Graph is the flagship example, fully extracted out of the base shell.- The new
[harness]table (theharness-hookcapability) is for a plugin that wires itself into a different program's own config instead of reacting to an Aphotic-internal event — exactly what Claude Code, Codex, and OpenCode's agent-hook wiring needed. Install/enable runs the plugin'swirescript; disable/remove runsunwire, since the "enabled" state lives in the harness's own config file, not something Aphotic can gate on its own. - Bar-tab harness icons now follow plugin install state, not live process presence — install only
codex-hooksand you'll see only the Codex icon, even if Claude Code happens to be running too.
install.sh rewritten as an orchestrator over lib/install/*.sh stage modules instead of one growing monolithic script. Running it with no flags now installs the daily-driver setup (full profile, no optional layers) with zero prompts; the old interactive wizard is still there via --opt-in. The WiFi-powersave prompt is gone entirely — it interrupted the install for a system tweak with no bearing on whether the desktop actually works.
--strip-conflicts/--keep-conflicts — a prior rice's leftover waybar/rofi/dunst/etc. gets offered for removal before install, instead of silently fighting Aphotic's own bar/launcher/notification center for the same role (#41).
Also in this release
- Two real config-preservation bugs fixed:
~/.config/hypr/monitors.luaand~/.config/gtk-3.0/settings.iniwere silently overwritten by everyinstall.sh/--config-onlyrun (#45) - Fixed
yayfailing to land on PATH on a fresh/torn-down system (stale/empty pacman sync databases before the AUR build) - Fixed a stale-pacman-db install failure (
[ERROR] - firefox install had failed..., #41) - Fixed the "Hyprland was started without start-hyprland" warning on login
AiProviders' Claude/Codex/Ollama auto-probe is now gated behind the installer'sailayer, instead of probing for CLIs that were never installed and logging noise for anyone without that layer
Known open item
yay not landing on PATH after the above fix has one more unresolved report (#45) — likely an existing paru install resolving first (not a bug) or an environment-specific issue, still being triaged with the reporter.
Full history: the README Roadmap section.