Every few weeks someone asks us the same question about willow-whispers.com/free-tarot-birth-card-calculator: "how does it actually figure out my cards?" So instead of answering that in a DM for the hundredth time, here's the full write-up — the math behind birth cards, the stack we leaned on to ship it, and the handful of UX decisions that made a numerology formula feel like an actual ritual instead of a spreadsheet.
The idea in one sentence
Give someone two numbers (their birth month and day), reduce the full birth date down to the Major Arcana, and hand back a Personality card and a Soul card with a short reading that blends both — wrapped in an interaction that feels closer to drawing a card than filling out a form.
The math first, because it drives everything else
Tarot birth cards aren't arbitrary — they come from a numerology reduction that's been floating around tarot circles for decades. The short version:
- Take the full birth date (MM/DD/YYYY) and sum every digit.
- If the sum is above 22, reduce it again by adding its digits together, since there are only 22 cards in the Major Arcana (0–21).
- That final number is your Personality card — the "how you show up" card.
- If the first reduction landed above 21, the number before the final reduction becomes your Soul card — the deeper, quieter influence. If it didn't need a second reduction, your Soul and Personality card are the same.
That's a handful of lines of arithmetic, but it's the kind of logic you want unit-tested within an inch of its life — tarot people will absolutely notice if your Hierophant shows up as a Hermit. We wrote the reducer as a small, pure function with no side effects, fed it a table of known birthdays and their published birth cards from reference books, and asserted against that table before it ever touched the UI. Pure functions plus a fixture table turned out to be the simplest way to trust a formula nobody on the team invented.
The stack
- Frontend framework: A component-based JS framework (React-family) driving the form, the card reveal, and the reading panel as isolated, testable pieces — the month/day selectors, the card flip, and the "Where Your Cards Meet" reading are three separate components that only communicate through the computed card numbers.
- Styling: Utility-first CSS for the layout and the soft sage-and-cream gradient background, with a handful of hand-rolled CSS custom properties for the Willow brand palette so the greens stay consistent across the marketing site and the calculator.
- Animation: A lightweight animation library for the card-flip sequence — the three-card fan that slides in, then flips to reveal artwork, is spring-based rather than a fixed-duration tween, which is what makes it feel tactile instead of like a loading spinner.
- Content/readings layer: The 22×22 grid of "where your cards meet" readings (231 unique pairings once you account for symmetry) lives as structured content rather than hardcoded strings in the component — each entry has a title, a short blend paragraph, and metadata for the weekly-reading upsell. That let our writer (hi, Zach) edit copy without touching code, and let us swap in new readings without a redeploy.
- Card artwork: Each Major Arcana card is a static, optimized image asset served responsively — lazy-loaded so the initial page weight stays light, since most visitors arrive from search and bounce fast if the hero takes too long to paint.
- Analytics and consent: Google Tag Manager plus a consent-management layer so EU visitors get a real cookie choice before anything fires — not just a banner for show.
- Hosting/CDN: Static-first deployment behind a CDN, because the page itself has zero server-side state — the entire calculation happens client-side in milliseconds, so there's no API round-trip between picking your birthday and seeing your cards.
Why client-side, not an API call
It would've been easy to POST the birth date to a /api/birth-cards endpoint and return JSON. We deliberately didn't:
- Privacy. A birth date is personal. Keeping the whole calculation in the browser means nothing about when you were born ever has to leave your device just to show you a tarot card.
- Speed. The reveal animation depends on an instant result. Shaving out a network round-trip means the "Reveal my birth cards" button can kick off the flip animation the same frame it computes the cards.
- Simplicity. No server, no database for this specific feature, no cold starts. The reducer is cheap enough to run a thousand times a second on a phone from 2016.
The UX details that took longer than the math
Honestly, the numerology was the easy part. The things that ate actual development time:
- Making two dropdowns feel like a ritual. Month and Day selectors are about as mundane as form inputs get. We spent real effort on the empty states, the hover glow on the "Reveal my birth cards" button, and timing the fan-of-three-cards animation (two revealed cards plus a branded card back in the middle) so it reads as a deliberate reveal rather than a page re-render.
- The pairing copy. Writing 231 distinct "where your cards meet" blurbs that each feel specific — not a template with two nouns swapped in — was the actual content-engineering problem. We built a small internal review tool that lets the writer page through every card-pair combination before publish, flagging any entry that was still a stub.
- Mobile-first card layout. The three-card fan needed to degrade gracefully from a wide desktop spread to a stacked mobile view without looking like an afterthought, since the majority of our birth-date searches land on mobile.
- SEO scaffolding. Each card page (Personality × Soul combination) is addressable and crawlable on its own, which matters a lot for a tool whose entire audience arrives by searching their specific birth card by name.
What we'd do differently
If we rebuilt this today, we'd probably pull the reading copy into a proper headless CMS from day one instead of a structured JSON file — at 231 entries it's still manageable, but it's creeping toward "needs a real editing interface." We'd also add a shareable result state (a URL or image export of your two cards) earlier; right now sharing your result means a screenshot, and that's the single most requested feature from the people who've used it.
Try it yourself
If you haven't run your own birth date through it, the calculator is live here: Free Tarot Birth Card Calculator (https://willow-whispers.com/free-tarot-birth-card-calculator). Curious what your Personality and Soul cards are — and whether the math checks out against what you already know about yourself? Drop your cards in the comments, I'd love to see how often people say the reading actually landed.
Top comments (0)