Go somewhere.

Home Page About Page Projects Page CV Page Dev Page Journal Page Contact Page Astro for Documentation and a Professional Site Dev Codex anywhere with tmux, Mosh, Termius, and Tailscale Dev Observing Codex MCP Tool Calls with Langfuse Dev Localization in Product Apps Dev MCP as a Safe AI Integration Boundary Dev Zod, OpenAPI, and Swagger for API Contracts Dev pg-boss for Durable Background Jobs Dev pgvector and RAG, Explained Through a Real Knowledge Workflow Dev Pragmatic Drag and Drop for Real Ordering Tasks Dev Prisma and PostgreSQL as the Product Source of Truth Dev Ralph Loop as a Plan Queue Dev React Router for Full-Stack Product Workflows Dev shadcn-Style UI as an Owned Product System Dev Dense Operational UI with Tables and Editors Dev Terminal Spike: a Native Android Terminal Dev Input Chinese pinyin with tones on Linux with fcitx Dev How to configure the DEFT Pro trackball on Linux Dev Use Pocket (read it later) on KOReader Dev Vercel AI SDK with Explicit Tool Boundaries Dev Vertical Slice Architecture with Dependency-Cruiser Dev Testing Product Workflows with Vitest and Playwright Dev Zod Beyond Validation Dev The Brothers Karamazov is the best novel I have ever read Journal Oral history of two Christians in a Chinese labour camp in the 1960s Journal The Word in the Bible Journal We love because He first loved us, not meaningless self-love Journal Mom, let me take the blame for Dad's mistakes Journal My story with God Journal The world is far from God, close to China Journal The Five Love Languages and Extrovert Only Exist in Language Journal Personality types don't exist, life is not a matching game Journal Dangerous words, why psychology is impossible Journal The story of a Shenzhen worker in 2000 Journal A Conversation with a Driver in Ras Al Khaimah Journal Shadian: a 1975 conflict between Communist forces and Muslims in China Journal Documentaries About China Journal
← Dev/Projects

Terminal Spike: a Native Android Terminal

An Android SSH client for remote work, with tmux sessions, SFTP, configurable controls, and a short demo of remote coding from my phone.

Terminal Spike is my native Android terminal app for working on remote machines from a phone. It brings SSH connections, multiple terminal tabs, tmux sessions, and file transfers into a workspace that keeps its settings and connection details on the device.

A short demo

This recording shows me using a remote coding session, entering prompts, scrolling through terminal output, and switching between tmux sessions. The extra-key bar keeps terminal controls close to the phone keyboard.

Terminal Spike in action · 45 seconds · No audio Watch on Google Photos ↗

The coding tool runs on the connected machine. Terminal Spike provides the terminal and input controls; it does not bundle an AI model or require an AI subscription of its own.

Remote work from a phone

The app supports password and private-key SSH authentication, saved connections, and several simultaneous terminal tabs. It verifies server host keys and warns when a known server’s key changes.

Alongside the terminal, there is an SFTP file manager for browsing, uploading, downloading, renaming, and deleting remote files. Saved command snippets and a configurable extra-key bar make frequently used commands and keys such as Ctrl, Esc, and the arrows easier to reach. Fonts, colours, text size, and cursor behaviour are configurable too.

One useful part of the remote coding workflow is image input. Terminal Spike can transfer a clipboard image over an authenticated SSH connection to a private cache directory on the connected host, then paste its remote path into the terminal. That lets a remote tool work with an image from the phone.

Building the terminal

The app uses Kotlin and Jetpack Compose for its application UI. The terminal itself is a custom Android View that draws rows directly with Canvas and Paint. That separates the terminal’s rendering and screen state from the surrounding connection lists, settings, and session controls.

The terminal engine handles primary and alternate screens, cursor movement, scroll regions, colours, bracketed paste, and common terminal queries. Scrollback is bounded. For app-selected tmux sessions, a separate local history model supports scrolling on the phone, while an explicit remote-mouse mode is available for interacting with terminal applications that use it.

Mosh support is implemented through an optional, separately installed extension. SSH works without it. Keeping the transport extension separate also keeps its native dependencies and lifecycle outside the main app.

Keeping data on the device

Terminal Spike has no app account, analytics, advertising, or cloud-sync service. Connections go directly to the hosts the user chooses. Imported private keys and passwords that the user explicitly chooses to save are encrypted using an app-specific Android Keystore key.

The privacy policy explains credential storage, remote connections, permissions, and backups in more detail.

See Terminal Spike on the Projects page for the app overview and demo.