Sushi - SSH Client
An open source Android SSH client focused on fast connections, clean session management, and a modern UI.
Status
- Active development with working SSH & local shell session flow, host management, and automated Plays.
- Conversational AI mode: Talk directly to your connected system using Gemini Cloud or on-device Gemini Nano.
- Security: Host key verification (TOFU), encrypted private keys with passphrase support, and AES256-GCM encrypted credential storage (
SecurePrefs).
- Connection reliability: Foreground service keep-alive (
SshConnectionService) and TCP keep-alive probes prevent background drops.
- Authentication: Modern Android Credential Manager & Identity Authorization for Google Drive log backups; GitHub OAuth Device Flow for in-app feedback.
Features
💻 SSH & Terminal
- Fast interactive terminal with custom
TerminalView, ANSI/OSC escape handling, and UTF-8 support.
- Local shell backend (
LocalShellBackend) alongside remote SSH (SshClient).
- Trust-On-First-Use (TOFU) host key verification with fingerprint verification, mismatch warnings, and
HostKeysActivity management.
- Password, unencrypted private key, and encrypted private key (PEM / OpenSSH bcrypt) authentication.
- Jump server (bastion host / proxy) support.
- Phrase management with quick-execution and automated key deployment phrases.
- Parameterized automated Plays with live preview and description support.
- Foreground service keep-alive ensuring sessions survive app backgrounding, switching apps, and 2FA prompts.
🤖 Conversational AI with Target System
- Talk directly TO your connected Linux system / Raspberry Pi via Gemini (Cloud or Nano).
- Target-side persona (
~/.config/sushi/SUSHI.md) automatically created on first use.
- Three-tier command safety model:
SAFE (auto-execute), CONFIRM (ask user first), and BLOCKED (never execute).
- Live command output streaming (
onChunk) and raw terminal bypass mode.
- SQLite-backed transcript persistence and interactive session history browser (
GeminiHistoryActivity).
- Dual voice and text input.
🎨 Customization & Convenience
- Light, Dark, and System theme support with customizable accent color palette (Gari amber, Wasabi, Coral, Terracotta).
- First-run setup checklist guiding SSH host setup, key generation, and optional cloud integrations.
- In-app feedback system filing issues directly via GitHub Device Flow.
- Google Drive session log backups via modern Credential Manager.
Recent Release Highlights
v0.8.3
- Light Mode: The terminal follows the system theme instead of a fixed dark screen. In light mode its key labels had been drawn at 1.04:1 against their own background — present, but invisible. The ANSI palette came with it, since the raw colour constants suit a dark terminal and put yellow and white at about 1.1:1 on a light one.
- Readable ANSI Backgrounds:
ESC[40m–ESC[47m had reused the foreground palette, so a highlight painted text in its own colour — a blank rectangle at exactly 1.00:1. Backgrounds are now their own palette per theme, and a foreground that would fall short against one is shifted toward white or black until it reads.
- No More Escape Codes at the Prompt: The terminal filtered only two kinds of escape sequence and let the rest through with their payload visible, so a prompt arrived as
=(B larry@edge:~ $. Every escape shape is now recognised and consumed.
- Visible Gemini Responses: The response bubble drew its text in the terminal's colour, which in dark mode was its own background colour. It now reads at about 16:1 in both themes.
v0.8.2
- Command History from the Terminal: Up and Down buttons send the cursor sequences to the shell, so
history is reachable from the phone. A hardware keyboard's arrows work too — neither reached the shell before.
- Readable Status Lines: The terminal's own messages no longer run into each other or into the shell prompt; the same fix applies to the Plays session log.
v0.8.1
- Jump Server Fix: Connecting through a bastion now works when the two hosts use different login methods. The jump host authenticates on its own preference instead of inheriting the target's, which had left a key-auth target's bastion with no password to offer and failed the connection outright.
- Per-Host Authentication Methods: Each connection now offers only the methods its own host is configured for, so a host set to Password no longer authenticates with the key instead.
v0.8.0
- Command History: Every command Sushi runs — AI-issued, Raw Terminal Mode, or a Play — is stored locally in SQLite and browsable from the Terminal tab, with search, per-host filter, and copy / delete / re-run. Capped at 500 entries per host; a Play that substituted a secret parameter value into its command is not recorded at all, since the rendered command would hold that value in plaintext.
- AI-Powered Troubleshooting: The conversation chains diagnosis automatically (command → output → interpretation → next command) until it reaches a conclusion, with every step still classified by
CommandSafety and a switch in the Gemini dialog to turn it off.
- Multi-System Awareness: The AI prompt carries an Infrastructure section describing your other saved hosts, so cross-system questions can be answered without connecting; the Gemini dialog names the active host.
- Complete Localization: Finnish, German, Swedish, and Spanish translations for all 508 translatable strings.
- Crash Fixes: Command execution on Android 12L and older, and feedback with device info on Android 8.x.
This is the beginning of the README. Read the rest at the original. Read the full README ↗