Skip to content

Releases: zyvorai/teryon

TERYON 0.22.0

Choose a tag to compare

@github-actions github-actions released this 28 Oct 05:18
723eadf
  • Per-project environment: an [env] table in .teryon.toml (variables and path_prepend) is loaded by the zsh, bash and fish integrations when you cd into the project and undone when you leave, restoring any value it replaced. It loads only after teryon env allow in that directory, editing the table asks again, and PATH, HOME, LD_PRELOAD and the like cannot be set. [shell] env = false turns it off

  • teryon search PATTERN [--host H] [-w NAME | --all] [-i] [-E] [-C N] searches the scrollback the daemon keeps for each pane, grep-style (workspace/pane:line: text, with the same absolute line numbers as capture). Lowercase patterns ignore case; exit status 0 found, 1 nothing found, 2 error. It only reads, so it never takes control of a pane

  • teryon play FILE.cast [--speed N] [--max-idle SECS] [--info] [--raw] plays a teryon record file in the terminal without asciinema. Pauses longer than --max-idle (default 2 s) are shortened. By default it drops what a recording must not be able to make your terminal do: clipboard writes (OSC 52), iTerm file/script sequences, DCS/APC strings and terminal queries such as cursor-position and device-attribute requests, whose answers would arrive as typed input

  • teryon watch-sync SRC HOST:DEST keeps a remote directory up to date: it copies once at start and again after the files change and settle (polled every --interval seconds), and while the host is unreachable it retries with a growing delay (2 s up to 60 s). New and changed files are copied; deletions are not propagated

  • Fix: teryon up waits (up to 4 s) for a new pane's shell to show its prompt before typing the pane's command; a shell that was still starting could throw the command away

  • teryon explain -- tar -xzf a.tgz -C /tmp explains a command line part by part (commands, flags, -la as -l -a, pipes, redirects, sudo/env wrappers) from the manual pages on this machine. It only reads man; the command is never run

  • teryon wake HOST --wait [--timeout SECS] [--connect] sends the wake-on-LAN packet, then waits until the host answers over SSH (default 180 s) and optionally opens teryon connect; a host that is already awake gets no packet

  • teryon hosts [--check] lists configured and ~/.ssh/config hosts; --check probes them in parallel over SSH for up/down, round-trip time, free disk and the installed teryon version

  • teryon snip add|list|show|fill|run|rm: saved commands with {{placeholders}} from the shell ([[desktop.snippets]] from the config are included; snip add keeps its own in ~/.teryon/snippets.jsonl). Missing values are asked for on the terminal, and a {{host}} answer accepts a prefix of a configured host. Alt-S in zsh, bash and fish picks one and types it

  • teryon hist report [--days N] [--host H] lists, per project (Git repository), how many commands ran and failed and which were slowest and failed most; Ctrl-C does not count as a failure

  • teryon hist replay [--failed] [--run] -- WORDS finds the newest matching past command, says where, when and on which branch it ran, and prints cd DIR && COMMAND (or runs it there with --run)

  • z HOST:words (zsh, bash, fish) opens a shell on HOST in the directory its own jump history ranks best (teryon jump go)

  • zsh paste guard: a paste of several lines, or of something that looks like a secret, waits for a y ([shell] paste_guard = false or TERYON_PASTE_GUARD=0 turns it off; it steps aside when another plugin owns the paste widget)

  • Fix: bash 3.2 (macOS /bin/bash) ignores history -a, so commands are now appended to ~/.bash_history directly there

  • bash and fish integrations now record history, bind the Ctrl-R / Ctrl-T / Alt-C pickers and provide z / zi (bash 4+ for the pickers; bash also flushes ~/.bash_history as it goes and imports it once). No ghost text, highlighting or fuzzy Tab

  • teryon hist sync [HOST...] copies other hosts' history here; [shell] sync_hosts / sync_every_hours keep it fresh in the background. hist import also reads bash history files

  • teryon completions zsh --install writes the completion script into a directory on your fpath; workspace names now complete too

  • teryon cp accepts - for standard input/output (teryon cp - host:file, teryon cp host:file -) and remote wildcards (host:logs/*.txt). --no-clobber now refuses to run with scp instead of silently overwriting

  • [shell] inject = false turns off loading the integration in zsh panes; the first pane prints a one-time notice saying what was loaded

  • Fix: connection sharing for completion and the rsync probe is skipped when the runtime directory is too long for a Unix socket, which had made the probe wrongly report "no rsync"

  • teryon doctor --shell [HOST] starts a zsh the way a pane does and reports whether the integration loads, whether compinit/fzf-tab own Tab, whether history is saved as you type, and whether the teryon on PATH is the same build as the one running

  • Ctrl with /, ?, `, ~ and the digits 2 to 8 now sends the bytes xterm does (Ctrl+/ undoes in readline, Ctrl+? is DEL), instead of being dropped

  • zsh panes put the daemon's own teryon first on PATH (a link in ~/.teryon/bin), so a stale build earlier on PATH cannot load an older integration

  • zsh panes load the shell integration by themselves (a temporary ZDOTDIR that restores yours and loads TERYON at the first prompt), so Ctrl-R, ghost suggestions, fuzzy Tab, z and the working-directory tracking no longer need a line in ~/.zshrc. Set TERYON_INJECT=0 before the daemon starts to turn it off; a .zshrc that already has the eval line is unaffected

  • The integration turns on inc_append_history (unless you set inc_append_history or share_history yourself; TERYON_HISTFLUSH=0 opts out), so a pane that is closed or killed no longer loses its shell history

  • teryon hist import [FILE] adds a zsh history file to Ctrl-R and the suggestions; the integration runs it once for ~/.zsh_history

  • Panes set TERM_PROGRAM=teryon

  • teryon cp SRC... DEST: scp-style copy with host:path, ~, recursive folders, rsync when both ends have it (else scp, including host-to-host via scp -3), --dry-run, --no-clobber, --parents, --limit-kbps

  • teryon completions zsh now completes host names (config and ~/.ssh/config) and remote paths for cp, push and pull

  • Hosts in files pulled in by Include in ~/.ssh/config now show up in the picker, import-ssh, setup and the AI host list

TERYON 0.21.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 06:11
8459d20

A code viewer in Quick Look, saved pane trees, and two new windows for the host you work on. Desktop only; the daemon and protocol are unchanged, so no daemon restart is needed.

  • Quick Look is a code viewer: syntax colors (syntect grammars, drawn with the active theme's palette), line numbers, a Find box that marks and counts matches, JSON re-indented with a Raw toggle, and "Open the whole file" (up to 2 MB). Large files are colored only in their first 256 KB. Adds the syntect dependency to the desktop build
  • "Edit in $EDITOR" in the file sidebar's menu types ${EDITOR:-vi} 'path' at the pane's prompt (no Enter)
  • Pane trees are saved: the split shape and divider positions are stored with the automatic layout and restored with "Restore" (old layout files still load)
  • Ports window (palette): every listening port with Open, Forward / Stop (ssh -L) and Copy URL
  • Host health window (palette): load and memory graphs for the last ~30 minutes
  • A layout file saved with a pane-tree shape is not readable by 0.20 or older clients (they reject the new field); older files load in 0.21
  • scripts/release-macos.sh builds only the .dmg when SKIP_PKG=1 is set

TERYON 0.20.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 02:51
2290efb

The largest release so far: a cheaper, more explainable link over SSH, more of the modern terminal protocols, much more for AI agents, and a smarter command history. Restart the daemon (teryon stop --force, which ends its shells) to get the daemon-side changes.

  • Update notice: "Check for updates" in the palette and teryon update [--open] say whether a newer release is out and open its page (where the signed .dmg/.pkg are); check_updates = true does it once a day at start-up. Off by default, and nothing is installed automatically
  • Kitty graphics protocol: kitten icat, chafa -f kitty and other tools that draw with ESC _ G now show images in the desktop app, the same way as iTerm2 images (PNG and raw RGB/RGBA, chunked, transmit/display/put/query/delete). Files, shared memory, zlib, animation and Unicode placeholders are refused with an error. Restart the daemon (teryon stop --force) to get it
  • Pane trees: "Split pane right / below (pane tree)" split the focused pane in any direction, as often as you like, with every divider draggable; a closed pane's space goes to its neighbours. The shape is not saved across restarts
  • teryon sandbox -- COMMAND runs a command (an AI agent) so it can only write to its Git repository plus scratch and settings directories and cannot read ~/.ssh, ~/.aws, ~/.gnupg or ~/.kube, with the network left open (sandbox-exec on macOS, bwrap on Linux); agent_sandbox = true starts agents from the overview and palette that way
  • Idle sessions poll less: after 5 seconds without input or output the client polls every 250 ms instead of 60 ms (about 4× fewer requests over SSH), and typing or any screen change returns to fast polling at once. Output that arrives after a quiet spell can show up up to ~190 ms later; quiet_poll_ms = 0 in [desktop] turns it off
  • Recipe panes can restart their command: restart = "on-failure" or "always", with restart_delay and restart_max; it is a small sh loop in the pane (works over SSH and with no client connected), and Ctrl-C stops it
  • A Changes button on each agent in the ⌘⇧A panel opens a pane in the agent's directory listing the branch, the changed files and the size of each change, with a shell left open for git diff; it works on remote hosts too
  • teryon hist pull HOST copies another machine's command history over SSH, so Ctrl-R and ⌘⇧H also find what you ran there: marked @HOST, narrowed with host:NAME, kept in a separate private file, never used for ghost suggestions, and secrets are left out on both ends
  • Fixed: a recipe pane could be treated as ready too early when its ready_text also appeared in its own command line (the shell echoes the command, and some prompt themes show it twice). Only output after the last echo of the command now counts, and a command or text that wraps across rows still matches.
  • Commands that contain a secret are no longer written to the command history, so they are never suggested back or shown in the history picker. teryon hist scrub removes the ones already there. The redaction rules (also used before anything goes to the assistant) now catch --password/--token/--api-key flags, user:password@ URLs and Authorization: Basic headers as well as the key shapes and NAME=value secrets they already knew. It is pattern-based and best-effort: a secret typed as a bare argument is not caught.
  • Command history search takes filter words, in Ctrl-R and the desktop's ⌘⇧H alike: is:failed, is:ok, exit:N, slow:SECONDS, dir:PART and branch:PART, mixed with fuzzy text (cargo is:failed dir:api). With a filter, every recorded run is searched, not only each command's newest, so a command that failed last week still turns up after it later passed. Commands are now recorded with the Git branch they ran on (read from .git/HEAD, no extra process), shown in the list.
  • Recipes can start things in order: a .teryon.toml pane can say after = "db" and the other pane can declare ready_text, ready_port and ready_timeout. teryon up creates all the panes, then types each command once the pane it waits for is ready, and stops with a clear error (leaving what already started running) if one never is. Unknown, ambiguous and circular after are rejected when the recipe is read.
  • "Agent: start Claude (or Codex, Gemini, aider, Cursor, OpenCode) in a new Git worktree" in the palette: the agent gets its own branch (agent/<name>-<time>) and directory next to the repository, so its edits stay out of your checkout. Nothing is cleaned up for you: the worktree and branch stay until you merge or remove them.
  • "While you were away" is now a timeline: one row per command that finished while the app was closed (the command line, ✓ or ✗ with exit code and duration, and how long ago), plus agents waiting for you. Click a row to open that pane at the command's output. The newest eight are shown, with a count of earlier ones; failures are highlighted. Command rows need the shell integration.
  • Slimmer polls: a client that asks for diffs is sent the pane's title, directory, process, ports and line numbers once, and again only when one of them changes (the long foreground command line was being resent on every poll). Empty fields (screen, exited, zero line numbers) are no longer written at all. Together with diffs and compact text, a whole scrolling pane's reply stream came to about a seventh of what whole screens cost. What remains when nothing is changing is the per-poll framing and the polling rate itself.
  • Compact screen bytes: a client that asks for diffs is sent the screen as base64 text instead of a JSON number array (about a third of the size). Measured over a whole scrolling pane including everything else in each reply, diffs plus compact text come to roughly a fifth of what whole screens cost. Pane details such as the title, directory and foreground command are still resent on every poll; that is now the largest remaining cost when nothing is changing.
  • Screen diffs over SSH: the desktop app asks the daemon for the difference from the last screen it received (a scroll plus the changed rows) instead of the whole screen each time. In a test with a pane printing colored lines, 8.5 KB crossed the wire instead of 144 KB, and the rebuilt screen was identical. Each diff carries a checksum; if the two sides ever disagree, a size change intervenes, or 500 updates pass, a whole snapshot is sent. Old daemons and local sockets are unchanged, and the UI still receives whole screens.
  • Closing a tab or window that would end running shells now asks first, naming what is running ("ends 2 running shells: vim, claude"). With fresh_window, a ⌘T tab and the window own their shells, and closing used to end them silently. "Keep it open" is the default button and Esc cancels. confirm_end_shells = false turns the question off. Tabs that only detach (shells keep running on the host) still close at once, and the tab's close button now says which of the two it does.
  • Kitty keyboard protocol (the "disambiguate escape codes" flag): Neovim and other modern TUIs can tell Esc from Alt-prefixed keys and get Ctrl/Alt combinations that the legacy encoding cannot express (Ctrl+1, Ctrl+Alt+A…). The daemon tracks each pane's flag stack per screen and answers CSI ? u; the desktop app encodes Esc, Ctrl/Alt keys and Shift+Tab as CSI code ; mods u while a program has the flag on. Unsupported flags are not reported back. The terminal UI (teryon connect) is unchanged.
  • Controller takeover: "Take control of this workspace from another device" in the palette takes the controller seat immediately instead of waiting for the other client to be released (up to 45 s when its link is half-open). The previous controller is told ("Another device took over") and keeps watching, read-only, until it takes the seat back. When an attach is refused because another client controls the workspace, the app says so and points to the action. Old daemons ignore the request and keep refusing.
  • OSC 8 hyperlinks: links that programs mark (ls --hyperlink, eza --hyperlink, rg --hyperlink-format, delta) open with ⌘-click and show their real target on hover. Only http, https and mailto open. Links are tracked per cell by the daemon and sent beside the screen, so older clients simply do not see them. They apply to the live screen, not the scrolled-back view.
  • Connection recovery inspector: the relink card now says why the link is down and what to do (Wi-Fi or DNS, host asleep, SSH not answering, key refused, changed host key, teryon missing or a different version, or a link that dropped), with ssh's own message underneath. Causes that need you show "ACTION NEEDED" instead of counting attempts. This works because ssh's stderr is now captured rather than lost; teryon doctor HOST errors include it too.
  • Agents: the overview (⌘⇧A) shows a one-line summary of where each agent got to and can start Claude, Codex, Gemini, aider, Cursor or OpenCode in a new pane (also in the palette as "Agent: start …"). "Agent: send a prompt to all idle agents…" types one prompt into every agent sitting at its prompt, skipping working agents and ones waiting for approval. "Finished" notifications now include that last line.
  • Remote link: reconnect waits are spread by up to ±20% so tabs do not retry in lockstep, and a link that comes back after the machine slept (20 s without a poll) is replaced at once instead of waiting for ssh keepalives to fail.
  • Typing exit (or Ctrl-D) no longer leaves a dead pane: after a clean exit the pane closes, or the tab closes when it was the last pane, or the window closes when it was the only tab (the workspace is removed). A non-zero exit keeps the pane so you can read the output; the close-pane key then removes it.
  • drag_selects = true makes a drag select (and honor copy_on_select) in panes whose program tracks the mouse, such as Claude Code; plain clicks and the wheel still reac...
Read more

TERYON 0.19.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 15:24
  • Settings window (⌘,): sliders, switches and choices for the common [desktop] options, applied live and saved to config.toml with your comments kept, with search, per-option reset, and a "restart" tag on the few that need one. "Window look…" is a small panel with opacity, dimming, font size and line height.
  • Font picker: the monospaced fonts installed on your Mac, each shown in its own typeface.
  • Keyboard shortcuts editor: every action with its key; click Change and press the new keys. Clashes are refused, and a ⌘, ⌃ or ⌥ is required so typing still reaches the shell.
  • Closing a pane is undoable: its shell keeps running for 30 seconds and ⇧⌘Z (or "Reopen closed pane") brings it back. Older daemons just close it for good. The close confirmation is gone.
  • Right-click a command or its output for Copy command, Copy output, Run it again and Ask AI about it.
  • Background tabs show ● for new output and ▲ when an AI agent in them needs you.
  • A config file that cannot be loaded shows a banner with the message, Open config file and Try again, instead of a toast.
  • The welcome card has Theme, Font and Settings buttons.

TERYON 0.16.4

Choose a tag to compare

@github-actions github-actions released this 19 Oct 13:33
  • Tab and the arrow keys reach the shell in a fresh window: focus is decided at the start of the frame and the terminal takes it when nothing has it (Tab used to move egui's focus first and was dropped).

TERYON 0.16.3

Choose a tag to compare

@github-actions github-actions released this 19 Oct 12:28
  • The background gradient is also painted under pane title bars (it was skipped, leaving a flat color).

TERYON 0.16.2

Choose a tag to compare

@github-actions github-actions released this 19 Oct 12:02
  • ion is the default theme for new installs; existing configs keep their theme. New ion theme (void navy, ion-blue accent, amber for "needs you"), with a matching header: host chip with a live dot, 01.. pane buttons, an amber " needs you" pill, SHELLS ALIVE / LINK stats, and a status line under the panes (status_line = false hides it).

  • Relink card: when the connection to the daemon drops while panes exist, a card explains the shells are still running, counts reconnect attempts and offers "Retry now" and "Open offline draft" (Esc hides it). Needs no daemon change beyond an optional uptime in Info.

  • Desktop responsiveness: the worker polls every 6 ms for 400 ms after typing or output (60 ms when idle) and wakes the UI the moment new screen state arrives, history/image reads run on their own read-only connection so they never delay keystrokes, switching tabs cross-fades, and the release build uses thin LTO.

  • New shells get a richer LS_COLORS (source, config, docs, images, video, audio, archives, lock files, Makefile/Dockerfile/README) and an EZA_COLORS for eza -l columns.

  • Desktop: the cursor is orange (#D97757) and blinks by default; set cursor_color / cursor_blink = false to change it.

TERYON 0.16.1

Choose a tag to compare

@zyrona-labs zyrona-labs released this 19 Oct 09:31

Desktop keys follow WezTerm: ⇧PageUp/⇧PageDown scroll, ⌘⇧[ / ⌘⇧] and Ctrl+Tab switch tabs, ⌥ acts as Meta, Ctrl+Space sends NUL.

TERYON 0.16.0

Choose a tag to compare

@zyrona-labs zyrona-labs released this 19 Oct 08:40
  • Desktop: inline images (iTerm2 OSC 1337), a command status chip in bare windows, tabs with program icons, a spinner and ×, eased cursor blink, smooth scroll-back, theme cross-fade with new carbon and tokyo-night-day themes, fullscreen, corner_radius and background_noise options.

  • Desktop: a maximized start option, a WezTerm-style accent scrollbar flush with the right edge, and a × on every tab of the bottom strip.

  • Desktop: ⌘T opens a new shell tab at once when fresh_window is on (closing it ends its shell); text_gamma sets text weight (uses a patched vendor/egui_glow).

  • Desktop: cursor_color, window_blur (macOS background blur) and background_gradient with gradient_angle.

  • Desktop: tab_bar = "bottom" adds a WezTerm-style tab strip (tab pills, a new-tab button and a clock) under a bare chrome = "none" window.

  • Zsh power features in teryon shell-init zsh, no plugins needed: history in ~/.teryon/history.jsonl, ghost-text suggestions, syntax highlighting, a fuzzy picker for Ctrl-R (history with status, duration and directory), Ctrl-T (files) and Alt-C (directories), fuzzy Tab completion, z/zi directory jump and an opt-in two-line prompt with git state. [shell] in config.toml switches each on or off; teryon-features shows what is active. See docs/SHELL-INTEGRATION.md.

  • Desktop: ⌘⇧H searches the command history; [desktop] chrome = "none" draws only the terminal (no title bar, tab strip or empty-pane hints) and initial_cols/initial_rows size new windows, and fresh_window = true gives every window a new shell that ends when the window closes (leftovers from a crash are removed at the next start). Text padding can differ per side (padding_x, padding_top, padding_bottom) and scrollbar = "always" keeps a scrollbar thumb on the live screen.

  • Signed and notarized TERYON-X.Y.Z.dmg and .pkg are attached to releases by scripts/release-macos.sh (built by hand on a Mac; CI still builds the tar.gz archives).

TERYON 0.15.1

Choose a tag to compare

@github-actions github-actions released this 18 Oct 14:09
  • Fixed the Linux build: an import used only by the macOS Keychain code failed clippy -D warnings on Linux.
  • Release workflow now publishes a GitHub Release with the archives and these notes (macos-arm64 and linux-x86_64).
  • Website: absolute Open Graph and Twitter card tags with a 1200x630 social image, canonical URL, sitemap, robots.txt, 404 page, new sections for agents, AI and the file browser. Social card and launch copy in docs/social/ (build-social-card.sh renders it with headless Chrome).