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:
- Open Antinote and go to Settings
- Navigate to the Extensions tab
- Click Browse community extensions
- Search or browse the available extensions, then click Add on any extension
- The extension is immediately available for use
Install manually:
- Drop the extension's files into your extensions folder — by default
~/Library/Application Support/Antinote/Extensions/(you can also choose a custom folder) - 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:
- Type
::anywhere in your note - The extensions palette appears with available commands
- As you type, it filters to match your search
- Select a command with arrow keys and press Return to insert it
- The command shows instructions, required and optional parameters
- 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
| Key | Action |
|---|---|
↑ / ↓ | Move the selection (command mode) |
Tab | Insert the highlighted command name; in parameter mode, fill the default value and jump
to the next parameter (or past ) on the last one) |
Return | Insert the highlighted command; in parameter mode, execute the command |
Esc | Dismiss 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 parametersTip: 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 BuilderInstalling Custom Extensions
Once you have the files for your extension:
- Go to Settings > Extensions > Open Extensions Folder
- Paste your extension's folder into this directory
- Go back to Settings and click Reload Extensions
- 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) andindex.js(code) — this format supports dependencies, preferences, declared API endpoints, and adataScopedeclaration - A legacy single
.jsfile 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 insertGenerate 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 replaceAllImprove text professionalism. Level 1 = typos/grammar, 2 = professional email, 3 = formal speech
Example: ::polish or ::polish(2)
::translate replaceAllTranslate text to another language
Example: ::translate or ::translate(French)
::create_list replaceAllConvert 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 insertInsert today's date with optional day offset
Example: ::today or ::today(7) for 7 days from now
::tomorrow insertInsert tomorrow's date with optional additional offset
Example: ::tomorrow or ::tomorrow(7) for 8 days from now
::yesterday insertInsert yesterday's date with optional additional offset
Example: ::yesterday or ::yesterday(-7) for 8 days ago
::business_day insertInsert 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 insertGenerate a random number between two values
Example: ::random_number or ::random_number(1, 100)
::random_letters insertGenerate random letter(s)
Example: ::random_letters or ::random_letters(5)
::random_quote insertInsert a random inspirational quote
Example: ::random_quote
::random_wiki openURLOpen 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 insertRoll 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 replaceAllFind and replace text throughout the document
Example: ::replace(old, new)
::append replaceAllAdd text to the end of every line in the document
Example: ::append(;) adds semicolon to each line
::prepend replaceAllAdd text to the beginning of every line in the document
Example: ::prepend(- ) adds dash bullet to each line
::uppercase replaceAllConvert entire document to UPPERCASE
Example: ::uppercase
::lowercase replaceAllConvert entire document to lowercase
Example: ::lowercase
::sentence_case replaceAllConvert document to Sentence case
Example: ::sentence_case
::title_case replaceAllConvert Document To Title Case
Example: ::title_case
::capitalize_first replaceAllCapitalize the first letter of the document
Example: ::capitalize_first
::remove_quotes replaceAllStrip 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 replaceLineConvert current line to UPPERCASE
Example: ::uppercase_line
::lowercase_line replaceLineConvert current line to lowercase
Example: ::lowercase_line
::sentence_case_line replaceLineConvert current line to Sentence case
Example: ::sentence_case_line
::title_case_line replaceLineConvert Current Line To Title Case
Example: ::title_case_line
::camel_case replaceLineConvert current line to camelCase
Example: ::camel_case (hello world -> helloWorld)
::snake_case replaceLineConvert current line to snake_case
Example: ::snake_case (Hello World -> hello_world)
::kebab_case replaceLineConvert current line to kebab-case
Example: ::kebab_case (Hello World -> hello-world)
::remove_quotes_line replaceLineStrip 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 replaceLineStrip all whitespace from the current line
Example: ::remove_all_whitespace
::trim_whitespace replaceLineRemove 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 replaceAllSort lines alphabetically. Options for reverse and skip lines
Example: ::sort_lines_alpha or ::sort_lines_alpha(true) for reverse
::sort_lines_number replaceAllSort lines by the first number in each line
Example: ::sort_lines_number
::sort_lines_number_last replaceAllSort lines by the last number in each line
Example: ::sort_lines_number_last
::sort_lines_reverse replaceAllReverse 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 replaceAllRemove all lines containing specific text
Example: ::remove_lines_with(TODO)
::remove_lines_without replaceAllRemove all lines NOT containing specific text
Example: ::remove_lines_without(important)
::remove_lines_empty replaceAllRemove all empty lines from the document
Example: ::remove_lines_empty
::keep_lines_with replaceAllKeep only lines containing specific text
Example: ::keep_lines_with(@mention)
::keep_lines_without replaceAllKeep only lines NOT containing specific text
Example: ::keep_lines_without(draft)
::trim_each_whitespace replaceAllRemove leading/trailing whitespace from all lines
Example: ::trim_each_whitespace
::remove_each_after replaceAllRemove content after a delimiter on each line
Example: ::remove_each_after(:)
::remove_each_before replaceAllRemove content before a delimiter on each line
Example: ::remove_each_before(:)
::keep_between replaceAllKeep only content between two delimiters on each line
Example: ::keep_between([, ])
::remove_between replaceAllRemove content between two delimiters on each line
Example: ::remove_between((, ))
::dedupe_lines replaceAllRemove duplicate lines, keeping first occurrence
Example: ::dedupe_lines or ::dedupe_lines(false) to keep last
::get_dupes insertFind and display duplicate lines grouped together
Example: ::get_dupes
List Tools
Version 1.0.1
Convert between different list formats.
::commas_to_list replaceAllConvert comma-separated items to lines
Example: ::commas_to_list
::commas_to replaceAllConvert comma-separated items to custom delimiter
Example: ::commas_to(|)
::lines_to_commas replaceAllConvert lines to comma-separated
Example: ::lines_to_commas
::lines_to replaceAllConvert lines to custom delimiter
Example: ::lines_to(;)
Checklists
Version 1.0.1
Manage markdown checklists in your notes.
::checked_to_bottom replaceAllMove all checked items to the bottom of the list
Example: ::checked_to_bottom
::remove_checked replaceAllRemove 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 replaceAllConvert CSV data to a JSON array using first row as keys
Example: ::csv_to_json
::json_format replaceAllReformat JSON (pretty, compact, or minified)
Example: ::json_format or ::json_format(pretty)
Sorting & Filtering
::json_sort replaceAllSort array of objects by a key value
Example: ::json_sort(name) or ::json_sort(age, true) for reverse
::json_sort_array replaceAllSort primitive arrays (strings/numbers)
Example: ::json_sort_array or ::json_sort_array(true) for reverse
::json_filter replaceAllKeep only items matching a condition
Example: ::json_filter(status, =, active)
::json_filter_out replaceAllRemove items matching a condition
Example: ::json_filter_out(status, =, inactive)
Key Manipulation
::json_add_key replaceAllAdd a key-value pair to all objects in array
Example: ::json_add_key(status, active)
::json_remove_key replaceAllRemove a key from all objects in array
Example: ::json_remove_key(temp_field)
::json_set_key replaceAllSet a key to a specific value in all objects
Example: ::json_set_key(version, 2.0)
::json_append_key replaceAllAppend value to the end of existing key values
Example: ::json_append_key(name, _suffix)
::json_prepend_key replaceAllPrepend value to the beginning of existing key values
Example: ::json_prepend_key(name, prefix_)
Deduplication
::json_get_dupes insertFind duplicate objects by key or duplicate primitives
Example: ::json_get_dupes or ::json_get_dupes(email)
::json_dedupe replaceAllRemove exact duplicate objects from array
Example: ::json_dedupe
Path Access (Dot Notation)
::json_get insertGet value at dot notation path
Example: ::json_get(user.profile.name)
::json_set replaceAllSet 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 replaceAllRemove all text matching a regex pattern
Example: ::regex_remove(\\d+) removes all numbers
::regex_keep replaceAllKeep only text matching a regex pattern
Example: ::regex_keep([A-Z]+) keeps only uppercase words
::regex_insert insertExtract 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 insertCalculate loan payment and amortization schedule
Example: ::loan(10000, 60, 4) for $10k, 60 months, 4% interest
::mortgage insertCalculate mortgage payment and schedule
Example: ::mortgage(500000, 20, 6.5, 30) for $500k, 20% down, 6.5%, 30 years
Investment Calculations
::investment insertCalculate investment growth with contributions, taxes, and inflation
Example: ::investment(10000, 5000, 500, 7, 30) for initial, annual, monthly, rate, years
::pv insertPresent value calculator
Example: ::pv(100000, 10) for future value $100k in 10 years
::fv_simple insertFuture value (simple calculation)
Example: ::fv_simple(10000, 10) for $10k in 10 years
::fv insertFuture value (Excel FV function style)
Example: ::fv(0.05/12, 120, -100, -10000) for rate, nper, pmt, pv
::pmt insertPayment per period (Excel PMT function)
Example: ::pmt(0.05/12, 360, 500000) for monthly payment on $500k
::npv replaceLineNet present value from cash flows
Example: ::npv(10, -1000,500,500,500) for 10% rate with cash flows
::irr replaceLineInternal rate of return
Example: ::irr(-1000,300,400,500) calculates IRR from cash flows
FIRE & Tax Planning
::fire_amount insertCalculate annual income from investments using safe withdrawal rate
Example: ::fire_amount(1000000) for income from $1M at 4%
::fire_plan insertCalculate path to financial independence
Example: ::fire_plan(100000, 3000, 5000) for savings, monthly additions, target expenses
::tax insertCalculate 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 insertAnalyze percentage growth between consecutive numbers in your note
Example: ::growth analyzes numbers like: 10, 30, 80
::forecast insertForecast future values using linear regression and variance analysis
Example: ::forecast(3) predicts next 3 periods from numbers in note
Marketing & Acquisition
::cac insertCustomer Acquisition Cost calculator template
Example: ::cac inserts a CAC calculation template
::ab_test insertA/B test statistical significance calculator
Example: ::ab_test inserts an A/B test template
::sample_size insertCalculate required sample size for A/B tests
Example: ::sample_size inserts a sample size template
Customer Metrics
::retention_churn insertRetention and churn analysis template
Example: ::retention_churn inserts retention analysis template
::ltv insertCustomer Lifetime Value calculator template
Example: ::ltv inserts an LTV calculation template
::arpu insertAverage Revenue Per User calculator template
Example: ::arpu inserts an ARPU calculation template
::arppu insertAverage Revenue Per Paying User calculator template
Example: ::arppu inserts an ARPPU calculation template
Startup Planning
::runway insertCash runway calculator template
Example: ::runway inserts a runway calculation template
::saas_pricing insertSaaS 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 insertDaily to-do list with GSD (Getting Stuff Done) framework
Example: ::todo
::bullet insertBullet journal template for daily logging
Example: ::bullet
::sorry insertApology template for crafting sincere apologies
Example: ::sorry
::reflect insertDaily reflection template for end-of-day review
Example: ::reflect
::standup insertStandup meeting template (yesterday, today, blockers)
Example: ::standup
::one_on_one insert1: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.
Missing an extension? Contribute on GitHub or request one on Discord.