Problem Statement
YourSSH ships on macOS / Windows / Linux only. Users who manage hosts on the go have no way to reach their saved servers from a phone — they must switch to a separate mobile SSH app and re-enter every host. A first-party Android client lets the same hosts (synced from desktop) be reached from a phone.
Proposed Solution
Add Android as a target of the existing app/ Flutter project, shipping a focused mobile SSH client (v1) that reuses the platform-agnostic core (models / providers / services) and adds a mobile UI layer. Delivered as 5 milestones:
- M1 — Target + platform branch:
android/ target; main() branches on isMobilePlatform to mount a mobile shell and skip the desktop-only bootstrap (window_manager / hotkey_manager / local_notifier / flutter_pty). Desktop untouched.
- M2 — Hosts + terminal: hosts list + minimal add-host form + connect; mobile
TerminalView with an accessory key bar (sticky Ctrl/Alt, ^C/^D, arrows, special chars) and pinch-to-zoom; multi-session strip. Mobile-scoped bootstrap reusing existing providers/services.
- M3 — Host import from desktop: cloud Supabase pull + P2P QR camera scan (
mobile_scanner).
- M4 — SFTP + snippets: single-panel SFTP (browse / download / upload via
file_picker) + snippets quick-insert sheet. (Command history deferred — no input bar to capture commands on mobile.)
- M5 — Security + polish: biometric app-lock (
local_auth), TOFU host-key-mismatch dialog, terminal appearance settings, release APK signing via key.properties.
Specs and per-milestone plans live in docs/superpowers/specs/ and docs/superpowers/plans/.
Alternatives Considered
- Separate mobile app / extracted core package: cleaner long-term but requires a large upfront refactor; chose to add the target to
app/ with a mobile-scoped bootstrap (zero desktop-regression risk, ships faster).
- Full feature port (RDP/VNC, port forwarding, DevOps tools): out of scope for v1 — large native (NDK) and background-execution work; deferred.
Additional Context
- New mobile dependencies:
mobile_scanner (QR scan), local_auth (app-lock) — accepted bundle tradeoff (single shared pubspec).
- iOS deferred but the structure does not preclude it.
- 33 commits, all milestones TDD-covered (33 new widget/unit tests); debug APK builds green; on-device verification pending a device/emulator.
- PR: targets
develop.
Problem Statement
YourSSH ships on macOS / Windows / Linux only. Users who manage hosts on the go have no way to reach their saved servers from a phone — they must switch to a separate mobile SSH app and re-enter every host. A first-party Android client lets the same hosts (synced from desktop) be reached from a phone.
Proposed Solution
Add Android as a target of the existing
app/Flutter project, shipping a focused mobile SSH client (v1) that reuses the platform-agnostic core (models / providers / services) and adds a mobile UI layer. Delivered as 5 milestones:android/target;main()branches onisMobilePlatformto mount a mobile shell and skip the desktop-only bootstrap (window_manager / hotkey_manager / local_notifier / flutter_pty). Desktop untouched.TerminalViewwith an accessory key bar (sticky Ctrl/Alt, ^C/^D, arrows, special chars) and pinch-to-zoom; multi-session strip. Mobile-scoped bootstrap reusing existing providers/services.mobile_scanner).file_picker) + snippets quick-insert sheet. (Command history deferred — no input bar to capture commands on mobile.)local_auth), TOFU host-key-mismatch dialog, terminal appearance settings, release APK signing viakey.properties.Specs and per-milestone plans live in
docs/superpowers/specs/anddocs/superpowers/plans/.Alternatives Considered
app/with a mobile-scoped bootstrap (zero desktop-regression risk, ships faster).Additional Context
mobile_scanner(QR scan),local_auth(app-lock) — accepted bundle tradeoff (single shared pubspec).develop.