A free, privacy-first Tarot de Marsella reading web app that runs entirely in the browser, with no registration and no accounts. ElTarot.es offers four reading modes (a daily card, a 3-card spread from the 22 Major Arcana, a 3-card spread from the full 78-card deck, and an AI-powered reading), all wrapped in card flip and shuffle animations that mirror a native experience. It is bilingual (Spanish/English with auto-detect) and installable as a PWA for full offline use. This is the web product, distinct from the earlier Flutter “Tarot Marsella” mobile app.
Features
- Four Reading Modes: Daily card (one card per calendar day with rotating messages), a 3-card spread over the 22 Major Arcana, a 3-card spread over the full 78-card deck, and an AI-powered reading (Spanish only, one per day)
- AI-Powered Interpretations: Write a custom question and receive a Claude-generated reading of a 3-card spread, gated to one per device per day and exportable to a branded A4 PDF
- Animated Card Mechanics: Multi-phase shuffle (collect, riffle, deal) and a 600ms card flip animation, with swipe-down and a floating refresh button to redraw spreads
- 22 Major Arcana Library: Dedicated card detail pages with image, name, essence, and per-card sections for Meaning, Advice, and reflection questions
- Share as Image: Generates a branded PNG of a completed spread with logo, all three card faces, and Past/Present/Future position labels
- Bilingual & Offline-First: Full Spanish/English UI and interpretations, language switching with auto-detect, and a service-worker PWA that precaches all 78 card images and the card data for offline reading
- Privacy-First by Design: No registration, no accounts, consent-gated analytics off by default, and a first-launch disclaimer and responsibility acceptance flow
Tech Stack
- Astro 6 with the @astrojs/node adapter (standalone); static output with on-demand SSR for the reading API route
- Vanilla TypeScript app layer with no UI framework (no React, Vue, or Svelte)
- Hand-rolled Store class for state management, persisted via localStorage
- Claude via the @anthropic-ai/sdk for AI readings, served from an /api/reading POST endpoint
- jsPDF for PDF export and the Marcellus font (Fontsource) for typography
- Service worker with a hashed precache version stamped by a postbuild step
- Schema.org JSON-LD, hreflang alternates, Open Graph/Twitter cards, and an llms.txt endpoint for SEO and LLM discovery
AI-Powered Readings
The AI reading endpoint validates the question and three drawn cards, builds a prompt, then calls Claude (model claude-sonnet-4-6, configurable via TAROT_MODEL) with a system prompt that channels a Jodorowsky-informed reader persona. Responses are constrained to symbolic, emotional guidance in Spanish (180 to 280 words), explicitly forbidding predictions and diagnoses, and every result is shown alongside a disclaimer that it is emotional accompaniment, not fortune-telling.
Frequently Asked Questions
What is ElTarot.es?
It is a free, privacy-first Tarot de Marsella reading web app that runs entirely in the browser with no registration and no accounts. It offers four reading modes: a daily card, a 3-card spread over the 22 Major Arcana, a 3-card spread over the full 78-card deck, and an AI-powered reading. This is the web product, distinct from my earlier Flutter “Tarot Marsella” mobile app.
What platform does it run on?
The web, and it is installable as a PWA. A service worker precaches all 78 card images and the card data, so it works fully offline once installed. The UI is bilingual (Spanish/English with auto-detect).
What is it built with?
Astro 6 with the @astrojs/node adapter (static output with on-demand SSR for the reading API route), a vanilla TypeScript app layer with no UI framework, and a hand-rolled Store class persisted via localStorage. The AI readings call Claude through the @anthropic-ai/sdk from an /api/reading endpoint, and PDF export uses jsPDF.
How do the AI readings work?
You write a custom question and get a Claude-generated reading of a 3-card spread, gated to one per device per day and exportable to a branded A4 PDF. The endpoint calls Claude (model claude-sonnet-4-6, configurable via TAROT_MODEL) with a Jodorowsky-informed reader persona, constrained to symbolic guidance in Spanish (180 to 280 words). It forbids predictions and diagnoses, and shows a disclaimer that it is emotional accompaniment, not fortune-telling.
