Image descriptions on Bluesky
Not bad, could be better.
What percentage of Bluesky images have image descriptions? I checked 2.8 million image posts and their user-provided image descriptions to find out.
Motivation
Image descriptions are text that describes an image (citation needed) for people who cannot see it (they’re also known as “alt text”, from the HTML attribute). That’s great. The only problem is, someone has to write these image descriptions, and most people don’t.
I recently noticed in my Bluesky feed, most images actually had decent human-written image descriptions. This was surprising! I remembered seeing a 2019 paper by Gleason et al. with the striking stat that on Twitter (now X), only 0.1% of image tweets had image descriptions at all:
Figure 1 from “It's almost like they're trying to hide it”: How User-Provided Image Descriptions Have Failed to Make Twitter Accessible, by Cole Gleason, Patrick Carrington, Cameron Cassidy, Meredith Ringel Morris, Kris M. Kitani, Jeffrey P. Bigham (published at WWW ‘19).
I was inspired by this paper to do a similar platform-wide look at Bluesky.
My own Bluesky feed includes a lot of UX and design people, who are exactly the people who are most likely to write good image descriptions. But there are a few other reasons I thought Bluesky would have a higher rate than the 2019 Twitter stat:
The option to add alt text on Bluesky is more prominent; in 2019 on Twitter, you needed to enable an account-wide setting to even see the option to add alt text. The equivalent stat for X/Twitter today is likely higher than 0.1%, as the extra setting flip is no longer needed.
Bluesky’s userbase is likely more liberal, and I have a hunch this correlates with higher rates of writing image descriptions.
Bluesky also has an explicit app-level option to “Require alt text”, which will give an extra reminder for people who want to write image descriptions, but might forget at times.
So, the number would certainly be higher than 0.1%, but I didn’t know exactly how much higher. The good news is that it’s easy to find out!
First, the final number
The analogous has-image-descriptions percentage of Bluesky posts (“skeets”, as the kids say) is… nineteen percent!
Actually, 19.9%. This is a lot better than Twitter in 2019! Here’s how I got to that number.
Data collection through the Bluesky Firehose
The Bluesky Firehose provides a real-time streaming view of all activity on the network. This made it straightforward to collect data about image posts and their alt text image descriptions. We wrote a script (the royal we, meaning me with the help of various computers) to pull image descriptions from the Firehose:
A stream of Bluesky posts and their image descriptions. Most posts don’t have descriptions, but the ones that do show a variety of content and style.
This is fun to watch; Bluesky has enough images to keep the feed moving, but not so many that it’s just a blur of text going by. For the same experience in a live web-based format, check out the Bluesky Alt Text Firehose.
Armed with my script, I collected 2,851,876 skeets containing at least one image between July 14 and July 21, 2025, minus several periods where my wife or I accidentally closed my laptop or otherwise stopped the script from running.
The code and resulting data are available in this GitHub repository: bobbiec/bluesky-alt-text .
Note that this dataset contains many (highly-detailed) sexually-explicit image descriptions. As (ᴘ)ᴀᴛ://ʀɪᴄᴋ (@alt.psingletary.com) said, “The NSFW space understands there is a large range of tastes and properly classifying it only benefits everyone.”
Also, this time frame perfectly captures the Coldplay kiss cam / Astronomer incident, which is mentioned a couple thousand times in the dataset - not bad.
Bot filtering
As I spot-checked the data, I noticed repeated patterns in captions, like “Product image”, “Album artwork for <some music>”, and “Season 1 Episode 2 - Frame 1234 of 5678”. At a glance, these were obvious bots.
I didn’t want bots to skew the data; it would be easy to pump up the image description rate with Amazon affiliate bots posting every minute (every link is a different account there), but that’s not very useful to anyone.
I took the 100 most frequently-posting users in the dataset and manually categorized them as bot-or-not, then filtered out the bot posts. I found that most bots provided poor image descriptions or none at all (similar to the Gleason paper).
Coincidentally, these bots weren’t so different from the humans so they didn’t affect the overall stats much. It’s possible that the remaining bots had a different rate, but they’d also have a smaller effect since they post less frequently.
Notes for next time
Potential improvements for the Firehose script
The exact percentage of 19% is a little fuzzy because of two interacting issues with my approach:
The Bluesky Firehose might send duplicate events referring to the same post (AT URI).
A single post might contain multiple images, and each image can have its own caption.
When you combine these two issues with the fact that I only stored AT URI and caption, this means if I see two rows with identical AT URI and caption, I don’t know if it’s a duplicate event or if it’s really one post with two images where both images have the same (possibly-empty) caption.
To be open, here’s the numbers by various methodologies (all slightly wrong from the ground truth):
Rows-with-captions / total rows, including bots: 20.0%
Rows-with-captions / total rows, excluding bots: 18.6%
AT-URIs-with-captions / unique AT-URIs, including bots: 21.5%
AT-URIs-with-captions / unique AT-URIs, excluding bots: 19.9%
Ultimately, I picked the last number, which aligns with the paper’s definition.
—
In other news, I regret using the CSV format, which is rough since image descriptions can contain all kinds of quotes AND newlines. The resulting file complies with RFC 4180 for CSVs and is read properly by pandas, but it doesn’t play well with line-based tools like `grep` (`rg`) or `uniq`. You’ve been warned.
—
Finally, I also should have started from an approach using Jetstream, which would’ve simplified the script as well. That’s what Simon Willison’s Bluesky Firehose tool does, and I forked it for my Bluesky Alt Text Stream linked above.
Future ideas for research
If I had more time, I would do more work here. That 2019 paper from Gleason et al. goes way deeper, in fun ways. They:
Checked the most-followed accounts, to see if the most-seen tweets would have a different rate vs. the tweets of random nobodies (no)
Did human evaluation of the actual quality of image descriptions (which I only did for the top 100 posters)
And, interviewed users who were writing image descriptions
Beyond these, the Bluesky labeling and moderation features could also provide interesting data for future research; for example, the Bad Accessibility / Alt Text Labeler (@baatl.mastod.one) has separate labels for “meaningless alt text” vs. “misused alt text”.
How can we do better?
80% of image posts in Bluesky today have no image description. That’s a big improvement over the 99.9% of descriptionless images observed on Twitter in 2019, but it could still be better. Image descriptions are useful beyond helping the visually impaired; they’re also indexed for search, which is good for everyone (an example of “curb cut” effect where accessibility benefits all).
As much as I like to encourage people to manually write good image descriptions (and to turn on the Bluesky setting that forces you to add them), I think there’s at least one great technical opportunity to make things easier for everyone.
The AI-pilled among us might jump straight to, “We should use multi-modal AI to automatically caption images!” But as Thomas Fuchs points out, it’s prone to producing meaningless descriptions like “a close up of a circular object with a reflection of a wave” when it should be “Jurassic Park velociraptor breathes on the window”.
In my staring at the data from this project, I realized there’s lower-hanging fruit. A huge proportion of images posted on Bluesky are not photos or any kind of visual content; they’re literally just screenshots of text from other social media sites, like X/Twitter, Tumblr, or Reddit.
To address this, I have a truly marvelous proof, which this blog post is too small to contain half-baked concept that I hope to fully-bake in the next two weeks. If you’d like to get an email for that post, subscribe with the form in the footer (or, use my RSS feed).
Alt text on Bluesky in 2025 is 200 times more common than on Twitter in 2019. That’s a great improvement, but it’s still absent from 80% of image posts. We can do better.