108 points by vinhnx 6 days ago | 18 comments on HN
| Mild positive Editorial · v3.7· 2026-03-01 10:30:59 0
Summary Technical Education Neutral
This URL contains a technical tutorial about implementing sprite animations for web interfaces, using Twitter's 2015 migration from star to heart icons as a case study. The content is purely educational and focuses on web development techniques, with no substantive engagement with human rights principles or frameworks. All sections receive neutral (ND) scores as the content does not meaningfully address any UDHR provisions.
I love Josh's blog and writing. I have to wonder what place this kind of content has in an age where agents are writing all the CSS. It sort of feels like hand tool woodworking now - there are people that will still get a kick out of designing things themselves, but it's going to be much less common. Maybe it already was like that anyway.
I remember Microsoft Front Page had a feature about doing buttons with image sprites and it spitted a ton of JS gibberish.
I don't think the example of the trophy in the article is a good use case this days, you could draw that trophy as a SVG and animate the flames with GSAP or something, or draw each flame frame as a <symbol> and animate that with CSS.
I think animation was the less common use case. Sprites were a nice way to get multiple images in a single HTTP request. Latency on dialup was murder and getting more in a single round trip was better. If you have a bunch of similarly-sized elements stick them all in a single file and use CSS to make multiple references to the same file display different images.
Josh, I was reading, and then a little man slid in from the left side, blocking the text I was reading, and said "Hey, friend! Would you like to subscribe to the newsletter?" I believe the site used CSS animation-timing-function:ease-in-out. My intuition told me that the slide was completely wrong for the situation.
First, the most important signal that any animation provides is this: the computer is doing this for you. This goes in the negative too: if you click and drag a file icon, the drag sprite may be translucent or highlighted somehow, but it should not 'animate' to your mouse cursor. The file icon should be attached to the cursor location with no delay.
However, suppose you drop it somewhere it can't go. The interface should then animate the file back to where it belongs; that's the computer 'putting it back'. Now, the timing function; how should the file go back? Slowly back away from the cursor? Accelerate to the return location, then slow back down again? No, it should very quickly snap away from the cursor, then settle where it belongs. You'll notice things like this as part of fit and finish; they are communication.
The man coming from the left eased in and then slowly stopped. This is profoundly wrong, like a person sneaking out of a dark place, then slowly coming to rest in front of you staring into your eyes, it is very much threat behavior. You want the person to come in a friendly way, so he can sell you something or convince you to smash the subscribe button. The correct animation is to simply appear halfway in, far enough you can see his smile; stop for 0.5s, indicating he is occupying the space; then slowly ease-in-ease-out the rest of the way.
Then the speech bubble should fade in, indicating that the computer is talking, and you as the user must act, like when a dialog says "Save your work now. I take your laptop away in 30 seconds. Look in my eyes, I am the user now."
I built 8bitsmith.com as a tool to make controlled sprite sheets.
It was an experiment in vibe-coding and controlled asset creation, so pricing is basically a pass-through cost of using Gemini.
Love Josh's work and usually always learn something new from his tutorials.
However, this time, I was really hoping the example implementations would use CSS transforms instead of properties that require repaints, especially since the rationale given here for using sprites is performance.
Maybe layer compositing warrants its own article and is beyond the scope here, but you can really tell when whoever built a frontend knows their stuff because all animations are hitting a consistent 60fps.
> While this technique is seldomly used on the web, it’s used all the time in video games
Seldomly used now, perhaps. Is the author unfamiliar with the history of the technique? This was everywhere on the web. It’s how Facebook served almost every icon and UI asset.
Back in the day we used 'background-position' to slice up the sprite map. There are articles on A List Apart describing this that are over 20 years old now. It was also the underpinning of the site’s legendary “sliding windows” technique, which was dominant on the web for some time.
E: I should add that one reason for its popularity was that we didn’t have HTTP multiplexing yet and so you wanted a small count of images/resources on the page
Tried this a little bit ago when making a website to try and qualify for the No JS Club inclusion. Wanted to include a bunch of interactive torches that would light when you click on them, and then turn off with subsequent clicks. Grabbed a bunch from the old Geocities gif image archive [1], and then turned them into something similar to this article.
Part I found a bit difficult was using background images, rather than using <img src""> links, and performing x and y shifting to minimize the use of enormous aspect ratio image files (really long strip of image sideways).
The part that's weird with background images though, is that you have to set them up with negative (-) background shifts. So the 24px x 53px image actually shifts -120px sideways each time it goes through an x-loop.
Further, since the sprite sheet is actually 120px x 265px to handle 5 rows of 5 frames, it then requires a somewhat complicated @keyframe definition setup. It actually needs one x-loop that's short, and loops endlessly, going through the full 5 frames, and a second 5x step length y-loop that then iterates once every full x-loop.
Actually imagery and animations that can be played with can be found here: https://araesmojo-eng.github.io under "Lantern Tests Menu"
NOTE: Needs the lantern to function and light the torches. Requires other minor puzzles on the website.
LLM are actually really bad at writing CSS. CSS is 20% logic and 80% art. The machines just don't understand what is attractive and what is ugly. I hand write all of my CSS and I don't see that changing any time soon.
Additionally, the file size of the sprite sheet image is often smaller than the combined file sizes of the individual images. (I never looked into why but expect it has to do with sharing overhead and the compression dictionary)
The page structurally enables the free sharing of information by publishing an educational tutorial freely accessible without paywalls or registration barriers.
How accessible is this content to a general audience?
technicalmedium jargondomain specific
Longitudinal
316 HN snapshots· 19 evals
Audit Trail
39 entries
2026-03-01 20:15
eval_success
Evaluated: Mild positive (0.29)
--
2026-03-01 20:15
eval
Evaluated by deepseek-v3.2: +0.29 (Mild positive) 12,508 tokens+0.09
2026-03-01 11:17
eval_success
Evaluated: Mild positive (0.20)
--
2026-03-01 11:17
eval
Evaluated by deepseek-v3.2: +0.20 (Mild positive) 12,434 tokens+0.20
2026-03-01 11:17
rater_validation_warn
Validation warnings for model deepseek-v3.2: 0W 1R
--
2026-03-01 10:31
eval_success
Evaluated: Neutral (0.00)
--
2026-03-01 10:30
eval
Evaluated by deepseek-v3.2: 0.00 (Neutral) 12,892 tokens
2026-03-01 10:30
rater_validation_warn
Validation warnings for model deepseek-v3.2: 31W 31R
--
2026-02-28 08:53
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 08:53
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
reasoning
ED technical tutorial no rights stance
2026-02-28 08:53
rater_validation_warn
Light validation warnings for model llama-4-scout-wai: 0W 1R
--
2026-02-28 08:49
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 08:49
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 08:49
rater_validation_warn
Light validation warnings for model llama-3.3-70b-wai: 0W 1R
--
2026-02-28 07:59
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 07:59
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 07:59
rater_validation_warn
Light validation warnings for model llama-3.3-70b-wai: 0W 1R
--
2026-02-28 07:19
credit_exhausted
Credit balance too low, pausing provider for 30 min
--
2026-02-28 04:52
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 04:52
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 04:16
rater_validation_fail
Parse failure for model deepseek-v3.2: Error: Failed to parse OpenRouter JSON: SyntaxError: Expected ',' or '}' after property value in JSON at position 17380 (line 388 column 4). Extracted text starts with: {
"schema_version": "3.7",
--
2026-02-28 04:16
eval_retry
OpenRouter output truncated at 4096 tokens
--
2026-02-28 03:35
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 03:35
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
reasoning
ED technical tutorial no rights stance
2026-02-28 02:03
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 02:03
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
reasoning
ED technical tutorial no rights stance
2026-02-28 01:47
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:47
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 01:43
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:43
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 01:35
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:35
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
reasoning
ED technical tutorial no rights stance
2026-02-28 01:13
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 01:10
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
reasoning
ED technical tutorial no rights stance
2026-02-28 01:07
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
reasoning
Tech tutorial, no rights stance
2026-02-28 01:05
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
reasoning
ED technical tutorial no rights stance
2026-02-28 00:58
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral)
reasoning
Tech tutorial, no rights stance
2026-02-28 00:53
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
build 1ad9551+j7zs · deployed 2026-03-02 09:09 UTC · evaluated 2026-03-02 11:31:12 UTC
Support HN HRCB
Each evaluation uses real API credits. HN HRCB runs on donations — no ads, no paywalls.
If you find it useful, please consider helping keep it running.