Coding on a Phone: What I Learned Building Software on Mobile in the Last Three Weeks
13 points by azhenley
13 points by azhenley
i often wonder what mobile development looks like. All jokes aside, it's called a laptop.
I just see these things and follow @simonw but all the examples I see are relatively simple and self contained, and whenever I’ve tried these things on a real world problem with any level of complexity it falls apart incredibly quickly.
Am I just doing it wrong?
I mean it’s great that we can describe a simple problem and have a solution, but this was the repeated promise of 4GLs and things like retool, and they all end up in the dustbin as we move past the low hanging fruit and onto things that require a systematic approach in order to be able to even comprehend them.
I don’t see any evidence of actually-complex systems being built successfully. That’s totally fine, some large proportion of systems are not very complex, but I work at the intersection of a bunch of domains and AI is a great help, but not remotely capable of building the things I need as quickly as I can do it.
Or at least that’s been my experience when I’ve tried.
It took me a whole lot of experimenting to find the patterns that work for me - things like starting each season by having it run the existing test suite to remind it that tests exist and it should continue to extend and run them.
Hi Simon, I like how you approach this and I really appreciate the thoughtfulness and openness you bring to the table. Thanks for your blog.
But one question I’ve never seen answered is if all this effort scales to things that are not simple or require discovery.
It’s not that I don’t think it’s possible or that LLMs don’t have value in coding work or that flinging off a new applet from your phone isn’t cool. It is. I’m just finding it hard to accept that all this effort to get results - requiring what is effectively TDD to do anything, PRDs to define the work, prompt engineering and so on - is in any way more productive than just doing the work myself.
I mean at some point the design or specification becomes more complex than the code. As an advocate of Jack Reeve’s “Code as Design” papers, this doesn’t sit well with me. Writing the program in English and “compiling” it with an LLM isn’t a significant change. Is it?
I mean it is also entirely possible that I’m holding it wrong.
I've always been a fan of processes outside of just writing code for enhancing coding productivity - I gave a talk about this back in 2022, emphasizing how comprehensive documentation and unit tests can hep improve prettily even on personal projects.
As such, none of the stuff I'm having the coding agents do feels like process overhead on what I was doing before.
I could not be more confident that my productivity as a programmer is enhanced by this stuff. More than that, I'm building things I never would have even considered building now because the time investment in trying them out has been reduced so much.
So what I'm gathering from your responses here and elsewhere is that anyone just starting out (like a teenager or a freshman in college) is basically screwed if they want to program computers because they don't have the five years of constant experience that you have in getting these glorified Markov generators to work semi-reliably. Too harsh? Or accurate?
Personally I think this is harsh and inaccurate. You can get good results for simple programs and changes, and (for example) my 12yo uses LLMs to program Roblox in Lua. Actually it’s made him less afraid and he finds it easier to learn because he can ask questions and go at his own pace.
On the other hand I am forming the opinion that we’re using LLMs to enable programming in a high level, ambiguous language called (in my case) English, and that doesn’t seem to be an improvement.
I'm 25 years past being a newbie now so I can't speak with credibility on this, but my hope is that we've shaved down the learning curve such that the path into programming computers is accessible to a whole lot more people.
I've seen anecdotal evidence of thus from a bunch of places. I know several people who have tried and failed to learn to program in the past because they didn't have the time needed to climb the initial learning curve who are now delighting in building small software projects for themselves.
I mean there's separate things, programming in general and programming at maximum efficiency.
There's still people who use Emacs or Vim quite effectively even though all the newfangled IDEs are out. Historically, the greybeards tended to outperform the kids, but that might have been just selection bias and experience edging out.
LLMs can both be a great boon and a huge crutch for learning specifically, in the same way calculators/Wolfram can be for math. If it's cutting time on things you know how to do but are just slow, you can learn more. If you're using them instead of understanding how things work, then you might end up with people writing hundreds of thousands of lines of code written without understanding a single one.
A friend's son has been teaching some algorithms classes as a Postdoc, and it's obvious to him: the best students are using LLMs (often extensively), but wisely. They save time debugging, typing. They come to office hours with chats/transcripts showing what they have tried, and they are always asking for explanations and resources. On the other hand, the worst ones are using LLMs even more, often without any review whatsoever.
anyone just starting out (like a teenager or a freshman in college) is basically screwed if they want to program computers because they don't have the five years of constant experience that you have in getting these glorified Markov generators to work semi-reliably.
I think it will ultimately widen the divide between the top programmers and scientists and the bottom. The people using these tools well will learn faster than ever before, and a lot might learn nothing at all.
…that limit was around five to seven active tasks. Beyond that, I felt drained and overwhelmed. The bottleneck isn’t the silicon or the neural nets—it’s the biological neurons doing context switching and higher-order thinking. Maybe I’m getting older.
Wow. No, maybe you're just human. Or, rather, superhuman — if you were indeed doing work of any quality while context switching between seven tasks.
Given that prompt injections are thing, what is everybody doing about that? I wanted to run an LLM in a VM but that just raises new questions, like where is it supposed to commit? Should I create a GH account for it?
If anybody has a security conscious setup, or arguments why one is not necessary, I would love to hear more!
I've produced significantly more code on my phone over the last ~6 weeks than I have on my laptop, thanks entirely to the Code tab in the Claude iPhone app. Two significant recent examples are https://github.com/simonw/denobox and https://github.com/datasette/datasette-transactions
I've found it to work like the author describes here: I'll have an idea, create a new private repository at https://github.com/new (sometimes starting from one of my template repos) and then fire up Claude Code from the app.
I'll usually get my laptop out at the end git one last round of manual testing before making the repo public, but that's mainly out of paranoia at this point. The code usually works because I tell Claude to use red/green TDD and my templates configure the tests to run in GitHub Actions.
I've recently dropped Claude Code (and its sub) to try out Opencode for a while and see how far I can satisfy my "agentic" needs with the free models available (eg. GLM-4.7). It seems to have great potential, at least for my needs, the only bit I'm truly missing so far is "async agents" as I think you call them, so running task from the web as eg with Claude Code for web.
Opencode has a GitHub integration which is partially providing it but I'm wondering if anyone else here is seeing value in a generic opensource "web agent" application to run agent tasks from e.g. a smartphone, something that works like CC web (so that hooks at least with GitHub) but where you can choose your agent app/model combo.
One thing I find when prompting an AI agent is they’ll sometimes come up with a bad solution or at least one I wouldn’t personally want used in my codebase. One example recently was the AI trying to match playwright test runs with screenshots using a flaky regex rather than using the mapping that exists in an adjacent json file. Are you finding this not to happen much with the models you’re using, or perhaps you are doing some detailed planning in your prompting? Or do you sometimes catch this in final PR reviews?
Yeah I spot things like that all the time - it's why I tend to keep half an eye on the chat transcript during these longer runs.
My favorite feature of Claude Code for web is that you can send it message while it's working, so any time you spot something you don't like you can tell it what to do instead.
Was curious about if the article would have any useful info on tools or approaches for mobile coding besides just using the recent agentic coding options as Ive been using my phone to code for a few years now and it’s a thing I have gotten loads of stuff done with in all sorts of areas.
Things I use on iOS frequently:
a-shell / a-shell minihttps://github.com/holzschu/a-shell
Ill let the creator do the explaining of what a-shell is
A Terminal in your pocket (or on your desk)
The power of command line instructions, on your favorite device.
Control your files
Create directories, move files, compress them, uncompress them, edit them, run python, lua or Tex on your files, move them to other apps.
Edit your files inside the App
a-Shell comes with Vim included. You can edit your files and even run syntax checkers using e.g. vim-lsp or ALE. Or, if you're more old-school, there is also Ed.
Shortcuts
a-Shell is compatible with Apple Shortcuts. Script your favorite commands, transfer files to other apps, typeset files, download files...
Plays well with others
a-Shell uses iOS file sharing ability. You can open directories in other app sandbox with pickFolder and run TeX or Python there. You can send the result in a third app. You can also edit files directly in a-Shell.
Multiple shell windows
a-Shell uses iOS 13 multi-window ability. Edit your files in one window, process them in another, transfer them in a third...
Program on your iPad (or your iPhone)
a-Shell comes with several programming languages: Lua, Python, JavaScript, C and C++. Edit your programs and run them inside the app.
Run your C and C++ files (yes, really)
clang/clang++ compiles your C/C++ files to webAssembly with wasi included. Execute the resulting files using 'wasm command'. You can also compile to webAssembly elsewhere and bring the files to your iPad.
Install more packages
Use 'pip install' to add more Python packages (if they are pure Python). Download pre-compiled webAssembly commands.
a-Shell can do most of the things you can do in a terminal, locally on your iPhone or iPad. You can redirect command output to a file with ">" (append with ">>") and you can pipe commands with "|".
- customize appearance with config
- pickFolder: open, bookmark and access a directory anywhere (another app, iCloud, WorkingCopy, file providers...)
- newWindow: open a new window
- exit: close the current window
- All your files, including configuration files (.bashrc, .profile, .ssh...) are in ~/Documents/
- Files created by Shortcuts are in ~shortcuts/
- a-Shell executes the ~/Documents/.profile and ~/Documents/.bashrc files for each new window
- Single-finger swipes move the cursor or scroll, two-finger swipes send keyboard input (up, down, escape, tab). "man gestures" for more.
- Edit files with vim and pico.
- Transfer files with curl, tar, scp and sftp.
- Clone repositories and do version control with lg2 (similar to git)
- Install more commands with "pkg"
- Process files with python3, lua, jsc, clang, pdflatex, lualatex.
- Open files in other apps with open, play sound and video with play, preview with view.
- For network queries: nslookup, ping, host, whois, ifconfig...
- bookmark the current directory with "bookmark <name>" and access it later with "cd ~name" or "jump <name>".
- showmarks: show current list of bookmarks
- renamemark, deletemark: change list of bookmarks
User guide: https://bianshen00009.gitbook.io/a-guide-to-a-shell/
A list of the commands possible to tickle anyone’s creative thinking going on possibilities for a particular use case in mind.
alias
apropos
awk
base64
basename
bc
blink
bookmark
brave
calc
call
cat
cd
chflags
chmod
cksum
clear
compare
composite
compress
config
conjure
convert
cowsay
cp
credits
ctags.wasm3
curl
cut
cygdb
cython
cythonize
dash
date
dc
deactivate
deletemark
diff
dig
dirname
downloadFile
downloadFolder
du
ebong
echo
ed
egrep
env
exit
export
expr
ffmpeg
ffprobe
fgrep
file.wasm3
files-to-prompt
find
firefox
googlechrome
grep
gunzip
gzip
head
help
hideKeyboard
hideToolbar
history
host
huggingface-cli
id
identify
idle3
idle3.13
ifconfig
import
indraa
internalbrowser
ipython
ipython3
isForeground
jq
jsc
jsc_core
jsi
jump
keepDirectoryAfterShortcut
less
lessecho
lex
lg2
link
ln
ls
lua
luac
magick
magick-script
man
mandoc
mandocdb
md5
mkdir
mktemp
mogrify
montage
more
multimarkdown
mv
nc
newWindow
normalizer
nslookup
open
openrsync
openurl
opera
pbcopy
pbpaste
pickFolder
pico
ping
ping6
pip
pip3
pip3.11
pip3.13
pkg
play
printenv
pwd
pydoc3
pydoc3.13
pygmentize
pyproject-build
python
python3
python3-config
python3.13
python3.13-config
readlink
readtags.wasm3
realpath
rehash
renamemark
repeatCommand
rlogin
rm
rmdir
rsync
safari
say
scp
sed
setenv
setuptools-scm
sftp
sh
sha1
sha256
shodan
showToolbar
showmarks
sleep
snetra
sort
source
ssh
ssh-add
ssh-agent
ssh-copy-id
ssh-keygen
stat
stream
stty
sum
tail
tar
task
tee
telnet
text
touch
tqdm
tr
tree.wasm3
unalias
uname
uncompress
uniq
unlink
unrar
unsetenv
uptime
vba_extract.py
view
vim
wappalyze
wasm
wasm3
wc
whatis
wheel
whoami
whois
wol
xargs
xxd
yandexbrowser
z
working copy
For code editor / repository / git anything / host key management Working copy is really good for local website development as its bulit in preview and JavaScript console
Git Shortcuts
Use Shortcuts and x-callback-url for automation.
Search repositories
Navigate by querying filenames, symbols or text occurrences.
Hosting Services
Lists your repositories on GitHub & many other services.
Signed Commits
Take part in secure workflows by signing commits.
Resolve Tool
Fix merge & rebase conflicts with speed and safety.
Large File Storage
Use Git LFS to efficiently handle videos and other huge assets.
Web IDE
HTML Preview with Javascript console.
Work Offline
Clone repositories making them fully available even when offline.