2.6.0 (2025-10-16)
🌟 Release Highlights
This is a feature-packed release with powerful new capabilities and important bug fixes:
- 🔀 Conditional Macro Commands - Add IF/ELSE logic to macros without writing JavaScript
- 📦 Package Export/Import - Share complete automation workflows with scripts and templates
- 🎯 Enhanced Format Syntax - New
{{FILENAMECURRENT}}
token and|custom
modifier for flexible inputs - ⚙️ Improved Input Validation - Real-time template path validation with autocomplete
- 🔗 Better Obsidian Integration - Respects link format and default location settings
- 🐛 Important Bug Fixes - Settings initialization, link generation, and UI improvements
Features
🔀 Conditional Macro Command Support
Add IF/ELSE logic to your macros without writing JavaScript boilerplate! This highly-requested feature enables dynamic workflows that respond to runtime data.
CleanShot.2025-10-16.at.18.38.18.mp4
Two modes available:
Variable Comparison Mode:
- Compare macro variables using operators:
equals
,notEquals
,lessThan
,lessThanOrEqual
,greaterThan
,greaterThanOrEqual
,contains
,notContains
,isTruthy
,isFalsy
- Support for text, number, and boolean value types with proper coercion
- Each conditional has "Then" and "Else" branch editors
Script Mode:
- Point to a JavaScript file that returns true/false
- Full access to app, variables, quickAddApi, and params
- Can use
params.abort()
to stop macro execution
Example use cases:
- Conditional Processing: "If priority equals 'high', send notification"
- Dynamic Workflows: "If status contains 'complete', archive the note"
- Complex Logic: Use JavaScript for advanced conditions like checking file age
- Nested Branching: Conditionals can contain other conditionals for complex decision trees
Demo:
CleanShot.2025-10-12.at.14.53.13.mp4
📦 Package Export/Import Workflow
Share your automation workflows between vaults or with others! Package your choices along with their scripts and templates into self-contained JSON files.
CleanShot.2025-10-16.at.18.41.37.mp4
Export Process:
- Open QuickAdd settings → "Export package..."
- Select choices to export with checkboxes
- Dependencies (nested choices, scripts, templates) automatically collected
- Choose to copy JSON or save to file
- Option to embed scripts/templates for fully self-contained packages
Import Process:
- Open QuickAdd settings → "Import package..."
- Paste .quickadd.json contents
- For each choice, decide: Import (new), Overwrite (replace), Duplicate (copy), or Skip
- For each asset, decide: Write, Overwrite, or Skip with customizable paths
- Click "Import package" - changes apply immediately
Example use cases:
- Share Workflows: Export a book tracking macro → share JSON → others import and use
- Vault Migration: Move entire QuickAdd setup to new vault in seconds
- Template Distribution: Package multi-choice workflows for community
- Backup: Export configurations for version control
- Team Workflows: Standardize workflows across team members
🎯 {{FILENAMECURRENT}} Format Syntax
Reference the current file's name without creating a link! Complements {{LINKCURRENT}}
for cases where you want the filename text without link formatting.
How it works:
- Returns basename (without extension) of currently active file
- Works in file names, content, capture formats, and location strings
- Honors same required/optional behavior as {{LINKCURRENT}}
- Shows 'current_filename' placeholder in autocomplete preview when no file is active
Example uses:
# Template file name
{{FILENAMECURRENT}} - Notes.md
# Template content
Created from: {{FILENAMECURRENT}}
Source: {{LINKCURRENT}}
# Result with active file "myfile.md"
Created from: myfile
Source: [[myfile]]
🎨 |custom Modifier for VALUE Syntax
Commit 207b0ba | Closes #461
Combine the best of both worlds: provide common suggestions while allowing custom input!
Before: Choose between suggester (fixed options) OR free text
After: Use |custom
to get both!
Status: {{VALUE:status,To Do,In Progress,Done|custom}}
Behavior:
- Shows suggester with preset options
- User can select from suggestions OR type completely different value
- Case-insensitive modifier parsing
- Cannot combine with default values
Example use cases:
- Priority levels with preset options but allow "Critical" or "None"
- Color themes with common choices but allow custom theme names
- Tag selection with frequent tags but allow new tags on the fly
⚙️ Improved Input Validation and Autocomplete
Commit 0b66d43 | Closes #625
No more template path typos! Real-time validation with autocomplete makes configuration faster and more reliable.
New features:
- Full-Width Layouts: Template and capture path inputs now span full modal width
- Real-Time Validation: "Template not found" errors appear immediately as you type
- Enhanced Autocomplete: Template path suggestions with highlighted matching text
- Reusable Component: Consistent validation across template and capture builders
Benefits:
- Catch typos immediately without testing
- See suggestions as you type
- Long paths are fully visible
- Consistent UX matching folder path inputs
🔤 Pre-populate Default Values in Input Fields
Default values are now visible in input fields instead of hidden until submission!
How it works:
{{VALUE:author|Anonymous}}
→ Input field shows "Anonymous" (editable){{VALUE:status,To Do,In Progress,Done|To Do}}
→ "To Do" appears first in suggester- Shows "Default: value" as placeholder hint in suggesters
Benefits:
- See what the default will be before submitting
- Press Enter to quickly accept defaults
- Better discoverability of default values
- Faster workflows for common scenarios
📝 Additional Features
Add toggle for input cancellation notices (aeb0002)
- Control whether cancellation notices appear when aborting macros
- Reduces noise for users who frequently cancel operations
Bug Fixes
🔗 Respect Obsidian 'New Link Format' Setting

