陈大猫 cc5ad3be16 perf: isolate Terminal hot props, cut memory/jank, and repay architecture debt (#2790)
* refactor: migrate architecture-debt hooks into application/state

Move SFTP Wave A stores/hooks and related vault/AI/terminal/systemManager
hooks out of components into application/state, update importers, and keep
thin deprecated re-exports at the old paths.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* refactor(sftp): align local bookmarks store API with global bookmarks

Export subscribe/get/set/rehydrate helpers from localSftpBookmarks to match
the globalSftpBookmarks external-store pattern.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix(electron): reduce baseline memory via spellcheck/GPU/prewarm guards

Disable spellcheck on BrowserWindows and the default session, drop spare
renderers, gate aggressive GPU switches behind NETCATTY_COMPAT_GPU, and make
settings prewarm opt-in via NETCATTY_PREWARM_SETTINGS.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* Isolate notes and customAccent from TerminalLayer hot props

Route vault notes through notesStore (shellHistoryStore pattern) and
app accent through appearanceChromeStore so note edits and accent-drag
ticks no longer rebuild TerminalLayer. Notes/AI slots and Terminal leaves
subscribe locally; VaultView and open-note callbacks stay unchanged.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix(ui): cut unnecessary AppView/VaultView/settings re-renders

Stabilize TopTabs close handler, memo AppHostTreeLayer, exclude accent from
settingsVersion, ignore connectionLogs off the logs section, share lastConnected
host refs, and keep rename dialog drafts local so chrome domain stays stable.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* chore: package size, dead code, and consolidation cleanup

Remove unused direct deps, exclude Vite-bundled renderer packages from
electron-builder, delete high-confidence dead code/no-op transfer warm
wiring, consolidate cloud provider IDs and KnownHost/SFTP helpers, and
land UI/AGENTS quick wins (rAF text batching, notes draft debounce,
streaming plain text, tempDirBridge, diagnostics adapter, External MCP
setters).

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: stabilize rAF text batching and diagnostics tests

Polyfill requestAnimationFrame for Node, flush pending text before
steer buffering, bypass rAF while steer is in flight, and stub
global localStorage for AI panel diagnostics adapter tests.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: correct import paths after application/state hook migrations

Migrated vault/AI/system hooks still used components/-relative imports;
point them at repo-root domain/components/types/lib instead.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: address Bugbot/Codex regressions from perf cleanup

- Keep blank Enter from closing RenameDraftDialog; only reset rename state after a non-empty submit
- Flush note drafts before vault mutations so pending title/body edits are not overwritten
- Re-apply appearanceChromeStore accent on appearanceTheme in Terminal, and keep layer themes unaccented

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix(notes): flush draft before markdown export paths

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: keep editor-close hotkey ref fresh during render

Assign handleRequestCloseEditorTabRef in render instead of useEffect so
Cmd/Ctrl+W never hits the App stub before the effect runs.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: keep accent in chrome themes without TerminalLayer thrash

Restore accent in globalAppearance for chrome/injection consumers.
Keep resolveFocusedAppearance identity stable across accent drag via
accent ref, while Terminal leaf still re-applies appearanceChromeStore.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: keep compose chrome accent live and merge note renames

Subscribe theme-panel focusedAppearance to appearanceChromeStore so
compose-bar chrome updates during color-picker drag even when
resolveFocusedAppearance identity stays stable. Tree renames now merge
title into the post-flush note instead of replacing from a stale row.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: clear terminal accent when switching back to theme mode

Re-resolve appearanceTheme by catalog id before applyCustomAccent so a
stale baked custom cursor/selection cannot stick after accentMode returns
to theme while TerminalLayer memo ignores accent props.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: register unsaved prompt singleton during render

AppView close handlers call promptUnsavedChanges outside the old
render-prop. Assign the singleton during render so Cmd/Ctrl+W and tab
close never hit the pre-effect null window that auto-cancels.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: keep vault import hooks UI-free and flush notes on teardown

Move ImportOptions into application/state and inject a notifier so
useVaultImportHandlers no longer imports components. Notes drafts also
flush on pagehide/beforeunload when Electron tears down without React
unmount.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: move AI terminal session context builders into domain

buildAITerminalSessionInfo and AIPanelContext now live under domain/ so
application hooks no longer import TerminalLayerSupport and create a
UI → application → UI cycle.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: drop duplicate AIPanelContext type from TerminalLayerSupport

The type is re-exported from domain; the local definition conflicted.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: keep migrated state hooks free of UI-layer imports

Move aiChatStreamingSupport into infrastructure/ai and poll list helpers
into domain/systemManager so useAIChatStreaming / useSystemManager no
longer import from components. Leave thin re-exports at the old paths.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: move remaining migrated-hook deps out of components

Host-key verification types/helpers now live in domain/, and SFTP column
layout types live in application/state/sftp/columnLayout. Application
hooks no longer import those definitions from the UI layer.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix: clear lint blockers and flush notes when panels hide

Move AI panel diagnostics persistence into application/state so
components stop importing localStorageAdapter. Flush note drafts when
retained NotesManager mounts become inactive, and silence related lint
warnings in theme/host-key helpers.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

* fix(notes): publish notesStore sync on vault note updates

updateNotes/updateNoteGroups now publishNotesSnapshot immediately so
AI/notes consumers do not briefly read a stale catalog after a hide
flush. Flush inactive drafts in useLayoutEffect before paint.

Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>
2026-08-07 14:40:38 +08:00
2026-07-21 13:27:20 +08:00
2026-06-30 17:51:33 +08:00
2026-06-30 17:27:34 +08:00
2025-12-07 03:25:07 +08:00

Netcatty

Netcatty

🔥 AI-Powered SSH Client, SFTP Browser & Terminal Manager 🚀
netcatty.app

A beautiful, feature-rich SSH workspace built with Electron, React, and xterm.js.
🔥 Built-in AI Agent · Split terminals · Vault views · SFTP workflows · Custom themes — all in one.

GitHub Release   Platform   License

Download Latest Release

Support on Ko-fi

English · 简体中文 · 日本語


Screenshot 2026-07-02 at 22 51 24

🔥 Catty Agent — Your IT Ops AI Partner

🚀 Boost your IT ops daily work with AI power. Catty Agent is the built-in AI assistant that understands your servers, executes commands, and handles complex multi-host operations — all through natural conversation.

🔥 What can Catty Agent do?

  • 🚀 Natural language server management — just tell it what you need, no more memorizing commands
  • 🔥 Real-time server diagnostics — check status, inspect logs, monitor resources through conversation
  • 🚀 Multi-host orchestration — coordinate tasks across multiple servers simultaneously
  • 🔥 Intelligent context awareness — understands your server environment and provides tailored responses
  • 🚀 One-click complex operations — set up clusters, deploy services, and more with simple instructions

🎬 AI in Action

🔥 Single Host — Intelligent Server Diagnostics

Ask Catty Agent to check a server's health, and it runs the right commands, analyzes the output, and gives you a clear summary — all in seconds.

ai-single

🚀 Multi-Host — Docker Swarm Cluster Setup

Watch Catty Agent orchestrate a Docker Swarm cluster across two servers in one conversation. It handles the init, token exchange, and node joining — you just tell it what you want.

ai-muti

Contents


What is Netcatty

Netcatty is a modern SSH client and terminal manager for macOS, Windows, and Linux, designed for developers, sysadmins, and DevOps engineers who need to manage multiple remote servers efficiently.

  • Netcatty is an alternative to PuTTY, Termius, SecureCRT, and macOS Terminal.app for SSH connections
  • Netcatty is a powerful SFTP client with dual-pane file browser
  • Netcatty is a terminal workspace with split panes, tabs, and session management
  • Netcatty supports SSH, local terminal, Telnet, Mosh, and Serial connections (when available)
  • Netcatty is not a shell replacement — it connects to shells via SSH/Telnet/Mosh or local/serial sessions

Why Netcatty

If you regularly work with a fleet of servers, Netcatty is built for speed and flow:

  • Workspace-first — split panes + tabs + session restore for “always-on” workflows
  • Vault organization — grid/list/tree views with fast search and drag-friendly workflows
  • Serious SFTP — built-in editor + drag & drop + smooth file operations

Features

🗂️ Vault

  • Multiple views — grid / list / tree
  • Fast search — locate hosts and groups quickly

🖥️ Terminal Workspaces

  • Split panes — horizontal and vertical splits for multi-tasking
  • Session management — run multiple connections side-by-side
  • Inline images — render Kitty graphics, SIXEL and iTerm inline images from remote programs

📁 SFTP + Built-in Editor

  • File workflows — drag & drop uploads/downloads
  • Edit in place — built-in editor for quick changes

🎨 Personalization

  • Custom themes — tune the app appearance to your taste
  • Keyword highlighting — customize highlight rules for terminal output

Screenshots

Main Window

The main window is designed for long-running SSH workflows: quick access to sessions, navigation, and core tools in one place.

black-grid light

Vault Views

Organize and navigate your hosts using the view that best fits the moment: grid for overview, list for scanning, tree for structure.

list tree

Split Terminals

Split panes help you monitor multiple servers/services at the same time (deploy + logs + metrics) without juggling windows.

split

Supported Distros

Netcatty automatically detects and displays OS icons for connected hosts:

Ubuntu Debian CentOS Fedora Arch Linux Alpine Amazon Linux Red Hat Rocky Linux openSUSE Oracle Linux Kali Linux AlmaLinux

Getting Started

Download

Download the latest release for your platform from GitHub Releases.

OS Support
macOS Universal (x64 / arm64)
Windows x64 / arm64
Linux x64 / arm64

Or browse all releases at GitHub Releases.

Code signing and privacy

Netcatty is applying to the SignPath Foundation open-source program. Once approved, covered Windows release artifacts will use Free code signing provided by SignPath.io, certificate by SignPath Foundation. See the code signing policy and privacy policy. Windows releases may remain unsigned until the application and integration are complete.

Windows portable data: Exit Netcatty, then create a folder named data beside Netcatty.exe (zip build) or beside the portable launcher. Netcatty will store its profile there on the next launch. Saved passwords and private keys remain protected by the Windows user account that created them, so they must be re-entered after moving the folder to another computer or Windows account.

Open folders in Netcatty on Windows: The installed version adds Open in Netcatty to Explorer's folder context menu and folder-background context menu. It opens a local terminal in that folder. On Windows 11, choose Show more options first. Turn the menu off or on in Settings → System → Windows Explorer. ZIP and portable versions do not add this menu by default.

macOS Users: Current releases are expected to be code-signed and notarized. If Gatekeeper still warns, make sure you downloaded the latest official build from GitHub Releases.

Nix / NixOS

Netcatty provides a flake that wraps the official Linux AppImage release for Nix and NixOS users:

nix run github:binaricat/Netcatty

For declarative installs, add the Netcatty flake as an input and use inputs.netcatty.packages.${pkgs.system}.default in your NixOS or Home Manager package list.

Prerequisites

  • Node.js 18+ and npm
  • macOS, Windows 10+, or Linux

Development

# Clone the repository
git clone https://github.com/binaricat/Netcatty.git
cd Netcatty

# Install dependencies
npm install

# Start development mode (Vite + Electron)
npm run dev

Build & Package

# Build for production
npm run build

# Package for current platform
npm run pack

# Package for specific platforms
npm run pack:mac     # macOS (DMG + ZIP)
npm run pack:win     # Windows (NSIS installer)
npm run pack:linux   # Linux (AppImage + DEB + RPM)

Tech Stack

Category Technology
Framework Electron 40
Frontend React 19, TypeScript
Build Tool Vite 7
Terminal xterm.js 5
Styling Tailwind CSS 4
SSH/SFTP ssh2, ssh2-sftp-client
PTY node-pty
Icons Lucide React

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

See agents.md for architecture overview and coding conventions.


Contributors

Thanks to all the people who contribute!


License

This project is licensed under the GPL-3.0 License - see the LICENSE file for details.


Star History

Star History Chart

Made with ❤️ by binaricat

S
Description
No description provided
Readme GPL-3.0 189 MiB
Languages
TypeScript 65.5%
JavaScript 34.1%
CSS 0.2%
Shell 0.1%