Ghost Rovers: I Called 12 Machines NASA Left Behind. One Picked Up.
A 1969 Mission Control console for kids. Built in one day for NASA Space Apps 2026. TL;DR: For NASA Space Apps 2026 I built Ghost Rovers, a free web app where kids sit at a 1969 Mission Control console and call the 12 machines NASA left on the Moon and Mars. Five Moon machines answer NO SIGNAL, the Apollo 11 Laser Mirror answers, and Mars stays quiet. I directed it in one day, with Claude planning and checking and Google Antigravity building, and every fact traces back to NASA's own records. The first commit went in at 10:47 a.m. PST on Saturday: a 15-minute test to see whether my phone could spin a 3D Moon without choking. At 7:32 p.m. I clicked Submit for Judging. In between, the project grew a second planet, a study kit for teachers, a 27-second demo video with Apollo radio beeps, and one correction I'm glad I asked for. NASA Space Apps is NASA's global hackathon, run over one weekend. This year one of the challenges was called Abandoned but not Forgotten: tell the story of the hardware NASA has left on the Moon and Mars, for school-age space fans. The challenge text even suggested "an interactive map of the Moon with clickable ghost rovers." I didn't have to look any further. Why this one? I love helping people, teaching people, and learning. Kids hear about rockets launching. They almost never hear about what stayed behind. The facts all exist in NASA's catalog, but they read like a spec sheet: catalog IDs, coordinates, mass budgets. Nobody tells a 9-year-old that a car has been parked on the Moon since before their grandparents had cell phones. lol earlgreyhot1701D / ghost-rovers Ghost Rovers 12 machines are still on the Moon and Mars. Only 1 still answers. A 1969 Mission Control console where kids ages 8 to 12 radio the hardware NASA left behind, on the Moon and on Mars. Play it live · Watch the 27-second demo · Slides (PDF) · Go to Mars · Study notebook · Fact check · SI disclosure NASA Space Apps Challenge 2026 · Abandoned but not Forgotten · Team Clew Labs (La Shara Cordero) The problem Kids hear about rockets launching. They almost never hear about what stayed behind. The facts are all in NASA's catalog, but they read like a spec sheet: COSPAR IDs, coordinates, mass budgets. Nobody tells a 9-year-old that a car has been parked on the Moon since before their grandparents had cell phones. What Ghost Rovers does You sit at a Mission Control console. Six machines are out there. You… View on GitHub Pick one. Press CALL GHOST. You sit at a Mission Control console. Six machines are out there on the Moon. You pick one and press CALL GHOST. Radio static. Then: On the Moon Today Surveyor 3 Quiet since 1967 Apollo 11 Laser Mirror Still answers Eagle's launch pad Resting since 1969 Apollo 12 moonquake station Switched off 1977 Apollo 15 Rover Parked since 1971 Apollo 17 Rover Parked since 1972 Five reply NO SIGNAL with the year they went quiet. One answers. Scientists on Earth still bounce lasers off the Apollo 11 mirror, so the console draws a beam from Earth to the Moon and back, and the round trip takes 2.5 seconds, the real number. Press M and the console flips to Mars: Viking 1 and 2, Sojourner, Spirit, Opportunity, and InSight. None of them answer. Yet. Each machine has a file: its original mission, a short story in its own voice, three questions kids ask ("Could I drive it?" "What's it made of?"), its real NASA photo, and a live counter of how long it has been sitting there, down to the second. READ TO ME reads the file out loud. Call all six on a world and you earn a Junior Flight Controller badge you can save. The console had to look like 1969 I spent the first real block of the day on design, before any build. Claude mocked up three directions: Museum After Dark, Field Notebook, and Mission Control 1969. I picked Mission Control, then sent the first version back because it didn't look enough like 1969. The second pass got the details: amber clocks, a red label-maker tape, a curved wall screen, console sounds generated in code instead of recorded. Then I wrote one rule into the agent's instructions before it built anything: the design is like-for-like. Build what was approved. If you have an improvement, list it separately and don't build it until I say yes. I've had agents "clean up" a design into something generic before, and I wasn't going to spend the afternoon arguing with a button radius. Every fact had to survive NSSDCA NSSDCA, NASA's Space Science Data Coordinated Archive, keeps a record for every mission. Every date, landing site, and status in Ghost Rovers was checked line by line against those records, and both fact-check logs are public in the repo. The check caught real overclaims. A draft called the Apollo 15 rover "the first car on the Moon." The Soviet Union's robot rover, Lunokhod 1, got there in 1970, a year earlier. The line now reads "the first car astronauts drove on the Moon." That kind of fix is small on screen and it's the whole difference between a fun app and a fun app a teacher can trust. The same rule applied to the Mars clock. "Light time Earth to Mars: 3 to 22 minutes" comes from NASA's Mars fact sheet: the closest and farthest Earth distances, divided by the speed of light. Two agents, one notebook, one rule I don't write the code. I direct, the agents generate, I check and decide. Here's who did what on Saturday: Who What they did Me The idea, the kid audience, the 1969 look, every design call, every yes or no Claude (Opus 5.5) The plan, design mockups, fact checks against NSSDCA, an independent check after every block, the docs, the demo video and slides Google Antigravity Built the site in small blocks: propose a plan, wait for my approval, then build Google's Gemini Notebook A public study notebook from the same NASA sources: a quiz, flashcards, and a mind map for each world, plus a podcast with AI voices The rhythm worked. Antigravity proposed, I approved, it built, Claude checked the result in a real browser at three screen sizes and ran an accessibility scan, and only then did the next block start. Claude's checks caught things that read fine in code and looked wrong on screen: the Earth sitting inside the Moon during the laser animation, a badge title clipped off the edge, an answer box covering the story text. The friction was mostly plumbing. Antigravity's built-in browser couldn't take screenshots on my machine, so it switched to a headless script. Old editor tabs kept trying to save stale copies of files over new ones. Once I learned to close the tab and pick Don't Save, that stopped. Space Apps calls AI tools "Super Intelligence," or SI, and asks you to label anything SI made. So every code file has a one-line SI header, every SI-assisted image and video carries a visible label, and the repo has a full disclosure log of what each tool did. The rule was in the wrong file Around 4 p.m., Claude ran a code review and pointed out that main.js was 1,104 lines and main.css was 2,775. I loathe god files. My build rules say one file, one job. Then we found out why. The rule lived in the file Claude reads. It never made it into the file Antigravity reads on every block. So Antigravity did the reasonable thing and kept adding each new feature to the files that already existed, block after block, and Claude's checks were looking at whether things worked, not at how big the files were getting. We split the CSS into nine files, all under 500 lines, and proved the split changed nothing: the joined files match the original line for line, and before and after screenshots at three screen sizes came out identical. The two big JavaScript files stay as they are until after the hackathon. Each one is a single giant function, and splitting that the night before a deadline is how you break the thing judges are about to open. They're listed in the agent instructions now as known exceptions, with a 500-line rule for everything else. "Yet" needed a meaning By 7 p.m. I was writing the project description, and something in my own pitch bugged me. Mars: none of them answer. Yet. What do we do with "yet"? That question turned up a mistake. Claude's draft of the description said no machine on Mars answers. That isn't true. Curiosity has been driving around Gale Crater since 2012, and Perseverance has been working in Jezero Crater since 2021. In October, Perseverance broke Opportunity's off-world driving record. The six machines in Ghost Rovers are quiet. Mars is not. My first instinct was to make Curiosity and Perseverance callable, like the Laser Mirror. Claude advised against it, and I agreed: the challenge is about discarded equipment, and those two are working missions with teams driving them every day. Calling them ghosts would stretch the theme and break "only 1 still answers" everywhere at once. So they became the answer to "yet" instead. Finish the Mars check, and the badge panel adds one more row: Antigravity usage was running low by then, so Claude built that row itself, as a new file with one job so the big files stayed untouched, and Antigravity committed it. The Mars clock already said "People on Mars: none yet," so "yet" ended up meaning what it should have meant all along: nobody has visited these machines. The next voice from those landing sites could be a kid watching today. Thirty seconds, with Apollo radio beeps The demo had to be 30 seconds or less, so Claude built a 27-second film in the app's own look: the console powering on, the Laser Mirror call, the switch to Mars, and a closing card with the classroom kit. The sound is my favorite part. Claude logged every sound the app made while a script played it, the clicks, the static, the laser ping, the NO SIGNAL buzz, and rebuilt them at the exact moments they happened. I asked for more Mission Control, so it added Quindar tones, the short beeps you hear on Apollo-era Mission Control radio audio. The narration is a synthetic voice, labeled on screen and in the file. The video is on YouTube. The form fought back The last bug of the day wasn't in the app. Claude filled in 15 NASA data links on the submission form by typing them, and a check afterward found the typing had dropped letters: display.ction instead of display.action, in several URLs. It reset all 15 and checked them again. Later, a second editor tab I'd left open almost saved an older, emptier version over the finished one. Reload, don't save. Lesson learned twice in one evening. What it can't do No human voice yet. A real Mission Control voice, ghost names, and Spanish are the v2 list. The podcast covers the Moon only. Two JavaScript files are still far over my own 500-line rule. Phone and tablet checks ran in browser emulation, not on every real device. I tested on my own Android phone. Twelve machines is a start. NASA has left a lot more out there. Try it Play Ghost Rovers, or go straight to Mars. Keys 1 to 6 pick a machine, C calls it, M flips worlds. No login, no tracking, no data collected. For teachers: the study notebook has a quiz, flashcards, and a mind map for each world, and it's public. The numbers, from the repo on submission day: Machines 12 (6 Moon, 6 Mars) Answering 1 (plus 2 working rovers linked on Mars) Accessibility scan (axe-core, WCAG 2.1 AA) 0 violations on both worlds First commit to submit 10:47 a.m. to 7:32 p.m. Commits by submission 21 Space Apps sent me a participant certificate that says Galactic Problem Solver. That one's going on the wall. Did a machine answer when you called it? I'd love to hear which one you tried first. Quick context if you are new here. I work in the California courts, running court operations for the county. I started building with AI in July 2025 and I have been learning in public ever since. I don't write the code. I direct, the agents generate, I validate and decide. I build the Clew Suite, a set of civic tech tools for making complex systems easier to inspect. Built with AI assistance in November 2026. NASA facts link to NASA's own records, and the fact-check logs are in the repo. These tools move fast, so check the source before you quote me. AI Assisted. Human Approved. Powered by NLP.
This is a summary aggregated from Dev.to. Read the complete article on the original site:
Read full article at Dev.to