User Guide

Learn how to set up and use DevPort across all platforms.

DevPort Desktop Client is a cross-platform desktop app that lets you connect to remote machines via SSH with code editing, terminal, Git, debugging, Docker management, and more — all in one app.

Installation

PlatformFormat
macOS.dmg (Apple Silicon + Intel universal)
Windows.exe (NSIS installer)
Linux.AppImage / .deb

Download the latest version from GitHub Releases.

Auto Update

When a new version is released, an update banner appears at the top of the app. Click it to automatically download and restart.


Connecting

When you launch the app, you'll see the Welcome screen. You can connect to remote machines in 4 ways.

Method 1: Direct SSH Connection

  1. Click New Connection
  2. Enter connection info: Hostname (IP or domain), Port (default 22), Username, Auth method (password or private key)
  3. Click Connect

Connection profiles are automatically saved — reconnect with one click from the sidebar.

Method 2: Nearby Devices (LAN)

If a DevPort Agent is running on the same network, it will automatically appear in the Nearby Devices section. Click to connect instantly.

Method 3: Connection Code (WAN)

Enter the 6-digit code (e.g., A3K-M7P) generated by the remote Agent in the Remote Connect section. If direct SSH is not possible (NAT/firewall), a WebSocket Relay will automatically bridge the connection. A Relay badge will appear in the UI.

Method 4: My Devices (GitHub Account)

  1. Click GitHub Login in the My Devices section
  2. After login, all devices registered under the same account are displayed
  3. Click to connect (no connection code needed)

Host Key Verification

  • On first connection, a dialog will ask you to verify the server's host key fingerprint — click Accept
  • If the fingerprint has changed from a previously saved one, a warning will appear. Be cautious if you haven't reinstalled the server.

Layout

After connecting, the screen is divided into 4 areas:

+-----------+-------------------------------+ | Sidebar | Code Editor | | (Conn/ | (Monaco Editor based) | | Files) | | | +-------------------------------+ | | Bottom Panel | | | (Terminal/Git/Debug/Ports/ | | | Docker) | +-----------+-------------------------------+

Code Editor

Monaco Editor-based (same engine as VS Code) code editor:

  • Click a file in the File Explorer to open it in the editor
  • Open multiple files as tabs
  • 100+ language syntax highlighting (JS, TS, Python, Rust, Go, Java, C/C++, etc.)
  • Cmd/Ctrl+S to save (instantly synced to the remote server via SFTP)
  • Binary files are auto-detected and won't open

File Explorer

Browse the remote file system from the sidebar.

ActionHow
Open fileClick
Expand/collapse folderClick
Create file/folderRight-click > New File / New Folder
RenameRight-click > Rename
DeleteRight-click > Delete
UploadRight-click > Upload or drag & drop
DownloadRight-click > Download

Large directories are handled with virtual scrolling for smooth performance.


Terminal

Use the Terminal tab in the bottom panel.

  • Remote Terminal: Execute commands on the remote machine via SSH (PTY support, UTF-8, dynamic resize)
  • Local Terminal: Your machine's shell (macOS: zsh/bash, Windows: PowerShell)
  • Manage multiple terminals as tabs
  • Cmd/Ctrl+T: New terminal, Cmd/Ctrl+W: Close current tab

Git

Manage Git visually from the Git tab in the bottom panel. It auto-detects the repository for the currently open file.

TabFunction
ChangesChanged file list, Stage/Unstage, Diff view, Commit
CommitsCommit history graph
BranchesCreate/switch/delete branches, Merge/Rebase
StashesSave/apply/delete stashes
BlamePer-line commit information for the current file

Basic Workflow

  1. Review changed files in the Changes tab
  2. Click to Stage/Unstage files
  3. Enter commit message and click Commit
  4. Click Push to sync to remote

Merge Conflict Resolution

When conflicts occur, a side-by-side Diff viewer opens:

  • Left: Current branch (Ours)
  • Right: Merge target branch (Theirs)
  • Choose the desired side for each conflict block or edit directly

LSP Autocomplete

Provides IDE-level code editing via Language Server Protocol:

  • Autocomplete: Real-time suggestions while typing
  • Go to Definition: Cmd/Ctrl+Click or F12
  • Hover Info: Type/documentation on mouse hover over symbols
  • Diagnostics: Real-time error/warning underlines

