Stellar Legacy

There are neutron monitors all over the world that count particles from cosmic rays hitting the atmosphere. They report numbers every five minutes. This site takes those numbers and uses them to generate visuals.

The numbers come from real detectors in real places (Finland, Switzerland, South Pole, etc). They're not random, not simulated. The count rate at a given station at a given moment becomes a seed value between 0 and 1, and that seed drives everything you see.

There's no real practical purpose here. It's just a cool thing that works: ancient supernova debris hits a detector, the detector reports a number, and that number ends up controlling what your GPU renders.

What the stations measure

Cosmic rays are mostly protons from supernovae and other high energy events outside the solar system. When one of them hits the upper atmosphere it triggers a shower of secondary particles, including neutrons that make it all the way to ground level.

A neutron monitor is a gas-filled tube (boron trifluoride or helium-3) that produces an electrical pulse when a neutron passes through it. Count those pulses and you get counts per second, which is the raw measurement this whole site is built on.

What the numbers mean

Different stations see very different count rates depending on altitude and location. Oulu in Finland reads about 85 to 110 counts/s. Jungfraujoch in the Swiss Alps (3570m up) gets 300 to 380 because there's less atmosphere above it. South Pole is around 240 to 295. Mexico City only gets 195 to 245 even at 2274m because Earth's magnetic field is stronger near the equator and blocks more of the incoming particles.

The GV number next to each station in the selector is the geomagnetic cutoff rigidity, basically how much shielding that location has. Low GV (like South Pole at 0.1) means almost everything gets through. High GV (Mexico City at 8.28) means only the most energetic rays make it.

Things that change the count rate:

  • Solar activity. When the Sun is more active its magnetic field blocks more cosmic rays from reaching us, so counts go down. When it's quieter, more get through.
  • Forbush decreases. A coronal mass ejection passes Earth and temporarily shields us. Counts drop 5 to 15% in hours, then take days to recover. These are the sharp dips in the data.
  • Pressure. More air above the detector absorbs more neutrons. Stations correct for this but there's still some noise.

Reading spikes and dips

Usually the numbers barely change between readings. When they do move significantly, here's what's probably going on:

Sudden dip (5 to 15% drop)

A coronal mass ejection just passed Earth. Its magnetic field blocks incoming cosmic rays for a while. Drops fast, recovers slow (days). If multiple stations dip at the same time, that's confirmation. On this site the seed drops toward 0 and things get quiet.

Sudden spike

Rare. Usually a Ground Level Enhancement (GLE) where solar particles from a big flare are energetic enough to produce extra neutrons on their own. If polar stations spike first and equatorial ones don't react much, it's solar particles following field lines to the poles.

Slow rise over months

The Sun getting quieter (moving toward solar minimum). Its weaker field lets more cosmic rays through. The historical range expands over time to account for this.

One station acting weird

Probably hardware. If every other station is flat and one spikes, it's flagged as anomalous (more than 3 sigma from the poll mean). Still stored, just marked.

From counts to seed

We normalize each station's count rate against its own historical min and max:

seed = (counts - min) / (max - min)

So 0 means the station is at its lowest ever, 1 means its highest ever. The range grows automatically when new extremes show up.

Example with Oulu reading 92.06 counts/s (historical range 85 to 104):

(92.06 - 85.00) / (103.89 - 85.00) = 7.06 / 18.89 ≈ 0.374

There's also a delta value which is just current seed minus previous seed. Bigger delta means something changed fast, so the visuals react with more movement.

Modes

Noise

GLSL shader that mixes static grain and smooth curl noise based on the seed. Low seed = grainy and cold, high seed = warm and flowing. Each station has its own color palette so they look distinct even at similar values.

Pipes

3D pipes growing through space, like the old Windows screensaver. Colors come from hashing the station code into a palette scheme. More flux = more pipes, faster. Clears itself every 60 seconds.

Crossing

Top-down pedestrian intersection. Number of people on screen matches the raw count rate. Higher counts = busier streets. Delta makes the crowd move more erratically.

Runner

Playable. Neutron particles fly at you and you dodge with A/D and SPACE. Count rate sets spawn rate and speed. High-flux stations are harder. Score is survival time.

Voxel

Minecraft-style world where the station code scrambles the terrain noise. Each station produces a different landscape. You can walk around, break and place blocks. Built on minecraft-threejs.

Pipeline

Python poller hits nmdb.eu/rt/realtime.txt every 5 minutes, normalizes the counts, writes to Postgres. Postgres notifies the NestJS backend over a trigger, backend pushes to connected browsers via WebSocket. Frontend interpolates toward the new values so transitions are smooth, and captures a noise-mode screenshot for each station into a rolling 24-hour archive.

Credits

Data from NMDB (EU FP7, contract 213007). Station credits are shown on each visualization.