Releases: d12frosted/vulpea
v2.2.0
Features
- Automatic database rebuild on schema version change (#243)
- Support for non-.org file extensions like
.org.age,.org.gpg(vulpea-journal#3) - Link descriptions stored in the database — schema version bumped to 3 (auto-rebuild)
- Title propagation system for renaming notes with backlink updates (#212)
- Per-note and batch tag operations in new
vulpea-tags.elmodule (#211, #120) - Batch metadata operations:
vulpea-meta-batch-set,vulpea-meta-batch-remove(#211) - Create heading-level notes under existing notes via
:parentand:afterparams (vulpea-journal#2)
Fixes
- Heading-level notes now inherit tags from
#+filetagsand parent headings (#248) - Enable alias expansion by default in
vulpea-findandvulpea-insert(#227) - Support aliases on heading-level notes (#232)
- Fix title links not persisted to normalized
linkstable (#221) - Strip Org emphasis markers from titles, aliases, and outline paths (#221)
- Fix sync failure with read-only text properties from e.g.
org-transclusion(#238) - Fix
~paths in database causing query mismatches (vulpea-journal#5) - Fix
vulpea-find-backlinkfailing inside headings without own ID (#252) - Fix
vulpea-default-notes-directorystale default (vulpea-journal#5) - Fix fswatch ignoring changes with relative paths in
vulpea-db-sync-directories(#255) - Extract
#+CATEGORYkeyword at file level as a property (#257) - Fix property keys returned as symbols after DB round-trip (vulpea-journal#9)
- Fix first heading with
:ID:not indexed when file has no file-level ID (#260) - Fix
vulpea-buffer-tags-getonly reading first#+filetagsline (#250) - Fix
org-attacherror during parsing withorg-latex-preview-mode(#262) - Add
:noquery tto fswatch process for clean Emacs exit (#263)
Upgrading
Database schema version bumped to 3. Existing databases will rebuild automatically on first access.
Full changelog: https://github.com/d12frosted/vulpea/blob/master/CHANGELOG.org
v2.1.0
First feature release since the v2 rewrite.
Blog post: https://www.d12frosted.io/posts/2026-02-01-vulpea-v2-1
Features
- Dead link detection (
vulpea-db-query-dead-links) - Orphan and isolated note detection (
vulpea-db-query-orphan-notes,vulpea-db-query-isolated-notes) - Title collision detection (
vulpea-db-query-title-collisions) - Link querying API (
vulpea-db-query-links,vulpea-db-query-links-by-type,vulpea-db-query-links-from,vulpea-db-query-links-to)
Fixes
- Strip org link markup from titles during extraction (#221)
- Normalize property keys to uppercase during extraction (#222)
Performance
- Polling-based change detection is now non-blocking — uses async
fd/findsubprocess instead of synchronousdirectory-files-recursively, reducing blocking time from ~700ms to 0ms per poll cycle
Upgrading
Delete your database and rebuild to pick up the extraction fixes:
(vulpea-db-close)
(delete-file vulpea-db-location)
(vulpea-db-sync-full-scan)Full changelog: https://github.com/d12frosted/vulpea/blob/master/CHANGELOG.org
v2.0.1
Features
- Add
vulpea-db-query-attachments-by-pathfor efficiently querying all attachment link destinations for notes at a given file path. Returns a list of cons cells(DEST . ATTACH-DIR)whereDESTis the attachment file name andATTACH-DIRis the attachment directory of the note containing the link. Uses a single SQL query with JOIN, avoiding N+1 queries when processing multiple notes in a file.
Performance
- Async autosync startup is now non-blocking. When
vulpea-db-sync-scan-on-enableis'async, the startup function returns in ~8ms instead of ~1400ms (measured with 13,800 files in GUI Emacs). File listing uses anfd(orfind) subprocess instead of synchronousdirectory-files-recursively, and cleanup of deleted files uses set comparison against the subprocess output instead of per-filefile-exists-pcalls. Whenfswatchis active, filenotify watchers are skipped entirely as they are redundant. Addedvulpea-db-sync-debugvariable for timing instrumentation.
Fixes
v2.0.0
This is the first stable release of Vulpea 2.0 - a complete rewrite that removes the dependency on org-roam. Vulpea now manages its own database and provides all functionality independently.
Fixes (since v2.0.0-rc.2)
vulpea-createnow refuses to overwrite existing files. Previously, if a file existed at the target path but was not in the vulpea database,vulpea-createwould silently overwrite it. Now it signals an error, preventing accidental data loss.
Highlights from the 2.0 series
Breaking changes
org-roamis no longer required. Vulpea manages its own SQLite database.- Database location changed from org-roam's db to
vulpea-db-file(default:vulpea.dbinvulpea-directory). vulpea-db-updaterenamed tovulpea-db-update-file.vulpea-insertnow uses keyword arguments instead of positional optional arguments.
New Sync System
Vulpea now has its own file synchronization system (vulpea-db-sync.el):
- Multiple backends:
filenotify(default),fswatch(for large directories),polling(fallback). - Async batched updates to avoid blocking Emacs.
- Configurable via
vulpea-db-sync-backend,vulpea-db-sync-directories. - Start with
vulpea-db-sync-start, stop withvulpea-db-sync-stop.
New Features
file-titleslot invulpea-notefor file context- Heading-level metadata support
- New query functions:
vulpea-db-query-by-directory,vulpea-db-query-by-file-path,vulpea-db-search-by-title,vulpea-db-query-by-created-date,vulpea-db-query-by-property,vulpea-db-query-by-property-key - Expanded aliases support in selection interfaces
- Batch metadata operations with
vulpea-meta-set-batch
Performance
- Optimized tag and link queries (~1.3-1.4x speedup)
- Batch metadata operations (2-10x speedup)
See CHANGELOG.org for the complete list of changes.
v2.0.0-rc.2
Breaking changes
- vulpea#128
vulpea-insertnow uses keyword arguments instead of positional optional arguments. Change(vulpea-insert filter-fn create-fn)to(vulpea-insert :filter-fn filter-fn :create-fn create-fn).
Features
- vulpea#178 Add
file-titleslot tovulpea-notethat stores the title of the file containing the note. For file-level notes, this equals the note's title. For heading-level notes, this is the parent file's title. Useful for displaying context without additional queries. - vulpea#178 Add
vulpea-select-describe-outlineandvulpea-select-describe-outline-fullfunctions for displaying notes with their parent hierarchy in selection interfaces. Setvulpea-select-describe-fnto use them. - vulpea#128 Add
:candidates-fnargument tovulpea-insert, aligning withvulpea-find. Allows customizing the source of candidates for note selection during insert. - vulpea#75 Add heading-level metadata support to
vulpea-meta-*andvulpea-buffer-meta-*functions. Metadata operations now scope to the correct level based on the note: file-level notes access metadata before any headings, while heading-level notes access metadata within their subtree.
Performance
- vulpea#129 Optimize
vulpea-db-query-by-tags-every,vulpea-db-query-by-tags-none, andvulpea-db-query-by-links-everyto use single SQL queries with subqueries instead of two separate queries. Provides ~1.3-1.4x speedup for large result sets. - vulpea#66 Add
vulpea-meta-set-batchandvulpea-buffer-meta-set-batchfor setting multiple metadata properties efficiently. Parses the buffer only once instead of N times, providing significant speedup (2-10x depending on property count).
Fixes
- Interactive meta commands (
vulpea-meta-add,vulpea-meta-add-list,vulpea-meta-remove,vulpea-meta-clean) now correctly operate on the note at point, including heading-level notes.
v2.0.0-rc.1
First release candidate for Vulpea v2 - a complete rewrite independent of org-roam.
Highlights
- No org-roam dependency - Vulpea manages its own SQLite database
- Async-first sync - Non-blocking file watchers with batched updates
- Plugin system - Custom extractors with schema versioning
- Performance - Optimized for 100k+ notes
Breaking Changes
- Database location changed from org-roam's db to
vulpea-db-file vulpea-db-updaterenamed tovulpea-db-update-file
See CHANGELOG for full details.