Requires Antinote 2.0 or later

Extensions

Antinote 2.0 allows you to write and use extensions in JavaScript that enable commands that can be invoked with ::. With over 100 official commands, and a growing community of contributors, the possibilities are endless.

Command Types

There are different types of commands, each with different capabilities:

Insert

These commands simply insert something at your cursor position. Perfect for quickly adding dates, templates, random values, UUIDs, and more.

  • Insert today's date or calculate business days
  • Insert templates like to-do lists or meeting notes
  • Generate random numbers, dice rolls, or quotes
  • Create UUIDs or random strings

Replace Line

These commands modify the content of your current line only. Great for formatting or transforming a single line of text.

  • Convert text to UPPERCASE, lowercase, or Title Case
  • Transform to camelCase, snake_case, or kebab-case
  • Trim whitespace or remove quotes

Replace All

These commands modify the content of your entire document. Powerful for bulk operations and text manipulation.

  • Find and replace text throughout the document
  • Sort lines alphabetically or numerically
  • Filter, deduplicate, or remove lines
  • Convert formats (CSV to JSON, lists to comma-separated)
  • AI-powered: polish text, translate, or create lists

Open URL

These commands can open URLs or use URL schemes to trigger actions in other apps on your Mac.

  • Open a random Wikipedia page
  • Launch other apps via URL schemes
  • Trigger automations in apps like Shortcuts or Raycast

LLM Extensions

Extensions can leverage LLMs (Large Language Models) as well, allowing you to quickly take advantage of AI for inserting or modifying text. Just configure your LLM key, and all LLM extensions will be able to leverage it.

Supported providers include:

  • OpenAI (ChatGPT)
  • Anthropic (Claude)
  • Google AI
  • OpenRouter (access multiple models)
  • Ollama (local models)

For more details, see the AI Extensions documentation on GitHub.

API Calls

Extensions can also call custom APIs with API keys stored safely in your macOS Keychain. This allows you to build powerful integrations while keeping your credentials secure.

Key features:

  • Secure credential storage using macOS Keychain
  • Make HTTP requests to declared API endpoints
  • Process responses and insert results into your notes
  • Build custom integrations with your favorite services

How network access is controlled:

  • An extension can only call endpoints declared in its extension.json — the app refuses requests to any other URL
  • All extension network access is additionally gated by Settings > Privacy > "Let extensions call their own APIs" — nothing goes out until you turn it on
  • Calls run asynchronously — the app never blocks while waiting for a response, so you can keep typing

You can manage API keys and see each extension's declared endpoints in Managing Extensions & API Keys. For more details, see the Network Extensions documentation on GitHub.

Math Functions

Extensions can also leverage the math feature in Antinote to make calculations based on natural language. This makes it easy to perform complex calculations without leaving your notes.

Examples of what you can do:

  • Calculate loan payments and amortization schedules
  • Compute investment growth with compound interest
  • Perform financial analysis (NPV, IRR, etc.)
  • Use math expressions in parameters (e.g., 0.05/12, 30*12)

For more details, see the Extensions documentation on GitHub.

Installing Extensions

Make sure you're running Antinote 2.0 or later to use extensions.

Install from the Extension Manager:

  1. Open Antinote and go to Settings
  2. Navigate to the Extensions tab
  3. Click Browse community extensions
  4. Search or browse the available extensions, then click Add on any extension
  5. The extension is immediately available for use

Install manually:

  1. Drop the extension's files into your extensions folder — by default ~/Library/Application Support/Antinote/Extensions/ (you can also choose a custom folder)
  2. In Settings > Extensions, press Reload Extensions

Any extension you put in the extensions folder can be loaded, which makes it easy to install custom extensions or ones shared by others. See Managing Extensions & API Keys for everything you can do once an extension is installed.

Tip: You can open your extensions folder any time from Settings > Extensions > Open Extensions Folder.

Managing Extensions & API Keys

Everything about extensions lives in Settings > Extensions. The Enable extensions master toggle at the top turns the whole system on or off.

