← Back to Blog
klimaspiraleklimadatendatenvisualisierungthreejsclaude-codeJuly 26, 2026 · 12 min read

Klimaspirale Part 1: From a Video to My Own Data

ENDS 2021 → raw data · SOURCE VERIFIEDAI-generated image
Editorial illustration: workshop scene on a dark desk. On the left, a framed strip of film holding a small climate spiral above a play bar labelled 'ENDS 2021'. From the frame, a paper tape full of monthly anomaly values runs to the right through a metal verification-stamp device with a glowing green 'SOURCE VERIFIED' display; a magnifying glass and pins lie in front.Editorial illustration: workshop scene on a dark desk. On the left, a framed strip of film holding a small climate spiral above a play bar labelled 'ENDS 2021'. From the frame, a paper tape full of monthly anomaly values runs to the right through a metal verification-stamp device with a glowing green 'SOURCE VERIFIED' display; a magnifying glass and pins lie in front.

One morning a video climbed the ranks in a subreddit: the climate spiral. Rising rings of monthly values, from blue to red. At the end the flat disc tips into perspective and becomes a funnel. The video already had over a thousand upvotes. It was a reupload, and where it originally came from was no longer traceable.

One revolution is one year. January at the top, then clockwise through the months, and at the next January the ring closes, just a little further out than the last time.

You don’t really read numbers, you just see a movement. For a hundred years the line trembles around the same spot, then it starts to drift, and in the last few revolutions it drifts fast.

I wanted to know where the clip came from and whether there was anything more current. The search led to a video file on Wikimedia Commons whose data ends in 2021. The lead image in the Wikipedia article was an even older still. No matter how I searched, the same familiar clip kept coming back.

I sent the Wikimedia link into a chat with Claude, with one sentence attached:

“The video only goes to 2021 or something… can we rebuild that, maybe with HyperFrames?”

I’d come across HyperFrames shortly before, a framework that renders HTML into video files. The climate spiral looked to me like exactly the sort of thing you’d build in HTML and export as video.

Claude’s Misunderstanding

The answer began with a rebuff:

“Straight talk up front: Hyperframes or any AI video generator is the wrong way to go here. The climate spiral isn’t a ‘generatable’ animation, it’s an exact data-driven visualization — every point is a real monthly value. An AI model would hallucinate you a pretty but factually wrong spiral.”

The second part is fair enough. An image generator would have painted something that looks like climate data without a single real monthly value in it. It’s just that the premise was wrong: HyperFrames isn’t a video generator at all. Claude had taken the name for an AI service and passed judgment before actually looking it up.

My reply cut Claude off mid-sentence:

“Of course I want to render it, I’m not stupid. Go research HyperFrames…”

Then came the research, and then the retraction. First briefly: “Fair, I jumped to ‘AI video generator’ there.” And a bit later: “I was wrong. HyperFrames isn’t a generative AI video generator at all.”

It’s an open-source framework from HeyGen under an Apache 2.0 license that grabs HTML, CSS and animations frame by frame and assembles them into an MP4. HyperFrames sets the browser’s virtual clock itself instead of running along in real time. Same input, same frames, same output, no matter how busy the machine is.

For a visualization where every point on screen follows from a row in a table, that’s exactly the property you need. Claude’s warning was right on the substance and aimed at the wrong tool.

In that same answer Claude had already checked the data on the side: at that point NASA’s series ran to February 2026. So a rebuild would show how the spiral has kept turning since the video ended.

The Data

The numbers came first. A spiral without solid data is just a pretty graphic.

The source is GISTEMP, NASA’s global temperature series from the Goddard Institute for Space Studies. The file is public, but the automated fetch came up empty: for a script the server simply delivered nothing.

Claude then found a continuously maintained mirror on GitHub, pulled the monthly series from there and extracted 1,752 monthly values, January 1880 to December 2025. The first months of 2026 were already there but stayed out so the series would end on a full year.

That put the data in the house, but second-hand. With a dataset you’re going to label “NASA data”, that’s a difference that counts.

So: spot checks against the original table at NASA. September 2023 at +1.48 °C, September 2024 at +1.23 °C, both identical. The mirror was a transport route, not a second truth. Weeks later the NASA server happened to respond normally again, and the detour turned out to have been unnecessary.

The series itself is unspectacular: one year per line, a month number, a value in degrees Celsius. The lowest value is −0.82 °C, the highest +1.48 °C. Between those two numbers lie 146 years, and the spiral is basically just that span, wound up once.

A value like +1.48 °C for September 2023 isn’t the temperature of that month.

The second question came up when looking at the first data point. The series starts in January 1880, and that isn’t because nobody read a thermometer before then.

Still in the same session Claude built a quick version in matplotlib: a polar plot, 1080 × 1080, 30 frames per second, just under a minute long, 4.2 MB.

Really just meant as proof that the numbers work and fit into a spiral. On the last frame, though, you could already see the most recent loops pressing against the 1.5 °C line.

Two things were missing. The tipping at the end, the transition from the flat disc into the funnel, wasn’t in it.

And I wanted the scale rings at 1, 1.5 and 2 °C. The next morning I asked for a handover document for Claude Code, so the animation could keep growing where the tools and the files live.

