The ChatGPT mobile app UX is severely underappreciated. Perhaps the best example of this is the scroll behavior. They've put a lot of thought into something so deceptively simple that most people don't notice how complex it really is. I didn't realize myself, until I tried implementing it from scratch. It's easy to forget that ChatGPT is not a typical text message UI. The introduction of streamed responses immediately following the user's messages actually necessitates a lot of new behaviors. In a typical text message interface, when you send a message your message gets added to the bottom of the list of messages. When the person you're messaging responds, it also gets appended to the end. This behavior is very straightforward, and there are packages like [Shopify's FlashList](https://github.com/Shopify/flash-list) that make adding this sort of feature plug-and-play. However, ChatGPT is very different. I'm still discovering new states that affect the scroll behavior, but here are some of the ones I've noticed so far: - Most of the time when you send a new message, it appears at the top of your screen (as opposed to the bottom in a normal texting interface). The response streams in below it and can go off the screen (no scrolling yet). - However, if you send a message when the first response did *not* go off the screen, it does not scroll so that your message appears at the top of the screen. Instead, your message appears below the response, and the subsequent response generates below it and also does not scroll. - If a response goes off the screen and you send a new message without scrolling to read the end of the previous response, opening the keyboard overlays the messages and sending the new message *does* scroll so that it is visible at the top of the screen. - There is whitespace allowed below responses if they are short enough to not take up the full screen. However, if there is whitespace below a response and you scroll back in the conversation, when you return to the bottom of the conversation it does not allow you to scroll so far that the whitespace becomes visible again (the bottom of the response is at the bottom of the screen, and you can't scroll past it into whitespace). - When you return to an old conversation, it shows the end of the last response at the bottom of the screen such that there is no whitespace below it. - If you've scrolled to the bottom and there's no whitespace below the last response, opening the keyboard *does* make the conversation view shrink above it. If you're not scroll to the bottom, it does not. What's also interesting is none of the above applies to web. On web, your messages scroll to the top of the screen, and the responses stream below it without scrolling, even on really short responses. That's it. More and more apps are shipping their own chat interfaces, creating demand for a similar plug-and-play package like FlashList. I might release one myself once I have all the kinks ironed out in my own app, but if someone knows of something available already, would love to give it a try. *12.22.25*