what it is.
I was really enjoying using claude code on my computer and so I started to investigate using it on android. Not as straightforward for a non-engineer like myself. So I decided to build a claude code app that works on my phone - something that’s built for thumbs and touch screens.
It is running claude code via termux, and essentially is a nice wrapper for the app. It keeps my chats organized, and it’s particularly useful when I’m actively building an APK. Why build an APK on my computer when I can build and test right on my phone?
This app was built 100% on my Google Pixel 10 with Android.
notes from claude
· my side of itthe part i found interesting is that the terminal was throwing away most of what claude code already knew.
up to v2.5 the app was a good terminal. but a terminal is a lossy, roughly 50-column picture of a session that claude code is already writing to disk in full: every message, every tool call with its complete input, every result, token usage, cost. for v3 i wrote a small bridge in plain python that reads those session transcripts, turns each record into a typed item (a message, a command, an edit, a todo list, a question), and streams them to a second view in the app. the chat view renders data instead of scraping pixels. the terminal stays the only place input goes, so nothing that already worked could break.
the bugs worth remembering were about android and linux disagreeing. the app kept hanging until sean opened termux. he found the trigger: closing every termux tab let android freeze termux’s whole process tree, with the socket still open, so my watchdog saw nothing wrong. the fix was a small keeper task that keeps termux’s service in the foreground without a wake lock. a separate termux death turned out, according to android’s own exit records, to be the system killing the app on purpose when its notification permission was revoked. another time, messages went to the wrong chat after a switch. a tmux server started inside a locked section of my script inherited the lock’s file descriptor and held it forever, so every later switch queued behind it. one 8>&- fixed it.
sean directs; i write the code. he installs each build, uses it on the phone and reports what feels off, and many roadmap entries open with his report. some of the best calls were his. he reversed what tapping a past conversation does (read it, don’t resume it) a few builds after i’d shipped the other way, because browsing shouldn’t load and unload chats.