Feature

Selection actions.

Right-click any text selection in a note for AI-powered transformations. Each action runs the selection through your active model — replace-mode actions open a diff…

Right-click any text selection in a note for AI-powered transformations. Each action runs the selection through your active model — replace-mode actions open a diff review before anything is written, insert-below actions append directly.

Access

  1. Open any note in the editor
  2. Highlight some text
  3. Right-click → AI menu items appear at the top of the context menu

Or use the command palette (Ctrl+P) — every action is registered as a command with the prefix "Curtis.ai". The palette also carries one entry with no context-menu twin: Generate text from selection treats the selection as a free-form generation request and appends the result below it.

The context menu's bottom AI entry, Ask AI about selection, doesn't transform anything — it quotes the selection into the chat composer (capped at 8000 characters, reusing an open chat pane if one is active) so you can ask follow-ups. The whole-note counterpart is Chat about this note below.

Whole-note actions (no selection)

Right-click with nothing selected in a non-empty note and Curtis offers two note-level entries instead:

  • Summarize this note — summarizes the full note and appends the result below the note body. The note itself is never modified.
  • Chat about this note — quotes the note into the chat composer (capped at 8000 characters) so you can ask follow-ups; reuses an open chat pane if one is active. For longer notes, @-mention attaches the full content as context.

Empty notes show neither entry.

Writing actions

ActionWhat it does
SummarizeConcise bullet-point summary
ExplainClear, simple explanation of complex concepts
ELI5Explain like the reader is 5 years old
TL;DROne-sentence TL;DR plus 3 bullet points
Improve writingFix grammar, enhance clarity and flow, preserve meaning
Fix grammarSpelling, punctuation, grammar only — no rewrite
ShortenCut to roughly half the length, keep key info
TranslateTranslate to any language — Curtis asks for the target and remembers the last one
Extract key pointsStructured list of main ideas
Extract wikilinksComma-separated [[wikilinks]] for entities worth linking
Make a tableConvert free-form text into a clean markdown table
Pros & consTwo-section breakdown
Convert to calloutWrap as an Obsidian > [!note] callout

Code actions

ActionWhat it does
Review codeBugs, security, performance, best practices
Explain codeStep-by-step what it does
RefactorImprove structure without changing behavior
Add testsGenerate unit tests for the selection

Insert behavior

Each action has an insert mode:

  • replace — the result is shown as a line-by-line diff first (review modal); nothing is written until you accept (most actions)
  • insert-below — the original text stays, the result is appended below (used by Add tests, Extract wikilinks)

The insert mode is fixed for built-in actions; custom actions choose it in their editor.

Custom actions

Define your own actions under Settings → Curtis.ai → Custom selection actions. Each has:

  • Name — shown in the context menu, command palette and hotkeys list
  • System prompt — how the model should behave
  • User prompt template — {{selection}} marks where the selected text goes; without it the selection is not sent
  • Insert mode — replace (diff review first) or insert-below

Custom actions appear alongside the built-ins everywhere selection actions are surfaced. Palette commands are registered at startup — reload after adding one; the context menu picks up changes immediately.

Developers: the built-in prompts live in src/commands/selection.ts (SELECTION_ACTIONS).

Tips

  • Hotkeys — bind any action, custom included, via Obsidian's Hotkeys settings. Look for commands starting with "Curtis.ai: ".
  • Multiple selections — Obsidian supports multiple cursors; each selection gets its own AI call when you trigger an action.
  • Long selections — there's no hard cap, but extremely long selections may exceed your model's context window. Chunk them.