Lightweight SSH bookmark manager built with Bubble Tea.
Manage, sync and connect to your servers — all from the terminal.
- Full TUI — no config files to hand-edit, everything is in the interface
- SSH connect — password, private key, or keyboard-interactive auth
- Bookmark management — add, edit, delete, star/favorite
- Gist sync — push/pull bookmarks via GitHub or Gitee Gist
- In-app config — set token and gist ID without leaving the TUI
- Filter & paginate — fuzzy search across bookmarks
- Private key input modes — paste key text or provide a key file path (resolved on save, ≤256KB)
- Clipboard-aware copy —
Ctrl+Ysupports system clipboard with terminal fallback - Config export/import — share config across machines via
Ctrl+Bexport +--import-config - i18n — English / 中文, toggle with
L - Update check — press
uto check for new releases, with download progress bar - Cross-platform — macOS, Linux, Windows, Android (Termux)
- Copy SSH command — press
yto copy the standard SSH command for the selected bookmark (e.g.ssh user@host -p 22), with Termux OSC52 fallback; the command is shown in the tip bar for manual copy too - Remote file transfer — double-press
Ctrl+Gduring an SSH session to upload or download files/directories via SCP protocol (reuses existing connection, no re-authentication; remote path supports Tab completion; downloads default to ~/Downloads with customizable save directory)
Homebrew (macOS / Linux):
brew install vst93/tap/ttmShell script (macOS / Linux / Termux):
curl -fsSL https://raw.githubusercontent.com/vst93/ttm/refs/heads/main/cmd/install.sh | bashChina mirror:
curl -fsSL https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.sh | bash| Option | Description |
|---|---|
--help |
Show all options |
--lang en |
Use English (default) |
--lang zh |
使用中文 |
--install-dir <dir> |
Install to custom directory |
--force |
Continue even if checksum fails |
--skip-github |
Skip GitHub direct download, use mirrors only |
--preview |
Install latest pre-release version |
Windows (PowerShell):
irm https://raw.githubusercontent.com/vst93/ttm/main/cmd/install.ps1 | iexOr with CDN mirror (faster in China):
irm https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.ps1 | iex| Environment Variable | Description |
|---|---|
SKIP_GITHUB=1 |
Skip GitHub direct download, use mirrors only |
FORCE_INSTALL=1 |
Continue even if checksum fails |
INSTALL_DIR=path |
Install to custom directory |
TTM_LANG=zh |
Use Chinese interface |
NO_SHORTCUTS=1 |
Skip creating desktop/start menu shortcuts |
TTM_PREVIEW=1 |
Install latest pre-release version |
Install pre-release version:
# Shell (macOS / Linux / Termux)
curl -fsSL https://raw.githubusercontent.com/vst93/ttm/refs/heads/main/cmd/install.sh | bash -s -- --preview
# Windows (PowerShell)
$env:TTM_PREVIEW=1; irm https://raw.githubusercontent.com/vst93/ttm/main/cmd/install.ps1 | iexTip: If GitHub access is limited in your region, use
SKIP_GITHUB=1to skip direct GitHub downloads and use CDN mirrors instead.
CDN Mirror (jsdelivr):
The installation script uses cdn.jsdelivr.net as a CDN mirror for faster downloads in regions with limited GitHub access. You can also use the CDN mirror directly:
# Use CDN mirror for installation
irm https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.ps1 | iex
# Or with options
$env:SKIP_GITHUB=1; $env:TTM_LANG="zh"; irm https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.ps1 | iexExample with options:
$env:SKIP_GITHUB=1; $env:TTM_LANG="zh"; irm https://raw.githubusercontent.com/vst93/ttm/main/cmd/install.ps1 | iexOr download ttm-windows-*.zip from Releases, extract ttm.exe, add to PATH.
Build from source:
git clone https://github.com/vst93/ttm.git && cd ttm
make buildttmc— Open config editor, set GitHub/Gitee token and gist IDa— Add a new bookmark (host, user, port, auth type)Enter— Connect to the selected servers/S— Push or pull bookmarks via Gist
Config directory: ~/.config/ttm/ (Linux), ~/Library/Application Support/ttm/ (macOS), %APPDATA%\ttm\ (Windows)
| File | Description |
|---|---|
config.json |
Platform, token, gist ID, locale |
bookmarks.json |
Bookmark entries |
{
"platform": "github",
"token": "ghp_xxxxxxxxxxxx",
"gistId": "abcdef1234567890abcdef1234567890",
"locale": "en"
}Export / Import: Press c → Ctrl+B to export config as a base64-encoded import command. Run ttm --import-config <base64> on another machine to import (details displayed, confirmation required).
Clipboard notes: In remote SSH/tmux sessions, clipboard falls back to terminal channel if system clipboard is unavailable. Enable tmux passthrough with set -g set-clipboard on.
Private key path input: The Private Key field accepts either raw key text or a file path. On save, if the value reads as a file (≤256KB), TTM stores the content. If reading fails, the path text is preserved with a tip.
c— Open config editor- Select platform (
github/gitee) - Enter Personal Access Token (needs
gistscope) - Enter Gist ID (leave empty to auto-create on first push)
Ctrl+Sto savesto push,Sto pull
Main list:
| Key | Action | Key | Action |
|---|---|---|---|
Enter |
Connect | a |
Add bookmark |
e |
Edit bookmark | d |
Delete bookmark |
* |
Star / unstar | s / S |
Push / Pull Gist |
c |
Config editor | u |
Check updates |
y |
Copy SSH command | L |
Toggle EN / 中文 |
/ |
Filter | j / k ↑ / ↓ |
Navigate |
h / l ← / → |
Page | ? |
Help |
q |
Quit |
Editor shortcuts: Ctrl+S save, Ctrl+R reveal/hide secrets, Ctrl+Y copy field, Ctrl+U clear field, Ctrl+V paste, Ctrl+B export config.
SSH session shortcuts:
| Key | Action |
|---|---|
Ctrl+G ×2 |
Open transfer dialog (copy scp command, upload, or download) |
Esc / Ctrl+C |
Cancel ongoing transfer |
Tab |
Auto-complete remote path (in download dialog) |
Transfer dialog flow:
- Double-press
Ctrl+Gduring an SSH session - Choose:
1copy scp command to clipboard,2upload local file/directory,3download remote file/directory - If uploading: confirm remote directory (auto-detected), enter local path, confirm before transfer
- If downloading: enter remote path (Tab to complete), choose local save directory (default ~/Downloads), confirm before transfer
- Progress bar shows transfer speed and ETA
- Supports both single files and recursive directory transfer
| Feature | Linux/macOS Server | Windows Server |
|---|---|---|
| Upload/Download | ✅ Full support | ❌ Not supported (use scp command instead) |
| Tab path completion | ✅ | ❌ |
| Auto-detect remote directory | ✅ | ❌ Falls back to home directory |
Local terminal notes:
- Windows Terminal — fully supported (ANSI escape sequences enabled by default)
- Old cmd.exe — UI may display incorrectly; recommend upgrading to Windows Terminal
- Termux (Android) — fully supported
- 全 TUI 界面 — 无需手动编辑配置文件,所有操作均在界面内完成
- SSH 连接 — 支持密码、私钥、键盘交互三种认证方式
- 书签管理 — 新增、编辑、删除、收藏
- Gist 同步 — 通过 GitHub 或 Gitee Gist 推送 / 拉取书签
- 应用内配置 — 无需离开 TUI 即可设置 Token 和 Gist ID
- 搜索与分页 — 模糊过滤书签列表
- 私钥输入模式 — 支持粘贴私钥文本或填写私钥文件路径(保存时解析,≤256KB)
- 剪贴板感知复制 —
Ctrl+Y优先系统剪贴板,可用时回退终端通道 - 配置导入导出 — 通过
Ctrl+B导出 +--import-config跨机器共享配置 - 双语 — English / 中文,按
L切换 - 版本检查 — 按
u检查新版本,下载时显示进度条 - 跨平台 — macOS、Linux、Windows、Android (Termux)
- 复制 SSH 命令 — 按
y复制选中书签的标准 SSH 命令(如ssh user@host -p 22),兼容 Termux OSC52;命令同时显示在提示栏,支持手动选中复制 - 远程文件传输 — SSH 会话中双击
Ctrl+G,可上传或下载文件/目录(SCP 协议,复用已有连接,远程路径支持 Tab 补全,下载默认 ~/Downloads 可自定义)
Homebrew (macOS / Linux):
brew install vst93/tap/ttm脚本安装(macOS / Linux / Termux):
curl -fsSL https://raw.githubusercontent.com/vst93/ttm/refs/heads/main/cmd/install.sh | bash国内加速:
curl -fsSL https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.sh | bash| 参数 | 说明 |
|---|---|
--help |
显示所有选项 |
--lang en |
使用英文(默认) |
--lang zh |
使用中文 |
--install-dir <dir> |
安装到指定目录 |
--force |
校验失败时继续安装 |
--skip-github |
跳过 GitHub 直连,仅使用镜像下载 |
--preview |
安装预览版 |
Windows (PowerShell):
irm https://raw.githubusercontent.com/vst93/ttm/main/cmd/install.ps1 | iex国内镜像:
irm https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.ps1 | iex| 环境变量 | 说明 |
|---|---|
SKIP_GITHUB=1 |
跳过 GitHub 直连,仅使用镜像下载 |
FORCE_INSTALL=1 |
校验失败时继续安装 |
INSTALL_DIR=path |
安装到指定目录 |
TTM_LANG=zh |
使用中文界面 |
NO_SHORTCUTS=1 |
不创建桌面/开始菜单快捷方式 |
TTM_PREVIEW=1 |
安装预览版 |
安装预览版:
# 脚本安装(macOS / Linux / Termux)
curl -fsSL https://raw.githubusercontent.com/vst93/ttm/refs/heads/main/cmd/install.sh | bash -s -- --preview
# Windows (PowerShell)
$env:TTM_PREVIEW=1; irm https://raw.githubusercontent.com/vst93/ttm/main/cmd/install.ps1 | iex提示: 如果您所在地区 GitHub 访问受限,建议使用
SKIP_GITHUB=1跳过 GitHub 直连下载,仅使用 CDN 镜像。
CDN 镜像 (jsdelivr):
安装脚本使用 cdn.jsdelivr.net 作为 CDN 镜像,在 GitHub 访问受限的地区可获得更快的下载速度。您也可以直接使用 CDN 镜像:
# 使用 CDN 镜像安装
irm https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.ps1 | iex
# 或带参数
$env:SKIP_GITHUB=1; $env:TTM_LANG="zh"; irm https://cdn.jsdelivr.net/gh/vst93/ttm@main/cmd/install.ps1 | iex带参数示例:
$env:SKIP_GITHUB=1; $env:TTM_LANG="zh"; irm https://raw.githubusercontent.com/vst93/ttm/main/cmd/install.ps1 | iex或从 Releases 下载 ttm-windows-*.zip,解压 ttm.exe,添加到 PATH。
从源码构建:
git clone https://github.com/vst93/ttm.git && cd ttm
make buildttmc— 打开配置编辑器,设置 GitHub/Gitee 令牌和 Gist IDa— 新增书签(主机、用户、端口、认证方式)Enter— 连接选中服务器s/S— 通过 Gist 推送或拉取书签
配置文件路径:~/.config/ttm/(Linux)、~/Library/Application Support/ttm/(macOS)、%APPDATA%\ttm\(Windows)
| 文件 | 说明 |
|---|---|
config.json |
平台、令牌、Gist ID、语言 |
bookmarks.json |
书签数据 |
{
"platform": "github",
"token": "ghp_xxxxxxxxxxxx",
"gistId": "abcdef1234567890abcdef1234567890",
"locale": "zh"
}导出 / 导入: 按 c → Ctrl+B 导出配置为 base64 编码的导入命令。在其他机器运行 ttm --import-config <base64> 即可导入(展示配置详情,确认后写入)。
剪贴板说明: 远程 SSH/tmux 会话中,系统剪贴板不可用时自动回退终端通道。tmux 建议开启 set -g set-clipboard on。
私钥路径输入: Private Key 字段可填写私钥文本或文件路径。保存时若读取文件成功(≤256KB)则存入内容,失败则保留路径文本并给出提示。
c— 打开配置编辑器- 选择平台(
github/gitee) - 输入 Personal Access Token(需要
gist权限) - 输入 Gist ID(留空则首次推送时自动创建)
Ctrl+S保存s推送,S拉取
主列表:
| 按键 | 功能 | 按键 | 功能 |
|---|---|---|---|
Enter |
连接 | a |
新增书签 |
e |
编辑书签 | d |
删除书签 |
* |
标星 / 取消 | s / S |
推送 / 拉取 Gist |
c |
配置编辑器 | u |
检查更新 |
y |
复制 SSH 命令 | L |
切换 EN / 中文 |
/ |
过滤 | j / k ↑ / ↓ |
导航 |
h / l ← / → |
翻页 | ? |
帮助 |
q |
退出 |
编辑器快捷键: Ctrl+S 保存、Ctrl+R 显示/隐藏敏感字段、Ctrl+Y 复制字段、Ctrl+U 清空字段、Ctrl+V 粘贴、Ctrl+B 导出配置。
SSH 会话快捷键:
| 按键 | 功能 |
|---|---|
Ctrl+G ×2 |
打开传输对话框(复制 scp 命令、上传、下载) |
Esc / Ctrl+C |
取消正在进行的传输 |
Tab |
自动补全远程路径(下载对话框中) |
传输流程:
- SSH 会话中双击
Ctrl+G - 选择:
1复制 scp 命令、2上传本地文件/目录、3下载远程文件/目录 - 如上传:确认远程目录(自动检测),输入本地路径,确认后传输
- 如下载:输入远程路径(Tab 补全),选择本地保存目录(默认 ~/Downloads),确认后传输
- 进度条显示传输速度和剩余时间
- 支持单文件和递归目录传输
| 功能 | Linux/macOS 服务器 | Windows 服务器 |
|---|---|---|
| 上传/下载 | ✅ 完全支持 | ❌ 不支持(请用 scp 命令代替) |
| Tab 路径补全 | ✅ | ❌ |
| 自动检测远程目录 | ✅ | ❌ 降级为 home 目录 |
本地终端说明:
- Windows Terminal — 完全支持(默认启用 ANSI 转义序列)
- 老版 cmd.exe — 界面可能显示异常,建议升级到 Windows Terminal
- Termux(Android) — 完全支持