Skip to content

Releases: chhoumann/quickadd

2.9.2

14 Dec 17:29

Choose a tag to compare

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

13 Dec 14:02

Choose a tag to compare

2.9.1 (2025-12-13)

Bug Fixes

  • preserve macro variables on reassignment (3c13731)
  • suggest vault tags for FIELD:tags (8a19e12), closes #671

2.9.0

09 Dec 22:01

Choose a tag to compare

2.9.0 (2025-12-09)

Bug Fixes

  • honor dateFormat in requestInputs (903df23)
  • preserve macro user script variable updates (#999) (26a7cf5)
  • reuse current tab when open file new-tab is off (#1007) (1b67d77)

Features

2.8.0

14 Nov 22:11

Choose a tag to compare

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

08 Nov 08:44

Choose a tag to compare

2.7.0 (2025-11-08)

Bug Fixes

  • format capture tags as YAML arrays (#974) (bc61760)
  • remove script suffix in request inputs (#979) (60ec853)
  • stop macros and APIs immediately when cancellations occur (#976) (48ea32d)

Features

  • add git info display to settings for development mode (#973) (e3b2a8b)

2.6.0

16 Oct 16:22

Choose a tag to compare

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

PR #959 | Closes #18

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

PR #961 | Closes #97

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:

  1. Open QuickAdd settings → "Export package..."
  2. Select choices to export with checkboxes
  3. Dependencies (nested choices, scripts, templates) automatically collected
  4. Choose to copy JSON or save to file
  5. Option to embed scripts/templates for fully self-contained packages

Import Process:

  1. Open QuickAdd settings → "Import package..."
  2. Paste .quickadd.json contents
  3. For each choice, decide: Import (new), Overwrite (replace), Duplicate (copy), or Skip
  4. For each asset, decide: Write, Overwrite, or Skip with customizable paths
  5. 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

PR #954 | Closes #499

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!

CleanShot 2025-10-16 at 18 46 45

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

Commit db76b9d

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

PR #958 | Closes #363

CleanShot 2025-10-16 at 18 48 19@2x

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

PR #951 | Closes #613

CleanShot 2025-10-16 at 18 47 58@2x

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

PR #956 | Closes #262

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...
Read more

2.5.0

10 Oct 19:41

Choose a tag to compare

2.5.0 (2025-10-10)

🌟 Release Highlights

This is a major feature release with significant improvements to QuickAdd's capabilities:

  • 🎨 Native YAML Property Types (Beta) - Use JavaScript arrays and objects directly in scripts, automatically formatted as proper Obsidian properties
  • 🛑 Macro Abort Control - New params.abort() method and automatic stopping on errors/cancellations
  • 🔍 Searchable Multi-Select Inputs - New suggester field type with search and multi-select capabilities for One Page Inputs
  • 🐛 Important Bug Fixes - Script-provided titles, escape sequences in code input, and property type handling

📊 By the numbers: 61 files changed, 8,177 lines added, 593 tests passing


⚠️ Breaking Behavior Change

Macro execution now stops when you press Escape or encounter errors. Previously, pressing Escape would continue execution with undefined values, which could cause confusing downstream errors.

New behavior:

  • Press Escape → macro stops immediately
  • Script error occurs → macro stops with clear error message
  • Call params.abort() → macro stops with your custom message

This is a better, more predictable experience, but if you have workflows that rely on the old behavior, see the migration guide below.


Features

🎨 Native YAML Front Matter Support for Structured Variables (Beta)

PR #932 | Commit 714ee32

QuickAdd can now automatically convert JavaScript data types into proper Obsidian property types in front matter!

Before:

// Manual string formatting 😓
QuickAdd.variables.authors = "John Doe, Jane Smith, Bob Wilson";
QuickAdd.variables.tags = "#work, #project";

After:

// Native data structures! 🎉
QuickAdd.variables.authors = ["John Doe", "Jane Smith", "Bob Wilson"];
QuickAdd.variables.tags = ["work", "project"];
QuickAdd.variables.metadata = { status: "active", priority: 1 };
QuickAdd.variables.completed = true;

Supported types:

  • Arrays → List properties
  • Objects → Object properties
  • Numbers → Number properties
  • Booleans → Checkbox properties
  • Null → Null values

⚠️ This is a beta feature disabled by default. Enable it here:

CleanShot 2025-10-10 at 21 49 12@2x

📚 Full documentation: https://quickadd.obsidian.guide/docs/TemplatePropertyTypes

Demo:

CleanShot.2025-10-10.at.21.48.11.mp4

🛑 Macro Abort Functionality

PR #937 | Closes #755, #897

Macros now stop executing when they encounter errors or when you cancel an input. This prevents confusing cascading errors and gives you programmatic control over macro execution.

What changed:

  1. Automatic abort on cancellation - Pressing Escape or clicking Cancel now stops the entire macro
  2. Automatic abort on errors - Unhandled exceptions stop execution (with preserved stack traces for debugging)
  3. Manual abort method - New params.abort(message) for validation scenarios
  4. Visual feedback - User-facing Notice when macros abort (PR #938)

Example use case:

module.exports = async (params) => {
    const file = params.app.workspace.getActiveFile();
    const cache = params.app.metadataCache.getFileCache(file);

    if (!cache?.frontmatter?.parent) {
        params.abort("This macro requires a note with a parent property");
    }
    // Macro stops here, no downstream errors
};

Another example:

module.exports = async (params) => {
    const projectName = await params.quickAddApi.inputPrompt("Project name:");

    if (!projectName || projectName.length < 3) {
        params.abort("Project name must be at least 3 characters");
        // Macro stops - no unwanted notes created
    }

    // Continue with valid input...
};

🔍 Searchable Multi-Select Suggester Field Type

PR #934 | PR #936 | Closes #934

One Page Inputs now support a new suggester field type with searchable autocomplete and multi-select capabilities!

Features:

  • 🔍 Searchable - Type to filter suggestions
  • Multi-select - Select multiple items (separated by commas)
  • 🎯 Custom options - Use static arrays or dynamic data sources (Dataview queries, etc.)
  • ⌨️ Custom input - Enter values beyond predefined options
  • 🎨 Configurable - Case-sensitivity, multi-select mode

Example:

const values = await quickAddApi.requestInputs([
  {
    id: "tags",
    label: "Select Tags",
    type: "suggester",
    options: ["#work", "#personal", "#project", "#urgent"],
    suggesterConfig: {
      multiSelect: true,
      caseSensitive: false,
      allowCustomInput: true
    }
  }
]);
// Result: values.tags = "#work, #project, #urgent"

Demo:

Suggester field with multi-select

📚 Full documentation: https://quickadd.obsidian.guide/docs/Advanced/onePageInputs

Huge thank you to @FindingJohnny for suggesting and helping develop this feature!


📝 Improved Script Discovery UX

PR #940 | Closes #895

QuickAdd now shows helpful notices when the Browse button finds no scripts, with clear guidance on:

  • Scripts must be in your vault (not .obsidian)
  • Hidden folders (starting with .) are not supported
  • Links to documentation

💡 Pro tip: Use underscore-prefixed folders instead: _quickadd/scripts/ instead of .quickadd/scripts/


Bug Fixes

🔧 Property Type Handling in Frontmatter Templates

Commit 2c24123

Critical follow-up fix for the Property Types feature (PR #932):

  • Preserves nested YAML paths when collecting template properties
  • Respects Obsidian property types when parsing array-like input
  • Ensures capture post-processing keeps frontmatter at top of files

This fix adds 173 new tests for capture choice frontmatter handling.


🔧 Script-Provided Title Values

PR #931 | Closes #929

Scripts can now override default title generation. When you set variables.title in a script, {{VALUE:title}} now respects that value instead of always using the file basename.

Before:

// Script sets custom title
variables.title = "My Custom Title";

// Template uses it
// Captured: {{VALUE:title}}

// Result: "Captured: NoteBasename" ❌

After:

// Script sets custom title
variables.title = "My Custom Title";

// Template uses it
// Captured: {{VALUE:title}}

// Result: "Captured: My Custom Title" ✅

🔧 Escape Sequences in wideInputPrompt

PR #939 | Closes #799

Long-standing issue from April 2024 now fixed!

Escape sequences like \n, \t, \" are now preserved as literal text when typing in wide input prompts. This is critical for code input use cases.

Before:

User types: "aa\nbb"
Result: "aa
bb" ❌ (actual newline)

After:

User types: "aa\nbb"
Result: "aa\nbb" ✅ (literal string)

🔄 Migration Guide

For the Macro Behavior Change

If you have macros that intentionally use undefined when users press Escape, update them to handle cancellation explicitly:

Before 2.5.0:

const input = await quickAddApi.inputPrompt("Optional input:");
// If user presses Escape, input is undefined, macro continues
if (input) {
    // Do something with input
}
// Macro continues regardless

After 2.5.0:

const input = await quickAddApi.inputPrompt("Optional input:");
// If user presses Escape, macro stops immediately

// To allow optional input, catch the abort:
// (Note: QuickAdd API still returns undefined on cancel for compatibility)
if (input === undefined) {
    // Handle optional case
    return; // or params.abort("Input required");
}

Most users won't need to change anything - this new behavior is more intuitive and prevents confusing errors.


⚠️ Known Limitations

  • Hidden folders (starting with .) are not supported for scripts. Use underscore-prefixed folders instead (e.g., _quickadd/scripts/ instead of .quickadd/scripts/)
  • Property Types feature is in beta - Please report any issues you encounter!

📚 Documentation Updates

New and updated documentation:

Read more

2.4.0

18 Sep 19:07

Choose a tag to compare

2.4.0 (2025-09-18)

Bug Fixes

  • remove global CSS that interfered with Obsidian modals (#923) (981b4dd), closes #921

Features

Optional linking

Append link now has three flavors. Capture and Template choices let you choose between Enabled (requires active file) for the legacy behavior, Enabled (skip if no active file) for a forgiving workflow, or Disabled.

CleanShot 2025-09-18 at 21 09 51@2x

That means no more “no active file” errors. If you opt into the skip mode, QuickAdd quietly drops the link when nothing is focused instead of aborting the capture. The same rule applies to templates and to {{LINKCURRENT}}, which now resolves to an empty string when there’s nothing to link to.

2.3.0

08 Sep 20:23

Choose a tag to compare

2.3.0 (2025-09-08)

Bug Fixes

  • preflight: restore One Page Input modal by avoiding mutation of executor variables during requirements scan (#917) (bd00430), closes #916

Features

2.2.1

07 Sep 19:30

Choose a tag to compare

2.2.1 (2025-09-07)

Bug Fixes

  • validation: revert excessive validation to enable previously working workflows and features (#915) (580d5af)