An SSH client, terminal emulator, SFTP browser and encrypted vault — one codebase for Windows, macOS, Linux, iOS and Android built with Flutter.
| Platform | Installer | Notes |
|---|---|---|
| Windows (x64) | Inno Setup installer, signed | |
| Linux (x64) | Self-contained bundle | |
| Android | Universal APK |
macOS and iOS — installable bundles are not yet attached to every release (awaiting CI signing). Build from source with
flutter build macosorflutter build ios.
- Download the installer for your platform from the table above.
- Launch Connexia — the Hosts screen opens.
- Add a host — tap the + button, enter a label, address, SSH port, username and authentication (password or private key).
- Connect — tap the host row. The terminal opens in a new tab.
- Open a tunnel (optional) — switch to the Tunnels sidebar entry,
create a local (
-L), dynamic SOCKS (-D) or remote (-R) forward against any saved host, then hit Start. The bind endpoint is one click away to copy. - Sync (optional) — go to Settings → Sync, enter
https://sync.connexia.run, create a free account, and your hosts, keys, tunnels and settings are encrypted and synced between all your devices.
- Host manager — groups, tags, colors, favorites, search (hosts, groups, addresses, tags), duplicate, delete
- SSH connections — password or private-key auth (PEM, OpenSSH, passphrase-protected), quick connect for ephemeral sessions
- Host-key verification — trust-on-first-use with fingerprint dialog and change detection
- Multi-session tabs — parallel connections in the title bar, per-tab status, rename, duplicate, reconnect with an auto-retry countdown
- Workspace tiling — drag sessions into a tiled grid inside the same window, resize and reorder by dragging to the title bar
- SSH tunneling — local port forwards (
-L), dynamic SOCKS proxies (-D) and remote forwards (-R); auto-start at launch, live status, one-click copy of the bind endpoint, full integration with sync and team workspaces - Interactive terminal — xterm emulation with CJK/emoji support, 256 colors, IME input, scrollback, pixel-exact resize, and 37 color themes (default: Connexia)
- Selection that survives live TUIs — select text in a moving terminal (top, htop, log tails) and copy it even while the screen redraws
- SFTP browser — navigate, upload/download with progress, new folder, rename, delete, chmod, drag & drop
- Snippets — a dockable sidebar with commands you can insert, run or paste into the active session
- Key manager — generate keys, import PEM/OpenSSH keys, view fingerprints
- Known hosts — track and remove trusted host keys
- Session & tunnel logs — every connection and tunnel event is recorded with start/end timestamps, errors and stack traces; device-local, never synced
- Encrypted vault — passwords and keys are encrypted with AES-256-GCM; the master key lives in the OS keychain (Windows: HKCU registry; other platforms: a user-private 0600 file)
- Zero-knowledge sync — optional cloud sync that stores only an encrypted snapshot; the server can never read your data
- Team workspaces — share hosts, groups, keys, snippets and tunnels with your team in end-to-end encrypted workspaces, with a metadata-only audit log of who changed what
The Tunnels screen lets you forward traffic through any saved host without leaving the app. Three modes are supported:
| Mode | What it does |
|---|---|
Local (-L) |
Listen on a local port; forward every connection to host:port on the remote side. Classic "access an internal service" pattern. |
Dynamic (-D) |
Spin up a SOCKS5 proxy on a local port. Point your browser or system proxy at it to route traffic through the remote host. |
Remote (-R) |
Listen on a port on the remote host and tunnel back to a local address — useful for exposing a local dev server behind NAT. |
Each tunnel can be linked to a saved host (uses that host's credentials) or stand alone (own address / username / password / key). Mark any tunnel as auto-start and Connexia will bring it up automatically every time the app launches.
Every tunnel shows its current state as a colored accent along the bottom of its card (running / connecting / error / stopped), matching the terminal-tab status palette. Click the bind endpoint to copy it to the clipboard. The Logs screen has a dedicated Tunnels tab with the last events per tunnel, including full stack traces on failure — device-local, never synced.
Tunnel configs sync alongside everything else, so creating a tunnel on your laptop makes it appear on your desktop seconds later. Team workspaces can also share tunnels — everyone in the workspace sees the same set, with their own runtime status.
Connexia ships with https://sync.connexia.run as the default sync endpoint.
It is free to use for everyone:
- Open Settings → Sync.
- Tap Sign out (if shown) then Sign in.
- Create an account — enter your email and a password. A verification code is sent to your inbox (check spam).
- Once verified, your vault is encrypted on-device with your password and pushed to the server. The server stores only the ciphertext and an scrypt password hash — it can never read your hosts, keys, tunnels or passwords.
- Sign in on another device with the same account and your data appears automatically.
Tunnels were added to the synced snapshot without any server-side changes: the sync backend treats payloads as opaque encrypted blobs, so new fields ride along inside the existing envelope.
You can run your own sync server anywhere (VPS, Raspberry Pi, Docker). The server is a single Go binary with no runtime dependencies:
cd server
go build -o syncserver . && ./syncserverIt listens on http://0.0.0.0:8047. By default it stores data in a SQLite
file, or you can point it at PostgreSQL with DATABASE_URL.
Docker:
docker build -t syncserver server/
docker run -d --name syncserver -p 8047:8047 -v sync-data:/data syncserverCoolify / Fly.io / Railway — see the server README for full deployment guides, environment variables, TLS, SMTP and backup instructions.
Prebuilt server binaries are attached to every GitHub release:
| Platform | Binary |
|---|---|
| Linux (x64) | connexia-server-linux-x64 |
| Windows (x64) | connexia-server-windows-x64.exe |
Workspaces let a team share hosts, groups, keys, snippets and tunnels across every member's devices, end-to-end encrypted. The server never sees the data — it stores only ciphertext plus a metadata-only audit log.
- Open Settings → Teams and create a workspace. Connexia generates a per-account X25519 keypair on first use; the public key is uploaded to the server and the private key is wrapped with your password-derived sync key and stored alongside it.
- Invite members by email. The server returns the invitee's public key; your client wraps the workspace data key with it and uploads the share. Only invited members can decrypt the workspace.
- Activate a workspace to scope the Hosts / Groups / Keys / Snippets / Tunnels screens to that workspace. Switch back to Personal scope any time.
- Every push records a server-side audit event automatically (who synced
what revision, when, from which IP). The client additionally attaches a
plaintext action summary (
host.create,key.delete, …) so the audit log shows what changed without leaking data content. - Rotate the workspace key when a member leaves. A new workspace key is generated, the snapshot is re-encrypted, and every remaining member receives a new wrapped share. The removed member can no longer decrypt new revisions.
| Role | Can |
|---|---|
| Owner | Everything: manage members, rotate key, delete workspace, view audit |
| Admin | Manage members, sync, view audit |
| Member | Read/write hosts, groups, keys and snippets in the workspace |
The workspace data key is a random 256-bit key. It is wrapped per member with an X25519 shared secret (your private key × their public key), so the server only ever sees opaque ciphertext. Audit events record who did what (actor email, action type, target, timestamp) but never the data content — the same zero-knowledge property as personal sync.
Run connexia-setup.exe — the installer places Connexia in
%ProgramFiles%\Connexia and adds a shortcut to the Start Menu.
The tarball is a self-contained bundle — extract it and run the binary from
inside bundle/:
tar -xzf connexia-linux-x64.tar.gz
cd bundle
./connexiaOptional — system-wide install and launcher:
sudo mkdir -p /opt/connexia
sudo cp -r bundle /opt/connexia/
sudo ln -s /opt/connexia/bundle/connexia /usr/local/bin/connexia# ~/.local/share/applications/connexia.desktop
[Desktop Entry]
Name=Connexia
Exec=/opt/connexia/bundle/connexia
Icon=utilities-terminal
Terminal=false
Type=Application
Categories=Network;Runtime dependencies (Ubuntu/Debian):
sudo apt install libgtk-3-0 libsecret-1-0flutter build macos
open build/macos/Build/Products/Release/connexia.appTransfer the APK to your device and install it, or use adb:
flutter build apk --release
adb install build/app/outputs/flutter-apk/app-release.apkflutter build ios
open build/ios/iphoneos/Runner.app| Shortcut | Action |
|---|---|
| Ctrl+Shift+C | Copy selection |
| Ctrl+Shift+V | Paste |
| Ctrl+Shift+F | Find in terminal scrollback |
| Ctrl+= / Ctrl+- | Zoom font in / out |
| Ctrl+0 | Reset font size |
| Ctrl+wheel | Zoom font |
| E | Edit card under cursor (hosts, groups, keys, snippets, tunnels) |
| Ctrl+Shift+N | New window |
All shortcuts are configurable in Settings → Shortcuts — click Record on any action and press the key combination you prefer.
Plain Ctrl+C / Ctrl+A / Ctrl+V are forwarded to the remote shell, so screen/readline keybindings keep working.
| Concern | Package |
|---|---|
| Terminal | xterm (vendored at third_party/xterm, patched for pixel-accurate resizing and live-TUI selection) |
| SSH/SFTP | dartssh2 (pure Dart) |
| State | flutter_riverpod |
| Database | drift (SQLite) |
| Crypto | cryptography (AES-256-GCM, PBKDF2, scrypt) |
| Window | window_manager (frameless custom chrome) |
flutter pub get
flutter run -d windows # or -d macos / -d linux / -d <android/ios device>After changing the drift database schema, regenerate the code:
dart run build_runner build| Platform | Prerequisites | Command |
|---|---|---|
| Windows | Visual Studio (Desktop C++) | flutter build windows |
| macOS | Xcode (build on a Mac) | flutter build macos |
| Linux | clang, cmake, ninja, GTK dev headers |
flutter build linux |
| iOS | Xcode + iOS signing (build on a Mac) | flutter build ios |
| Android | Android Studio / SDK | flutter build apk |
flutter analyze
flutter testThe test suite covers terminal emulation (resize/reflow, CJK, TUI toggles), selection stability, vault crypto, SSH key parsing, sync snapshots, migration upgrades across every schema version, tunnel forwarding and host ordering (53 tests).
lib/
main.dart entry; single ProviderContainer, window setup
app.dart MaterialApp root, global keyboard shortcuts
core/
db/ drift schema (schemaVersion 10) + migrations
hosts, groups, identities, known_hosts, snippets,
session_logs, themes, tunnels, tunnel_logs
crypto/ Vault (AES-256-GCM) + platform secret storage
ssh/ SshService, SessionManager, TunnelManager,
HostKeyStore (TOFU)
sync/ SyncApi, SyncCrypto, Snapshot, SyncController,
TeamController (workspaces), TeamCrypto (X25519)
terminal/ 37 terminal color themes, scrollback search
shortcuts.dart Configurable keyboard shortcut model
debug_log.dart Fire-and-forget diagnostics log (%TEMP%)
ui/
screens/ hosts, keys, known hosts, snippets, tunnels,
logs, settings, teams, terminals, sftp
widgets/ panels, sidebar, custom title bar, forms
state/ Riverpod providers, nav, settings, connection helpers
theme/ mutable palette + Material 3 dark theme
third_party/xterm/ vendored, patched xterm (pixel resize + live-TUI selection)
server/ Go zero-knowledge sync server (Postgres/SQLite storage,
admin dashboard, marketing website)
installer/ Inno Setup script for the Windows installer
test/ 53 tests across 8 files
| Document | Audience | Contents |
|---|---|---|
docs/ARCHITECTURE.md |
Contributors | Layered design, module breakdown, data model, encryption model, SSH lifecycle, sync protocol, key code paths |
docs/DEVELOPMENT.md |
Contributors | Build/run/test per platform, codegen, conventions, troubleshooting |
docs/API.md |
Integrators | Sync-server REST API and the client-side snapshot/payload format |
server/README.md |
Operators | Deploying and configuring the self-hosted sync server |