Journal v1.11.0: rich text editor integration for text sections
Details
Replace plain TextBox controls with RichTextEditor (WYSIWYG inline markdown)
in text section editors and quick-capture card. Add persistent FormattingToolbar
with bold/italic/underline/strikethrough/code/link buttons. Text sections in
read-only views (focused view, section grid) now render formatted text via
RichTextEditor IsReadOnly mode. Feed card previews strip markdown to plain text
via updated StripLinksConverter. Search indexing and RAG chunks strip markdown
before indexing. Backward-compatible — existing plain text entries render
identically since plain strings are valid inline markdown.
Finance v3.24.0: add right-side category edit panel to budget dashboard
Details
Add click-to-edit pattern matching Account Register: clicking a budget
category row opens a 340px edit panel on the right side with name,
rollover, goal type, and conditional goal fields. The Goal column
auto-hides when editing to make room. CurrencyBox inline editing is
preserved via a visual tree check that skips the panel open for clicks
on CurrencyBox controls. Panel closes on month navigation. After save,
the panel re-selects the same category with fresh data.
New files:
- BudgetDashboardViewModel.EditPanel.cs: partial class with edit panel
state (EditingCategory, IsGoalColumnVisible, save/hide/close commands)
- BudgetCategoryEditPanel.axaml: extracted UserControl for the edit form
Modified files:
- BudgetDashboardView.axaml: restructured to 2-column layout (content +
edit panel), goal column uses Auto width with IsVisible binding,
category rows get hover/selected styles
- BudgetDashboardView.axaml.cs: PointerPressed tunnel handler with
CurrencyBox descendant check
- CategoryViewModel.cs: added IsSelected property for row highlighting
- BudgetDashboardViewModel.cs: re-selection logic after LoadDataAsync,
edit panel close on month navigation
Journal v1.10.0: multi-column layouts + map routing
Details
Add magazine-style multi-column layouts for journal entries. Each row can
have 1-3 columns with configurable width ratios (Full, 1/2+1/2, 1/3+2/3,
2/3+1/3, Thirds). Each cell holds any section type (text, photo, audio, map).
Extend map sections with three modes:
- Pin: existing postal code geocoding + click-to-place
- Route: A-to-B driving routes via OSRM public API with polyline, distance,
and duration. Also supports GPX file import for hiking/cycling tracks.
- Waypoints: click-to-add manual waypoints with connecting polyline and
distance calculation.
Maps now have configurable height (Small 150px / Medium 250px / Large 400px)
and color-coded markers (green=start, red=end, blue=intermediate).
Data model additions are fully backward-compatible: new fields are nullable
with defaults, so existing entries render identically.
New files: GpxParser, RoutingService, JournalRowViewModel, SectionRow,
SectionsToRowsConverter, RowEditor, SectionGridView.
Also fixes: focused view now renders Audio and Map sections (previously
missing), seed data uses local timezone for sensible times, and includes
a multi-column example entry.
Fix RAG index cascade on bulk file operations
Details
RagIndexService now uses batch-coalescing debounce instead of per-entity
timers. Incoming EntitySyncedMessages are queued and deduplicated, then
dispatched as a single batch — calling each IIndexableContentProvider at
most once per batch and loading hashes once. This reduces bulk operations
(e.g. trashing 40 files) from ~560 ReadList calls to ~14.
SdkMessage gains a SuppressChangeNotification property (JsonIgnored) that
tells SdkHost to skip the EntitySyncedMessage broadcast while still
recording sync outbound snapshots. Batch callers send a single summary
notification after all items are processed.
Version bump: 1.67.0 → 1.68.0 (SDK + Desktop)
Add biometric unlock (Touch ID / Windows Hello) support
Details
Implement platform-native biometric authentication as a convenience option
for unlocking PrivStack. The master password remains the root of trust —
biometric enrollment stores it in the OS keychain (macOS Keychain / Windows
Credential Manager), gated by biometric access control. On unlock, biometric
verification retrieves the password and feeds it through the existing
UnlockApp path. Zero Rust core changes required.
New files:
- IBiometricService interface with IsSupported, IsAvailable, Enroll,
Authenticate, Unenroll
- MacBiometricService: Security.framework P/Invoke for Keychain +
LocalAuthentication.framework for Touch ID prompts
- WindowsBiometricService: advapi32.dll CredWrite/Read/Delete +
UserConsentVerifier for Windows Hello
- NullBiometricService: Linux/unsupported fallback
Integration points:
- UnlockView: biometric button with "or" separator, auto-attempts on load
- SensitiveUnlockOverlay: biometric option for re-authentication
- Settings > Security: toggle with inline password enrollment, auto
re-enrollment on password change
- Setup Wizard: optional biometric step after password creation (shown only
when hardware is available)
- AppSettings: BiometricUnlockEnabled persisted setting
- ServiceRegistration: platform-conditional DI registration
Version: 1.66.5 → 1.67.0
Get notified about new releases