Inspiration

People around me love telling me about their dreams. Honestly, it was a little tiring. So I asked myself: in an age of AI, why do they tell me and not a chatbot? The answer I landed on was that they believe I understand them — their week, their moods, their recurring nightmares — better than a generic model ever could.

That became the idea for Yumetan: a dream journal where the AI reading is grounded in your own dream history and diary, not in a one-off prompt, and where a character that only you can grow makes the habit of writing dreams down feel rewarding.

What it does

  • 24-question dream-type quiz sorts you into one of 16 playful dream types across four groups (nightmare, prophetic, lucid, recurring), each with its own character — a human "Dreamwalker" or an animal "Moonlight companion". The type is recomputed from your recent dreams, so it drifts as you do.
  • Dream & diary journal with typed, dictated (on-device speech recognition) or photographed (handwritten-note OCR) entries, sleep check-ins, and a dream level that rises as you keep writing.
  • AI dream reading: GPT reads the dream together with your recent diary and returns a reflection on your current state of mind plus a light-hearted "fortune of the day" — clearly labelled as entertainment, never a diagnosis.
  • Members' dream feed: share one dream a day, anonymised under a nickname and your character, and react to others' dreams of today with 12 stamps. Yesterday's dreams disappear at midnight, so the feed feels like a shared morning.
  • Four languages (Japanese, English, Korean, Simplified Chinese), account sync across devices, in-app account deletion, and store subscriptions (Free / Starter / Standard) verified server-side.

How we built it

  • One codebase, three targets: plain HTML/CSS/JavaScript modules served as a PWA, wrapped with Capacitor for iOS. Rules that decide a dream type or a dream level live in public/core/ and are shared by the app, the server and the tests.
  • Node.js + Express API on Render: verifies Firebase ID tokens, meters plan quotas in Firestore transactions, calls the OpenAI API for readings and OCR, and syncs subscriptions from RevenueCat (webhook + REST) so the client never grants itself a plan.
  • Firebase Authentication (Google, native Sign in with Apple, native LINE Login, email) and Cloud Firestore with owner-only rules for journals; a small Swift plugin hands off browser-based OAuth to the app with two independent proofs so a stolen link can't log anyone in.
  • App Store In-App Purchase through RevenueCat, Terms of Use / Privacy Policy pages served by the API, and a GitHub Actions pipeline that archives and uploads every develop push to TestFlight.
  • Quality: ~80 Node unit tests for the domain rules, billing, moderation and account deletion, plus ~80 Playwright browser tests covering onboarding, sync, purchases, the feed and account deletion in all four languages.

Challenges we ran into

  • Dreams break content filters. Our first feed ran every post through OpenAI moderation — and rejected "I jumped off a collapsing building" as self-harm. Dreams are full of falling, dying and disasters, so we removed automatic filtering and kept operator-side hiding and suspension instead.
  • App Review. We were rejected for missing in-app account deletion, for subscription screens without terms/price disclosure, and for mentioning Google Play inside an iOS app. Each round meant server-side deletion of every trace of a user (posts, stamps on other people's posts, usage counters, RevenueCat subscriber), a purchase screen that states name, length and price next to the button, and a text sweep across four languages.
  • OAuth inside a WKWebView. Pop-ups don't work in a Capacitor app, so we built a browser hand-off with a challenge/verifier pair, then replaced it with native Apple and LINE SDK sign-in for iOS.
  • Store sandboxes. A RevenueCat Test Store key silently crashes a release build; the build script now refuses it unless explicitly allowed.

Accomplishments that we're proud of

  • A dream journal that is fun on day one (quiz → character) and gets more personal the longer you use it.
  • Shipping iOS and web from one codebase with full localisation in four languages.
  • A server that never trusts the client for anything that costs money: plans, AI quotas and account deletion are all verified with Firebase tokens and Firestore transactions.
  • Surviving three App Review rounds and coming out with a cleaner, more honest product (no Google Play copy, real legal pages, complete account deletion).

What we learned

  • "Understanding someone" is mostly context. The AI reading felt generic until it started reading the previous day's diary alongside the dream.
  • Content moderation tuned for social media is wrong for dreams; the operator, not a classifier, has to be the safety net.
  • App Store rules (5.1.1 account deletion, 3.1.2 subscription disclosure, 2.3.10 metadata) are easier to design in from the start than to retrofit.
  • Writing tests for the rules (type scoring, quotas, deletion) rather than the UI let us change the UI many times without fear.

What's next for Yumetan

  • Make the AI reading remember: longer-term patterns across weeks of dreams and diary entries, so the reading truly knows you the way a friend would.
  • Report and block controls in the feed, and a gentle "dream streak" to reward daily writing.
  • Traditional Chinese and more character sets, plus a shareable "dream card" image for each reading.

Built With

Share this project:

Updates

Submission history