20 answers · classic · random · local

Ask the Magic 8-Ball

Type a question, shake the ball, and watch your fate appear. All 20 classic answers — 10 affirmative, 5 non-committal, 5 negative — picked with cryptographic randomness.

Magic 8-Ball
Answer
—
ready
Pool
20
classic
Affirm
10
50%
Negative
5
25%
crypto random · 20 answers
input · question

Frame the question for yourself, then shake. The ball draws from 20 fixed answers used by the original Mattel toy.

output · 8-ball
8
Quick Start

How to consult the 8-ball

The classic Magic 8-Ball uses a 20-faced icosahedron floating in dark liquid. We replicate the original pool with cryptographic randomness, no batteries required.

  1. 01

    Frame the question

    Yes/no questions work best — that's what the original pool was tuned for.

    Inputs are treated as UTF-8 throughout the pipeline and validated client-side as you type — nothing dispatches until the value is well-formed.

    questioninpututf-8client-sidevalidated
    input · texttext · set
    Will it ship?
    loaded · parsedclient-side
  2. 02

    Shake the ball

    The dramatic shake delay is half the fun. Crypto random picks one of 20 answers.

    Each toggle re-computes through a memoised hook, so flipping options never resets your input and the UI stays snappy on large inputs.

    shakeoptionslivememoisedtoggles
    roll · memoised20 · live
    shake → answer
    options set · memoisedlive
  3. 03

    Read the verdict

    Green for affirmative, blue for non-committal, red for negative.

    Randomness — where used — comes from crypto.getRandomValues, never Math.random. Heavy work sits in useMemo.

    readcomputeinstantlocaldeterministic
    out · instantanswer · computed
    Most likely
    computed · instantinstant
  4. 04

    Shake again

    Every shake is independent — don't dispute the ball.

    Copy writes through navigator.clipboard and downloads use a Blob — zero network traffic. Same input plus same options always yield the same bytes.

    repeatcopydownloadzero-networkreproducible
    ok · copiednext · copied
    Reply hazy
    shipped · ready to shipsuccess
Pro tips

Pro tips for everyday utilities

Reach for crypto.getRandomValues

Cryptographically random for IDs, tokens, salts. Math.random is for animation and games, not security.

Sort IDs lexicographically

UUID v4 has no time ordering. Use ULID or UUID v7 if you need sorted IDs.

Mock data with seeds

Faker-style libraries can be seeded so tests are reproducible. Embed the seed in the fixture file.

Reference cards beat memory

Cheatsheets for Vim, Git, Docker, Linux signals are faster than man pages when you’re mid-flow.

Browser APIs vary

Touch events, gamepads, and clipboard differ across vendors. Feature-detect before use.

Persist in the right place

localStorage for user preferences, sessionStorage for transient state, IndexedDB for structured data.

Use Cases

When to ask the 8-ball

Tiebreakers, ice breakers, and decision fatigue.

Casual tiebreaker

Slightly more theatrical than a coin flip. Random values come from crypto.getRandomValues — cryptographically secure for tokens, salts, and session IDs. Math.random is deterministic enough for animations but predictable enough to be a security bug.

CSPRNG-backed

Meeting kickoff

Drop in as an ice breaker for remote teams. Pair with hashids, ULID, or UUID v7 when you need both random and sortable — useful for primary keys, public-facing IDs, and event log ordering without a sequence column.

reproducible

Writing prompts

Force a yes/no plot decision when stuck. Output is deterministic given the same seed, so fixtures and tests stay reproducible across CI runs and contributor machines. Embed the seed in the fixture file for full replay.

snappy

Standup volunteer

Let the ball pick who goes first. Heavy work runs through useMemo so the UI stays snappy on large inputs. Same input + same options yields identical bytes — the kind of stability snapshot tests rely on.

feature-detected

Game night

Use as a fortune teller in tabletop games. Storage tools persist to the right backend: localStorage for user preferences, sessionStorage for transient state, IndexedDB for structured data. Pick the right shelf and quota worries disappear.

deterministic

Decision fatigue

When small choices pile up, outsource to the ball. Browser feature detection: clipboard, fullscreen, gamepad, and Web Bluetooth APIs gracefully fall back when unavailable. No surprise white screens on Safari or older Firefox.

production-ready
FAQ

Frequently asked questions

Yes — these are the original Mattel responses: 10 positive, 5 non-committal, 5 negative.
Yes — we use crypto.getRandomValues to pick uniformly. Each answer has a 1/20 chance.
Open a PR — the ANSWERS array lives in this file.
Shake again. The 8-ball respects free will.
Yes — randomness and answers come from your browser. Nothing is sent to a server.
Suggest a tool

Something missing?

Tell us what you need. We ship the top requests every two weeks.

Sent straight to the maintainers · no account needed
47 in queue·8 shipped this month
Request queued. Thanks!