Loaded Extensions

The Loaded Extensions list shows every extension currently installed. Click an extension to see:

  • Its version, author, and category
  • Badges: Network Extension, Local Extension, or Service
  • Dependencies, with each one marked installed or missing
  • Its Data Access declaration: No note content, Current line only, or Full note content
  • The API endpoints it declares and any API keys it requires
  • The commands it provides
  • Per-extension settings, with a Reset to Defaults button
  • A Danger Zone with Remove Extension

Browsing community extensions

The Browse community extensions button opens the Extension Manager. It lists Updates Available and Available Extensions with search; each entry shows its version, size, Network / Requires API Key badges, and the commands it adds. Use the Add, Update, and Refresh buttons to manage your collection.

Security: The extension catalog manifest is fetched from GitHub and verified with an Ed25519 signature against a key built into the app, and every downloaded extension is checked against a SHA-256 hash before it's extracted. Browsing requires Settings > Privacy > "Check GitHub for extension updates" to be on.

API Keys

The API Keys section manages the credentials that network extensions use. Each key has:

  • A friendly name you choose
  • A Keychain key, e.g. apikey_openai
  • An allow-list of which extensions may read it

Key values are stored in the macOS Keychain — never in preferences. Extensions can only use keys once Settings > Privacy > "Let extensions call their own APIs" is enabled.

Custom aliases

You can add your own aliases to any command from the command's detail view. Aliases are matched by autocomplete just like command names, so a long command can be as short as you like.

Pro tip: Before adding an extension, check its Data Access declaration — extensions that declare No note content never see what you write.

Using Commands

In Antinote, simply type :: and the extensions palette will pop up.

How it works:

  1. Type :: anywhere in your note
  2. The extensions palette appears with available commands
  3. As you type, it filters to match your search
  4. Select a command with arrow keys and press Return to insert it
  5. The command shows instructions, required and optional parameters
  6. Fill in the parameters, then press Return to execute the command

The palette is a full autocomplete system — see Autocomplete for ranking, parameter assistance, and the complete keyboard reference, and Argument Syntax for how commas and quotes are parsed inside the parentheses.

Pro tip: You can type the command name directly after :: to quickly filter, like ::today or ::ai.

Autocomplete

Typing :: opens an autocomplete popover instantly. It has two modes depending on where your cursor is in the command.

Command selection

