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
developpush 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
- actions
- api
- app
- apple
- authentication
- cloud
- css3
- express.js
- firebase
- firestore
- github
- gpt
- html5
- ios
- javascript
- line
- login
- node.js
- openai
- purchase
- render
- revenuecat
- swift
Log in or sign up for Devpost to join the conversation.