NexusTerm: an SSH session manager for Linux

Connection tree with interleaved folders and hosts, tabbed terminals
grouped by host, a pinned local shell, TOFU host key verification, and
credentials held by the OS keyring.

Terminal bytes travel on a per-session MessagePort with credit-based flow
control, so one session running `cat` on a large file cannot stall the
others. Transports reconnect on their own with jittered backoff, keeping
the scrollback and the tab while replacing only the connection beneath.

156 tests, including integration tests against a real sshd and a
migration exercised against a database built in the old shape.
This commit is contained in:
ylhan
2026-09-17 03:12:24 +08:00
commit 430d78b9f0
88 changed files with 19793 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
appId: dev.ylhan.nexusterm
productName: NexusTerm
copyright: Copyright © 2026 ylhan
directories:
output: release
buildResources: build
files:
- out/**/*
- package.json
# Ship only this platform's native prebuilds.
#
# better-sqlite3 alone carries eight, and node-pty another eleven — for other
# operating systems, other architectures, and musl. None of them can be
# loaded here and together they are about 10MB of the package.
# better-sqlite3 ships these as flat FILES (`win32-arm64.node`), not as
# directories, so the pattern must not require a trailing `/**`.
- '!node_modules/better-sqlite3/prebuilds/win32-*'
- '!node_modules/better-sqlite3/prebuilds/darwin-*'
- '!node_modules/better-sqlite3/prebuilds/linuxmusl-*'
- '!node_modules/better-sqlite3/prebuilds/linux-arm64*'
- '!node_modules/node-pty/prebuilds/win32-*/**'
- '!node_modules/node-pty/prebuilds/darwin-*/**'
- '!node_modules/ssh2/lib/protocol/crypto/build/Release/obj/**'
# Native modules cannot be loaded from inside an asar archive.
#
# Unpack the WHOLE package, not just `**/*.node`. node-pty ships `spawn-helper`
# on macOS and Windows, a real executable loaded from disk rather than dlopen'd
# — if it stays inside the archive, the app works in dev and fails only once
# packaged, which is the worst way for it to fail. ssh2 turned out to carry
# `sshcrypto.node` as well, which is easy to miss because the library reads as
# pure JavaScript.
asarUnpack:
- node_modules/node-pty/**
- node_modules/better-sqlite3/**
- node_modules/ssh2/**
- node_modules/@serialport/**
# Deliberately off. These are all node-addon-api builds, so the binaries
# produced by `npm install` load unchanged in Electron's Node — verified by
# spawning a real PTY from inside Electron 44. Rebuilding would take time and
# risk replacing working binaries with differently-built ones, for no gain.
npmRebuild: false
linux:
target:
- AppImage
- deb
category: Network
maintainer: ylhan <ylhan@example.com>
# Without this, desktop environments cannot tell which running window
# belongs to this .desktop entry, so the launcher shows a second icon
# instead of indicating the running app.
syncDesktopName: true
synopsis: SSH session manager
description: >
SSH session manager with a connection tree, tabbed terminals grouped by
host, port forwarding, a pinned local shell, and credentials held by the
system keyring.
# electron-builder generates the .desktop entry from these.
desktop:
entry:
Name: NexusTerm
Comment: SSH session manager
Keywords: ssh;terminal;shell;sftp;remote;
deb:
depends:
- libgtk-3-0
- libnotify4
- libnss3
- libxss1
- libxtst6
- xdg-utils
- libatspi2.0-0
- libsecret-1-0
# node-pty needs a working /dev/pts, which every normal desktop has.
- libuuid1
artifactName: ${productName}-${version}-${arch}.${ext}