Releases: CarlB01/re-supercharged-links
Release list
1.0.19
Release Notes: Re-Supercharged Links (v1.0.19-optimized)
Overview
This production release introduces a completely re-engineered core runtime architecture. It addresses critical performance bottlenecks, eliminates heavy layout thrashing loops, and stabilizes background resource usage down to 0% idle CPU.
The entire framework has been audited to eliminate redundant object allocations, optimize memory footprint, and guarantee smooth performance inside large vaults with high-density data views.
Key Performance Enhancements
1. Fixed "Infinite Style Loop" & DOM Race Conditions
- The Issue: Previous rendering loops repeatedly cleared, re-inserted, and evaluated link styles on active view elements. This triggered a cascading sequence of Obsidian mutation updates, keeping the Electron renderer thread locked at 58%–62% CPU.
- The Fix: Implemented a synchronous Immutability Guard (
scl-processed) inside the core mutation engine (setLinkNewProps). Element styles and attributes are now verified before any heavy DOM access. If a link matches its precompiled layout configuration, the mutation layer aborts immediately, clipping the endless execution chain.
2. High-Performance Asynchronous DOM Chunking
- The Issue: Legitimately updating high-density layouts (e.g., loading large database tables or bulk link state changes via myBrain) forced up to 700 synchronous DOM mutations in a single frame, causing significant lag and frameskipping.
- The Fix: Introduced
DOMMutationBatcher, a non-blocking asynchronous render queue powered byrequestAnimationFrame. Mutations are now split into micro-batches capped at 25 operations per frame. Large table layouts are processed smoothly across successive animation cycles, securing a fluid 60 FPS user experience.
3. Decoupled Core Event Engine & Cache Hygiene
- The Issue: Real-time cache pruning and structural array mappings (
Array.from().sort()) were executing inline across active styling loops, bottlenecking the main Obsidian process. - The Fix:
- Relocated the cache eviction manager (
runLifecyclePrune) out of hot execution paths onto a passive, nativethis.registerInterval()background worker that sweeps memory every 30 seconds. - Swapped out loose real-time event executions for a strictly debounced path and folder-prefix aggregation filter (
asap: false), grouping rapid file changes together before executing a single compressed layout update.
- Relocated the cache eviction manager (
4. Zero-Array Memory Optimization (Anti-Garbage Collection)
- The Issue: Frequent use of high-order array methods (
.filter(),.map(), and Regex splits) on critical hot paths generated massive amounts of short-lived heap allocations, forcing constant Garbage Collection thread pauses. - The Fix: Streamlined
shared-utilswith localized indexing loops (for,while) and index-based slicing (substring,indexOf). Features likehasTagTokennow utilize zero-allocation string mapping to evaluate token parameters instantly.
Architectural Metrics & Telemetry Baseline
Following these optimizations, real-world vault analytics profiles demonstrate massive efficiency gains:
| Metric Metric | Legacy Runtime Engine | v1.0.19 Optimized Engine | Architectural Impact |
|---|---|---|---|
| Idle CPU (Renderer / Process) | 55.0% – 62.0% | 0.0% – 0.2% | Eliminates thermal throttling and battery drain. |
| Sync Mutations per Frame | ~702 nodes | Capped at 25 nodes | Breaks layout bottlenecks; guarantees fluid UI scrolling. |
| Average Execution Time | 2.24ms – 5.10ms | 0.63ms – 0.95ms | Drastic sub-millisecond execution boundaries. |
| Cache Hit Rate Stability | Volatile Loops | 54.1% (Deterministic) | Removes duplicate metadata queries from disk. |
Installation & Deployment
The compiled assets have been packaged and optimized to fully prevent script evaluation anomalies during hot-reloads. Downstream plugins (such as myBrain) can safely bind against the standardized data-attribute matrices.
1.0.18
consolidate strings nb has race condition in obsidian helper (renderer)
1.0.17
deduplicated logic between Read Mode and Live Preview. Pre-compiled style rules. Stabile.
1.0.15
moved cache logics and metrics out of .main and into separate .ts
1.0.14
Release notes (since last release)
This release focuses on performance, stability, and smoother behavior when styling links.
Highlights
-
Smarter refresh behavior
- Reduced unnecessary theme refreshes during normal file events.
- Theme/editor refresh is now more targeted to settings/rule changes, which lowers CPU usage during editing.
-
More efficient path/prefix updates
- Added prefix compaction to avoid redundant subtree work (child prefixes already covered by parent prefixes are removed).
- Improves responsiveness on large vaults and heavy rename/move operations.
-
Attribute cache hardening
- Added TTL + size cap for attribute cycle cache to prevent unbounded growth over time.
- Cache entries are now touched/pruned more predictably for long-running sessions.
-
Debounced settings persistence
- Settings typing now uses debounced disk saves instead of saving on every keystroke.
- Reduces IO pressure and improves settings UI smoothness.
-
Guardrails for expensive rules
- Added validation for very short alphanumeric
containstokens (e.g. single-letter matches) to avoid accidental “match almost everything” rules. - Symbol-based tokens (e.g.
@) are still allowed.
- Added validation for very short alphanumeric
-
Startup/edit-mode robustness
- Improved initial refresh timing for first active edit-mode note after startup to reduce missed initial styling in Live Preview.
Result
Overall, this version should feel lighter under load, especially in vaults with many links and broad style rules, while preserving expected behavior in read/edit mode and settings workflows.
1.0.13
Release Notes
✅ Improvements
- Reduced redundant refreshes by deduplicating metadata-change events after recent file modifications.
- Batched file-change handling using pending path/prefix queues to avoid unnecessary repeated UI refreshes.
- Improved responsiveness and stability during rapid modify/rename/delete event bursts.
- Kept settings editing smooth by preserving silent updates where appropriate (avoids focus/cursor interruptions while typing).
🧹 Cleanup
- Removed development-only runtime profiling and test instrumentation from production code.
- Simplified refresh flow by removing profiler wrappers while keeping optimized behavior.
🔧 Internal
- Retained path/prefix invalidation flow for accurate cache updates.
- Preserved debounced refresh scheduling for better event coalescing.
1.0.12
Release: Targeted Cache Invalidation
This release improves responsiveness by invalidating attribute cache entries only for affected files/paths, instead of clearing broad cache state.
What changed
- Added path-based cache invalidation on vault events:
modify→ invalidate changed file pathdelete→ invalidate removed file pathrename→ invalidate both old and new paths- folder-rename safety via prefix invalidation
- Added throttled visible refresh after invalidation to keep UI updates smooth
Impact
- Faster incremental updates in large vaults
- Less unnecessary cache churn
- More consistent live styling after file operations
- Keeps quick switcher and link suggestion flows feeling snappy
1.0.11
Release: Faster Styling, Smarter Cache
This release makes Supercharged Links feel snappier and more predictable — especially in large vaults. We introduced a smarter cache strategy so style changes show up faster and old styles don’t “stick” after edits.
What changed
1) Versioned rule cache (ruleConfigVersion)
Think of this like a cache generation number.
- Every time you make a rule-related change (edit/create/delete/reorder), the generation is bumped.
- Cache keys now include that version.
- Result: old cache entries are automatically ignored after changes, so you get fresh styling without weird stale leftovers.
In short:
new rules config = new cache namespace.
2) Better live refresh behavior
When rules change, the plugin refreshes visible links more directly, so updates appear quickly in the editor and UI.
3) Startup stabilization pass
A second delayed refresh pass helps when metadata/Dataview data is still warming up right after launch.
That improves first-load consistency in big vaults.
Why this matters
With very large vaults, performance is often less about raw compute and more about:
- avoiding unnecessary recomputation
- invalidating cache at the right time
- syncing UI updates with metadata readiness
This release improves all three.
User-visible impact
- Faster, “cleaner” feeling interactions
- Quick switcher/suggestions feel more responsive
- Styling updates apply more reliably after rule edits
- Fewer stale-style edge cases
Release hygiene
- Perf/debug instrumentation remains available for diagnostics
- Debug logging is disabled in normal release mode
1.0.10
Re-Supercharged Links — Runtime Unification & Performance Cleanup
This release delivers a focused internal refactor aimed at improving consistency, reducing redundant logic, and stabilizing observer behavior across views.
Highlights
- Unified rule matching into a shared resolver used across rendering paths
- Reduced duplicated styling/matching logic between Live Preview and Read Mode
- Added observer deduplication safeguards to prevent duplicate registrations
- Consolidated rule reordering into one shared engine
- Refactored visible-link updates into smaller, testable routines
- Performed targeted cleanup of transitional/legacy wiring after migration
What changed
1) Unified rule resolution
A new centralized rule-resolution routine now handles matching and style aggregation in a deterministic way.
This reduces drift between rendering contexts and makes future optimizations easier.
Included behavior:
- Tag/path/attribute matching
- Color/background/font style resolution
- Icon before/after resolution
- Data attribute export for downstream consumers
2) Live Preview + Read Mode parity improvements
Both Live Preview decoration flow and Read Mode DOM mutation flow were aligned to the same resolution model.
Result: more consistent visual output across editor and rendered views.
3) Observer deduplication and lifecycle hardening
Observer registration logic was tightened to avoid duplicate observers during repeated layout/window cycles.
- Container observers are now deduplicated by container + logical key
- Modal observers are deduplicated per
Document - Disconnect paths reset plugin-level observer lists to avoid stale references
4) Rule reorder consolidation
Rule movement logic was consolidated into a shared rule-order-engine routine.
- Preserves existing row animation
- Keeps active edit index synchronized during swaps
- Removes duplicated reorder logic in settings tab code
5) Update flow refactor (no intended behavior change)
updateVisibleLinks was split into focused helper routines:
- properties pane updates
- tab header updates
- internal link updates
This is a maintainability refactor to make incremental testing and debugging simpler.
6) Cleanup
Post-migration cleanup removed redundant wiring and reduced technical debt while preserving runtime behavior.
Why this release matters
This release is primarily about long-term reliability and performance stability:
- Fewer duplicated rule engines to maintain
- Lower risk of inconsistent match behavior across contexts
- Better observer hygiene under repeated layout or window events
- Cleaner structure for upcoming feature work and optimization passes
Compatibility notes
- No intentional user-facing configuration changes
- Existing style rules/settings should continue to work as before
- If you rely on third-party view integrations, please report regressions with reproduction steps
Recommended quick verification after update
- Reload plugin
- Verify rule styling in Live Preview and Read Mode
- Test quick switcher / suggestion popups
- Reorder rules up/down in settings
- Restart Obsidian and confirm settings persistence
1.0.9
Re-Supercharged Links — Performance & Architecture Refactor
This release focuses on runtime consistency, maintainability, and incremental performance improvements across Live Preview, Read Mode, and settings UI rendering.
✨ Highlights
- Introduced a unified rule resolution engine for deterministic style matching.
- Reduced duplicated matching logic across rendering pipelines.
- Improved observer lifecycle safety with duplicate observer prevention.
- Consolidated rule reordering logic into a single shared engine.
- Refactored visible-link update flow into smaller, testable routines.
🔧 What changed
1) Unified rule resolution
- Added a central resolver (
rule-resolver) used by multiple pipelines. - Live Preview now resolves styling through the same matching model used elsewhere.
- Read Mode mutation flow was migrated to the same resolution strategy.
2) Observer deduplication and lifecycle hardening
- Added container/key-based observer dedup logic to avoid duplicate
MutationObserverregistrations after repeated layout changes. - Preserved existing behavior while reducing redundant observer overhead.
- Cleaned observer teardown flow and reset plugin-level observer arrays on disconnect.
3) Rule ordering consolidation
- Moved reorder behavior to one shared routine (
rule-order-engine). - Removed duplicated move logic from settings tab class.
- Preserved animation and active edit-row synchronization behavior.
4) View updater refactor
- Split
updateVisibleLinksinto smaller focused routines:- properties pane updates
- tab header updates
- internal link updates
- No intended behavior changes; this is a structure/maintainability refactor.
5) Cleanup and migration
- Removed legacy call paths after migration to unified resolver.
- Kept compatibility where needed during transition, then cleaned dead code/imports after verification.
- Improved internal comments and consistency in strict typing patterns.
✅ Result
- More consistent styling output across UI contexts.
- Lower risk of rule drift between Live Preview and Read Mode.
- Cleaner architecture for future optimization work.
- Safer incremental maintenance with smaller, isolated routines.
Notes
This release is intentionally focused on internal quality, runtime coherence, and technical debt reduction.
If you notice edge cases in specific third-party view integrations, please open an issue with reproduction steps and view/plugin context.