Claude wrote the document and noted in it that its own matplotlib draft was a dead end: polar matplotlib can’t do the tipping cleanly, and 3D in matplotlib is a mess.

The recommendation was a rebuild in Three.js, rendered through HyperFrames, because there the transition from the top-down view into the funnel can be solved with a single parameter. Plus a beat timeline (a plan of what happens in which second of the video) and acceptance criteria. Six decisions Claude left to me: color logic, resolution, frame rate, zero line, final rotation, and whether the scale rings run as cylinders through the whole height or only sit on the floor.

The Build Day

Claude Code read the document and got started. The first draft render went through after about an hour.

What comes out of it is at its core just a conversion of table rows into coordinates. The month number sets the angle: January at the top, then clockwise, so one revolution comes to exactly one year. The anomaly sets the distance from the center, cold values inside, warm ones outside. And the running number of the month sets the height: 1880 at the bottom, the present at the top.

Both views come out of the same calculation: if the camera looks from above, there’s a flat spiral. If it tips to the side, that becomes the funnel. That’s exactly where Three.js won over matplotlib, because the transition there is just a camera movement within the same scene rather than a second graphic.

The look wasn’t in the document yet. I wrote my change requests into one message:

“We should add a ring with the average value, so 0 degrees deviation. That one is white, temperatures below it bluish, values above it orange-red. […] Then it would be good if we could slow the speed down a bit at the end, from around 2000 onwards, so it can land better. […] And I’d like the option to generate it in English too. And: Are there data points for 2026 yet?”

All four are in the spiral today. The white zero ring is the optical center where you can tell without reading numbers where the long-term mean sits: blue below, orange-red above.

The slowdown at the end became an ease-out curve so the most recent years stand still instead of flitting past. The bilingualism became an attribute on the HTML root element, out of which Claude Code later built two video versions and a bilingual web app.

Shortly after I noticed:

“The heading ‘up to 2025’ isn’t right anymore now.”

The numbers keep growing, so the label has to keep up.

Every change cost a new run, and a run over 1,800 frames takes time. A good part of the day was just waiting.

In between there were things like translucent cylinders on the scale rings that were simply invisible on a black background, because color times opacity at low values just gives you black.

Or a value readout that wobbled back and forth on every frame: “Ah, since it’s not monospace, the whole line wobbles back and forth… monospace font?” In a proportional typeface a 1 is narrower than an 8.

In the middle of the build the session filled up. Claude Code carried on from a summary of its own history from then on, knowing the decisions only as a note. In what came after, I didn’t notice.

The Side Question

A render takes time. While waiting I asked:

“Could we also build this animation incl. 3D view with mouse control (rotate, tilt etc.) as a webpage?”

The appeal lay in what the scene already offered. The camera move at the end of the video is really just a fixed path through a space you could also move around in freely.

If the same scene runs in the browser, the viewer decides where to look from, how fast the series builds up and where it stops.

In the end that’s what actually became the release, and the videos are more of a sideshow. The question was on the table before anyone on the project knew whether more current spirals existed.

From the same waiting time came the decision about which scale rings run as translucent cylinders through the whole height:

“Let’s do the translucent cylinder only at 1.5 degrees (because that used to be the climate target).”

The cylinder is still there today. I didn’t think any further about the half-sentence in the brackets at the time.

The Finding

A day later the decision to publish was made: set up a subdomain on aeternalabs.io and put the videos up for sharing. But first I wanted two things checked:

“Do two more things first: 1. Plausibility check: don’t want our display of the data to have an error in it. That would be embarrassing. 2. Is the spiral really not out there in a more current version than 2021/2022? That would also be embarrassing.”

Claude Code sent a research subagent for each question. The data check confirmed the numbers and ran into a problem with the scale along the way.

There is in fact a current climate spiral, from NASA itself. The Scientific Visualization Studio keeps a version called “1880 to today” that gets updated monthly, about two weeks after the end of the month. At the time of writing it runs to June 2026. Ed Hawkins, who originated the form of presentation, maintains his version too, annually.

The occasion for the project rested on a mistake. I’d searched for the clip’s origin myself and found nothing apart from the Wikimedia file. That there’s a maintained page where a new version appears every single month was in none of the search results I’d seen.

What’s left of the assumption is a smaller and actually more interesting statement: the version in circulation just lags behind.

The clip that gets shared everywhere ends at 2021. The video file on Wikimedia ends there too. The lead image in the Wikipedia article is a still from 2017, calculated on an older data series.

What goes through the feeds as “the climate spiral” is therefore five to nine years old, while the maintained version is updated every month.

It got built anyway. The question about the interactive version was already on the table before this check, and it never depended on being up to date.

What NASA publishes is a video: sixty seconds, a fixed camera move, one viewing angle somebody else picked out.

The version I built runs in the browser. You can turn the spiral yourself, zoom in and out, pause and rewind, click individual months and switch the scale to a different baseline. That makes the data something you experience instead of just watching, and to me that’s the real value.


Part 1 of 4 in the Klimaspirale series.

Klimaspirale Part 2: The Baseline Trap →

The spiral from this series is a project: Climate Spiral.

Comments

Commenting takes an email confirmation or a GitHub login. Comments run on my own server, not on an ad provider's — details in the privacy policy.