Ported from downstream development. Four independent defects.
1. The memory dump was unrestorable. iterdump() serializes sqlite_vec virtual
tables as a raw INSERT INTO sqlite_master(...) followed by inserts into a
table the replaying connection cannot see, so replaying memory.db.sql died
on "no such table: vec_messages" and left ZERO tables behind. dump_db() now
loads the vec0 extension and filters the derived vec tables out of the
iterdump stream, matched on each statement's target table rather than as a
substring - a chat message whose text mentions vec_messages is an
INSERT INTO "messages" and has to survive.
compare() reported an unreadable dump as "diverged", which read like a real
verdict and made both guards refuse backup AND restore, locking the machine
out of syncing in either direction. Unreadable is now its own verdict.
_extra() compared updated_at against a "" default, but the column is REAL,
so the comparison raises TypeError on the first conversation the other side
lacks - exactly the case it counts. It tests membership first now. The
direction test declared updated_at TEXT, which is why this survived: the
test compared str to str while the field compared str to float.
2. The memory curator invented facts. It attributed the ASSISTANT's words to
the user, wrote absence claims read off the existing-memory block, and added
judgements ("favorite") the user never used. The prompt now scopes the USER
line as the only source, and two deterministic guards drop absence claims
and facts whose distinctive tokens appear nowhere in the user's message -
prompt wording alone did not hold on a 7B curator.
3. _best_vulkan_device scored Mesa's llvmpipe above an integrated GPU, pinning
Ollama to a software rasterizer advertising 31 GiB of "VRAM" - CPU inference
with Vulkan overhead on top. Software rasterizers are dropped.
4. Models.jsx compared catalog names to installed names literally, but Ollama
resolves a bare name to ":latest", so an untagged entry (nomic-embed-text)
read as missing forever and the Required gate never opened. Chatbot.jsx
fetched the model list once on mount although App keeps the page mounted
behind display:none, so a newly pulled model never appeared in the picker
until a full browser reload.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
NexusOS desktop theme
XFCE/GTK desktop theme (distinct from the web UI in interface/web/).
Lime-green + purple, dark, with tightened menus.
Layout
| Path | What |
|---|---|
NexusOS/ |
GTK2/3 + xfwm4 theme. GTK3 CSS in NexusOS/gtk-3.0/ is hand-maintained (no build step). |
NexusOS/gtk-3.0/colors.css |
All color tokens. Edit colors here, not in the widget files. |
NexusOS-icons/ |
Icon theme (inherits Papirus-Dark). |
_palette.py + *-src/build.py |
Regenerate gtk2 / icons / xfwm4 — NOT gtk-3.0. |
NexusOS-icons-src/build_actions.py |
Regenerate the actions icons (logoff dialog / Whisker session buttons). |
install-theme.sh |
Idempotent restore of all the wiring (see below). |
gtk3-user-overrides.css |
Symlinked to ~/.config/gtk-3.0/gtk.css. |
How it's wired (the part backups miss)
The files above are just source. What makes the desktop use them lives
outside this folder and is recreated by install-theme.sh:
- Symlinks:
~/.themes/NexusOS,~/.icons/NexusOS,~/.config/gtk-3.0/gtk.css. - xfconf:
xsettings(/Net/ThemeName,/Net/IconThemeName,/Gtk/CursorThemeName,/Gtk/FontName) andxfwm4 /general/theme. ~/.config/gtk-3.0/settings.iniand~/.config/gtk-4.0/settings.ini.
Canonical values: theme NexusOS, icons NexusOS, cursor DMZ-White,
font Ubuntu 10. Keep these in sync with NexusOS/index.theme and
install-theme.sh.
Apply / reload after editing
xfconf-query -c xsettings -p /Net/ThemeName -s Adwaita
xfconf-query -c xsettings -p /Net/ThemeName -s NexusOS
xfdesktop --reload & xfce4-panel -r
Some apps cache the theme at startup and need a full restart.
Backup / restore
ncp backup -f(python bin/sync.py backup --full):bin/backup-linux.shsnapshots live wiring intorestore-snapshot/, then the tree is committed and pushed to Gitea.ncp restore(python bin/sync.py restore): pull, rebuild venv/frontend, thenbin/restore-linux.sh desktopauto-runsinstall-theme.sh. Add--checkfor a dry run.- Both stages are Linux-only and skipped on Windows;
bin/sync.pyis the entry point on both machines.
Gotchas (each cost real debugging time)
- Theme silently falls back to Adwaita if
gtk-theme-nameinsettings.iniand xfconfxsettings/Net/ThemeNamedisagree, or point at a non-existent theme. Edits then have zero visible effect. settings.iniis machine-generated by xfsettingsd fromxsettings.xml— don't symlink it into the repo. GTK4 has its own~/.config/gtk-4.0/settings.inithat xsettings does not override; it must be reconciled separately (easy to forget).@border==@overlay_bg(#2e3236) incolors.css, so a separator drawn in@borderon an overlay surface is invisible. Use@border_strong/@menu_border. Root collision is unfixed; patched per-spot.gtk-menu-imagestoggles icons in classic GtkMenus only. It does not affect the Whisker menu (separate widget tree).- Whisker menu: the popup's identifier is set via
gtk_widget_set_name(), so CSS must target#whiskermenu-window(an #id), not.whiskermenu-window(a class) — a class selector matches nothing. The basewindow.backgroundrule also outranks a bare class;#idwins on both counts. Whisker version: 2.9.x. Its app/category lists aretreeview/iconview; restartxfce4-panelto reload its CSS. - Menu surfaces use
@menu_bg(#2a1d33) /@menu_border(#4d3461) — dark purple. Tooltips/menubars/cards stay on the gray surface palette deliberately. .gitignoredoes not support trailing/inline comments. ADir/ # noteline matches nothing — comments must be on their own line. (This once let agit addstart ingesting the 28 GB venv.)
KDE Plasma migration (KDE/)
All KDE Plasma theme assets live under KDE/. These are built to mirror the NexusOS
visual design — same palette, same flat aesthetic — in KDE-native formats. The GTK 3
theme and icon theme carry over unchanged.
KDE/
install-plasma.sh # idempotent installer (run once after switching)
generate_plasma_colors.py # regenerate NexusOS.colors from _palette.py
plasma/NexusOS/ # Plasma shell theme (panel, widgets, tooltips)
NexusOS.colors # KDE color scheme — source of truth for Qt/KDE colors
colors # Plasma shell palette overrides
widgets/*.svg # 9-slice SVGs: panel-background, tooltip, button, etc.
opaque/widgets/ # compositor-off variants
kvantum/NexusOS/ # Qt5/Qt6 app styling
NexusOS.kvconfig # widget geometry + element references
NexusOS.svg # flat SVG widget drawings
aurorae/NexusOS/ # KWin window decoration
NexusOSrc # titlebar height, button layout, colors
decoration.svg # window frame (9-slice)
close/maximize/minimize/restore/alldesktops/keepabove/keepbelow/shade.svg
sddm/NexusOS-QML/ # Login screen (already deployed; palette now aligned)
Main.qml # QML login UI — NexusOS purple/green palette
assets/background.svg assets/logo.png
kscreenlocker/NexusOS/ # Runtime screen lock (Meta+L in KDE)
contents/ui/LockScreenUi.qml # matches SDDM aesthetic; kscreenlocker API
konsole/
NexusOS.colorscheme # general terminal colors
NexusOS-Promethean.colorscheme # deep purple — matches promethean-kitty.conf
Promethean.profile # Konsole profile: rcfile, cursor, color scheme
What survives the switch unchanged
| Asset | Status |
|---|---|
NexusOS/gtk-3.0/ (all CSS) |
GTK apps on Plasma use it as-is |
NexusOS-icons/ |
Freedesktop spec — works on any DE |
_palette.py / colors.css |
Source of truth; KDE palette generated from it |
| Plymouth boot splash | System-level; unaffected by DE switch |
Installing before the switch (XFCE)
Testable now:
# Kvantum (Qt5 app styling — works on XFCE)
sudo apt install qt5-style-kvantum qt5-style-kvantum-themes
ln -sfn "$PWD/assets/themes/KDE/kvantum/NexusOS" ~/.config/Kvantum/NexusOS
kvantummanager --set NexusOS # then open any Qt5 app
# Konsole colors (works on XFCE if konsole installed)
cp assets/themes/KDE/konsole/*.colorscheme assets/themes/KDE/konsole/Promethean.profile \
~/.local/share/konsole/
# SDDM palette (already live; installer will redeploy if needed)
Needs KDE session: Aurorae decoration, Plasma shell theme, kscreenlocker.
First boot into Plasma
assets/themes/KDE/install-plasma.sh
Then in System Settings → Appearance verify:
- Global Theme: (manual if needed — set individual components below)
- Colors: NexusOS
- Application Style: Kvantum-dark
- Plasma Style: NexusOS
- Window Decorations: NexusOS
- Icons: NexusOS
Test lock screen: Meta+L
Promethean Terminal on KDE
bin/promethean/promethean-terminal.desktop now uses konsole --profile Promethean.
The Promethean Konsole profile configures the rcfile, deep-purple color scheme,
and #b040c0 cursor. The kitty fallback line is commented out in the .desktop.
Palette alignment note
The SDDM NexusOS-QML theme previously used a navy/cyan palette (#0f1626 / #00d4ff).
It has been updated to the NexusOS palette (#1e1526 / #8cc63f) for consistency.
The live SDDM at /usr/share/sddm/themes/NexusOS-QML/ still has the old colors;
install-plasma.sh will replace it.