Inspiration

Our starting idea was simple: a dream happens on a particular day, and the lunar calendar is a familiar way to talk about that day. We had already built this reading, text in and a layered reading out, for Telegram and a large social platform, and watched it get used for real. In the seven months since the first commit, 2,853 accounts have written at least one dream (4,111 readings in total, counting our own accounts), and more than 90% of those dreams were written in September. Taking it to the App Store was a chance to bring the lunar framing into a dream journal.

We also wanted the reading to lead somewhere. Each one ends with something to do, a practice for the day and an action step, so that a person is not left holding an interpretation and nothing else.

What it does

You write a dream the way you remember it, a sentence or a page. Voice dictation is built in and currently transcribes Russian only. The dream comes back read in seven layers: the symbols and what they carry in that specific dream (not a fixed dictionary entry), the feelings and body signals under it, the family threads it touches, the patterns that keep repeating with a three step way to sit with each one, the shift the dream is pointing at, a practice for the day, and a closing message.

Every reading is generated for that text. The only fixed material is the short lunar background we hand the model as context (the meaning of the current lunar day, the moon sign's dream hint and, if a birth date is added, a short personal note), which comes from our own written tables.

Around the reading sits the rest of the product: a private journal where entries accumulate; a monthly summary, available once a person has logged at least three dreams in a lunar month, that shows which patterns came up most often; a lunar day page with the current moon phase, lunar day and moon sign and a short meaning for the lunar day; a lunar self-care calendar (hair and beauty timing by lunar day); and an oracle chat to ask about a dream already recorded. Adding a birth date personalizes your dream readings and the lunar self-care calendar to your own Moon.

A new account gets three full readings, 15 Oracle messages a month and one monthly summary before the paywall appears. After that: a single reading, or a 30-day or 365-day pass. The passes do not renew on their own.

How we built it

The client is a React and Vite web front end, wrapped for iOS with Capacitor 8. The backend is Node and Express on our own server, with Postgres for the journal. Readings and the monthly summary are written by DeepSeek from a prompt built per dream; there is no fallback dictionary of dream meanings anywhere in that path. The lunar day, moon phase and moon sign are computed on our own server with astronomy-engine, with no external ephemeris service. Voice dictation goes through Groq's Whisper endpoint.

Identity on iOS is Sign in with Apple only. The same backend also serves Telegram and a social platform, with their own sign-in, which the iOS app never offers.

Purchases run through RevenueCat: two non-renewing passes and one consumable reading, all priced in App Store Connect (US storefront: $9.99, $49.99, $2.99). The client calls purchaseStoreProduct and stops there. The actual grant happens on our server from the RevenueCat webhook, never from the client's own read of the purchase result, so a tampered client cannot hand itself a pass. The webhook checks its bearer secret with a constant time comparison, and every grant is keyed to the App Store transaction id, so a retried webhook delivery (RevenueCat retries any delivery not answered with a 200, up to five times) cannot credit the same purchase twice.

Sandbox purchases go through the same webhook and are granted exactly like real ones (the environment is recorded, not blocked), so an App Review tester who buys with a sandbox account sees the same state a paying user would see.

Challenges we ran into

The interface had a translation, the product did not. Prompts sent to the model carried no language parameter, so the reading came back in whatever language the prompt itself happened to be written in, regardless of what the interface asked for. An English speaker writing a dream in English would have read the answer back in Russian. We found this on September 19 while taking screenshots for the listing. The reading and oracle prompts were fixed that morning; the monthly summary prompt followed on September 24. Voice dictation is the one path still fixed to Russian.

A glow drawn with box-shadow is a rectangle. On an SVG moon that gives a square halo around a circle, and it slipped through because we kept checking the moon itself and not the corner of its frame.

Our deploy pipeline works by copying files onto a server. A deploy from another working tree once copied an older version of the source over the live one and rolled back Sign in with Apple and the purchase handling along with it, silently, because nothing in the pipeline compared what was being shipped against what the store submission actually needed. The real fix lives in the build itself: it now refuses to produce an image at all if the App Store integration code is missing from the tree, so the mistake cannot ship again unnoticed.

Accomplishments that we're proud of

The reading is structured: seven layers generated fresh per dream, each one requested from the model in a fixed JSON structure (JSON mode, with the exact fields spelled out in the prompt). The interface treats any missing field as empty, so a reading renders in the same layout every time without a human ever touching the output.

The App Store purchase path reuses the grant function and the unique per-order idempotency key (here, the App Store transaction id) that our Telegram Stars, card and social-platform payment handlers already call, so Apple's model was an extension of existing server code rather than a rewrite. One social platform sells in-app credit packs, bought with its own in-app currency, through a separate grant function.

The product already has real usage behind it, almost all of it from one social platform. The first commit is dated February 26, 2026, and the first account other than the founder's appeared on March 4. As of September 29, 2026 (19:04 UTC), 14,349 accounts had opened the app: our own two (the founder's and an Apple test account) plus 14,347 outside users. Of all accounts, 99.5% came through that social platform and 66 through Telegram (the founder's included). Over 96% of them were created in September, about half of those in a four-day burst on September 7-10 (roughly 6,700 sign-ups), and daily sign-ups have since fallen to between 18 and 31 (September 26-29). Please read these totals as one September spike, not as a steady trend.

About one in five accounts, 2,853, wrote at least one dream, for 4,111 readings in total, and 685 of them (24%) went on to write a second dream. The app has generated 25 monthly summaries. The readings do end in something to do: 4,105 of the 4,111 include a practice, an action step and an affirmation, and across all readings 11,755 hidden patterns have been named and 11,307 old-to-new belief pairs written. Our database does not record whether anyone acted on them, so we claim no outcomes beyond that. Apart from our own one Apple test account, these are social-platform and Telegram figures, gathered while the App Store submission is still waiting on Apple's review, and the demo video uses the same snapshot.

What we learned

A feature can be fully correct on the server and still miss the user entirely if nobody wired the interface to it; we had this happen with moderation and reporting on a different product in the same family.

We chose non-renewing passes over an auto-renewing subscription. Nothing is charged automatically: access simply ends after 30 or 365 days, and the person decides again next time, on purpose.

What's next

Once the App Store listing is live: an export of a person's own journal, which the app does not have yet. The next pass on the store listing goes to the monthly summary with its repeating patterns. It is already in the build under review and already running for Telegram and the social platform, but the store screenshots show it only as a card at the bottom of the journal screen, so it gets a screenshot of its own.

Team

This entry is filed by a team of two: Alla, the founder, who built the product together with an AI coding assistant, and Svetlana, the team representative and director of the publishing company.

Built With

Share this project:

Updates

Submission history