moonset/CLAUDE.md
nevaforget a47fdff1dd docs: drop Hekate persona, unify attribution on ClaudeCode
Remove the Hekate persona block from CLAUDE.md and rewrite prior
DECISIONS entries from Hekate and leftover Ragnar to ClaudeCode
for consistency with the rest of the ecosystem.
2026-04-21 09:03:22 +02:00

2.4 KiB

Moonset

Projekt

Moonset ist ein Wayland Session Power Menu, gebaut mit Rust + gtk4-rs + gtk4-layer-shell. Teil des Moonarch-Ökosystems. Per Keybind aufrufbares Overlay mit 5 Aktionen: Lock, Logout, Hibernate, Reboot, Shutdown.

Tech-Stack

  • Rust (Edition 2024), gtk4-rs 0.11, glib 0.22
  • gtk4-layer-shell 0.8 für Wayland Layer Shell (OVERLAY Layer)
  • cargo test für Unit-Tests

Projektstruktur

  • src/ — Rust-Quellcode (main.rs, power.rs, i18n.rs, config.rs, users.rs, panel.rs)
  • resources/ — GResource-Assets (style.css, default-avatar.svg)
  • config/ — Beispiel-Konfigurationsdateien

Kommandos

# Tests ausführen
cargo test

# Release-Build
cargo build --release

# Power-Menu starten (in Niri-Session)
LD_PRELOAD=/usr/lib/libgtk4-layer-shell.so ./target/release/moonset

Architektur

  • main.rs — Entry Point, GTK App, Layer Shell Setup, Multi-Monitor, systemd-Journal-Logging, Debug-Level per MOONSET_DEBUG Env-Var, zentrale GRESOURCE_PREFIX-Konstante
  • power.rs — 5 Power-Action-Wrapper mit absoluten Pfaden und 30s Timeout (lock, logout, hibernate, reboot, shutdown)
  • i18n.rs — Locale-Erkennung und String-Tabellen (DE/EN)
  • config.rs — TOML-Config + Wallpaper-Fallback
  • panel.rs — GTK4 UI (Action-Buttons, Inline-Confirmation, WallpaperWindow)
  • users.rs — User-Erkennung, Avatar-Loading (AccountsService, ~/.face, GResource-Fallback)
  • resources/style.css — GTK-Theme-Colors für Konsistenz mit dem aktiven Desktop-Theme

Design Decisions

Siehe DECISIONS.md für das vollständige Entscheidungsprotokoll.

Kurzfassung der wichtigsten Entscheidungen:

  • OVERLAY statt TOP Layer: Waybar liegt auf TOP, moonset muss darüber
  • Niri-spezifischer Logout (niri msg action quit): Moonarch setzt fest auf Niri
  • Einmal-Start per Keybind: Kein Daemon, GTK application_id verhindert Doppelstart
  • System-Icons: Adwaita/Catppuccin liefern alle benötigten symbolischen Icons
  • Lock ohne Confirmation: Lock ist sofort reversibel, braucht kein Confirm
  • Absolute Pfade für Binaries: /usr/bin/systemctl etc. statt relativer Pfade (Security)
  • GResource-Bundle: CSS und Default-Avatar sind in die Binary kompiliert (Wallpaper kommt vom Dateisystem)
  • Async Power Actions: glib::spawn_future_local + gio::spawn_blocking mit 30s Timeout
  • Journal-Logging: systemd-journal-logger statt File-Logging — journalctl -t moonset, Debug-Level per MOONSET_DEBUG Env-Var