Releases: chhoumann/quickadd
2.11.0
β¨ New Features
Case Transforms for VALUE/NAME
Use the new |case:<style> pipe syntax to transform any VALUE or NAME token inline β no extra variables or macros needed. Eight styles are supported:
| Style | Example |
|---|---|
kebab |
my-new-blog |
snake |
my_new_blog |
camel |
myNewBlog |
pascal |
MyNewBlog |
title |
My New Blog |
lower |
my new blog |
upper |
MY NEW BLOG |
slug |
my-new-blog (filename-safe) |
Combine with other options freely: {{VALUE:title|label:Post Title|case:kebab}}. Each token applies its own transform independently, so you can reuse the same variable with different casing in a single template β for example, {{VALUE:title}} for the heading and {{VALUE:title|case:slug}} for the filename. Autocomplete suggestions appear as you type |case:. (#1103)
π Bug Fixes
Smarter Capture Target Resolution
Capture targets are now resolved with a clear, predictable hierarchy: empty β vault picker, #tag β tag picker, trailing / β folder picker, .md β file, and ambiguous paths are intelligently checked against existing files and folders. If a target file doesn't exist and "Create file if it doesn't exist" is off, you now get a clear error notification instead of a silent failure. The file suggester also properly suggests folders with trailing slashes. (#1098)
Alias Matching β Case-Insensitive & Comma-Aware
File suggestions now recognize aliases regardless of frontmatter key casing (Aliases, ALIAS, aLiAs β all work). Comma-separated alias strings like aliases: "hello, world" are now properly split into individual searchable aliases instead of being treated as one long string. (#1097)
Correct Section Insertion Position
Content captured into a specific section (insert-after a heading) now lands in the right place. A bug caused the plugin to confuse array indices with line numbers when finding the next heading boundary, which could misplace your content β especially in documents with nested subsections. (#1096)
Proper Newlines When Appending Tasks
Appending tasks to a file that doesn't end with a trailing newline no longer concatenates the new task onto the last line. Tasks now always start on their own line. (#1102)
VDATE Formatter β Robust Date Parsing
The {{VDATE:...}} formatter now handles date variables passed as plain strings (e.g. "2026-12-31") or JavaScript Date objects via the API, not just the internal @date: format. This makes programmatic and URI-based date passing work reliably. (#1101)
Cleaner Settings Suggesters
File suggestions in settings dialogs no longer show the redundant .md extension β you'll see folder/my-template instead of folder/my-template.md. The underlying values are unchanged. (#1104)
Discoverable Choice Renaming
Renaming choices is no longer a hidden feature. A pencil icon now appears next to the choice name as a visual indicator, and "Rename" is available in the right-click context menu. (#683)
Intuitive Split Direction Labels
"Vertical" and "Horizontal" split labels have been replaced with "Split right" and "Split down" β describing where the new pane actually appears rather than the orientation of the divider. (#1089)
2.10.0
β¨ New Features
AI & Security
- SecretStorage for API keys β AI provider keys are now stored securely in Obsidian's SecretStorage instead of plain settings. Existing keys are migrated automatically. Requires Obsidian 1.11.4+.
Capture Improvements
- Inline insert-after mode β New capture mode that inserts content inline with optional replace-to-EOL behavior
- Per-token multiline VALUE inputs β Use
{{VALUE:name|type:multiline}}to get multiline prompts for specific tokens (#339) - Selection-as-value controls β New options for how captured selections are handled (#1055)
- Blank-line mode for insert-after β Better control over whitespace when inserting after headings (#1054, #1056)
Prompts & Input
- Native date picker β New date picker UI with timezone-stable selection, used with
{{VDATE:...}}syntax - Short-form date aliases β Configure aliases like
tmβtomorrowfor natural language dates - Persist drafts on cancel β Input prompts now remember your draft if you escape/cancel (#1044)
- Improved prompt labels β Better labeling for VALUE/MACRO prompts with new
|label:option syntax
Macros & Templates
- Macro selection helper β New
quickAddApi.getSelection()to access editor selection in macros (#483) - Enhanced folder chooser β Create folders directly from the template folder picker, plus current-folder shortcut (#1011, #1012)
Documentation
- Versioned docs β Documentation now supports versioning via Docusaurus, with stable v2.9.4 snapshot
π Bug Fixes
- Templater 2.18.0 compatibility β Fixed breaking change in Templater's
parse_templateAPI (#1085, #1086) - Android suggester filtering β Hardened query normalization to prevent crashes (#1078)
- Legacy choice migration β Backfill missing file-opening defaults to prevent runtime errors
- Bundle size β Reduced below Obsidian sync limit using js-tiktoken/lite
- Unicode file suggestions β Proper NFC normalization for non-ASCII filenames (#1046)
- Case-insensitive paths β Handle template overwrite with mismatched casing (#1049)
- Leading slash normalization β Fix paths starting with
/in capture/template settings (#1050) - Suggester display stability β Prevent crashes from non-string display items
- Macro rename prefill β Input now prefilled with current name (#1043)
- Update announcements β Default to major releases only (#1042)
β οΈ Breaking Changes
- Minimum Obsidian version raised to 1.11.4 β Required for SecretStorage API
2.9.4
2.9.3
2.9.2
2.9.2 (2025-12-14)
Highlights (Templater integration overhaul)
This release makes QuickAddβs Templater integration deterministic and safe-by-default, addressing long-standing reports around cursor placement, double execution, and unexpected <% %> execution during captures.
tp.file.cursor()/ cursor jumping now works reliably when QuickAdd opens the target file (respects Templaterβs auto-jump setting).- Captures no longer execute unrelated
<% %>elsewhere in the destination note (including inside fenced code blocks). - βInsert afterβ on newly created files is more reliable when the anchor is created by Templater (includes / trigger-on-create).
- Reduced βtemplate runs twice / duplicate promptsβ by removing unnecessary whole-file renders and locking whole-file processing per file.
- Template append/prepend now runs Templater only on the inserted snippet (not the entire destination note).
Behavior change (important)
Captures into existing files no longer run Templater across the entire destination file by default.
- If you relied on the legacy behavior, enable Run Templater on entire destination file after capture in the capture choice settings.
Bug Fixes
2.9.1
2.9.0
2.8.0
2.8.0 (2025-11-14)
Bug Fixes
- restore Insert After matching for table separator rows (#983) (1393e6a), closes #970
- support frontmatter tags in getFieldValues filtering (#980) (c9de468), closes #927
Features
- Add embed replacement option for link placement (#984) (06a77a3), closes #893
- add provider-native model discovery (#982) (f195c06)
- add textarea type for advanced script settings (#981) (dc9a650)
- add update modal settings for major releases only (#985) (d63f8c9), closes #447
- add write to top of file switch for capture to active file (#986) (5361e6c), closes #248 #248
2.7.0
2.6.0
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.
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 be...
