Inspiration

Seeing Reddit's Daily Games Hackathon in my email was my cue to finally dive into game development. But, the deeper motivation was personal.

I don't fit the typical "always-on" social media user. The current speed of feeds and trends can make it feel like you're being left behind, even lose your own identity. I care about places, both physical and virtual, where you can actually talk and listen, where repeating yourself isn't a nuisance and abstract ideas have room to breathe. Real conversation often feels like a dying art. I believe we can revive it, but only if we first sit alone with ourselves, adopt a slower pace, and understand where we are. Then we can show up with something real to offer.

Tarot helped me do that. Contrary to its popular use, I use it as a conversation framework rather than fortune-telling. It taught me how to slow down and think more critically about my own circumstances. Oddly enough, the cards kept stringing together consistent narratives that pointed at the things I knew I needed to change but was stubbornly refusing to face. It gave me structure to be honest with myself instead of staying stuck in the same loop.

A disclaimer: tarot has deep roots in divination and in the practices of readers who use it for spiritual guidance. I respect their craft and I'm not here to dismiss or compete with that. Casually Tarot is my secular, reflection-focused approach for anyone who finds that useful or wants to start learning about it.

I've always used games as a way to step back from the chaos of the world. So I asked: what if the "game" didn't just help you escape, but gave you the same kind of honest pause that tarot gave me? Casually Tarot is designed to be that.

What it does

Casually Tarot is secular, reflection-focused tarot experience built for r/casuallytarot. It works as a mirror, not a crystal ball.

You start by choosing a mode. Daily Draw pulls a single card for what to focus on today. Three-Card builds a personalized narrative from your Recent Past, Current Self, and Possible Future. Celtic Cross, if you have the time for it, uses ten cards for a fuller, deeper reading. Next, you set an intention: Relationships, Direction, A Choice, Feeling Stuck, or Open Draw. Then, either pick a preset question or write your own. Once you have your question locked in, you draw from the full 78-card deck. Every card can appear upright or reversed, and its meaning shifts based on the intention you set, so the same card reads differently depending on what you're actually working through. After the reveal, you can dive deeper into the card's meaning or optionally share your reading to r/casuallytarot so others can add their perspective. Check in with yourself first, then bring that into conversation if you want.

How I built it

Casually Tarot is built with Devvit Web using Phaser.js as the game engine and TypeScript across client and server. The server runs on Express and uses Devvit's Reddit and Media APIs for post creation and image uploads.

I started with the two core screens: a main menu and the card reveal, supporting only the Daily Draw mode to learn the Phaser way of doing things. Once that loop worked, I probably spent more time than I'd like to admit fine-tuning animations and transitions: fades, slides, and background effects through Phaser's tween system to get the feel right. Then, I went back to the main menu to layer in the full flow: multiple spread modes, intention selection, and question input. Each screen uses a factor-based layout system so game objects and positioning scale across different screen sizes. As the main menu scene grew in complexity, I refactored the config into separate constant files per step so each part of the flow can be edited in isolation (there's probably a better way to do this).

The card content was a separate effort. Every card in the 78-card deck has tailored upright and reversed meanings for each of the four intention categories (Relationships, Direction, A Choice, and Feeling Stuck), plus a fifth "Open Draw" option that uses the card's default meaning. That means there are over 600 unique intention-specific interpretations so the same card reads differently depending on what you're actually working through.

The share feature lets users post their reading to r/casuallytarot with card images and a summary of the reading attached as comments. The client captures a snapshot of the revealed card(s), the server uploads it via Devvit's Media API, creates the post, and attaches the summary as a comment. A fallback was also implemented for when Reddit creates the image post asynchronously and the API doesn't return the new post id.

I used Cursor as my AI coding assistant throughout the entire build.

Challenges we ran into

Local Development The full dev pipeline rebuilds the client, server, and Devvit app together, which made iteration slow early on. Once I figured out I could run only the client for frontend changes, the feedback loop got much faster. But anything involving the Reddit API still required the full rebuild-and-deploy cycle.

Share to Reddit This feature went through several iterations. I first tried a flow where users could preview a draft post before submitting, but that path didn't work out within Devvit on desktop for some reason. I pivoted to server-side post creation with the card image as the post and a reading summary attached as a comment. That introduced its own problems: Reddit sometimes creates image posts asynchronously and the API doesn't return the new post ID, so I had to build a fallback to find the post after the fact. I'd say the image composite itself was non-trivial as the app needed to support the following: capture the Phaser canvas, resize and compress for Celtic Cross (which has 10 cards), and overlaying the user's Snoovatar, which required a server-side proxy to avoid CORS issues.

Phaser Masks The rounded-rectangle card masks were harder than expected. Phaser's GeometryMask doesn't track the parent container's transform, so when cards slide during transitions, the masks stay fixed in world space. I ended up with separate mask graphics for card fronts and backs, kept outside the slide container, with their positions synced to the cards' world coordinates during tween updates.

What's Next for Casually Tarot

Sound and Music I wanted ambient sound and music to add atmosphere to the readings and match the mood of each intention category, but it's another full layer on top of everything else. Between the UI, animations, card content, and the share pipeline, I fear that I'm running out of time and I don't want to risk cheapening what's already built. In the meantime, I highly recommend listening to Aria of the Souls by Shoji Meguro on repeat before launching the game!

Actual Tarot Art The app currently uses public domain card art by the Bibliothèque nationale de France. I'd love to feature original card art from Reddit artists, or support multiple deck themes that users could choose from.

Draw Limits One draw per day for Daily, per week for Three-Card, and per month for Celtic Cross. The structure is there with Redis. It just needs per-user tracking with cooldown timers. This would make each reading feel more intentional rather than something you spam.

Community-Shaped Card Meanings Right now, all 600+ interpretations are static. I'd like to explore letting the community submit and vote on alternative meanings, so the deck evolves with the people using it.

A Compendium Currently, a placeholder on the main menu. This will be a browsable library of all 78 cards where users can explore the deck freely. A place in the game to read meanings across different intentions, see the art, and learn about tarot and the cards outside of a reading.

Built With

Share this project:

Updates