Shipped an expandable header that broke mid-scroll. Went unnoticed for a week. Broke highlighting of hyperlinks in text for the third time. Fixed a button’s layout on one screen, and silently broke its on-pressed shape on another. These are some examples of real issues that were happening at Block. Each of them was frustrating because we were regularly shipping broken experiences to customers desp
24 May 2026A wild developer appears. He works at Square . Find him on Twitter and Bluesky .
Latest episodes
unfurl is one of my favorite open source libraries. Not because it’s clever or complex, but because it’s a tiny kotlin library that does one thing well: generate rich link previews by extracting their social metadata. You can try out its demo on your computer: brew install saket/repo/unfurl unfurl https://dog.ceo If you’ve ever pasted a link into Slack, Twitter or WhatsApp and watched a link previ
23 Dec 2025Demo showing that Compose Hot Reload (Firework) only invalidates remembered state if you change code affecting the slot table (e.g. changing code inside 'remember {}') — Sebastian Sellmair (@sellmair.dev) 2024-11-19T17:37:50.295Z Sebastian Sellmair from JetBrains recently showed off a prototype of hot-reloading Compose UI code for deploying changes without rebuilding the project. It looks exciting
27 Nov 2024How do you display a 100mb image on Android without running into OutOfMemoryError ? You can’t. But you can cheat. For years Android developers have used Dave Morrissey’s excellent library, subsampling-scale-image-view for displaying large bitmaps with deep zoom. It optimizes memory usage by loading lower resolution bitmaps whenever possible and avoiding loading parts of the original image that are
9 Aug 2023While exploring how text paragraphs are rendered in Compose UI, I nerd sniped myself into porting squiggly underlines from Sam Ruston’s Buzzkill app. Sam’s animation was implemented using TextView custom spans, but Compose UI does not offer any alternatives for them yet. While our friends at Google are prototyping text modifiers ( first , second ), I figured I could draw them manually in the meant
12 Jul 2022I found an old screen in Cash App today that wasn’t retaining its scroll position across configuration changes. A peek into git history revealed that the author forgot to assign an ID to its scrollable layout for enabling state restoration. And would you even blame them? Sure, View IDs are necessary, but maintaining them manually is such a chore. It’s even easier to forget about them when layouts
2 Dec 2021One of the many things I was constantly amazed about during my first few weeks at Square / Cash App was seeing how fast this team shipped code. All members of the Android team (and likely other platforms as well) were merging to the main git branch multiple times every day. This was in stark contrast to my previous company where it was common for us to raise large PRs after a couple days of work.
23 Feb 2021Changing line heights in Android using LineHeightSpan has this ugly side-effect where the cursor ends up being very tall, extending till the full line height instead of just the text height. I've decided to go to extreme lengths to fix this over the next few days. For science. pic.twitter.com/2tWLvDq1rz — Saket Narayan (@Saketme) November 24, 2019 A few hours after posting the above tweet, I notic
18 Dec 2019While working on a healthcare app called Simple at my previous company, we wanted to improve how nurses follow up with their patients. The aim was to replace traditional paper registers + landline phones with the app, which could intelligently suggest patients who are potentially at risk based on their medical history, age, and other important cues. For protecting their privacy, we needed to route
18 Aug 2019An exploratory talk that showcases how Android can deliver a beautiful experience to the user using material design principles and various framework APIs like gestures and spans. This talk walks the user through a collection of concrete examples of custom UI components and their implementations in my gesture driven Reddit app, Dank. Recreating Google Inbox’s UI for expandable descendant navigation
16 Jun 2019I’ve been trying to write this post for a while, but I kept throwing my words in the bin in hopes that things will improve. I believe it’s now time to put an end to this. I started building Dank as a side project in January 2017. It was my playground for exploring Android. It was also an attempt to showcase a beautiful experience of what Android can offer to its users. There are many Reddit apps o
15 Dec 2018When people use Dank , one of the terms they use to describe it is fluid . The app makes a good use of motion to indicate changes on the screen, but I think one of my favorite reasons why the app feels fluid is because it handles keyboard changes smoothly . When the soft keyboard is shown, Android forces the content to resize immediately (unless the windowSoftInputMode is set otherwise). This resu
5 Oct 2018When Google released Inbox for Android some 4 years ago, their UI was rad. I was obsessed with the navigation transition, where emails expanded from their list item when clicked, pushing all other items out of the screen. When pulled downwards, the emails collapsed back to their positions. I wanted to recreate this UI. I started by capturing a screen-recording of Inbox and playing it many hundred
14 Sep 2018While working on Dank , my primary goal was to ensure that user generated content on Reddit receive as much attention in the app as possible, while letting the UI take a back-seat. As part of this experience, all images and videos in Dank are flick-dismissible so that the user can browse through high quality cat photos as fast as possible. Because flick dismissible images are not a new idea, I was
15 Aug 2018Simple is better than complex . Complex is better than complicated. In the world of Android, where all sources of information and user interactions are asynchronous, UI state can become hard to reason about, especially in large apps. This is not only difficult to maintain but also increases complexity with the addition of every new feature. This talk explores the idea of “persistence as the single
26 Jul 2018After spending more than a year , I’m happy to announce that my Reddit app — Dank is finally ready for the world to see. You’re going to love it. It’s a fresh experience for Reddit on Android. Scroll to the bottom for the download link. The first thing you’re going to notice is that Dank puts the focus on user generated content. The UI takes a back-seat so that you can enjoy photos posted by Reddi
11 May 2018When Uncommon was brought in to refactor a big legacy app last year, we found ourselves in a strange situation. Our client was maintaining a common library for handling networking — HTTP, FCM, MQTT — across all apps under their brand. This library (let’s call it SadLibrary) had an API that was badly designed and dated, but not using it was not an option — a dedicated team was working on it and the
30 Apr 2018One of my favorite parts of RxJava is that no matter how complex a state management usecase is, there’s always an operator for that . During a recent code cleanup, I found a very cool usecase of RxJava’s scan() and compose() operators for simplifying the usually verbose DiffUtil implementation. I had been delaying writing this post for a while, but Mark Allison’s new series of articles on adding i
18 Feb 2018Do you know what’s common between the blinking cursor, hyperlinks and text highlighting in TextViews? They’re all implemented using spans. Spans are tiny objects that Android uses heavily across the framework. If you’ve worked with text styling such as bold or italics, then you’re already familiar with the basic usages of spans. But they are capable of much more than just modifying the visual repr
5 Nov 2017While working on a feature for downloading images in my app, I ran into a strange issue where progress notifications were never reaching 100%. Knowing that the framework is usually not wrong, I started suspecting my own skills (as usual). To make matters worse, nobody was able to reproduce the issue in a sample project I shared with other developers. It took me a baffling/embarrassing amount of ti
28 Aug 2017