Docs

Custom buttons and chains

A button on the palette can post to a destination you already configured, or run your own program with the finished note and type whatever it prints straight back at your caret. A chain strings steps together as plain settings rather than script. This page covers both, the payload your script is handed, and the permission prompt that stops a settings file arriving from somewhere else and running a program silently.

Custom buttons and chains

Your own actions on the session toolbar and the mode palette, also in %USERPROFILE%\.deixis\config.toml. Two kinds: webhook posts to an integration you already configured, command runs a program.

[[buttons]]
id = "jira"
label = "File a bug"
key = "J"                    # single letter or digit; a clash with a built-in key is refused by name
icon = "◈"                   # a glyph, or an image path under ~/.deixis (svg, png, jpg, gif, webp, ico)
where = ["toolbar"]          # toolbar | palette | history
kind = "command"             # command | webhook
command = "pwsh"
args = ['-File', 'C:\Users\you\.deixis\jira.ps1', '{payload}']
wait = true                  # wait for exit and route stdout
stdout = "insert"            # insert | clipboard | notify | ignore
timeout_ms = 30000

(TOML literal strings — single quotes — keep Windows paths readable without doubled backslashes.)

Your script receives the same payload v1 JSON as a webhook, written to a temp file: {payload} in any argument is replaced by its path, and DEIXIS_PAYLOAD holds it too. Arguments are passed as a list straight to the process — no shell ever sees them, so nothing needs escaping and nothing can be injected.

# jira.ps1 — read the note, do something, print what should be typed back
$note = Get-Content -Raw $env:DEIXIS_PAYLOAD | ConvertFrom-Json
$issue = New-JiraIssue -Summary $note.title -Description $note.text
"Filed $($issue.key)"        # stdout = "insert" types this at the caret

stdout = "insert" pastes the output at the caret through the same path dictation uses, so a button can answer back into the document you are working in. clipboard copies it, notify shows it in the Activity feed, ignore discards it. A script that exits non-zero never routes its output; its stderr is reported instead.

The first run of a command button asks permission. Deixis shows the exact command line and does nothing until you approve it in Settings → Buttons; the approval is written to config.toml as approved = true. Editing the command or its arguments clears that approval and asks again — a config file arriving from somewhere else must never be able to execute silently.

Chains

A third kind, chain, strings steps together: each step is handed the previous one's text, and the button's stdout says where the last one's goes. The steps are the two kinds above plus four text transforms — no scripting language, a chain is data in the same file.

[[buttons]]
id = "read-and-translate"
label = "Read & translate"
key = "R"
where = ["palette"]
kind = "chain"
input = "image"              # selection (default) | clipboard | image
stdout = "insert"            # where the last step's text goes

[[buttons.steps]]
kind = "ocr"                 # text from an image — on this machine, nothing is sent anywhere

[[buttons.steps]]
kind = "translate"
language = "French"          # leave out to use the Translate setting's language
Step Does Runs where
ocr Reads the text off an image: the clipboard's, else the newest screenshot in ~/.deixis/captures. First step only. This machine (the Windows OCR engine; macOS is a separate task)
translate Into language, or the Translate setting's. Your plan, your own key, or a local model
summarize A short summary. Your plan, your own key, or a local model
prompt Your own instruction (prompt = "…") applied to the text. Your own key or a local model only — plans cover the built-in steps, not open-ended prompts
webhook Posts the text to integration and passes it on unchanged. This machine
command Runs command with args; the text is the payload's text, its stdout is the next step's text. This machine

The Buttons panel in Settings builds these without touching the file, and says what each step costs before you add it. Its template library has ready-made ones — text from a screenshot, read and translate, summarize, proofread — that a click adds as an ordinary button you can then edit; a Request a template link is how the library grows. A command step anywhere puts the whole button behind the same first-run permission as a command button, quoting every program at once. Every step is named on the Activity feed as it starts, and a step that fails stops the chain — nothing half-made is ever pasted.


Two keycaps, Ctrl and Win, held down and lit teal from underneath.

Hold a key. Speak. Keep working.

Deixis is free, needs no account, and runs on your own device.

v1.2.2 · 64‑bit Windows 10/11 · macOS 13 on Apple silicon · 51 MB · nothing else to install