Case Study

Entropic Tarot

The first tarot app powered by true physical entropy. Three device sensors, cryptographically provable shuffles, three historic decks spanning 535 years, and the conviction that spiritual practice and scientific integrity make each other stronger.

Status In Development
Role Solo Developer
Stack React · Express · Capacitor
Price Free
Data Collected None

The false choice nobody questioned

Every tarot app on the market makes the same lazy compromise. The spiritual ones use Math.random() and dress it up with animations. The technical ones strip away everything that makes tarot meaningful as a practice. Both sides assume you have to choose: either take it seriously as a tool for reflection, or take it seriously as engineering. Never both.

That assumption is wrong. A shuffle that draws from real physical entropy — harvested from the noise floor of your device's microphone, the thermal fluctuations in your camera sensor, the chaos of your touch patterns — is more scientifically rigorous and more spiritually honest than a pseudorandom number generator seeded by a timestamp.

The entropy isn't decoration. It's the point. If you believe randomness carries meaning, then the quality of that randomness matters. If you don't believe that, you still get a provably fair shuffle that no algorithm could predict or reproduce. Either way, you win.

3

Entropy Sources

3

Historic Decks

535

Years of Tradition

78

Cards per Deck

0

Data Collected

256

Bit Hash Depth

From sensor noise to provable randomness

The entropy pipeline is the heart of the application. Three physical sensors feed raw chaos into a cryptographic funnel that produces shuffles no algorithm can predict, reproduce, or reverse-engineer.

Microphone: ambient audio captured at high sample rates contains thermal noise from the ADC circuit itself — quantum-level fluctuations in electron flow that are fundamentally unpredictable. The app samples this noise floor, not your voice.

Camera: even with the lens covered, CMOS sensors produce shot noise from photon arrival statistics and read noise from the amplification circuit. Each frame is a unique thermal fingerprint.

Touch: human motor control is inherently chaotic. The microsecond timing between touch events, the sub-pixel position drift, the pressure variations — these are biometric entropy that can't be simulated.

All three streams are concatenated and run through SHA-256 to produce a uniform, high-entropy seed. That seed feeds HMAC-DRBG — the deterministic random bit generator specified in NIST SP 800-90A — which produces the actual shuffle sequence. The result is cryptographically provable: given the same entropy input, you'd get the same shuffle, but no one can predict or reconstruct that input.

Most tarot apps use Math.random(). That's a linear congruential generator with a period of 232. Entropic Tarot draws from a space so large that the number of possible shuffles exceeds the number of atoms in the observable universe.

What made this difficult

  • Sensor entropy on mobile is adversarial Browsers throttle microphone access. iOS suspends background audio capture. Android fragments sensor APIs across manufacturers. Camera access requires user permission even for noise-floor sampling. Each platform actively fights you for doing something sensors weren't designed for. The fallback chain — mic to camera to touch to Web Crypto API — has to be seamless and invisible.
  • Offline-first PWA with real-time astronomy The app calculates planetary positions client-side using astronomy-engine — real orbital mechanics, not lookup tables. That means computing Keplerian elements, perturbation corrections, and coordinate transformations entirely in the browser. Moon phase, planetary hours, void-of-course periods — all calculated from ephemeris data without a server call. The entire experience works on airplane mode.
  • 535 years of esoteric knowledge in structured data Three historic decks — Visconti-Sforza (1491), Rider-Waite-Smith (1909), Thoth (2026) — each with distinct iconographic traditions and interpretive frameworks. Every card maps to Qabalistic paths on the Tree of Life, Hebrew letters, Golden Dawn correspondences, decan-level astrological associations. This isn't a database of keywords. It's an ontology of Western esoteric thought that had to be researched, cross-referenced, and structured by hand.
  • Cross-platform via Capacitor without losing the web The same codebase ships as a PWA, an iOS app, and an Android app through Capacitor. Sensor access, file system APIs, haptic feedback, and notification scheduling all need platform-specific bridges. The web version can't assume native capabilities. The native version can't break web semantics. Every feature needs three implementations or a graceful degradation path.
  • AI interpretation via SSE streaming Claude generates contextual readings that weave card symbolism, spread position, astronomical timing, and Qabalistic correspondences into coherent interpretation. Streamed via Server-Sent Events so the reading unfolds in real time rather than arriving as a wall of text. The prompt engineering alone required encoding centuries of interpretive tradition into system context that produces responses worthy of the source material.

Depth that respects the tradition

Most tarot apps give you a paragraph per card. Entropic Tarot gives you the full esoteric stack. Each of the 78 cards maps to a specific path on the Qabalistic Tree of Life, a Hebrew letter with its own symbolic tradition, Golden Dawn ceremonial correspondences, and decan-level astrological associations that connect the card to specific degrees of the zodiac.

The astronomical layer is live. When you pull the Tower during a Mars-Saturn square, the app knows. When you draw the High Priestess on a full moon, that's not coincidence detection — it's real-time orbital mechanics cross-referenced with traditional planetary rulerships. The astronomy-engine library computes actual celestial positions, not approximations.

This depth exists because tarot's power as a reflective tool comes from the density of its symbolic network. A card that connects to a planet that connects to a Hebrew letter that connects to a path on the Tree of Life creates a web of associations that gives the reader something real to work with. Strip that away and you're left with fortune cookie wisdom.

The false choice was always between rigor and reverence. Entropic Tarot proves they're the same thing — that caring about the quality of your randomness is caring about the quality of your practice.

Completely free. Completely private. Works offline. No accounts, no tracking, no data collection. The cards are yours.

How it's built

React 18 frontend with TypeScript, built via Vite for sub-second HMR and optimized production bundles. Express backend handles AI interpretation requests and SSE streaming. Capacitor wraps the web app for native iOS and Android distribution without maintaining separate codebases.

The entropy system operates as a layered pipeline: sensor collectors feed raw bytes into a mixing pool, SHA-256 compresses the pool into a uniform seed, and HMAC-DRBG expands that seed into the shuffle sequence. Each layer is independently testable. The DRBG implementation passes NIST test vectors.

Styling through Tailwind with Radix UI primitives for accessible, unstyled components — dialogs, dropdowns, tooltips — that get the interaction patterns right without fighting a design system. The visual language draws from the esoteric tradition: dark, contemplative, precise.

React 18 TypeScript Vite Express Capacitor astronomy-engine Tailwind Radix UI Claude AI SHA-256 HMAC-DRBG Railway

The honest retrospective

The biggest lesson was that the "spiritual vs. scientific" framing is a false dichotomy manufactured by people who are lazy about both. The moment you commit to genuine cryptographic randomness, the spiritual practitioners respect it more, not less. And the moment you commit to genuine esoteric depth, the technical implementation becomes more interesting, not less.

Sensor entropy collection on mobile is harder than any documentation suggests. Every browser, every OS version, every device manufacturer has different opinions about when you're allowed to access a microphone, how quickly a camera initializes, and whether touch events fire at 60Hz or 120Hz. The fallback chain isn't an edge case — it's the primary experience for most users.

Running real orbital mechanics client-side was a revelation. astronomy-engine is a masterwork of numerical precision — but it means your app is computing planetary positions using the same algorithms as professional observatory software. On a phone. Offline. The fact that this is even possible in a browser is something I still find extraordinary.

I built this because I wanted a tarot app I could actually trust — one where the shuffle was real, the knowledge was deep, and the privacy was absolute. It didn't exist, so I made it. That's the whole story.

Back to Portfolio