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.
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 · also for Windows