A daily horoscope app that explains the planetary movements behind every reading for grounded, credible insights
Challenge: Most horoscope apps deliver generic, vague readings with no explanation of why they apply to a specific sign on a specific day. Users have no reason to trust the output, and the experience feels disconnected from any real astrological basis.
Solution: Skyread is a bilingual daily horoscope app powered by Google Gemini AI. For every reading, it surfaces the actual planetary movements driving the forecast — a "Sky Explainer" and "Sky Snapshot" that tell users what is happening in the sky and why it matters to their sign, making every reading feel grounded and credible.
A ~100-word personalized horoscope for the user's selected zodiac sign. Generated fresh each day via Gemini AI, tone is atmospheric and credible rather than generic. Supports English and Mandarin Chinese.
Plain-language explanation of 2–3 real planetary movements occurring today and how they specifically influence the user's sign. Transforms the reading from vague advice into an astronomically-grounded forecast.
A structured panel showing 3 key planets, their current astrological position (e.g. "Mars in Leo"), and a brief influence note. Gives users a quick at-a-glance view of the celestial landscape.
Automatically saves readings to localStorage. Users can browse and revisit up to 30 days of past horoscopes with full detail — daily reading, sky explainer, and snapshot — all available offline.
One-tap language switch between English (EN) and Mandarin Chinese (ZH). Switching language triggers a fresh AI-generated reading in the selected language, stored separately in the archive.
Readings are cached by date, sign, and language — the app only calls the Gemini API once per combination per day. Revisiting the app on the same day instantly loads the cached reading from localStorage.
Skyread uses Google's Gemini 3 Flash model with a strict JSON response schema. The prompt requests a daily reading, sky explainer, and planet snapshot — all returned as a typed JSON object, eliminating parsing errors.
The API call passes a full responseSchema specifying the exact shape of the output — date, reading, skyExplainer, and a snapshot array — ensuring consistent, structured AI responses every time.
The prompt dynamically instructs Gemini to respond "in Mandarin Chinese (Simplified)" or "in English" based on the user's selected language. The entire output — including planet names and positional descriptions — is returned in the target language.
The Gemini API call uses ThinkingLevel.LOW for fast response times. Horoscope generation does not require deep reasoning — speed and creativity matter more than analytical depth for this use case.
{date}_{sign}_{language} — prevents duplicate API calls for the same sign/language combination on the same day/[\u4e00-\u9fa5]/) rather than storing a language tagnpm run dev — Start Vite dev server with hot module replacementnpm run build — Build the React SPA to dist/npm run preview — Preview the production build locally