Supported Languages & Installation

The language server must be installed on the remote server:

LanguageLanguage ServerInstall Command
JavaScript/TypeScripttypescript-language-servernpm i -g typescript-language-server typescript
Pythonpython-lsp-serverpip install python-lsp-server
Rustrust-analyzerrustup component add rust-analyzer
Gogoplsgo install golang.org/x/tools/gopls@latest

Debugging

Debug remote applications from the Debug tab. (DAP: Debug Adapter Protocol)

Supported Languages

LanguageDebuggerRequired Package
Node.jsBuilt-in InspectorNode.js 12+
Pythondebugpypip install debugpy
Godelvego install github.com/go-delve/delve/cmd/dlv@latest

Usage

  1. Click the line number gutter to set breakpoints
  2. Select a language in the Debug panel
  3. Launch (start program) or Attach (connect to running process)
  4. Debug controls: Continue, Step Over, Step Into, Step Out, Variables, Call Stack, REPL

Port Forwarding

Managed from the Ports tab in the bottom panel. Forward remote ports to localhost for browser access (e.g., remote web server on port 3000 accessible at localhost:3000).

  1. Click Add Forward
  2. Enter Remote Port (e.g., 3000)
  3. Set Local Port (optional, defaults to same port)
  4. Manage/terminate active forwards from the list

Forwarded ports can also be previewed in the built-in Web Preview panel.


Docker

Manage Docker containers on the remote machine from the Docker tab:

  • Container list (name, image, status, CPU/memory usage)
  • Start/Stop/Restart/Delete containers
  • View logs
  • Execute shell inside a container

Collaboration

Create real-time collaboration sessions from the Collab tab:

  1. Click Create Session, enter a display name
  2. Share the session code with teammates
  3. Participants enter the code to join

Features: Terminal sharing, real-time co-editing (CRDT-based auto conflict resolution, cursor sharing), chat messages, participant presence.


Settings

Open with menu or Cmd/Ctrl+,

  • Appearance: Theme (Dark / Light / Eye Comfort)
  • Editor: Font, font size, tab size, word wrap, minimap
  • Terminal: Font, size, cursor style
  • General: Biometric lock (macOS Touch ID), auto-update, reset

Keyboard Shortcuts

ShortcutAction
Cmd/Ctrl+PFile search
Cmd/Ctrl+Shift+PFile content search
Cmd/Ctrl+,Open settings
Cmd/Ctrl+SSave file
Cmd/Ctrl+GOpen Git panel
Cmd/Ctrl+BToggle sidebar
Cmd/Ctrl+TNew terminal
F12Go to definition

Troubleshooting

Cannot connect

  • Verify SSH service is running on the remote server: ssh user@host -p port
  • Ensure firewall allows port 22 (or configured port)
  • Check auth method is allowed on the server (password/key auth)
  • Verify SSH key permissions: chmod 600 ~/.ssh/id_rsa

LSP autocomplete not working

  • Verify the language server is installed on the remote server
  • Ensure the language server is in PATH

Korean characters garbled in terminal

  • Check remote server locale: run locale
  • Set export LANG=ko_KR.UTF-8 or export LANG=en_US.UTF-8

For persistent issues, please report at GitHub Issues.

DevPort Agent is a lightweight app installed on the machine that will receive remote connections. Running the Agent allows DevPort Client to connect to that machine.

Agent comes in two forms:

TypeUse Case
Desktop Agent (Electron)Personal PC, GUI environment
CLI Agent (Node.js)Server, container, headless environment

Prerequisites: Enable SSH

SSH must be enabled for the Agent to work.

macOS

  1. System Settings > General > Sharing
  2. Enable Remote Login

Linux

# Ubuntu/Debian
sudo apt install openssh-server
sudo systemctl enable --now ssh

# Verify
sudo systemctl status ssh

Windows

  1. Settings > Apps > Optional Features
  2. Install OpenSSH Server
  3. Start the service:
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

Desktop Agent

Installation

Download from GitHub Releases:

PlatformFile
macOS.dmg
Windows.exe
Linux.AppImage / .deb

Running

After installation, launch the app. It will appear in the system tray.

