This is the one where we add theming. And make Memory Cortex even smarter. And a lot of other little things you might appreciate.
You can now write CSS and replace entire React components without touching source. Open the editor from Theme > Advanced > Custom CSS Editor.
lumiverse-user layer, so it always wins over base styles. CodeMirror editor with syntax highlighting and validation.applyThemePack() wires everything at once.data-component="ComponentName" so your CSS can select precisely. No more guessing class names.BubbleMessage was refactored to support this. The original rendering logic is now BubbleMessageDefault.tsx, loaded through the override system. If you've written extensions that patch BubbleMessage internally, check the new shape.
Hardcoded tab definitions are gone from ViewportDrawer and commands.ts. Both now read from a central registry (drawer-tab-registry.tsx). Extensions can register tabs dynamically and they'll show up in the command palette automatically. We've updated the developer documentation to show you how.
ViewportDrawer lost ~160 lines of imports and switch-case spaghetti. commands.ts lost ~200 lines of duplicate panel definitions. Both are better for it.
New option in settings: Show tab labels renders short text labels below drawer icons.
The entity/relationship tracking system got a ground-up overhaul of its scoring, resolution, and data integrity layers. Four bugs fixed, five improvements landed.
Bug fixes:
1 - exp(-0.15 * evidence_count). One chunk = 14%. Five chunks = 53%. Twelve chunks = 84%. Feels right.factExtractionStatus field. The system will attempt extraction on the next available cycle instead of quietly ignoring them forever.Improvements:
lover subsumes ally. ally and custom merge when sentiment is within 0.3. Spatial (located_in) and hostile (enemy) edges are always independent.Schema: Two new migrations (046, 047) add 13 columns to memory_relations and 6 to memory_entities. Backfill runs automatically. For existing chats, hit the new Migrate Heuristics endpoint or trigger a rebuild.
Frontend: Entity cards now show provisional badges, fact extraction status, salience breakdown bars, and relative last-seen times. The relations drill-down shows edge salience, contradiction flags, sentiment ranges, and label aliases.
Action buttons (test, duplicate, delete) on connection items collapsed into a context menu. Same change on image generation connections. Less clutter in the list view.
Fixed a URL construction bug where the provider sometimes generated malformed endpoint URLs with leftover path fragments. Regional endpoints now always use https://{location}-aiplatform.googleapis.com. The "global" region (which Vertex doesn't actually support for generation APIs) falls back to us-central1.
Extensions can now register custom commands in the command palette (Cmd/Ctrl+K). Free tier, no permission needed.
spindle.commands.register() takes a list of command definitions with label, description, keywords, and scope. When a user picks one, the extension gets the commandId plus a context snapshot (active chat, character, route, group status) via spindle.commands.onInvoked(). Commands are contextual: call register() again with a different set whenever the available actions should change. Each call replaces the previous set.
Max 20 commands per extension. Cleanup is automatic on unload. See developer-docs/docs/backend-api/commands.md.
Three new actions in the Operator panel, grouped under a Maintenance section.
bun pm cache rm. No restart.bun install at project root and in frontend/. No restart.frontend/dist, rebuilds from source, restarts the server. Mutex-protected like updates and branch switches.All three require runner IPC.
lumiverse-base, lumiverse-theme, lumiverse-user) so the cascade is predictable.model_labels field added to connection models API response for human-readable model names.