Ashish Bhatia
Software Engineer • San Francisco Bay Area
Featured Writing
The posts below reached the front pages of Hacker News, Reddit, and similar communities, and are the ones people cite and share the most.
It is hard to recommend Google CloudA widely-shared critique of Google Cloud's developer experience. How to run Python in productionA much-referenced, no-nonsense guide to shipping Python. Maintaining an Android app is a lot of workMy Hacker News–famous take on the hidden cost of Android upkeep. Migrating from WordPress to HugoHow, and why, I moved this site off of WordPress.
As Seen In
My work and writing have been referenced by the press, academia, and industry newsletters.
BBC↗
Yahoo! Finance↗
Business Insider↗
India Today↗
Google Scholar↗
eWeek↗
Android Weekly↗
Medium↗
Fundraising Radio↗
Angelneers↗
Open Source & Tools
Projects I maintain on GitHub, several of which are widely used and starred by the community.
dotfilesBattle-tested macOS, Android, and infrastructure engineering setups.
wp2hugoThe best tool to migrate a website from WordPress to Hugo.
gaboA GitHub Actions boilerplate generator.
amazing-sandboxRun third-party tools and AI agents securely on your machine.
adb-enhancedA Swiss-army knife for Android development.
android-securityThe most comprehensive list of Android security tools.
android-malwareA research collection of live Android malware samples.
Apps I have built
MusicSyncA Google Play Music replacement that plays from SD card, Google Drive, the web, and podcasts.
Mindful ReadingMaintain your own custom RSS feed for focused reading.
VoiceNotesRecord location-tagged voice notes, with transcription, on the go.
AutoSnoozerBatch-process your email inbox instead of reacting to every message.
Writing by Topic
More technical deep-dives, grouped by the area they cover.
Infrastructure & DevOps
Docker 101: a basic web serverA hands-on intro to Docker with a hello-world web server. Deploy side projects as web services for freeShip side projects with essentially zero fixed cost. Be careful about Docker's scratch imageThe pitfalls of Docker's minimal scratch base image. Common pitfalls of GitHub ActionsGotchas to avoid when using GitHub Actions. The first two statements of your bash scriptA safety check that makes bash scripts robust. My rm -rf momentHow I once deleted my full disk.
Go Language
A common concurrency pitfall for beginnersThe easy concurrency mistake Go beginners make. Inheritance in GoHow to do inheritance in the Go language. Generics in GoWriting generics in Go, like Java and C++.
Testing
Bad and good ways to write automated testsAlways test along the axis of minimum change. Testing resumable uploads and downloadsSave bandwidth and latency for you and your users. Infinite network timeouts in Java and GoCheck for missing network timeouts in your requests.
Android
Critique of React NativeWhere React Native falls short. Catching NDK crashesHow to catch native NDK crashes on Android. Android Fragments without crashingFragment pitfalls and how to avoid them. Architecting Android apps for emerging marketsDesigning apps for low-end devices and networks. Why I built MusicSyncThe reasoning behind building MusicSync.
Product & UX
Indeterminate progress bars are badWhy indeterminate progress bars are an inferior UX design. How not to write an email to your usersEmail mistakes startup founders make. Why audio can't be as big as text, photos, and videosThe consumer-internet case against audio. When marketplaces work and when they don'tWhat makes online marketplaces succeed or fail.
Travel
I have been to 50+ countries and love writing about it. Explore my travel stories, browse the travel blog category, or read my reviews on Tripadvisor.