+-----------------------------+ | DevPort Agent | | | | Status: * Ready | | | | Device: my-macbook | | SSH: OK Enabled (port 22) | | | | Code: A3K-M7P | | Expires in: 4:32 | | | | [GitHub Login] [Refresh] | +-----------------------------+

Connection Methods

LAN Auto Discovery (no setup needed)

Simply run the Agent. It will automatically appear in Nearby Devices on any Client on the same network, broadcasting device name, OS, and SSH port via mDNS (_devport._tcp).

Connection Code (WAN)

Share the 6-digit code shown on the Agent screen (e.g., A3K-M7P). The code auto-refreshes every 5 minutes; use the Refresh button for manual refresh.

Codes exclude confusable characters (0, O, 1, I). If direct SSH is impossible (NAT/firewall), the Signal Server automatically relays via WebSocket.

GitHub Account

  1. Click GitHub Login
  2. Complete GitHub authentication in the browser
  3. The device is automatically registered to your account
  4. On the Client, sign in with the same GitHub account to see it in My Devices

Registered devices send heartbeats every 30 seconds to maintain online status.


CLI Agent

A terminal-based agent with no GUI. Ideal for servers, cloud instances, and containers.

Installation

npm install -g @devport/agent-cli

Basic Commands

# Foreground (for log viewing)
devport-agent start

# Background daemon
devport-agent start --daemon

# Specify SSH port (default 22)
devport-agent start --port 2222 --daemon

# Check status
devport-agent status

# Stop
devport-agent stop

GitHub Login/Logout

# Login (opens browser)
devport-agent login

# Logout
devport-agent logout

systemd Service (Linux)

For automatic start on reboot:

# /etc/systemd/system/devport-agent.service
[Unit]
Description=DevPort Agent
After=network.target

[Service]
Type=simple
User=ubuntu
ExecStart=/usr/bin/devport-agent start
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now devport-agent

Desktop Agent vs CLI Agent

FeatureDesktop AgentCLI Agent
UISystem tray + windowTerminal output
StartLaunch app (auto-start available)devport-agent start
BackgroundRuns in tray--daemon flag
Best forPersonal PC, interactive useServer, CI/CD, automation
Size~150-200MB~5-10MB

Security

  • Connection Code: 5-min TTL, auto-refresh, rate limited on Signal Server
  • SSH Encryption: Standard SSH protocol (E2E encrypted data)
  • Signal Server: Routing only, no user data storage (zero-knowledge)
  • WebSocket Relay: Transparently relays SSH traffic, cannot inspect data
  • Authentication: Password or Private Key required for SSH connection

Troubleshooting

Agent running but not visible on Client (LAN)

  • Verify both devices are on the same network
  • Check if firewall is blocking mDNS (port 5353)
  • Try restarting the Agent

Connection code not working

  • Check if the code has expired (5-min TTL)
  • Click Refresh to generate a new code
  • Check internet connection

CLI Agent won't start

# Check if already running
devport-agent status

# Kill existing process and restart
devport-agent stop
devport-agent start

For persistent issues, please report at GitHub Issues.

DevPort iOS app is a native SwiftUI app that lets you connect to remote machines via SSH on iPad and iPhone, with code editing, terminal, Git, debugging, and more.

Installation

  • Search "DevPort" on the App Store
  • Requires iOS 16+ / iPadOS 16+
  • Supports both iPhone and iPad

Connecting

Launch the app to see the connection screen.

Direct SSH Connection

  1. Tap the + button
  2. Enter: Hostname, Port (default 22), Username, Auth (password or private key)
  3. Tap Connect
  4. On first connection, verify Host Key and tap Accept

Nearby Devices (LAN)

If a DevPort Agent is running on the same Wi-Fi, it will automatically appear. Tap to connect.

Connection Code (WAN)

Enter the Agent's 6-digit code for remote connection. If direct connection is not possible, WebSocket Relay handles it automatically.

My Devices (GitHub Account)

  1. Tap Sign In in the My Devices section
  2. Complete GitHub authentication
  3. All devices registered under the same account are displayed
  4. Tap to connect (no code needed)

Biometric Auth (Face ID / Touch ID)

Enable biometric auth in Settings > Security:

  • Face ID / Touch ID required to launch the app
  • Quickly use saved credentials with biometric auth for SSH connections
  • Credentials are securely stored in iOS Keychain

