termuna

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:

FieldWhere it comes from
CommandThe line as the shell echoed it, up to 4 KiB.
Time and machineThe clock and the hostname of the machine whose daemon recorded it.
Hostuser@host for an SSH pane; absent for a local shell.
DirectoryWhat the shell announces over OSC 7, or the local process's working directory when it announces nothing.
Exit statusExact 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+C clears 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:

ChipNarrows to
this machineCommands recorded here. With one machine on the account this is the only machine chip.
all machinesEvery synced machine, with one chip per machine name beside it, this one first. Tab cycles them.
this directoryCommands run in the pane's current directory. Drawn only when the shell has told Termuna where it is.
failed onlyCommands 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.

  • Enter types the selected command at the prompt with its trailing newline stripped. It waits for your Enter. Nothing in the palette ever executes.
  • Up and Down move through the list and wrap around; Esc closes it.
  • A second Ctrl+R closes 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 record under [history] in config.toml, true by 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.

Back: Using the terminal