Tracks: Main track · Photon track (our iMessage agent is built on Photon Spectrum)

Inspiration

This weekend is the Mid-Autumn Festival. For a thousand years, families who couldn't be together have taken comfort in one idea: however far apart we are, we look up at the same moon. Su Shi wrote it in 1076, and every international student at WashU knows the feeling.

Texting is instant, free, and forgettable. We wanted the opposite: a message that takes the moon's own time to arrive, and that you receive by stepping outside and looking up. The theme said Fly Me to the Moon. We can't fly you there, but we can let the moon carry something for you.

What it does

  • Leave something on the moon. Write a note or attach a photo for someone far away (in iMessage you can also send a voice note).
  • The moon carries it west. The point under the moon drifts west about 14.5° every hour. Your message rides along and becomes collectible only when the moon actually rises over the recipient's city, computed from real astronomy, not a fake timer.
  • They look up to receive it. The Look up screen uses the camera, compass and gyroscope to guide them to the moon ("Raise 12° · Turn left… There it is. Hold still."), even behind clouds. They photograph it, and Claude checks it's really the moon: not a screen, the right phase, and actually up where they are. Then the message is revealed.
  • No push notifications. The only messages we send first are a receipt to the sender ("Aaron just looked up and found what you sent 🌕") and one gentle hint if something waits three nights. Looking up becomes a nightly ritual, and every look earns a moon-phase stamp (eight to collect).
  • Two doors, one agent:
    • iMessage, powered by Photon Spectrum. Nothing to install. Onboarding, invites, sending and picking up all happen in the chat, with screen effects on arrival and a chat background that becomes tonight's real moon.
    • Web app (PWA). A live Moon Map (where the moon is right now, with a 24-hour time-lapse of your message riding it), plus Send, Look up and Phases.

How we built it

  • Photon Spectrum (spectrum-ts). The iMessage agent: message effects, custom chat backgrounds, image and voice attachments, invite codes and receipts. We followed Photon's deliverability guidance: inbound-first conversations and no links in the first message.
  • Claude API (structured outputs with Zod). Vision checks on every moon photo (is_moon, shows_screen_or_print, observed_phase, sky_is_cloudy), and natural-language parsing that turns "my mom in Shanghai" into a person and a place.
  • astronomy-engine. The moon's altitude, azimuth and tilt as seen from each city, its phase and illumination, moonrise and moonset, the points directly under the moon and the sun, and the arrival time (skipping moonrises too close to new moon to see).
  • NASA SVS Dial-A-Moon. The real moon image for the current hour, used in the app and in the iMessage moon cards (rendered with sharp).
  • Open-Meteo. Geocoding and cloud cover.
  • Stack: Node and TypeScript with Hono on the backend; the web app is dependency-free ES modules with a d3-geo world map, getUserMedia and DeviceOrientation for the Look up guidance.

Challenges we ran into

  • iMessage in the real world. Photon's Pro shared number pool only reaches whitelisted phone numbers, rejects email handles, and doesn't allow SMS to non-US numbers. Getting a +86 number working meant activating iMessage on it.
  • Demoing a moon app on a Sunday afternoon, when the moon is below the horizon. We recorded the Look up flow at 2 AM in St. Louis under 89% cloud cover, and the compass guidance still found the moon behind the clouds. A demo mode lets judges pick things up during the day.
  • Making "it's in their sky" actually true. This meant computing the moon's position as seen from each city, tilting the moon correctly in the camera view, and handling nights around new moon when there's nothing to see.

Accomplishments that we're proud of

  • End to end on real iPhones: a message left from one phone was picked up on another by photographing the real moon, over iMessage and on the web.
  • Every time, position and phase in the app is astronomically real.
  • The recipient never has to install anything.

What we learned

Slow can be a feature. The constraints (no push notifications, inbound-first messaging, waiting for moonrise) produced a gentler, more meaningful product than the instant version would have been.

What's next for Same Moon

  • Attach real gifts to the moon, such as a mooncake delivery or a gift card that unlocks when they look up.
  • Family "moon circles" for group chats.
  • Seasonal moments for every culture that keeps time by the moon: Lunar New Year, Chuseok, and crescent sighting for Ramadan and Eid.
  • A dedicated Photon number and a native app with ARKit.

Built With

  • claude
  • photon
Share this project:

Updates

Submission history