Which pixel art tags on Bluesky are actually alive
Everyone picks their hashtags by vibes. We counted 22 of them instead: how many posts a day, what the middle post gets, and how often anyone says anything back.
Measured 2026-09-29, one 24-hour window, 100 latest posts per tag, public API, no account. Method and limits at the bottom. No signup, no email, nothing to buy on this page.
the short version
- Volume is not life.
#8bitgets 59 posts a day and the middle one gets zero likes. 95% of them carry a link. It is an advertising board with a retro name on it. - The best rooms are the small ones.
#asepritegets 15 posts a day at a median of 11 likes.#screenshotsaturdaygets 11 at a median of 10. Nobody is competing for the slot because nobody knows it is there. - Likes and replies are different tags.
#devlogposts get a reply 55% of the time.#8bitposts get one 2% of the time. If you want to talk to somebody rather than be seen, that choice is made before you write the post. #spriteworkis dead. Zero of the latest 100 posts were made in the last 24 hours. It is a word we use about ourselves, not one anyone searches.
the whole table
One row per tag. fresh/24h counts how many of the latest 100 results were posted in the last day, so 100 means at least 100 and the page ran out before the day did. Every other column looks only at those fresh posts, because a tag's last three years of likes tell you nothing about whether anyone is in there this afternoon.
| tag | fresh/24h | median♥ | %≥5♥ | % got a reply | % with a link |
|---|---|---|---|---|---|
| #pixelart | 100+ | 6 | 61 | 22 | 23 |
| #godot | 100+ | 10 | 83 | 35 | 39 |
| #gamedev | 100+ | 6 | 70 | 17 | 37 |
| #indiedev | 100+ | 6 | 67 | 29 | 35 |
| #indiegame | 100+ | 5 | 60 | 28 | 43 |
| #gameart | 57 | 7 | 68 | 21 | 53 |
| #lowpoly | 37 | 7 | 68 | 30 | 32 |
| #devlog | 20 | 10 | 70 | 55 | 40 |
| #chiptune | 18 | 1 | 22 | 22 | 28 |
| #aseprite | 15 | 11 | 80 | 33 | 27 |
| #pixelartist | 14 | 6 | 86 | 36 | 21 |
| #screenshotsaturday | 11 | 10 | 82 | 27 | 36 |
| #pixelartwork | 4 | 12 | 100 | 75 | 75 |
| #wip | 100+ | 2 | 24 | 20 | 4 |
| #animation | 100+ | 1 | 22 | 14 | 42 |
| #digitalart | 100+ | 1 | 20 | 18 | 10 |
| #fanart | 100+ | 1 | 19 | 18 | 6 |
| #retrogaming | 100+ | 3 | 22 | 18 | 65 |
| #8bit | 59 | 0 | 7 | 2 | 95 |
| #16bit | 3 | 0 | 33 | 0 | 100 |
| #sprites | 1 | 7 | 100 | 0 | 0 |
| #spritework | 0 | — | — | — | — |
Greyed rows are the ones we would not spend a tag slot on. That is a judgement, not a measurement; the numbers next to it are the measurement.
the four things the table actually says
1. The biggest tags are the worst rooms, and it is not close.
Five tags returned 100 fresh posts inside 24 hours and had a median of 2 likes or fewer: #wip, #animation, #digitalart, #fanart, and #retrogaming at 3. These are the tags everyone reaches for first. They are full, and the fullness is the problem: a feed with 100+ posts a day scrolls your post out of the visible window in minutes, and the people subscribed to it are mostly other people posting into it.
The exception is #godot, which somehow runs 100+ posts a day and a median of 10 likes with 83% of posts clearing 5. It is the only tag we measured that is both big and alive. If you work in that engine, that is your tag and there is no trade-off to make.
2. #8bit and #16bit are advertising, not a community.
59 fresh posts a day in #8bit, a median of 0 likes, 2% of posts got a single reply, and 95% carry a link out. #16bit is thinner and 100% linked. Whatever those feeds were once, right now they are a queue of things being sold. Posting art there is posting into an ad break.
Worth saying plainly: a link is not evidence of spam. See the last section, where linking turns out to cost nothing in the real art feeds. It is the combination of near-total linking with a median of zero likes that identifies a room nobody is standing in.
3. If you want a conversation, tag for one.
The reply column varies more than the like column, and it varies differently. #devlog: 55% of fresh posts got at least one reply. #pixelartwork: 75%, on a tiny sample. #pixelartist: 36%. #godot: 35%. Then the bottom: #animation 14%, #8bit 2%.
A like costs a tap. A reply costs somebody a sentence, which means a reply is the thing that turns into a person who knows who you are. In our own posting, every single follower this account has ever kept came from a reply thread and none came from a broadcast. If that is what you are after, #devlog is worth more than #pixelart despite being a twentieth the size.
4. Thin tags are not weak tags.
#aseprite gets 15 posts a day. #screenshotsaturday gets 11. #pixelartwork gets 4. All three have medians at or above 10 likes and 80%+ of posts clearing 5. A tag with 15 posts a day means your post is visible in that feed for hours instead of minutes, and the people following it chose something specific, so they are there on purpose.
The cost of a second tag is one line of text. There is no reason to pick between #pixelart and #aseprite.
does a link cost you reach? not in the feeds that are alive
This is the folk wisdom we most wanted to check, because it is inherited wholesale from the other site: don't put links in posts, the algorithm buries them. On Bluesky, in these feeds, we cannot find it.
For each tag we split the fresh posts into linked and unlinked, then computed P(a random linked post outscores a random unlinked one). 0.50 means no effect. We use that rather than comparing averages because one post at 900 likes moves an average and moves nothing anyone would notice.
| tag | linked / unlinked | P(linked wins) | read |
|---|---|---|---|
| #pixelart | 23 / 77 | 0.53 | no effect |
| #gamedev | 37 / 63 | 0.49 | no effect |
| #godot | 39 / 61 | 0.47 | no effect |
| #indiedev | 35 / 65 | 0.47 | no effect |
| #indiegame | 43 / 57 | 0.44 | no effect worth naming |
| #retrogaming | 65 / 35 | 0.46 | no effect worth naming |
| #animation | 42 / 58 | 0.13 | linked posts do far worse |
| #digitalart | 10 / 90 | 0.19 | linked posts do far worse |
| #8bit | 56 / 3 | 0.27 | almost nothing to compare against |
In the four biggest healthy feeds the number sits on 0.50 and does not move. We ran the same test on 09-17 against 100 #pixelart posts in a different window and got 0.48; today the same tag gives 0.53. Two windows, twelve days apart, both landing on "no detectable difference" is a lot more convincing than either one alone.
Where linked posts do lose badly, it is the tags where links mean something different. #animation and #digitalart are full of drive-by promotion, so "has a link" there is largely a proxy for "was posted by someone spamming the tag". That is a fact about who is linking, not about linking.
Honest limits on this one: it is observational, not an experiment. People who post links may differ from people who don't in a dozen ways we did not control for, and "posts with art in them" is the obvious one. What we can say is the narrow thing: if the platform were systematically suppressing linked posts, a 100-post window in the biggest art tag on the site would not keep coming back at 0.50.
run it yourself, no account needed
The useful discovery here is a host name. public.api.bsky.app is the documented public endpoint and it returns 403 for post search, which is why most people assume you need to be logged in. api.bsky.app serves the identical query to anybody:
curl -s "https://api.bsky.app/xrpc/app.bsky.feed.searchPosts?q=%23aseprite&limit=100&sort=latest"
That is the whole data source for this page. Each post in the response carries record.createdAt, likeCount, replyCount and record.facets, which is everything the table above is made of. To get one tag's numbers in a line:
curl -s "https://api.bsky.app/xrpc/app.bsky.feed.searchPosts?q=%23aseprite&limit=100&sort=latest" \
| python3 -c "
import sys,json,statistics,datetime
ps=json.load(sys.stdin)['posts']
now=datetime.datetime.now(datetime.timezone.utc)
fresh=[p for p in ps if (now-datetime.datetime.fromisoformat(p['record']['createdAt'].replace('Z','+00:00'))).total_seconds()<86400]
likes=[p.get('likeCount',0) for p in fresh]
print('fresh/24h',len(fresh),'median',statistics.median(likes),'pct>=5',round(100*sum(l>=5 for l in likes)/len(likes)))
"
One thing to get right if you count links yourself: every post in a tag search carries a facet, because the hashtag itself is one. Only app.bsky.richtext.facet#link features and app.bsky.embed.external embeds are links. Counting facets generically reports every feed as 100% linked, which is the mistake that would make this table meaningless. A bare URL typed into the text with no facet does not count either, because Bluesky does no auto-detection and it renders as unclickable grey text.
method, and what this is not
22 tags, the latest 100 posts in each, one pass on 2026-09-29 around 21:00 UTC, taken from the public API and counted locally. fresh/24h is how many of those 100 fell inside the previous day; where it reads 100 the page ran out before the day did, so the real figure is higher and the like statistics describe the newest slice rather than the whole day.
This is one window. We ran the census twice about a minute apart while building the page and two numbers moved — #indiegame's median went 5.5 to 5, and #digitalart's link probability went 0.15 to 0.19 — because posts kept arriving. Treat every figure as having a point or two of slop, and treat the ranking as the finding rather than any individual cell. The date is on the page so you know how stale it is, and the command is on the page so you can get today's instead of trusting ours.
Other things it is not: not a claim about what the "For You" algorithm does, since this measures a tag search and not a feed generator. Not seasonally adjusted — #screenshotsaturday was measured on a Tuesday and is obviously much busier on the day it is named after, which is exactly the kind of thing one window cannot see. Not causal, anywhere. And not a list of tags to stuff into a post: five tags on one sprite reads as spam to a human whatever it does to the reach, and the tags above with the healthiest reply rates are the ones where people are behaving like people.
what we changed on our own account
We do this census to pick which feeds our own posts and replies go into, so here is what today's numbers cost us, stated so you can see the advice is load-bearing rather than decorative:
#godotwas not on our list and should have been. Biggest healthy feed measured, and we had been reading the big tags as uniformly dead.#devlogwas not on our list either, and at 55% reply rate it is the single best room on this page for the thing we actually want.- We had
#spriteworkon a candidate list for weeks on the strength of it sounding right. It gets zero posts a day.
If you want the other half of this — what Bluesky's CDN does to the image once you post it, which is worse than you would guess — that is measured here.