Layout

iPad Layout

+-----------+-------------------------------+ | Sidebar | Code Editor | | (Conn/ | (CodeMirror 6 based) | | Files) | | | +-------------------------------+ | | Bottom Panel | | | (Terminal/Git/Debug/Ports/ | | | Docker/Collab) | +-----------+-------------------------------+
  • Sidebar and bottom panel are resizable by dragging
  • Cmd+, to toggle sidebar (with external keyboard)

iPhone Layout

Tab-based navigation with full-screen panels.


Code Editor

CodeMirror 6-based editor with automatic syntax highlighting based on file extension.

  • Multiple file tabs
  • Syntax highlighting, code folding
  • Search/replace
  • Minimap

File Explorer

Browse the remote file system from the sidebar.

  • Tap folders to expand/collapse
  • Tap files to open in editor
  • Git status indicators (modified, staged, untracked)
  • Cmd+P: Search by file name
  • Shift+F: Search file contents
  • Expand/collapse all button

Terminal

Use the Terminal tab in the bottom panel.

  • Manage multiple terminals as tabs
  • Rust native PTY for real terminal emulation
  • Auto-resizing
  • Full iPad external keyboard support

Git

Manage Git with touch from the Git tab.

TabFunction
StatusCurrent branch, ahead/behind, changed file list
ChangesStage/Unstage, Diff view, Commit
CommitsCommit history graph (author, date)
BranchesSwitch/create/delete branches, remote tracking
StashesSave/apply/delete stashes
BlamePer-line commit info for current file

Basic Workflow

  1. Review changes in the Changes tab
  2. Swipe or tap files to Stage
  3. Enter commit message and tap Commit
  4. Tap Push to sync to remote

LSP Autocomplete

Code editing features via Language Server Protocol:

  • Real-time autocomplete suggestions
  • Symbol hover info
  • Error/warning diagnostics

The language server must be installed on the remote server (see Client Guide for installation commands).


Debugging

Debug remote apps from the Debug tab (DAP):

  • Supported: JavaScript, Python, C/C++, etc.
  • Launch / Attach modes
  • Breakpoints, variable inspection, call stack, output streams

Port Forwarding

Managed from the Ports tab. Forward remote ports for access from iPad browser.

  1. Tap Add Forward
  2. Enter Remote Host/Port
  3. Manage/terminate from the active list

Docker

Manage remote Docker containers from the Docker tab:

  • Container list (status, image, ports, CPU/memory)
  • Start/Stop/Restart
  • View logs
  • Docker Compose project detection

Collaboration

Real-time collaboration from the Collab tab:

  • Up to 8 participants
  • Terminal sharing (read-only mode available)
  • Real-time document co-editing (cursor tracking)
  • Chat messages and presence status

Settings

  • Theme: Dark / Light / System
  • Editor: Font (10 options), size (10-24px), tab size, word wrap
  • Terminal: Font size, cursor style
  • Profiles: Auto-save, Share Sheet import/export

iPad Keyboard Shortcuts

ActionShortcut
Save fileCmd+S
New connectionCmd+N
DisconnectCmd+W
Toggle sidebarCmd+,
File name searchCmd+P
File content searchShift+F
New terminalCmd+T
Shortcut helpCmd+/

Differences from Desktop Client

FeatureDesktop ClientiOS App
FrameworkElectron + ReactSwiftUI (native)
EditorMonaco EditorCodeMirror 6
Terminalxterm.js + node-ptyxterm.js + Rust UniFFI PTY
PlatformWindows/Mac/LinuxiOS 16+ / iPadOS 16+
InputKeyboard/MouseTouch + External Keyboard
AuthPassword/Key + Touch ID (Mac)Password/Key + Face ID/Touch ID
DistributionGitHub ReleasesApp Store

Troubleshooting

Connection drops

  • Ensure Wi-Fi is stable
  • Set auto-lock to a longer duration (Settings > Display & Brightness > Auto-Lock)
  • SSH may disconnect when the app goes to background

Keyboard covers editor

  • Resize or hide the bottom panel
  • External keyboard is recommended

File not saving

  • Check SSH connection status
  • Verify remote file write permissions: ls -la filename

For persistent issues, please report at GitHub Issues.