Skip to content
← All AppsWeb app · Retired

Selfward

Selfward was a web app for turning your own words and generated art into a print-ready oracle deck. It started with a tradition's cards and let you write what each one meant to you.

My role
Independent developer
Built
April to September 2026

The editor showed the tradition's description beside your own writing. You could generate an illustration for each card, keep the deck for daily draws or buy a print-ready bundle. Selfward ran at selfward.cards for five months.

Inside the app

Selfward library showing a deck called The house I carry with four painted cards: Self, An Exile, A Manager and A Firefighter
The libraryEvery deck and card you've made, with the writing that came with it.
Selfward tradition page introducing the Internal Family Systems parts map before a deck is started
Start from a traditionEach tradition opens with an introduction and credits the sources its card text draws on.
Selfward holding screen reading moving selfward, give it a few breaths, shown while card art renders
A pause, not a spinnerRendering takes a few seconds, so the wait became a breathing prompt with one slow ambient drift.
Selfward landing page with the lowercase selfward wordmark and an invitation to build a deck in your own words
The front doorWarm ivory, deep ink and one terracotta accent. The design aimed for a book, not a dashboard.

From tradition to printed deck

  1. 01

    Pick a tradition

    A template sets the cards and their order. Internal Family Systems went live. Tarot, Jungian archetypes, zodiac and a Sacred Feminine set were drafted.

  2. 02

    Write every card

    Each card shows what the tradition says beside a blank field for what it means to you. It autosaves as you type.

  3. 03

    Render the art

    A prompt and an optional style preset go to Flux, and the image comes back in a few seconds. Regenerate as often as you like.

  4. 04

    Keep it or print it

    Draw a card a day and journal against it, or pay once for a print-ready bundle to send to any print-on-demand shop.

How it was designed and built

Designed like a book

A single design document set the direction: Fraunces for display, DM Sans for body, warm ivory paper, deep ink and one terracotta accent. The only animation is a slow six-second drift while art renders. It installs as a PWA and has a dark mode.

Traditions as content

Each tradition is a versioned YAML file holding its cards, their meanings, an introduction and the sources it draws on. A seed script loads them into Postgres, alongside fifteen art style presets that can sit on top of any prompt.

The app

I built Selfward alone across 168 commits. Next.js 15 on the App Router in strict TypeScript, with Drizzle over Supabase Postgres. A deck starts under an anonymous session cookie, so there's no sign-up before the first card. A magic link later claims the deck for an account. Every card autosaves half a second after you stop typing.

Private by default

The words you write never go to a model. Only the art prompt does. Optional likeness photos sit under a private prefix in R2, row-level security limits them to the deck's owner, and they reach the image model only as short-lived signed URLs.

Rendering the art

Prompts go to Flux schnell on fal.ai, which returns an image in a few seconds for about a third of a cent. Each render is stored in Cloudflare R2 under its own ID, with its seed and cost recorded, and served back through signed URLs.

The print pipeline

A $30 Stripe payment queues an order. Every minute a cron job composes up to five bundles with headless Chrome: a PDF per card at poker size with 3 mm bleed, a card back and a guidebook. Each bundle is zipped, stored in R2 and emailed through Resend. Stored event IDs keep a retried webhook from queuing an order twice.

Built with

Next.js 15TypeScriptDrizzle ORMSupabasefal.ai · FluxCloudflare R2StripePuppeteerResendVercel

Selfward is retired

The code is archived and the domain is lapsing. The rest of what I build is still running.