Retrospect
Your Last.fm history against the actual sky. Every scrobble you have ever logged, cross-referenced with real retrogrades, full moons, and eclipses, then held to a standard astrology never asks for.
- 25
- Trials per sweep 5 skies × 5 measures
- 2,000
- Scrambled skies per trial
- 495k
- Scrobbles in the test library 17 years, one account
- $0
- Hosting cost by design
Astrology never has to be right
“Mercury retrograde makes you revisit the past” is unfalsifiable as usually stated. It is not unfalsifiable in principle, though. You need two things: a record of what someone actually did, and a real calendar of when the sky did the thing. A Last.fm history is the first. An ephemeris is the second.

Every window is computed, not looked up. Retrograde periods, full moons, and eclipses come from planetary positions via astronomy-engine, down to the minute and the zodiac sign. The landing page proves it before you have typed anything, by showing what the sky is doing right now and counting down to the next event.


What if the answer is no?
The honest version of this app returns a null result most of the time. That is the whole premise, and it is also a product problem, because “we checked, nothing happened” is a terrible thing to show someone who just waited for half a million scrobbles to sync.
Almost everything else in Retrospect exists to answer that. Five skies instead of one. Five measures that can be mixed freely. A listening profile that has nothing to do with astronomy. If the planets are innocent, there is still something to read.
Astrology is the question. Statistics is the answer. If the sky is innocent, the app has to be willing to say so, and still be worth the wait.
The reveal is paced like a story rather than dropped as a dashboard. Scale first, then how often the sky did its thing, then the verdict. Every figure from here on is one real library, mine: 17 years and roughly 495,000 scrobbles. Someone else’s numbers will be different, and that is the entire point of the thing.


Rotate the calendar, do not reshuffle it
Any large listening history shows some difference during retrograde, because any two arbitrary buckets of days differ. The question is whether the difference beats what chance produces on its own.
So every claim faces a circular permutation test. The real event calendar is rotated to 2,000 random offsets against the same listening data, and the real effect only counts when it beats the scrambled ones. Rotation matters more than it sounds: a plain reshuffle would destroy the structure of both the calendar and the listening, and hand back a null that is easy to beat. Rotating preserves seasonality, weekly rhythm, and the fact that people listen in streaks. The null keeps the shape of your actual life.
The seed is fixed, so the same library returns the same p-value every time. A verdict that changed on refresh would not be a verdict.


Mercury is innocent. The full moon is not.
Mercury retrograde is the famous claim, and the one the whole app is framed around. On my library it comes back at 1.02×, which is nothing.
So the sweep runs every sky against every measure, 25 trials, and surfaces only what survives the scramble test. For me, exactly one did: Full Moon × Night Owl, an iron grip. Not the claim anyone makes at parties.
That result is mine, not a finding about full moons. Another account runs the same 25 trials and gets its own answer, or more often no answer at all, which is a perfectly good outcome and one the app is built to report. The sweep exists precisely because there is no way to guess in advance which combination, if any, is yours.


Opened up, that trial reads: Does a full moon keep you up past midnight? Oh yes, +33%. Index 1.33× for me, and the grip meter that sat empty for Mercury lights all four bars. Same component, opposite ends of the same scale, which is the point of having a grip meter instead of a p-value in the headline.

Running 25 tests at p < 0.05 means roughly one false positive is expected from chance alone, and exactly one conviction came back. Retrospect does not correct the threshold for that. It labels instead: a conviction survived its scramble test, a lead is large but unconfirmed and says so on its face. For a tool whose tagline is entertainment with error bars, saying which tier a result lives in seemed more honest than a quieter number nobody would read.
Your habits leave fingerprints anyway
The listening profile needs no astronomy at all. Archetypes, golden hour, best streak, loudest month: all computed from the same timestamps, all there whether or not the planets did anything.


The specifics land harder than the statistics. A retrograde anthem, a single most nostalgic day, and NASA’s picture of the sky on that exact date.

Ambient tracks were the quiet threat to all of this. Rain, static, and sleep playlists run for hours unattended, and those plays add up to counts that can dwarf anything you actually chose that week, so sleep and noise artists can be excluded in one click. It is a data-quality switch wearing a friendly label.

A loading screen worth waiting through
The first sync of a large library takes minutes, because Last.fm is rate limited and the history is pulled page by page. That wait was not going away, so it got a planetary system instead of a spinner: planets spawn, orbit, occasionally collide, and explode, while the scrobble counter climbs behind them.
The sync itself is built for serverless. Each invocation pulls pages for a fixed time budget at roughly five requests a second, flushes once at the end, and dedupes on read, because new scrobbles landing mid-backfill shift the page boundaries underneath you.
Built to cost nothing, on purpose
Retrospect runs on Vercel’s free tier with Cloudflare R2 for storage. R2 was chosen specifically because it has zero egress fees, so a read-heavy access pattern cannot generate a surprise bill, and Vercel Hobby pauses rather than charges when limits are hit. Histories are stored as gzipped blobs, so a 500,000-scrobble library is about 7 MB and the free tier holds roughly a thousand of them.
Birth charts are the one thing that never touches a server. Sun, moon, and rising sign are computed in the browser and saved only on that device, because birth date, time, and location is a more sensitive payload than anything else the app handles.
