The QuickAdd plugin is a game-changer for Obsidian users who crave efficiency and productivity. It combines four powerful tools - templates, captures, macros, and multis - to help you streamline your note-taking process. With QuickAdd, you can create custom workflows that automate tasks, such as creating new notes with pre-defined templates and content, adding links to specific files, or even chaining together multiple actions for complex workflows. The plugin's syntax is similar to Obsidian's template syntax, making it easy to customize and extend your workflow. Whether you're a power user or just looking to boost your productivity, QuickAdd is definitely worth exploring.
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|custommodifier 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.
https://github.com/user-attachments/assets/f623a25c-0d2b-4de9-9741-ce07a5b344d5
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:
https://github.com/user-attachments/assets/877a6a17-742c-478b-895e-22d9f83ed6b2
📦 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.
https://github.com/user-attachments/assets/805968e2-5678-4136-b4ca-99a04a3bf9d0
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|custommodifier - 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