Releases: akhmialeuski/obsidian-citation-extended
v0.6.0
This release is a performance and stability overhaul of the database subsystem — incremental reloads, a worker pool, off-thread indexing — plus a major maturation of the Readwise integration.
✨ New Features
- Incremental library reloads: a change in one database now re-reads and re-parses only that database; every other source is served from cache. Reaction cost is proportional to the changed database, not the whole library.
- Worker pool with real cancellation: multiple databases parse in parallel (load time = max, not sum); aborting a load terminates its worker immediately; file buffers move zero-copy into the worker.
- Off-thread search index builds: the MiniSearch index is built inside a Web Worker (with an async chunked fallback) and swapped in atomically — large libraries no longer freeze the UI during indexing.
- Stale-while-revalidate search: the search modal stays fully usable during background reloads and transient reload errors, serving results from the last loaded data.
- Readwise incremental sync: after the first full download, syncs fetch only entries changed since the last sync (
updatedAftercursor with a clock-skew overlap) and merge them into the offline cache idempotently. The Refresh citation database command forces a full re-fetch to pick up items deleted in Readwise. - Structured Readwise highlights: each entry exposes
entry.highlights(text, note, location, color, tags, URL per highlight) for{{#each}}templates, alongside the backward-compatible aggregated{{note}}. - Readwise import filters: per-database filtering by category, tags, minimum highlight count, and Reader location — applied at read time, so the offline cache stays full-fidelity.
- Full-text search over notes and highlights: a query that appears only inside a Readwise highlight or BibTeX note now finds the entry; title and author matches still rank first.
zoteroPdfMarkdownLinkhelpers (#71) and an array-returningzoteroPdfURIs(#69) for one-click PDF links in templates.
🐛 Bug Fixes & Improvements
- Readwise robustness: API client hardened against malformed responses and pagination loops; a corrupt offline cache is treated as missing instead of masquerading as an empty library; ASIN is exposed via its own getter instead of ISBN; stable source identity preserves the polling timer and sync continuity across unrelated reloads.
- Library loading: the load timeout now actually cancels in-flight source work; retries are always full loads; an aborted load is never cached as a failure.
- Parser: LaTeX command aliases missing from
unicode2latexare mapped; cross-platform path handling stabilized. - Settings: the library-load-timeout input is clamped and documented; the Readwise card reports truthful sync states; interval changes apply on the next poll cycle without recreating the source.
- Obsidian plugin review findings resolved.
🔧 Under the Hood
- New
npm run benchbenchmark suite (index build, search hot path, sorting over real adapters, normalization pipeline, BibLaTeX parse throughput, full reload cycle); the underlying bottleneck analysis is committed asdocs/performance-analysis.md. - A minimal id-correlated worker RPC replaces
promise-worker, which supported neither transferables, nor pooling, nor real cancellation. - Hot-path getters (
year,authorString,issuedDate) are memoized via a sharedEntry.memo()helper — a year-sort of 10k entries no longer allocates hundreds of thousands ofDateobjects. - Architecture documentation expanded: loading flow, source lifecycle, search index build, worker protocol, Readwise incremental sync.
- Test suite grew from 1105 to 1264 tests, maintaining 95%+ statement coverage.
Full Changelog: 0.5.1...0.6.0
v0.5.1
This release brings Readwise integration, Zotero PDF helpers, frontmatter-based note lookup, and important fixes for the Obsidian plugin approval process.
✨ New Features
- Readwise Integration: Import highlights and documents from Readwise as citable entries. Supports both v2 Export API (Kindle, Instapaper) and v3 Reader API (articles, PDFs). Includes automatic periodic sync, offline cache, and token validation. Configure as a regular database in settings.
- Zotero PDF Helpers: New
{{zoteroPdfURI}}and{{zoteroPdfURIs}}template helpers generatezotero://open-pdflinks from BibLaTeX file paths, enabling one-click PDF opening directly from literature notes (#57). - Frontmatter-Based Note Lookup: Renamed literature notes are no longer lost. Configure a Note identifier field in settings (e.g.
citekey) and the plugin will find notes by their frontmatter value even after renaming. Opt-in, configurable, zero-IO via Obsidian's metadataCache (#53). - Configurable Filename Sanitization: Choose the replacement character for illegal filename characters (
: * ? " < > |). Default remains_, but you can use space, dash, or empty string (#59).
🐛 Bug Fixes & Improvements
- Obsidian Plugin Approval: Replaced
fetchwith Obsidian's built-inrequestUrlfor all network requests, as required by the Obsidian plugin review guidelines. HTTP transport is now injected viaHttpGetFnto keep the core layer free of Obsidian imports. - Cyrillic BibLaTeX Support:
\cyrcharcommands (e.g.\cyrchar\CYRK,\cyrchar\cyri) are now correctly resolved to Unicode characters viaunicode2latexlookup, fixing broken Cyrillic text in BibLaTeX entries. - Relative Zotero Storage Paths:
zoteroPdfURIhelpers now correctly handle relative paths (e.g.storage/KEY/file.pdf) in addition to absolute paths. - LaTeX Error Reporting: Unmapped LaTeX commands now properly report errors instead of silently dropping characters.
🔧 Under the Hood
- Architecture Documentation: Added comprehensive
docs/architecture.mdcovering all layers, data flows, and component relationships. - New Use Case Guide: Added
docs/use-cases/renaming-literature-notes.mdwith step-by-step setup instructions for the frontmatter lookup feature. - Test Coverage: Expanded from 705 to 1105 tests, maintaining 95%+ statement coverage.
Full Changelog: 0.5.0...0.5.1
v0.5.0
Release Notes v0.5.0
This release is packed with quality-of-life improvements, extensive updates to the templating system, and a completely rewritten underlying architecture that ensures rock-solid stability.
✨ New Features
- Vault File Templates: You can now use a normal Markdown file from your vault as a template! No more squeezing complex layouts into a tiny settings text box—just point the plugin to your template file.
- Citation Style Presets: Setting up your reference formats is now instantly easier with built-in presets. Quickly apply standard styles like
textcite,parencite, orcitekeywith a single click in the settings. - Reference List Sorting: Finding the right paper is faster with new customizable sorting options directly inside the citation reference list search view.
- Accent-Insensitive Search: Searching is now much smarter! The search engine automatically normalizes diacritics, meaning a search for "Muller" will successfully find "Müller" without needing to type exact accents.
- Smart Cursor Placement: A major time-saver: when you insert a citation or extract its content, your cursor is now automatically placed at the very end of the inserted text, letting you continue typing immediately without breaking your flow.
- Advanced Literature Note Organization: Keep your vault tidy! You can now organize your literature notes into specific subfolders automatically.
- Granular Note Creation Control: New settings allow you to explicitly configure whether literature notes should be automatically created when inserting a citation, or disable the behavior entirely.
- Template Variables Explorer: Added a "Show variables" button in the settings that opens a convenient, searchable modal. You can see all available variables for a citation and click to copy them directly into your clipboard!
- New Template Variables: Expanded your templating capabilities with new helpful properties:
{{currentDate}}(inserts today's date),{{ISBN}},{{lastname}}, and{{selectedText}}for richer notes.
🐛 Bug Fixes & UX Improvements
- Canvas & Lineage Support: Fixed an issue where insertion commands failed; you can now correctly insert citations directly inside Obsidian Canvas and Lineage views.
- Mendeley Path Normalization: Fixed broken file links by ensuring Mendeley's PDF file paths are correctly normalized and resolved.
- Automatic Folder Creation: Improved stability by ensuring that missing base folders are correctly auto-created when generating new notes.
- HTML Entities in Notes: The
notefield will now properly decode HTML entities, preventing messy or broken formatting in your extracted notes. - Better Error Visibility: Instead of failing silently in the background, database parsing errors and missing configuration issues now display clear, helpful on-screen notices so you know exactly what needs fixing.
- Template Regex Safety: Addressed potential template crashes by adding regex safety checks to the Handlebars
replaceandmatchhelpers. - Listener Leaks: Fixed a hidden event listener memory leak in settings modals, ensuring the plugin remains fast and responsible over time.
🔧 Under the Hood
- Documentation Overhaul: The plugin documentation has been comprehensively rewritten with better structure, richer template examples, and detailed explanations of new settings and variables.
- Architecture V2: Completed a massive rewrite of the plugin's internal architecture to improve long-term maintainability and lay the robust foundation needed for future data formats and batch operations.
- Performance Boost: Switched to an isolated compilation cache for templates, significantly speeding up rendering for large vaults.
- Rock-Solid Stability: The testing suite was expanded from 338 to an incredible 705 tests, achieving over 95% test coverage to guarantee core features remain perfectly stable as the plugin grows.
Full Changelog: 0.4.7...0.5.0
0.4.7
Release Notes v0.4.7
This release brings powerful new features for advanced users, multi-database support, and a wave of critical bug fixes!
✨ New Features
- Multiple Citation Databases: You can now configure multiple databases in your settings, enabling simultaneous access to different reference libraries (e.g., separate Zotero exports for different projects).
- Date Variable: A new
{{date}}template variable is now available, automatically formatted asYYYY-MM-DDfor easy date stamping in your notes. - Zotero ID Access: The
zoteroIdfield is now exposed in templates, allowing direct linking back to your Zotero library entries. - Extended Handlebars Helpers: New helpers added for conditional logic (
#if,#unless,#each) and string manipulation, giving you more control over your templates. - formatNames Helper: A new
formatNameshelper for formatting author/editor names, plus direct access tokeywordsin your templates.
🐛 Bug Fixes
- WikiLink Extension: Fixed an issue where inserting literature notes incorrectly included the
.mdfile extension in WikiLinks. - Duplicate Note Prevention: Empty literature notes will no longer be created as duplicates when inserting citations.
- YAML Colon Handling: Fixed YAML generation to correctly handle titles containing colons (
:) without breaking frontmatter. - Zotero Link Preservation: The Zotero link text in the
notefield is now correctly preserved during parsing. - Year Off-by-One (Issue hans#160): Fixed a bug where the publication year was incorrectly calculated.
- BibTeX Note Parsing: Fixed a greedy regex issue that caused incorrect parsing when the
notefield contained multiple links. - Author/Editor Fallback: Improved handling for entries with single-field authors and added proper fallback to editors when authors are missing.
- Infinite Loading Spinner: Fixed a critical issue where the loading spinner would never disappear in certain error scenarios.
🔧 Under the Hood
- ESLint 9 Upgrade: Migrated to ESLint 9 with strict linting rules and improved type safety across the codebase.
- Code Quality: Enforced stricter linting and type safety to improve maintainability and catch potential issues early.
- Documentation: Updated README with better formatting and helper documentation.
0.4.6
Release Notes v0.4.6
We are excited to bring you a major update focusing on performance, stability, and a better user experience!
✨ New Features
- Expanded Template Support: You can now use
language,type, andsourcefields in your citation templates, giving you more flexibility in how you format your citations. - Smarter Templates: The plugin now dynamically detects and generates the schema for template variables, making it easier to see exactly what data is available from your library.
- Faster Search: We've implemented a new search engine (MiniSearch) under the hood. Searching your citation library is now significantly faster and more responsive.
🎨 UI & UX Improvements
- Modernized Interface: We've refreshed the look of the Modals and Settings pages. They are now cleaner, more organized, and align better with Obsidian's modern design.
- Better Settings Layout: Navigating through the plugin settings is now more intuitive with a reorganized layout.
🔧 Under the Hood
- Modern Obsidian API: We've migrated the plugin to use the latest Obsidian Editor API, ensuring better compatibility with current and future versions of Obsidian.
- Performance & Stability: We performed a massive refactoring of the internal architecture (including a new Service Layer and improved Lifecycle management). This makes the plugin more stable, reliable, and easier to maintain.
- Dependency Updates: We've updated core packages and TypeScript to keep the codebase healthy, secure, and performant.
Full Changelog: https://github.com/akhmialeuski/obsidian-citation-extended/commits/v0.4.6