What was broken:
QuickAdd ignored Obsidian's "New link format" setting (relative/shortest/markdown vs wiki), always using vault-absolute paths.
What's fixed:
- Append-link operations now respect link format setting
{{LINKCURRENT}}
in captures generates proper relative links- File suggester uses destination context instead of active file context
- Multi-level relative navigation (
../../
) works consistently - Handles cases where destination file doesn't exist yet
Impact: Users who configure relative/shortest path links now see correct formatting everywhere in QuickAdd.
🗂️ Respect Obsidian's Default Location for New Notes

What was broken:
When 'Create in folder' was disabled in template choices, files were always created in vault root, ignoring Obsidian's global "Default location for new notes" setting.
What's fixed:
Uses app.fileManager.getNewFileParent()
to determine correct folder, respecting Obsidian's default location settings (vault root, same folder as current file, or specific folder).
Impact: Template choices now match Obsidian's native file creation behavior.
⚡ Initialize User Script Default Values Before Execution
What was broken:
User script settings default values weren't initialized unless you explicitly opened the settings modal first. Scripts received empty settings objects even when defaults were defined.
What's fixed:
- Created
initializeUserScriptSettings()
utility that populates default values before script execution - Default values now work immediately without opening settings modal
- Consistent behavior across all user scripts
Impact: Settings work out-of-the-box with no manual initialization required.
📝 Restore TITLE Behavior When FIELD:title is Used
What was broken:
Using {{FIELD:title}}
in a template interfered with {{TITLE}}
, causing both to show the filename instead of {{FIELD:title}}
accessing the YAML frontmatter title field.
What's fixed:
- Prevented FIELD-derived specifiers from sharing the global title slot
{{TITLE}}
correctly represents the filename{{FIELD:title}}
correctly accesses YAML title field- Both can be used together without conflicts
🔧 Respect Macro Member Access
What was broken:
Executing specific functions using {{MACRO:X::func}}
syntax didn't work - macros ran the default entry point instead.
What's fixed:
- Macro member access now runs requested function directly
- Settings initialized and variables synced when using member access
- No unexpected entry point prompts
Impact: {{MACRO:ZZZ::f}}
correctly calls function f
and uses its return value.
🔄 Nested Choice Reordering Not Persisting
What was broken:
Reordering choices inside Multi/folder choices updated the UI but didn't persist after restarting Obsidian.
What's fixed:
Added proper event bubbling from nested ChoiceLists to ChoiceView where saveChoices()
persists changes.
Impact: Nested choice reordering now persists correctly across plugin reloads.
🤖 Improve AI Model Parameter Handling
What was broken:
- Passing model as string (e.g.,
"gpt-4"
) didn't work despite documentation showing this format - Confusing error: "Model 'undefined' not found in any provider"
- Only
{name: "gpt-4"}
object format worked
What's fixed:
- Accept model parameter as both string and
{name: string}
object - Consistent validation via
getModelByName()
- Better error messages guiding users to configure providers
- Updated documentation with correct examples
🎨 Additional Bug Fixes
Standardize multi-line input font size across themes (#955) | Closes #270
- Fixed inconsistent font sizing in multi-line input boxes across different Obsidian themes
- Added explicit 16px font size for consistent experience
Keep custom suggestions last (#965)
- Custom input entries now consistently appear after fuzzy-ranked suggestions
- More predictable suggestion ordering
Correct broken documentation link (#948)
- Fixed 404 error in Readwise example documentation
- Updated link path to match actual file structure
📚 Documentation Updates
Updated documentation:
- NEW: Packages.md - Complete guide to export/import workflow
- Updated: MacroChoice.md - Conditional command documentation
- Updated: FormatSyntax.md - New
{{FILENAMECURRENT}}
token and|custom
modifier - Updated: QuickAddAPI.md - Corrected AI model parameter examples
- Updated: Example documentation - Fixed broken links
🙏 Thank You
Special thanks to everyone who:
- Reported issues and provided detailed feedback
- Waited patiently for issue #18 (4+ years!) - it's finally here!
- Contributed ideas and feature requests
- Continue to use and support QuickAdd
Your feedback drives QuickAdd's development!
Full Changelog
Features:
- add {{FILENAMECURRENT}} format syntax (#954) (f66ada5), closes #499
- add |custom modifier for VALUE syntax to allow custom input (207b0ba), closes #461
- add conditional macro command support (#959) (4e0fc1e)
- add toggle for input cancellation notices (aeb0002)
- improved input validation and autocomplete with full-width layouts (0b66d43), closes #625
- package export/import workflow (#97) (#961) (80da44b)
- pre-populate default values in input fields (db76b9d)
Bug Fixes:
- correct broken documentation link (#948) (1ac3f2b)
- improve AI model parameter handling and validation (#949) (dbc74a7), closes #674
- initialize user script default values before execution (#956) (3017875), closes #262
- keep custom suggestions last (#965) (3ca5eef)
- nested choice reordering not persisting (#953) (acee380), closes #142
- respect macro member access (#963) (a0b77fe)
- respect Obsidian 'New link format' setting when appending links (#958) (9368ef0), closes #363
- respect Obsidian's default location for new notes (#951) (c096a2d), closes #613
- restore TITLE behavior when FIELD:title is used (#967) (d89bc7d), closes #966
- standardize multi-line input font size across themes (#955) (bda1dad), closes #270