What's new
- Search performance instrumentation: detailed timing metrics for search index build
(decrypt phase, insert phase, per-note average) and query latency. Enable with
DEBUG_SEARCH=1environment variable for console logging. Metrics tracked in
src/main/search.tsandsrc/main/ipc.ts. - Test vault generator: new CLI tool (
scripts/generateTestVault.ts) to create
reproducible test vaults with N notes (100, 500, 1000, 5000+) for performance
benchmarking. Usage:npx ts-node scripts/generateTestVault.ts 1000 /tmp/test-vault. - Performance benchmarking guide: comprehensive documentation at
docs/PERFORMANCE.md
with methodology, baseline metrics, expected improvements, and troubleshooting steps. - Data loss safeguard testing: new test suite in
scripts/tests/(data-loss.js and
data-loss-integration.mjs) for verifying atomic writes, crash safety, reconciliation,
encryption, and corruption detection. Comprehensive testing documentation at
docs/DATA_LOSS_TESTING.mdverifying all safeguards (atomic writes, crash-safe
operation ordering, vault reconciliation, AES-GCM auth tags, canary file checks).
PLAN.md milestone 16 completed. - GitHub community configuration: complete
.github/folder with issue templates
(bug reports, feature requests), pull request template, contributor guidelines
(CONTRIBUTING.md), code of conduct (CODE_OF_CONDUCT.md), security policy
(SECURITY.md), funding configuration (FUNDING.yml), automated PR checks workflow
(pr-checks.yml), and Dependabot configuration for weekly dependency updates. - Keyboard navigation in sidebar: arrow keys (Up/Down) to navigate notes list, Enter to
open, Escape to clear search. Visual focus indicator (subtle background + left border)
distinguishes keyboard focus from selection. Works in both folder notes and search results. - Accessibility improvements: ARIA labels on all interactive elements (buttons, folders,
notes, context menus). Context menu role set torole="menu"withrole="menuitem"on
items. Folder buttons userole="treeitem"witharia-expanded. All elements properly
labeled for screen reader navigation. - Visible keyboard focus indicators: global
:focus-visiblestyles (2px primary color
outline with 2px offset) applied to all buttons, inputs, textareas, and ARIA roles. Tab
navigation now visually clear throughout the entire UI. - Focus trap utility: new
src/renderer/lib/focusTrap.tsfor managing modal focus —
ensures focus stays within modal, cycles with Tab, closes on Escape, and returns focus to
the triggering element on dismiss. Ready for use in modal components.
Bug fixes
- Keyboard focus management in notes list: sidebar now properly tracks keyboard focus
separately from selected note, allowing arrow-key navigation without changing selection.
Focused note rendered with distinct visual state.
Changes
- Search index build optimized for speed: decryption of notes now runs in parallel via
Promise.all()instead of sequential loop, reducing I/O blocking. Expected improvement:
2–3× faster on large vaults (1000+ notes). Inserts remain serial (SQLite single-threaded)
but wrapped in a single transaction for ~10–20% additional speedup. - Incremental search reindex faster:
reindexNote()now uses atomicREPLACE INTO
instead of DELETE + INSERT pair, cutting per-note update overhead by ~50%. - Save status visibility: font size increased from 0.8em to 1em, opacity from 0.5 to
0.8. Layout updated to flex with gap for visual icons (checkmark for "Saved", hourglass
for "Saving…"). - Disabled element visual feedback:
cursor: not-allowedapplied to all disabled
buttons and folder items in modals. Move modal's current-folder state now uses
cursor: not-allowedinstead ofdefaultfor clarity.
Downloads
| Platform | Format | SHA256 |
|---|---|---|
| Linux (x64) AppImage | driftleaf-0.2.0-x86_64.AppImage | c307db79da1adee9ff087241fd4b0adc1a9fabfcdccc09a6e171d1f8d54dfeea |
| Linux (x64) .deb | driftleaf-0.2.0-amd64.deb | 94a3f5fbf65e2957367e96340ec6b68d8ba44618bd3d93f72f26e29efc6bf056 |
| Linux (x64) .rpm | driftleaf-0.2.0-x86_64.rpm | 7a7cb7b460c35c6fefb150b26cd42cdb28ce2e7469f1b8398eeef4cdecd19264 |
| Linux (arm64) AppImage | driftleaf-0.2.0-arm64.AppImage | 65c621e652c959f0a2a053e9be2df4b811543c15aa482db984d6f65e9b641851 |
| Linux (arm64) .deb | driftleaf-0.2.0-arm64.deb | 054a8645c4683af4d9e28ff5b0dc9790b59e29d1212bad0e501220672b24d4f1 |
| Linux (arm64) .rpm | driftleaf-0.2.0-aarch64.rpm | be1f65a40728fde132a942d261ec92c975c7ce2140de9aa7b376bec6b58d7fca |
| macOS DMG | driftleaf-0.2.0-mac.dmg | b85e76d179e376b10eb935a39b566226fea9d47444e3d99fee061af42f6915e7 |
| Windows installer | driftleaf-setup-0.2.0.exe | 57269c6d7a50e4b9b202f3a95ada2397fe4149522963aa0b289af1519d084240 |
| Windows portable | driftleaf-portable-0.2.0.exe | d72defee1b4bb35940bac229c77a63520a21d6c4b8f6698da2a4c85b365f75a4 |
Verify a download
sha256sum "driftleaf-0.2.0-x86_64.AppImage"Linux notes
Already using a package repo? Just run your normal update command — no download needed:
- Debian / Ubuntu / Raspberry Pi OS (apt):
sudo apt update && sudo apt upgrade driftleaf - Fedora / RHEL / CentOS Stream / Rocky / Alma (COPR):
sudo dnf upgrade driftleaf - openSUSE (OBS):
sudo zypper update driftleaf - Arch: download the appropriate
.AppImageattached below
First install or using AppImage? Grab your build from the table above.
Repo setup instructions are in the README.
macOS notes
The app is not notarized, so macOS may show a "damaged" warning and refuse to open it.
Run this command after mounting the DMG to strip the quarantine flag:
xattr -d com.apple.quarantine "/Applications/Driftleaf.app"Windows notes
If SmartScreen warns on the installer, click More info then Run anyway. The app is not yet code-signed.