| Tool | Version | Install |
|---|---|---|
| Node.js | 22+ | nodejs.org |
| pnpm | 10.8+ | npm install -g pnpm |
| Git | 2.40+ | git-scm.com |
| Python | 3.x | Required by node-gyp for native modules |
| Visual Studio Build Tools | 2022 | Required for better-sqlite3, node-pty, serialport on Windows |
# Clone and install
git clone <repo-url> hypershell
cd hypershell
pnpm install
# Rebuild native modules for Electron
pnpm --filter @hypershell/desktop rebuild:native
# Start development (terminal 1: Vite dev server)
pnpm --filter @hypershell/ui dev
# Start development (terminal 2: Electron)
pnpm --filter @hypershell/desktop devThe Electron app opens and loads the UI from http://localhost:5173 (Vite dev server with HMR).
- The HyperShell window should open with the animated logo welcome screen
- Press
Ctrl+Kto open Quick Connect — confirms the UI renders - Double-click a host in the sidebar (or add one) to open an SSH session
- The terminal should connect and show a shell prompt
pnpm build # Build all workspaces (shared → session-core → db → ui → desktop)
pnpm test # Run all Vitest unit tests
pnpm lint # Lint all workspaces
# Per-workspace
pnpm --filter @hypershell/ui test
pnpm --filter @hypershell/ui test:e2e
pnpm --filter @hypershell/desktop test
pnpm --filter @hypershell/session-core test
pnpm --filter @hypershell/db testhypershell/
├── apps/desktop/ # Electron main + preload
├── apps/ui/ # React renderer (Vite)
├── packages/shared/ # IPC contracts (Zod schemas)
├── packages/session-core/ # Transport layer (SSH, serial, SFTP)
├── packages/db/ # SQLite database + repositories
└── docs/ # This documentation
See Project Structure for detailed breakdown.
- UI changes — Edit files in
apps/ui/src/. Vite HMR updates the renderer instantly. - Main process changes — Edit files in
apps/desktop/src/main/. Rebuild withpnpm --filter @hypershell/desktop build, then restart Electron. - Preload changes — Edit
apps/desktop/src/preload/. Same rebuild + restart as main process. - Shared/session-core/db changes — Rebuild the package, then rebuild desktop:
pnpm build. - IPC contract changes — Update schemas in
packages/shared/src/ipc/, then update both preload (desktop) and UI consumers.
- Define the channel name in
packages/shared/src/ipc/channels.ts - Add Zod request/response schemas in
packages/shared/src/ipc/schemas.ts(orsftpSchemas.ts) - Add the handler in the appropriate
apps/desktop/src/main/ipc/*Ipc.tsfile - Register the channel in
registerIpc.ts - Expose the method in
apps/desktop/src/preload/desktopApi.ts - Add the method to
apps/ui/src/types/global.d.ts(window.hypershell) - Call it from the UI
- Create a new migration file in
packages/db/src/migrations/(numbered sequentially) - Migrations run automatically on database open via
openDatabase() - Use
column already existsguards for idempotent migrations
- Create a directory under
apps/ui/src/features/<feature-name>/ - Create components, stores (Zustand), and hooks
- Wire into
App.tsxor the relevant parent component - Add any needed IPC calls through
window.hypershell