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
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.