All work

Tarot reader — booking, payments, video shop

Paid bookings and a video shop where each recorded reading reaches only the person who bought it.

Stack:
  • Astro
  • React
  • Cloudflare Workers
  • Cloudflare D1
  • Cloudflare R2
  • Stripe
  • Workers AI
  • Claude API
Launch video · 9:16
  • ≈27API endpoints for booking, admin, payments, video shop and chunked upload
  • 20 minphone videos uploaded in resumable chunks
  • 3months of live updates on the client's real requests

Cards, payments and videos only the buyer can open

A night-sky site with a card game, a booking engine with a shared pool of seats, payment before every slot or video, and phone uploads that become a private library.

Tap a block to see what it does.

  • Input
  • People
  • Logic
  • AI
  • Infrastructure
  • Output

Input

Public site

Astro SSR on Workers. React islands for the booking wizard, a draw-a-card game and a FAQ chat; Lenis for smooth scroll.

  • Astro
  • React
  • Lenis

Hands to Booking engine

The fanned cards of the home, a frame from the screen recording

The problem

A tarot reader gave readings over video calls and handled her agenda and payments by hand. She also wanted to sell recorded readings. The site had to take bookings with limited seats, charge in advance and deliver each video only to its buyer.

What I built

  1. I forked the booking engine from an earlier trainer project into its own repo and extended it with shared seat pools and agenda openings and closures.
  2. I added Stripe Checkout with a webhook whose signature I verify with Web Crypto, without the SDK; with no keys the site stays in demo mode.
  3. I built the video shop: catalogue, free preview, single purchase, and a personal library opened by an emailed link that installs as a mini-app.
  4. I made uploads from her phone go to R2 in parts that resume after an interruption; a short voice note about the video becomes a draft description and tags (Whisper, then Claude) that she can edit.
  5. I gave the home a draw-a-card game, a FAQ chat and ambient sound, as React islands.

The hard part

Long phone videos. Her 10 to 20 minute recordings arrive as HDR HEVC at about 12 Mbit/s: they stalled every few minutes and did not play in many browsers. Uploads go to R2 in resumable parts, and a scheduled job makes a 720p H.264 copy at about 2 Mbit/s that the player serves instead, keeping the original intact.

Result

Live on the client's domain and updated for three months on her real requests, such as agenda openings and closures and a shared pool of 10 seats. Production bugs, like a blank booking page caused by an expired date limit, were fixed in the same loop.

My role

Solo client project. I handled the client and turned her requests into tasks, configured Stripe, R2, domain and secrets, and tested payments and uploads on a phone; Claude Code wrote 71 of the 72 commits.