Command history
The daemon records each command line you run, in local
shells and SSH panes alike, and Ctrl+R searches them by text,
machine and directory. Recording and searching on one machine is free and
needs no account; carrying the history between machines is Termuna
Cloud.
What is captured
The command is read off the terminal's own echo: a per-pane model of what the shell drew on the line, not of the keys you pressed. That is what makes readline editing, arrow-key recall and tab completion come out right, and it is why there are no shell hooks to install. Nothing runs on the remote host, so an SSH pane records the same way a local one does. Each record holds:
| Field | Where it comes from |
|---|---|
| Command | The line as the shell echoed it, up to 4 KiB. |
| Time and machine | The clock and the hostname of the machine whose daemon recorded it. |
| Host | user@host for an SSH pane; absent for a local shell. |
| Directory | What the shell announces over OSC 7, or the local process's working directory when it announces nothing. |
| Exit status | Exact where the shell speaks OSC 133 (fish natively, bash and zsh with shell integration); unknown elsewhere. The daemon waits 1.5 seconds for it before writing the record. |
What is refused
- Editors and other full-screen programs. While a pane is on the alternate screen nothing typed there is a command, so the recorder is not fed at all.
- Password prompts. A prompt with echo off draws nothing on the line, and nothing on the line means no record.
- The foreground-group veto. On Enter, a local shell
on Linux is checked against the terminal's foreground process group. If
the shell is not in the foreground, the line went to a program (a REPL,
a
read, a password prompt that echoes) and is dropped. Where that probe is not available, in SSH panes and on other platforms, the line is only recorded when the text before it ends in a prompt glyph such as$,#,%or❯. - A leading space. The shell convention holds: a line that starts with a space is never recorded. Commands the daemon itself injects carry one, so they never land in your history.
- An abandoned line.
Ctrl+Cclears the line without a record.
Where it is stored
Each record is sealed on its own with this machine's vault key and
appended to history/commands.seal under Termuna's data
directory (~/.local/share/termuna on Linux and macOS,
%LOCALAPPDATA%\termuna on Windows), created with owner-only
permissions. The plaintext never touches disk: what is written is the
length and the sealed bytes. The store is append only. A late exit status becomes a
small amendment record that readers fold into the original; nothing is
rewritten in place. It is its own file: the session frame log is not
reused, and Ctrl+Shift+F scrollback search is untouched.
Ctrl+R recall
Ctrl+R opens the recall palette over any pane with a prompt
to insert into. Type to search; the chips narrow the list:
| Chip | Narrows to |
|---|---|
| this machine | Commands recorded here. With one machine on the account this is the only machine chip. |
| all machines | Every synced machine, with one chip per machine name beside it, this one first. Tab cycles them. |
| this directory | Commands run in the pane's current directory. Drawn only when the shell has told Termuna where it is. |
| failed only | Commands that left a non-zero exit status. |
With an empty search the list is split into here and elsewhere; with a query it is grouped into today, this week, this month and earlier, at most 100 rows, duplicates folded. Each row shows the command over one line of facts: machine, host, directory, exit status and age.
Entertypes the selected command at the prompt with its trailing newline stripped. It waits for your Enter. Nothing in the palette ever executes.UpandDownmove through the list and wrap around;Esccloses it.- A second
Ctrl+Rcloses the palette and hands the key to the shell, so your shell's own reverse search is one more press away. The palette says so on its first three opens.
Pause and delete
Both live under Settings, Terminal, in the command history block.
- Record command history is the switch, per machine.
Off, the daemon records nothing until it is turned back on; what was
recorded stays searchable, and the palette reads "recording paused" with
a link to the setting. The same switch is
recordunder[history]inconfig.toml,trueby default. - Delete all history asks once, inline, then does it: the button reads Delete, and pressed once it becomes Delete everything next to Keep. It removes every recorded command from this machine, from the copies of other machines' history held here, and from the cloud copy when the account syncs. Delete is never gated by a plan.
The first command ever recorded on a machine puts one line in the status bar: "history on · ctrl+r searches it · settings to turn off". It is shown once.
Across machines: Termuna Cloud
Recording and searching on this machine is free and works without an
account. Carrying history between machines is part of a paid Termuna Cloud
plan; a free account's daemon makes no history calls at all, and the server
answers any such call with history_sync_requires_cloud. With a
paid plan and cloud sync on, the desktop runs a sync round every five
minutes: it uploads new records in batches of 200 and pulls what the other
machines wrote, page by page. Records from elsewhere are stored beside your
own, sealed with the same machine key, and appear in the palette under the
machine they came from.
Before a record leaves the machine it is re-sealed with a key derived from your personal vault key, so every machine, the web dashboard and the phone open the same records once your passphrase has unlocked the vault. The server stores ciphertext it cannot read, plus the record id, the machine name and the time so it can page and filter without opening anything. Nothing is indexed or searched server-side; search runs on the client, over records it opened itself. The dashboard's History view and the phone's history screen show the same rows and the same chips; there a row copies its command, and with a session open it can type it at that prompt, again with no Enter appended.
The sealed records are part of your full data export on every plan, including a free account holding records from a paid stretch.