Urgent.News

What's breaking now, across thousands of outlets.

Tech

Why I Built an Open-Source, E2EE-Synced Termius Alternative (and What Broke Along the Way)

Like many developers and DevOps engineers, my daily workflow lives inside an SSH terminal. For years, many of us relied on modern tools like Termius . It was slick, cross-platform, and solved the hassle of juggling keys and server IPs. But then came the paywalls: server sync behind a monthly subscription, closed-source binaries, and your server metadata hosted on proprietary clouds. On the other…

In the world of software development, finding the perfect tools for daily workflow can be a challenge. Termius, once a popular choice, started imposing paywalls and closed-source binaries, prompting developers to seek alternatives. Enter Shellit, an open-source, end-to-end encrypted SSH/SFTP client and server management hub built from scratch using Dart & Flutter.

The developers behind Shellit aimed to create a lightweight, cross-platform solution without relying on Electron's heavy bloat. Key features include production safety guardrails, self-hosted zero-knowledge E2EE cloud sync, native AI integration, and matrix tiling & broadcast input workspaces.

One of the primary concerns in building Shellit was ensuring secure key management. The developers implemented a true zero-downtime database re-keying routine, exporting the decrypted SQLCipher vault in memory, deriving a new 256-bit Argon2id key, and securely writing the new cipher header while zeroing out the previous memory buffer.

Building an SSH client posed numerous challenges, as the client needed to handle various platform quirks and edge cases. For instance, on Windows, the terminal would occasionally stop accepting keystrokes due to conflicts between Windows Input Method Editor (IME) and Flutter's focus tree. To resolve this, the developers created a dedicated HardwareInputRouter that binds directly to raw key events with an explicit ticker guard.

Another significant issue they encountered was "tab destruction." When switching tabs in Flutter, the hidden widget tree would be destroyed, causing running top or tail -f sessions to be lost. To address this, they implemented an off-stage preservation model using IndexedStack coupled with a PaneReloadController, ensuring that active sessions remained intact even when switching tabs.

Despite these challenges, Shellit has made impressive progress. The project is covered by over 200 unit and widget tests, with no Dart analyzer issues. As they continue to develop and refine the platform, Shellit offers a promising open-source alternative for developers seeking a more secure and customizable SSH/SFTP client experience.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

An address validator should return a reason, not a boolean

A user pastes an address into a withdrawal form and gets back "invalid address". Sometimes the string was truncated by a copy that clipped at a line break.

  • Address validator should return reason, not boolean
  • Boolean-only validation fails to capture address distinctions
  • Structured result with reason enables informed decisions

More from Saturday 19 September →