Go somewhere.

Home Page About Page Projects Page CV Page Dev Page Journal Page Contact Page Privacy Policy Page Terminal Spike Privacy Policy 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 Pi Edge: Pi beside my Obsidian notes 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 My anywhere workflow: Herdr, code-server, Obsidian, and Pi Edge 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

My Android workspace for Herdr and remote coding, with SSH, built-in Mosh, touch controls, and links into code and notes.

Terminal Spike is my open-source native Android terminal for working on remote machines from a phone. SSH, built-in Mosh, Herdr, tmux, and file transfers live in one workspace, with connection details stored on the device.

Get it on Google Play · View source · Download releases

Herdr is the centre of my workflow

I use Herdr on my computer to organise projects, terminal panes, and coding agents. Its background server keeps terminal sessions running when I detach, so I can return from my phone to the work already in progress. Agent status helps me see which pane is working and which needs attention.

Terminal Spike understands Herdr sessions and pane layout metadata. Its connection picker lets me resume a running Herdr session, and touch handling makes navigating spaces, tabs, and agents practical on a small screen. Tap to navigate; double-tap to bring up the keyboard.

Scrolling needs to respect the application inside each pane. Where Herdr exposes usable pane history, Terminal Spike offers a native scrollback reader. Interactive applications can use remote mouse input instead. That distinction matters when a coding agent owns its own transcript UI.

Terminal Spike connection picker offering a running Herdr session alongside tmux sessions

Herdr is a separate open-source project. My work here is the Android client and its integration with that remote workspace.

Follow the work into code and notes

Terminal output often points to the next thing I need: a file, a browser editor, or a project note. Terminal Spike recognises web URLs and obsidian:// links, including terminal hyperlinks, so those references can open in the appropriate app.

In my setup, code-server gives me a browser editor, Obsidian holds project notes, and Pi Edge brings Pi into Obsidian. Tailscale connects my devices when I am away from home. I describe how these pieces fit together in my current workflow.

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 is built into the app. It starts through SSH, then uses its encrypted UDP transport to make an interactive session more tolerant of network interruptions. The connected computer needs mosh-server; Herdr or tmux keeps the remote workspace available independently of the phone connection.

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.