Skip to content

Drop eww: Memento and text prediction become Noctalia plugins - #205

Merged
VictorGSchneider merged 2 commits into
mainfrom
claude/tender-dirac-0bc2zn
Oct 21, 2026
Merged

VictorGSchneider merged 2 commits into
mainfrom
claude/tender-dirac-0bc2zn

Conversation

@VictorGSchneider

@VictorGSchneider VictorGSchneider commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

What

eww only carried three features. All three now have another home, and eww is removed from configs, installers, the doctor, stoa-settings and the README.

Memento Mori → stoa/memento (Noctalia v5 desktop_widget)

  • Same five bars (day, week, month, year, life) and the rotating Stoic quote, read from stoa-memento-data (unchanged).
  • Replaces two copies that weren't working:
    • the eww window, which no keybind or autostart ever opened;
    • the v4 QML plugin (manifest.json), which install.sh never linked.
  • config/noctalia/config.toml places one tile on the desktop (no output, so Noctalia uses the focused monitor and clamps cx/cy to it). Move it with noctalia msg desktop-widgets-edit.
  • The widget draws no frame of its own: Noctalia's per-widget background (background* settings) is the frame.

Text prediction → stoa/predict (Noctalia v5 plugin)

  • Daemon: stoa-predict.py keeps the same word engine. It now prints one JSON line per change on stdout and logs to stderr.
  • Service: runs stoa-predict run through noctalia.runStream, so there is no eww update process per keystroke.
  • Popup: a persistent panel with keyboard_focus = "none" on the overlay layer, so the window being typed in keeps focus.
  • Opening the popup: the service uses noctalia msg panel-open/-close, not togglePanel. A service runtime is built without the panel-toggle callback (src/scripting/plugin_service_host.cpp), so togglePanel silently does nothing there.
  • stoa-predict select: sends SIGUSR1 to reset the daemon, because wtype input never reaches evdev.
  • Orphaned daemon: run kills one left over from a restarted shell instead of refusing to start. A missing keyboard or input group is reported back as {"error": …} and shown as a notification.
  • plugin_api = 30 (panel layer, Noctalia v5.0.1). I avoided the [[layer]] entry type: it needs API 36, which no released Noctalia supports yet.

Shift+Print → alexander/screen-toolkit

  • stoa-capture is removed. Shift+Print in Hyprland and niri runs noctalia msg plugin alexander/screen-toolkit:service all toggle (recording, OCR, colour picker).

Enabling the plugins

  • config.toml gains [plugins].enabled with stoa/drive, stoa/health, stoa/memento, stoa/predict and alexander/screen-toolkit.
  • Noctalia merges arrays by overwriting (ConfigService::deepMerge), so a settings.toml list hides that one. install.sh therefore also runs noctalia msg plugins enable for each plugin when the shell is running.
  • Stale symlinks for eww, stoa-capture and stoa-memento are removed.

Verification

Built Noctalia 5.3.0 in the session and ran it under headless sway (pixman renderer), with this branch's config.toml and plugins:

  • Lint: noctalia plugins lint theme/noctalia-plugins reports 0 errors and 0 warnings for all four Stoa plugins. A planted typo in getConfig is reported as an error (exit 1), so the lint does bite.
  • Loading: both plugins load, stoa/predict:service starts, and alexander/screen-toolkit is fetched from the community source and enabled from the config.toml list (fresh install).
  • Memento: renders on the desktop with five bars, percentages, time left and the quote, inside a single frame.
  • Predict, end to end: used a stand-in stoa-predict with the same CLI and stdout protocol, since there is no evdev in the container.
    • The IPC toggle runs run and shows the "On" notification.
    • The popup opens at the bottom centre with the 5 words (first one highlighted) and 2 emojis.
    • It closes when the suggestions empty: 0 drawn pixels in the strip area afterwards.
    • Toggling again runs kill, and the pidfile is gone.
  • Existing install: with the user's real settings.toml list (drive, health, screen-toolkit), memento and predict start disabled. The install.sh enable loop turns them enabled and appends them to that list without dropping anything.
  • Daemon protocol: PredictDaemon driven with simulated key codes. "stoi" emits the stoic… suggestions, SUGGEST_FILE mirrors the last line, and reset() (the SIGUSR1 handler) emits a single empty update.
  • Repo checks: tests/run.sh 18 passed, check_config_integrity.py ok, luac5.4 -p on every .luau file, shellcheck clean.

Not tested here: clicking a suggestion (the headless compositor has no pointer device) and real evdev input. Both paths are unchanged from before apart from the SIGUSR1 reset, which was tested directly.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CrdbH4MCHhLKimzdRSzXZp

eww only carried three things, all replaced:

- Memento Mori: a Noctalia v5 desktop_widget (stoa/memento) with the
  same five bars and quote, fed by stoa-memento-data. Replaces both the
  eww window (no bind or autostart opened it) and the v4 QML plugin
  that install.sh never linked. config.toml places one on the desktop.
- Text prediction: a v5 plugin (stoa/predict). Its service runs
  stoa-predict.py through runStream and reads JSON lines, so no eww
  update is forked per keystroke; the popup is a persistent panel with
  keyboard_focus = none on the overlay layer. The service opens it with
  panel-open/-close IPC because togglePanel is a no-op from a service
  runtime. stoa-predict select resets the daemon with SIGUSR1, since
  wtype input never reaches evdev.
- stoa-capture: removed. Shift+Print opens alexander/screen-toolkit
  (recording, OCR, colour picker).

config.toml enables the plugins; install.sh also enables them over IPC
because a settings.toml list replaces config.toml's wholesale. Stale
eww/stoa-capture/stoa-memento symlinks are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CrdbH4MCHhLKimzdRSzXZp
Noctalia draws every desktop widget's rounded background itself (the
background / background_color / background_opacity widget settings), so
the fill and border the tree added showed as a second box inside it.
Seen running Noctalia 5.3.0 under headless sway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CrdbH4MCHhLKimzdRSzXZp
@VictorGSchneider VictorGSchneider self-assigned this Oct 21, 2026
@VictorGSchneider
VictorGSchneider merged commit e55c400 into main Oct 21, 2026
3 checks passed
@VictorGSchneider
VictorGSchneider deleted the claude/tender-dirac-0bc2zn branch October 21, 2026 23:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants