-
-
Saju Today — your birth chart, one line a day
-
Three-step intro: like astrology, but based on your birth time. Just enter your birth date and time
-
Today: your four pillars and the day's one-line reading, with no tap
-
A full Today reading, with the AI disclosure under every card
-
Stars: Saju and your Western sun/moon signs, side by side
-
Week: the shape of your next seven days
-
Match: the energy between two birth charts. How to work together, never a score
-
My Chart: four pillars, your day master, and RevenueCat-powered pricing (Pro, or credits that never expire)
-
Share your day master card, then go deeper: Pro $6.99/mo or 10 readings for $17.99
-
Full Korean UI and readings, in the same app
Inspiration
Saju (四柱, "four pillars") is the Korean reading of a birth chart from the year, month, day and hour you were born — the cycles of seasons and five elements rather than star positions. It is a mainstream New Year ritual in Korea, yet most apps are either a wall of Chinese characters or a paid phone consultation. Western astrology apps solved the "one line a day" habit; nobody had done it for Saju, and nobody had done it in plain English. Saju Today is that: like astrology, but based on your birth time instead of the stars.
What it does
- Zero-tap daily line. Open the app and the day's one-line reading is already there, computed from your four pillars and today's stem-branch, no button to press.
- Your chart, always visible. Four pillars, day master (your core element), today's element and a five-element balance strip sit above every reading — the chart is the product, the AI text explains it.
- Deeper readings on demand: Today (free) · Week (7-day shape) · Match (the energy between two birth charts — framed as how to run the relationship, never a score) · Stars (Saju and Western sun/moon signs read side by side: where the two skies agree and where they split).
- Share card. An "I'm a Water day master" card with a five-element mascot, exported as an image for chat and social.
- Two languages, one product. Full English and Korean UI and readings; English readings never use Chinese characters.
- Honest framing. Under every reading: "Every reading is generated by an AI language model (Google Gemini) applying traditional Saju concepts. It is for reflection and entertainment — not a prediction of the future, and not medical, psychological, legal, or financial advice." A free-text question box carries a crisis-support pointer (findahelpline.com). The service is not directed to children under 13.
How we built it
- Client: React + Vite inside a Capacitor 8 Android shell. All chart math (four pillars, ten gods, element relations, solar terms, Western sun/moon signs) runs on-device in plain JS — the chart appears instantly and offline; only the prose needs the network.
- Readings: Node.js server on
saju.hun-is.comstreams Google Gemini output (gemini-3.1-flash-lite for the daily line, a larger model for deep readings) through persona prompts that were hash-frozen for release after a copy audit. Answers are marker-structured so the UI can render cards (e.g. EAST/WEST/MEET/SPLIT in Stars) instead of raw paragraphs. - Identity & data: Firebase Auth (guest first, Google to upgrade — the guest's history carries over) and Cloud Firestore with per-app quota buckets.
- Monetization — RevenueCat:
@revenuecat/purchases-capacitor13.2.2. Three Play products —saju_pro_monthly(Pro: 10 deep readings a month),credits_1,credits_10— surfaced as one RevenueCat offering; prices in the paywall come fromgetOfferings(), not from copy.app_user_idis the Firebase uid, and a RevenueCat webhook on the server grants entitlements (INITIAL_PURCHASE/RENEWAL→ Pro,NON_RENEWING_PURCHASE→ credits,EXPIRATION→ free,CANCELLATION+CUSTOMER_SUPPORT→ automatic refund revocation). 14 webhook unit tests; all three SKUs verified end-to-end with a Play License Tester before submission. - Release pipeline: Play Developer API scripts for AAB upload, listing updates and screenshot upload; store screenshots are generated by Playwright against an isolated Firebase emulator so the listing never drifts from the build.
Challenges we ran into
- Google Play's new-account gate. A personal developer account must run a closed test with 12+ opted-in testers for 14 continuous days before it can even apply for production. We recruited testers, tracked opt-ins daily, and only got production access on 08-24 — which is why the public release lands in September rather than August.
- Purchase identity. An early real-device test bound a purchase to the wrong user because a JS flag assumed the SDK was still configured for the current uid. The fix: never trust client state — ask the native SDK for
getAppUserID()on every purchase and assert it matches beforepurchasePackage. - Web payments were a dead end. Card-network category blocks meant web checkout couldn't be relied on for this app category, so the Android app is RevenueCat-only and web checkout is parked; the web build's job is to be the teaser.
- Copy discipline. Apps in this category drift into "advice" and "prediction" language fast. We ran a legal/compliance review on every copy change, replaced "advice" everywhere, and froze the six prompt files by hash before release.
- Emoji in headless Chromium. The first set of store screenshots baked tofu boxes into the PNGs because the headless browser had no emoji font. We replaced every emoji icon with inline SVG and regenerated the set — the fix is in the product, not in the screenshot script.
Accomplishments that we're proud of
- A Saju chart that reads like an app screen, not a textbook: chart first, prose second, one line a day.
- A monetization path that works from day one: RevenueCat offering → Play billing → server-granted entitlements → refund revocation, all tested before launch.
- Bilingual from the start without two codebases.
What we learned
- The Play closed-test gate is the real schedule, not the code.
- Never let the client decide who is paying — verify identity at purchase time.
- For an AI product in a sensitive category, the disclosure sentence is a feature: it's on every screen, with the model named.
What's next for Saju Today
- Post-launch: retention loop (daily push at the user's morning), share-card export polish, "what's on your mind" follow-ups.
- Growth: English-market store search (ASO) and a web teaser → store deep-link funnel.
- Pricing experiments via RevenueCat offerings (annual Pro, first-week trial).
Log in or sign up for Devpost to join the conversation.