A dialogue-driven tarot reading experience
Taros is an AI-powered tarot reading app that talks with you rather than at you. Instead of dropping a static card meaning on you, it asks follow-up questions, listens to your answers, and uses everything you share to give you a reading that actually fits your situation.
Seven cards are shuffled and surfaced at random. You pick one. The AI takes it from there.
Tarot reading has always been something interesting to do with family or friends — whether you are spiritual or not. It opens up conversations, sometimes with other people, sometimes just with yourself. You often land on an answer just by saying a question out loud.
That quality is what this app tries to bring online. A reading you can reach for whenever you want it.
| Feature | Description |
|---|---|
| Dialogue-first reading | The AI asks you questions to build context before giving any interpretation |
| 7-card shuffle | Cards are drawn randomly each session. No fixed layout |
| Free summary | Every user gets a short reading at no cost |
| Pay-what-you-want | Full detailed readings use a flexible payment model via LemonSqueezy |
| Email delivery | After payment, the full reading is sent to you automatically via Resend |
| No account needed | No login, no saved data. One session, one reading — like the real thing |
- Frontend — Vue 3, Nuxt
- AI — Claude API (server-side, keys protected)
- Payments — LemonSqueezy
- Email — Resend
Kept intentionally simple. No user accounts, no database, no stored reading history. The experience mirrors an in-person tarot reading — it happens, and then it is yours to keep via email. The server layer exists only to protect API keys.
server/api/reading.post.ts — server-side handler, protects API keys
app/api/tarot.ts — browser-side calls to the server
composables/useTarot.ts — session and card state
composables/useReading.ts — AI response handling
composables/useVoice.ts — microphone logic
Card animations — Multi-step animations need a written map before you write a single line. Even small details like fade-out timing need to be planned step by step, or they break each other.
Payment API setup — Integrating LemonSqueezy took more time than expected. Webhook timing and email triggers both needed careful handling.
When there are several steps of animation, plan every keyframe on paper first — including the small ones like when a fade starts and ends. Without that map, steps start breaking each other in ways that are hard to trace.
- English only at this stage
- Card layout is fixed to a 3-card past / present / future spread
- No reading history or session saving
Personal project — not open for contributions.