Tyche is a psychedelic single-page web app that picks something random from a list — 27 official lists shipped (cuisines, dishes, Disney rides, workouts, party games, scenarios, etc) plus custom lists you can build yourself. Five animation styles wrap the same randomizer logic: slot machine, coin flip, tumbling die, card flip, and a triangular rock-paper-scissors prism. No backend, no accounts, no telemetry — everything lives in browser localStorage. Live at tyche.awrylabs.com.

Live · Spin now

Tyche

A psychedelic randomizer for the small decisions you can't make. Pick a list, hit spin, get an answer. 27 official lists ship with the app; five animation styles wrap the same randomizer logic so the visual matches the metaphor of the choice. Build your own lists, combine them into multi-slot rolls, or just use the standalone coin / dice / cards / RPS utilities. Named for Τύχη — the Greek goddess of fortune, chance, and providence.

React 19 TypeScript 6 Tailwind 4 Mobile-first
🎲 Spin at tyche.awrylabs.com rhoekstr/tyche
tyche.awrylabs.com · last commit 2026-05-07 · previously So Random! at sorandom.awrylabs.com

At a glance

Official lists 27 Cuisines, dishes, Disney rides, workouts, party games, scenarios, and more — fetched from a manifest at app load.
Animations 5 Slot · coin · dice · card · RPS prism. Each conforms to the same animation interface so any list can use any of them.
Custom Roll slots 8 Combine up to eight lists or utility randomizers into one decision; save and share configurations as JSON.
Tracking 0 No accounts, no analytics. All state — preferences, custom lists, configs — lives in browser localStorage.

Five ways to land an answer

Five animation components implementing the same { pool, result, isSpinning, onComplete } interface. Each list declares a default animation, and the user can override it from the picker on any pack page.

Slot
Slot machine
Vertical reel of 24 padding items + the result. Cubic-bezier easing, confetti burst on completion, flash reveal. The default for any pack with more than 52 items.
Coin
Two-sided 3D flip
Real preserve-3d disc, four full Y-rotations, randomizes the front face on every back-visible pass and locks to the result on the final pre-completion phase so there's no swap-pop.
Dice
Tumbling cube
Six positioned faces, X+Y rotation with different easings per axis. Per-frame back-face content swap, last-frame lock so the settled face is always the result. Defaults for d4–d20 lists.
Card
Card flip
Coin's pattern, rectangular. Renders a real card layout (rank corners, big suit, red ♥/♦) when items have suit icons; otherwise centered text. Defaults for any pack of 52 or fewer items.
RPS
Triangular prism
Three faces at 120° intervals. Result face is chosen at spin start; content swap happens when that face goes back-facing. Works on any pool size — original 3-item RPS or a 36-item adjective list both land cleanly.
Result
Label below
Small faces (coin, die, card) can't always fit "Star Wars: Rise of the Resistance." A separate result label component renders the full text + icon below every non-slot animation.

Build your own

The 27 official lists are a starting point, not a ceiling. Tyche has a full custom-list editor and a multi-slot composer for harder decisions.

/custom
List editor
Form builder for title, icon, optional filter dimensions, and per-item rows — or paste a Pack JSON object directly. Bulk-add textarea for fast value-only entry. Lists save to localStorage and hot-inject into the same pack cache the official lists use, so they show up everywhere immediately.
/multi
Custom Roll
Combine up to eight lists or utility randomizers (coin / dice / cards / RPS) into one composite decision. Each slot has its own pack picker, animation override, and filter editor. Save named configs, export and import as JSON.
Filters, formally

Lists can declare optional filter dimensions (e.g. course, cuisine, dietary) and items declare which values they belong to. The runtime treats empty arrays as "no filter on this dimension — accept anything," so the default state of every list is "all chips deselected, full pool." Users opt in by selecting chips. AND across dimensions, OR within.

All state stays on your device

Tyche is a static site served from GitHub Pages. There is no origin runtime, no account system, no telemetry, and no analytics calls. Everything you create or set is yours alone, in your browser.

tyche:preferences

Sound, animation speed, reduced motion. Synced across tabs via the storage event.

tyche:custom-packs

Lists you've built. Stored as an array of Pack objects under the tyche: prefix.

tyche:multi-configs

Named Custom Roll configurations. Settings → Export All Data writes the whole bundle as JSON; Import reads it back.

Why "Tyche"

Τύχη — Tyche — was the Greek goddess of fortune, chance, and providence. Romans called her Fortuna. She's typically depicted with a rudder (steering fates), a cornucopia (abundance), and a wheel that turns up and down without warning. Cities adopted her as a patron, hoping she'd tilt outcomes their way. Naming a randomizer after her is on-the-nose in the best way.

The app shipped originally as So Random! at sorandom.awrylabs.com and was renamed to Tyche in mid-2026 along with the move to its current domain. Old bookmarks redirect.

Run it locally

Clone & serve
git clone https://github.com/rhoekstr/tyche.git
cd tyche
npm install
npm run dev          # localhost:5173 (or $PORT)
npm run build        # tsc -b && vite build
npm run deploy       # build + cp 404.html + gh-pages -d dist

Adding a list is a two-file change: drop a Pack JSON into public/data/packs/ and add a manifest entry. No rebuild needed in dev — just refresh.