Before you type (, the popover lists matching commands. The highlighted entry shows the full signature — name(param1*, param2), where * marks a required parameter — along with the command's description.

  • Matching is case-insensitive and covers both command names and aliases
  • Results are ranked: exact-prefix matches first, then contains matches, then fuzzy matches
  • Recently used commands appear first

Parameter assistance

After you type (, the popover switches to parameter mode. It shows the signature with the current parameter highlighted — its name, type, description, and default value — plus a live status line:

  • Green — "Press ⏎ or ⇥ to execute" when the command is ready to run
  • Red — the reason it can't run yet, e.g. "amount needs to be a number", a missing dependency, or a network extension while you're offline

Keyboard reference

KeyAction
/ Move the selection (command mode)
TabInsert the highlighted command name; in parameter mode, fill the default value and jump to the next parameter (or past ) on the last one)
ReturnInsert the highlighted command; in parameter mode, execute the command
EscDismiss the popover until the next ::
/ Dismiss when the cursor leaves the command token

Pro tip: Tab your way through a command — press Tab repeatedly to accept each parameter's default and land ready to execute.

Argument Syntax

Commands take their parameters between the parentheses, separated by commas. Spaces around commas are fine.

  • Commas separate parameters
  • Wrap a value in quotes to protect commas inside it
  • Quotes are stripped before the extension sees the value
  • Use \" to escape a quote inside a quoted value
::gpt(Hello world)        → one parameter: Hello world
::gpt("Hello, world")     → one parameter: Hello, world
::gpt(Hello, world)       → two parameters!
::gpt("Write a haiku", 100, 1.2)
::gpt()                   → no parameters

Tip: If a command seems to be receiving your text in pieces, check for unquoted commas — ::gpt(Hello, world) is two parameters, not one.

Making Your Own

The GitHub repository has everything you need to make your own extensions. Feel free to submit a PR if you want to add an extension to the community collection.

Don't code? No problem.

Use our AI Extension Builder to describe what you want, and we'll generate a prompt you can paste into ChatGPT, Claude, or any coding assistant.

Open AI Extension Builder

Installing Custom Extensions

Once you have the files for your extension:

  1. Go to Settings > Extensions > Open Extensions Folder
  2. Paste your extension's folder into this directory
  3. Go back to Settings and click Reload Extensions
  4. Test your extension by typing :: and searching for your command

Debugging

The Extension Logs panel in the Extensions settings shows logs from your extensions. Turn on Enable Extension Logging and every console.log, console.warn, and console.error from your extension is captured (up to 500 entries), with a level filter to narrow down errors while you debug.

Extension Structure

Antinote accepts two layouts:

  • A folder containing extension.json (metadata) and index.js (code) — this format supports dependencies, preferences, declared API endpoints, and a dataScope declaration
  • A legacy single .js file dropped straight into the extensions folder

AI & ML Extensions

Extensions that leverage artificial intelligence and machine learning to enhance your notes.

AI Providers

Version 1.0.5 | Service Extension

A service extension that provides AI backends to other extensions. This extension has no user-facing commands but enables all AI-powered features in Antinote.

Supported Providers

  • OpenAI - ChatGPT models (GPT-4, GPT-3.5)
  • Anthropic - Claude models
  • Google AI - Gemini models
  • OpenRouter - Access to multiple model providers
  • Ollama - Run local models on your machine

LLM

Version 3.0.5

Generate AI responses to prompts directly in your notes. Use this for brainstorming, writing assistance, answering questions, and more.

::ai insert

Generate an AI response to your prompt

Example: ::ai(What is the capital of France?)

AI Process

Version 1.0.6

Process and transform text using AI. Polish your writing, translate to other languages, or convert text into structured lists.

::polish replaceAll

Improve text professionalism. Level 1 = typos/grammar, 2 = professional email, 3 = formal speech

Example: ::polish or ::polish(2)

::translate replaceAll

Translate text to another language

Example: ::translate or ::translate(French)

::create_list replaceAll

Convert text into a structured list

Example: ::create_list

Date & Time Extensions

Extensions for inserting and working with dates.

Date

Version 1.0.6

Insert dates with optional offsets. Perfect for journaling, planning, and timestamping notes.

::today insert

Insert today's date with optional day offset

Example: ::today or ::today(7) for 7 days from now

::tomorrow insert

Insert tomorrow's date with optional additional offset

Example: ::tomorrow or ::tomorrow(7) for 8 days from now

::yesterday insert

Insert yesterday's date with optional additional offset

Example: ::yesterday or ::yesterday(-7) for 8 days ago

::business_day insert

Insert date offset by business days (excludes weekends)

Example: ::business_day(5) for 5 business days from now

Random Generators

Extensions for generating random values, great for games, writing prompts, decision making, and more.

Random

Version 1.0.6

Generate random numbers, letters, quotes, or open random Wikipedia pages.

::random_number insert

Generate a random number between two values

Example: ::random_number or ::random_number(1, 100)

::random_letters insert

Generate random letter(s)

Example: ::random_letters or ::random_letters(5)

::random_quote insert

Insert a random inspirational quote

Example: ::random_quote

::random_wiki openURL

Open a random Wikipedia page in your browser

Example: ::random_wiki

Dice

Version 1.0.6 | Optional Extension

Roll dice of various types. Perfect for tabletop gaming, random decisions, or probability exercises.

::roll insert

Roll dice. Accepts number (20), die notation (d20), or multiple dice (4d6)

Example: ::roll or ::roll(d20) or ::roll(4d6)

Text Formatting Extensions

Extensions for formatting and transforming text case and style.

Text Format

Version 2.0.1 | Operates on entire document

Transform the entire document's text with various formatting options.

::replace replaceAll

Find and replace text throughout the document

Example: ::replace(old, new)

::append replaceAll

Add text to the end of every line in the document

Example: ::append(;) adds semicolon to each line

::prepend replaceAll

Add text to the beginning of every line in the document

Example: ::prepend(- ) adds dash bullet to each line

::uppercase replaceAll

Convert entire document to UPPERCASE

Example: ::uppercase

::lowercase replaceAll

Convert entire document to lowercase

Example: ::lowercase

::sentence_case replaceAll

Convert document to Sentence case

Example: ::sentence_case

::title_case replaceAll

Convert Document To Title Case

Example: ::title_case

::capitalize_first replaceAll

Capitalize the first letter of the document

Example: ::capitalize_first

::remove_quotes replaceAll

Strip surrounding quotes from the document

Example: ::remove_quotes

Line Format

Version 2.0.0 | Operates on current line only

Transform just the current line with various case and naming convention options.

::uppercase_line replaceLine

Convert current line to UPPERCASE

Example: ::uppercase_line

::lowercase_line replaceLine

Convert current line to lowercase

Example: ::lowercase_line

::sentence_case_line replaceLine

Convert current line to Sentence case

Example: ::sentence_case_line

::title_case_line replaceLine

Convert Current Line To Title Case

Example: ::title_case_line

::camel_case replaceLine

Convert current line to camelCase

Example: ::camel_case (hello world -> helloWorld)

::snake_case replaceLine

Convert current line to snake_case

Example: ::snake_case (Hello World -> hello_world)

::kebab_case replaceLine

Convert current line to kebab-case

Example: ::kebab_case (Hello World -> hello-world)

::remove_quotes_line replaceLine

Strip quotes from the current line

Example: ::remove_quotes_line

Clean Line

Version 1.0.0 | Operates on current line only

Clean up whitespace on the current line.

::remove_all_whitespace replaceLine

Strip all whitespace from the current line

Example: ::remove_all_whitespace

::trim_whitespace replaceLine

Remove leading and trailing whitespace from the current line

Example: ::trim_whitespace

Text Manipulation Extensions

Extensions for sorting, filtering, and manipulating lines of text.

Line Sort

Version 2.0.3

Sort lines in your document alphabetically or numerically.

::sort_lines_alpha replaceAll

Sort lines alphabetically. Options for reverse and skip lines

Example: ::sort_lines_alpha or ::sort_lines_alpha(true) for reverse

::sort_lines_number replaceAll

Sort lines by the first number in each line

Example: ::sort_lines_number

::sort_lines_number_last replaceAll

Sort lines by the last number in each line

Example: ::sort_lines_number_last

::sort_lines_reverse replaceAll

Reverse the order of all lines

Example: ::sort_lines_reverse

Filter Lines

Version 1.0.2

Filter, remove, and manipulate lines based on content or position.

::remove_lines_with replaceAll

Remove all lines containing specific text

Example: ::remove_lines_with(TODO)

::remove_lines_without replaceAll

Remove all lines NOT containing specific text

Example: ::remove_lines_without(important)

::remove_lines_empty replaceAll

Remove all empty lines from the document

Example: ::remove_lines_empty

::keep_lines_with replaceAll

Keep only lines containing specific text

Example: ::keep_lines_with(@mention)

::keep_lines_without replaceAll

Keep only lines NOT containing specific text

Example: ::keep_lines_without(draft)

::trim_each_whitespace replaceAll

Remove leading/trailing whitespace from all lines

Example: ::trim_each_whitespace

::remove_each_after replaceAll

Remove content after a delimiter on each line

Example: ::remove_each_after(:)

::remove_each_before replaceAll

Remove content before a delimiter on each line

Example: ::remove_each_before(:)

::keep_between replaceAll

Keep only content between two delimiters on each line

Example: ::keep_between([, ])

::remove_between replaceAll

Remove content between two delimiters on each line

Example: ::remove_between((, ))

::dedupe_lines replaceAll

Remove duplicate lines, keeping first occurrence

Example: ::dedupe_lines or ::dedupe_lines(false) to keep last

::get_dupes insert

Find and display duplicate lines grouped together

Example: ::get_dupes

List Tools

Version 1.0.1

Convert between different list formats.

::commas_to_list replaceAll

Convert comma-separated items to lines

Example: ::commas_to_list

::commas_to replaceAll

Convert comma-separated items to custom delimiter

Example: ::commas_to(|)

::lines_to_commas replaceAll

Convert lines to comma-separated

Example: ::lines_to_commas

::lines_to replaceAll

Convert lines to custom delimiter

Example: ::lines_to(;)

Checklists

Version 1.0.1

Manage markdown checklists in your notes.

::checked_to_bottom replaceAll

Move all checked items to the bottom of the list

Example: ::checked_to_bottom

::remove_checked replaceAll

Remove all checked items from the document

Example: ::remove_checked

Data Tools Extensions

Extensions for working with structured data like JSON and regular expressions.

JSON Tools

Version 2.0.1 | 15 commands

Powerful tools for manipulating JSON data. Supports smart JSON extraction with dot notation.

Conversion

::csv_to_json replaceAll

Convert CSV data to a JSON array using first row as keys

Example: ::csv_to_json

::json_format replaceAll

Reformat JSON (pretty, compact, or minified)

Example: ::json_format or ::json_format(pretty)

Sorting & Filtering

::json_sort replaceAll

Sort array of objects by a key value

Example: ::json_sort(name) or ::json_sort(age, true) for reverse

::json_sort_array replaceAll

Sort primitive arrays (strings/numbers)

Example: ::json_sort_array or ::json_sort_array(true) for reverse

::json_filter replaceAll

Keep only items matching a condition

Example: ::json_filter(status, =, active)

::json_filter_out replaceAll

Remove items matching a condition

Example: ::json_filter_out(status, =, inactive)

Key Manipulation

::json_add_key replaceAll

Add a key-value pair to all objects in array

Example: ::json_add_key(status, active)

::json_remove_key replaceAll

Remove a key from all objects in array

Example: ::json_remove_key(temp_field)

::json_set_key replaceAll

Set a key to a specific value in all objects

Example: ::json_set_key(version, 2.0)

::json_append_key replaceAll

Append value to the end of existing key values

Example: ::json_append_key(name, _suffix)

::json_prepend_key replaceAll

Prepend value to the beginning of existing key values

Example: ::json_prepend_key(name, prefix_)

Deduplication

::json_get_dupes insert

Find duplicate objects by key or duplicate primitives

Example: ::json_get_dupes or ::json_get_dupes(email)

::json_dedupe replaceAll

Remove exact duplicate objects from array

Example: ::json_dedupe

Path Access (Dot Notation)

::json_get insert

Get value at dot notation path

Example: ::json_get(user.profile.name)

::json_set replaceAll

Set value at dot notation path

Example: ::json_set(user.status, online)

Regex

Version 1.0.1

Use regular expressions to find, remove, or extract text patterns.

::regex_remove replaceAll

Remove all text matching a regex pattern

Example: ::regex_remove(\\d+) removes all numbers

::regex_keep replaceAll

Keep only text matching a regex pattern

Example: ::regex_keep([A-Z]+) keeps only uppercase words

::regex_insert insert

Extract all matches and insert with delimiter

Example: ::regex_insert(\\w+@\\w+\\.\\w+, ,) extracts emails

Finance & Math Extensions

Extensions for financial calculations and analysis. All commands support math expressions in parameters (e.g., 0.05/12, 30*12).

Finance

Version 1.0.5 | 12 commands

Comprehensive financial calculators for loans, investments, and personal finance planning.

Loans & Mortgages

::loan insert

Calculate loan payment and amortization schedule

Example: ::loan(10000, 60, 4) for $10k, 60 months, 4% interest

::mortgage insert

Calculate mortgage payment and schedule

Example: ::mortgage(500000, 20, 6.5, 30) for $500k, 20% down, 6.5%, 30 years

Investment Calculations

::investment insert

Calculate investment growth with contributions, taxes, and inflation

Example: ::investment(10000, 5000, 500, 7, 30) for initial, annual, monthly, rate, years

::pv insert

Present value calculator

Example: ::pv(100000, 10) for future value $100k in 10 years

::fv_simple insert

Future value (simple calculation)

Example: ::fv_simple(10000, 10) for $10k in 10 years

::fv insert

Future value (Excel FV function style)

Example: ::fv(0.05/12, 120, -100, -10000) for rate, nper, pmt, pv

::pmt insert

Payment per period (Excel PMT function)

Example: ::pmt(0.05/12, 360, 500000) for monthly payment on $500k

::npv replaceLine

Net present value from cash flows

Example: ::npv(10, -1000,500,500,500) for 10% rate with cash flows

::irr replaceLine

Internal rate of return

Example: ::irr(-1000,300,400,500) calculates IRR from cash flows

FIRE & Tax Planning

::fire_amount insert

Calculate annual income from investments using safe withdrawal rate

Example: ::fire_amount(1000000) for income from $1M at 4%

::fire_plan insert

Calculate path to financial independence

Example: ::fire_plan(100000, 3000, 5000) for savings, monthly additions, target expenses

::tax insert

Calculate tax and after-tax income

Example: ::tax(100000, 25) for $100k income at 25% rate

Business & Analytics Extensions

Extensions for business metrics, analytics, and startup calculations. Numbers in your note can be comma-separated, space-separated, or line-separated.

Business

Version 1.0.3 | 11 commands

Essential business calculators for growth analysis, SaaS metrics, and decision making.

Growth & Forecasting

::growth insert

Analyze percentage growth between consecutive numbers in your note

Example: ::growth analyzes numbers like: 10, 30, 80

::forecast insert

Forecast future values using linear regression and variance analysis

Example: ::forecast(3) predicts next 3 periods from numbers in note

Marketing & Acquisition

::cac insert

Customer Acquisition Cost calculator template

Example: ::cac inserts a CAC calculation template

::ab_test insert

A/B test statistical significance calculator

Example: ::ab_test inserts an A/B test template

::sample_size insert

Calculate required sample size for A/B tests

Example: ::sample_size inserts a sample size template

Customer Metrics

::retention_churn insert

Retention and churn analysis template

Example: ::retention_churn inserts retention analysis template

::ltv insert

Customer Lifetime Value calculator template

Example: ::ltv inserts an LTV calculation template

::arpu insert

Average Revenue Per User calculator template

Example: ::arpu inserts an ARPU calculation template

::arppu insert

Average Revenue Per Paying User calculator template

Example: ::arppu inserts an ARPPU calculation template

Startup Planning

::runway insert

Cash runway calculator template

Example: ::runway inserts a runway calculation template

::saas_pricing insert

SaaS pricing strategy helper template

Example: ::saas_pricing inserts a pricing strategy template

Productivity Extensions

Extensions for templates and productivity workflows.

Templates

Version 2.0.0 | 16 commands

Insert pre-built templates for common note-taking scenarios. Includes 6 built-in templates plus 10 customizable slots.

Built-in Templates

::todo insert

Daily to-do list with GSD (Getting Stuff Done) framework

Example: ::todo

::bullet insert

Bullet journal template for daily logging

Example: ::bullet

::sorry insert

Apology template for crafting sincere apologies

Example: ::sorry

::reflect insert

Daily reflection template for end-of-day review

Example: ::reflect

::standup insert

Standup meeting template (yesterday, today, blockers)

Example: ::standup

::one_on_one insert

1:1 meeting template with talking points

Example: ::one_on_one

Custom Templates

You can configure up to 10 custom templates in the extension settings. Once configured, they'll be available as:

  • ::custom_template_1
  • ::custom_template_2
  • ::custom_template_3
  • ... through ::custom_template_10

Custom templates support variables like {date}, {time}, and {cursor} to place your cursor after insertion.