[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-92462":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},92462,"sageport","joygqz\u002Fsageport","joygqz","SSH workbench with integrated SFTP, credential management, and an AI assistant.","",null,"TypeScript",70,5,52,8,0,12,43.53,"GNU General Public License v3.0",false,"main",true,[24,25,26,27,28,29,30,31,32,33],"agent","ai-client","radix-ui","sftp-client","ssh","ssh-client","terminal","terminal-emulator","tuari","xterm","2026-07-22 04:02:06","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"public\u002Fapp-icon.png\" alt=\"Sageport\" width=\"96\" height=\"96\" \u002F>\n\n# Sageport\n\n**SSH workbench with integrated SFTP, credential management, and an AI assistant**\n\n[![Latest release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fjoygqz\u002Fsageport)](https:\u002F\u002Fgithub.com\u002Fjoygqz\u002Fsageport\u002Freleases\u002Flatest)\n[![License: GPL-3.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-GPL--3.0-blue)](LICENSE)\n[![Built with Tauri](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbuilt%20with-Tauri%202-24C8DB)](https:\u002F\u002Ftauri.app)\n\n[Download](https:\u002F\u002Fgithub.com\u002Fjoygqz\u002Fsageport\u002Freleases\u002Flatest) · [Features](#features) · [Quick start](#quick-start) · [Security](#security)\n\n\u003C\u002Fdiv>\n\n---\n\n![Sageport workbench](docs\u002Fscreenshot.png)\n\nSageport consolidates the tools of routine server operations — terminal, file transfer, key management, and command snippets — into a single desktop application with a VSCode-style layout: activity bar, side bar, tabbed editor area, bottom panel, and command palette. All data is stored in a local SQLite database; optional multi-device sync transmits only end-to-end encrypted ciphertext.\n\n## Features\n\n**Terminal** — GPU-accelerated rendering via xterm.js with WebGL, built on a pure-Rust SSH stack (russh). Tabbed concurrent sessions that persist in the background without reflow, keepalives with one-click reconnect, scrollback search (\u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>F\u003C\u002Fkbd>), clickable links, and full Unicode support. Inline autocomplete suggests commands from your history as you type, and input can be broadcast to every connected session at once. Local shell tabs run alongside SSH sessions, and typing `user@host` in the command palette connects immediately — no saved host required.\n\n**Hosts & credentials** — Hosts organized into collapsible groups with live connection indicators, jump-host (ProxyJump) chains, per-host startup commands, and one-click import from your existing `~\u002F.ssh\u002Fconfig`. Connections verify host keys on first use and support the system SSH agent. Credentials are decoupled from hosts, so one identity can be reused across servers. The built-in key manager generates and imports Ed25519, RSA, and ECDSA keys in OpenSSH format, with optional passphrase protection.\n\n**File transfer & editing** — Dual-pane browser where each pane can show the local filesystem or an SFTP connection. Drag-and-drop transfer in both directions, in-transit archiving for directories with many small files, a permissions editor, path bookmarks, and a complete transfer history. Text files open in an editor tab with syntax highlighting and save straight back over SFTP.\n\n**Monitoring** — A dedicated sidebar shows live CPU, memory, disk, and network statistics for connected hosts, with a compact summary for the active host in the status bar.\n\n**Port forwarding** — Local (`-L`) and dynamic SOCKS (`-D`) tunnels with start\u002Fstop control, live status, and optional auto-start on launch — routed over jump-host chains when configured.\n\n**Snippets** — Frequently used commands with `{{variable}}` placeholders, sent to the active terminal or run across many hosts at once with per-host results.\n\n**AI assistant** — Bring your own API key; supports Anthropic and any OpenAI-compatible endpoint with configurable base URL and model, with prompt caching to cut token costs. The assistant works with your workbench through tools: it can list saved hosts, open connections, inspect terminal output, and propose commands — every remote command requires explicit confirmation before it runs, and when a decision is ambiguous it asks you to pick from options instead of guessing. Conversations are stored locally.\n\n**Sync & backup** — Cross-device sync through one of five providers — GitHub Gist, Google Drive, and Microsoft OneDrive via OAuth, or WebDAV and S3 with your own credentials — encrypted end to end with a passphrase-derived key. Only ciphertext ever leaves the device. Syncs hosts, credentials, snippets, port forwards, bookmarks, and interface preferences (locale, theme, zoom). Automatic last-write-wins conflict resolution, revision history with restore, and encrypted export\u002Fimport for offline backups.\n\n**Interface** — Six full themes (terminal palette included), English and Simplified Chinese localization, whole-UI zoom, command palette (\u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>P\u003C\u002Fkbd> \u002F \u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>⇧\u003C\u002Fkbd> \u003Ckbd>P\u003C\u002Fkbd>), and automatic updates.\n\n## Installation\n\nDownload from the [latest release](https:\u002F\u002Fgithub.com\u002Fjoygqz\u002Fsageport\u002Freleases\u002Flatest):\n\n| Platform | Package |\n| --- | --- |\n| macOS | `.dmg` (Apple Silicon \u002F Intel) |\n| Windows | `.msi` \u002F `.exe` |\n| Linux | `.deb` \u002F `.rpm` \u002F `.AppImage` |\n\nThe application updates itself; the status bar indicates when a new version is available.\n\n## Quick start\n\n1. **Add a host** — \u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>N\u003C\u002Fkbd>, then enter the address and choose password or key authentication — or just type `user@host` in the command palette to connect right away.\n2. **Connect** — \u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>P\u003C\u002Fkbd>, type the host name, press Enter.\n3. **Transfer files** — \u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>J\u003C\u002Fkbd> opens the dual-pane file panel.\n4. **AI assistant** (optional) — set an API key under *Settings → AI*, then \u003Ckbd>⌘\u003C\u002Fkbd> \u003Ckbd>L\u003C\u002Fkbd> to chat.\n5. **Sync** (optional) — under *Settings → Sync*, pick a provider (GitHub, Google Drive, OneDrive, WebDAV, or S3), authorize or enter credentials, then set a passphrase; enter the same passphrase on another device to restore.\n\nOn Windows and Linux, substitute \u003Ckbd>Ctrl\u003C\u002Fkbd> for \u003Ckbd>⌘\u003C\u002Fkbd>.\n\n## Security\n\n- All data resides in a local SQLite database; no cloud service is required.\n- Sync and backups derive the encryption key from your passphrase with **Argon2id** and seal payloads with **AES-256-GCM**. Only ciphertext leaves the device; the passphrase never does. **A lost passphrase makes synced data unrecoverable.**\n- Every remote command initiated by the AI assistant executes only after user approval.\n\n## Development\n\n**Stack:** Tauri 2 + Rust · React 19 + TypeScript · Tailwind CSS 4 · Zustand + TanStack Query\n\n```bash\n# Prerequisites: https:\u002F\u002Ftauri.app\u002Fstart\u002Fprerequisites\u002F plus Node.js and pnpm\npnpm install        # install dependencies\npnpm tauri dev      # run in development mode\npnpm tauri build    # build installers\n```\n\nAdditional scripts: `pnpm lint`, `pnpm typecheck`, `pnpm format`, `pnpm test`.\n\n### Project layout\n\n```\nsrc\u002F\n  workbench\u002F    Shell: activity bar, side bar, editor tabs, panel,\n                status bar, command palette, keybindings\n  features\u002F     One folder per domain: hosts, terminal, sftp, snippets,\n                credentials, forwards, monitor, ai, sync, settings, updates\n  themes\u002F       Theme definitions applied as CSS variables and shared with xterm\n  components\u002F   Reusable UI primitives\n  lib\u002Fipc.ts    Typed facade over all Tauri commands and events\n  i18n\u002F         Typed dictionaries: en, zh-CN\n\nsrc-tauri\u002Fsrc\u002F\n  commands\u002F     Thin Tauri command handlers\n  repository\u002F   SQLite persistence per entity\n  ssh\u002F sftp\u002F    russh session, SFTP, forwarding, and monitoring engines\n  pty\u002F          Local shell sessions via portable-pty\n  sync\u002F crypto\u002F Vault snapshot, provider clients (Gist, Drive, OneDrive,\n                WebDAV, S3), OAuth, Argon2id + AES-256-GCM\n  ai\u002F           Anthropic and OpenAI-compatible chat clients\n```\n\nIssues and pull requests are welcome.\n\n## License\n\n[GPL-3.0](LICENSE)\n","Sageport 是一款面向系统管理员与开发者的桌面端 SSH 工作台应用，整合终端、SFTP 文件传输、凭据管理与 AI 辅助功能。基于 Tauri 框架构建，采用 russh（Rust）实现 SSH 协议栈，xterm.js 提供 GPU 加速终端渲染；支持多标签会话、跳转主机链、OpenSSH 配置导入、本地 SQLite 存储及端到端加密同步。内置双面板 SFTP 浏览器、实时系统监控、端口转发控制与命令片段模板。适用于服务器运维、远程开发调试及跨环境批量操作等场景。",2,"2026-07-09 02:30:05","CREATED_QUERY"]