Skip to main content

Changelog

Every improvement, automatically tracked from our commit history.

Subscribe via Atom feed
← Prev Page 27 of 212 Next →
February 28, 2026
patch Desktop Shell

Fix client mode: no plugin UI and silent logging after workspace switch

Details

Two root causes fixed:

1. PluginRegistry logging silently dead after workspace switch:

The static readonly ILogger field was captured from the old Serilog logger.

When ReconfigureForWorkspace calls Log.CloseAndFlush(), the ForContext child

becomes bound to a disposed logger — all subsequent messages silently vanish.

Changed to a property that always reads from the current Serilog.Log instance.

Added Console.Error fallback in plugin init catch blocks so errors are always

visible regardless of Serilog state.

2. No UI for any plugin in client mode:

MainWindowViewModel.SelectTab() guards on _service.IsInitialized, where

_service is IPrivStackRuntime (native Rust/DuckDB runtime). In client mode

the native runtime is intentionally NOT initialized — the headless server

owns DuckDB and the desktop routes all SDK calls through HTTP transport.

This caused SelectTab to abort with "Not initialized" for every plugin,

preventing any plugin view from being created or displayed.

Added IsServiceReady property that checks either native init OR client mode,

and replaced all 4 guard sites in the ViewModel.

patch Notes

Migrate Notes plugin from local ErrorMessage to unified IToastService

Details
  • Add IToastService to NotesViewModel constructor (injected from Host.Toast via NotesPlugin)
  • Replace all ~45 ErrorMessage assignments with Toast() calls using ToastType.Error
  • Remove [ObservableProperty] string? _errorMessage field (toast auto-dismisses)
  • Remove inline ErrorMessage border from NotesView.axaml (toast UI is shell-provided)
  • Add success toasts for key operations: wiki push, page duplicate, trash, restore, empty trash, template applied
  • Clean up double blank lines left by ErrorMessage = null removal
  • Leave SaveAsTemplate and WikiSources ErrorMessage untouched (form-level validation, separate VMs)
patch Desktop Shell

Fix client mode runtime issues: Tasks plugin, API server, and warnings

Details
  • PluginRegistry: Skip *.Headless.dll during assembly scan in Desktop mode.

Headless plugin DLLs are server-only but were being loaded by the Desktop's

ScanAssemblyPlugins, creating type identity conflicts and duplicate plugin

IDs (both TasksPlugin and TasksHeadlessPlugin share ID "privstack.tasks").

  • SettingsViewModel: Guard ToggleApiServerAsync with App.IsClientMode.

Setting ApiEnabled in the constructor triggered OnApiEnabledChanged which

called StartAsync on the local API server — even in client mode where

the remote server already owns port 9720.

  • MainWindowViewModel: Skip SubscriptionValidationService.ValidateAsync

in client mode. The service calls ILicensingService.GetLicenseStatus()

which hits the uninitialized native runtime. License status is already

proxied from the server during client mode detection.

  • SyncPairingViewModel: Skip LoadInitialState in client mode. The method

calls IPairingService FFI methods (GetSyncCode, SetDeviceName, etc.)

that require the native runtime. Server handles sync in client mode.

patch RssSnippets

Migrate Snippets and RSS plugins from local ErrorMessage to unified IToastService

Rss 1.9.5 → 1.9.6 | Snippets 1.7.5 → 1.7.6 | c85ad9d0
Details

Snippets (v1.7.6):

  • Add IToastService to SnippetsViewModel constructor via SnippetsPlugin
  • Replace all ErrorMessage assignments with Toast(msg, ToastType.Error)
  • Replace ShowSuccess helper to route through Toast(msg, ToastType.Success)
  • Remove _errorMessage and _successMessage ObservableProperty fields
  • Remove inline error/success Border elements from SnippetsView.axaml

RSS (v1.9.6):

  • Add IToastService to RssViewModel constructor via RssPlugin
  • Replace all ErrorMessage assignments with Toast(msg, ToastType.Error)
  • Convert completion StatusMessage assignments to Toast calls (feed added,

feed removed, refresh complete, mark all read, OPML imported, category set,

feed renamed)

  • Keep StatusMessage for progress indicators shown in loading overlay

(fetching feed, saving feed, importing OPML progress)

  • Remove ClearStatusAfterDelay helper (no longer needed)
  • Remove inline StatusMessage TextBlock from bottom bar in RssView.axaml
  • Remove _errorMessage ObservableProperty field
patch Contacts

Migrate Contacts from local toasts to unified IToastService

Details

Replace inline ErrorMessage/SuccessMessage ObservableProperties and

their AXAML toast borders with the shell-level IToastService via a

private Toast() helper method, matching the pattern established by

Calendar and Tasks.

  • Add Toast() helper routing to _host.Toast.Show() with StatusMessage fallback
  • Convert all ErrorMessage assignments (30 sites) to Toast(..., ToastType.Error)
  • Convert all SuccessMessage assignments (20 sites) to Toast(..., ToastType.Success)
  • Remove _errorMessage/_successMessage ObservableProperty declarations
  • Remove OnSuccessMessageChanged auto-dismiss partial method
  • Remove Error Toast and Success Toast Border elements from ContactsView.axaml
  • Add _statusMessage ObservableProperty for fallback path
← Prev Page 27 of 212 Next →

Get notified about new releases