iPX Directory

Directory Technology

Saket Narayan

Listed, no subscribers yet

Paste it into any podcast app or feed reader to subscribe.

A wild developer appears. He works at Square . Find him on Twitter and Bluesky .

Latest episodes

Writing interactive screenshot tests in Compose UI with Touch Robot

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 2026
Generating rich link previews 10x faster

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 2025
The pursuit of fast feedback loops

Demo 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 2024
Building a sub-sampling image viewer for Compose UI

How 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 2023
Drawing custom text spans in Compose UI

While 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 2022
Graduating from View IDs

I 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 2021
Great teams merge fast

One 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 2021
Avoiding fake italic and bold text on Android

Changing 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 2019
Reinventing the dial-up modem

While 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 2019
Building a gesture driven Reddit app

An 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 2019
Sunsetting Dank

I’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 2018
Smoothly reacting to keyboard visibility changes in Android

When 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 2018
Introducing InboxRecyclerView, a library for building expandable descendant navigation

When 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 2018
Designing a flick dismissible image viewer

While 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 2018
Persistence as the single source of truth

Simple 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 2018
This is your next Reddit app — Dank

After 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 2018
Band-aiding legacy networking libraries with Retrofit and OkHttp

When 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 2018
Simplifying DiffUtil with RxJava

One 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 2018
The lesser known world of spans

Do 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 2017
Android Nougat and rate limiting of notification updates

While 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