Disabling Paste Doesn't Prevent Text Entry

This week I had a fascinating conversation about disabling paste into a text input. You might see this UX pattern when a form requires a user to type “confirm” before taking an action. I believe it’s a UX anti-pattern. It breaks an expected behavior of a web form without an obvious benefit. What I learned is that even if it were good practice, you can’t reliably enforce manual typing anyway. ...

October 27, 2026

Building a Pitchfork-Style Loading Skeleton

Today, after waiting for an album review to load, I built something small: my own take on the Pitchfork aggregate review loading experience. Pitchfork uses a Skeleton-style UI while returning an album’s aggregate review, such as “8.0” for Mastodon’s Crack the Skye. Skeleton UIs show you something, like blurred text or a flashing bar, to build anticipation and fill out the page while in a loading state. They are a fantastic UX touch for the right kind of app and data. In the case of the Pitchfork app, the aggregate review is a pivotal piece of information about an album, and is presumably being calculated on demand, so this choice makes sense. ...

September 2, 2026

Opaque IDs, editable titles in TIL URLs

Today I’d like to highlight something I built with some colleagues that I think is cool: the dynamic paths of Hashrocket’s daily learning site, Today I Learned (TIL). Check out the browser bar here: The URL it contains is: https://til.hashrocket.com/posts/ee0a1bc878-parameters-filtering What do you notice? Here’s my list: After posts/, the path starts with ee0a1bc878 (?) That’s followed by a dash, then the post title in kebab-case (parameters-filtering) When you visit the same URL with an altered kebab-case title (e.g. ee0a1bc878-nope), you get the same page 😵‍💫 When an admin changes the post’s title (e.g. “Rails Parameters FTW”), the URL changes too(ee0a1bc878-rails-parameters-ftw) 😳 There are some sneaky features in there! Let’s dig into them for a minute. ...

July 22, 2026