Extract ModalOverlay to UI.Adaptive, bump SDK to 1.61.0
Details
Add shared ModalOverlay control to PrivStack.UI.Adaptive replacing
duplicated per-plugin copies in Notes, Tasks, Calendar, and Email.
The control provides animated backdrop, centered card with title bar,
scrollable body, optional footer, Escape key and backdrop-click-to-close.
Built as a code-based Panel (matching EmptyState pattern) with no AXAML
theme file required.
Exclude test/runner projects from plugin build loop
Details
Added case filter to skip *.Tests and *.TestRunner csproj matches in the
dev build script. These are test utilities, not runtime plugins, and
should not be built alongside actual plugins.
Add CompositeDisposable lifecycle to ViewModelBase, bump SDK to 1.60.0
Details
ViewModelBase now implements IDisposable with a protected CompositeDisposable
property. Plugins can track subscriptions and event handlers via DisposeWith()
extension method to prevent memory leaks when ViewModels are deactivated.
Added System.Reactive dependency for CompositeDisposable. Added
DisposableExtensions.cs with DisposeWith<T> extension method matching the
ReactiveUI convention.
Remove hardcoded OAuth secrets and bump to v1.58.7
Details
Move all OAuth client credentials (Google, Microsoft, GitHub) to
environment-variable-only resolution with no compiled-in fallback
defaults. This prevents GitHub push protection violations and ensures
secrets never appear in source code. Added .env.example documenting
required variables. App logs warnings on startup if env vars are missing.
Add Habits plugin label to ReminderSchedulerService
Details
Map "privstack.habits" → "Habits & Goals" in the notification label
switch so habit reminders display with the correct plugin name.
Get notified about new releases