9First launch · invalid-notation badge · coloured icons · import success · updates with progress · no d30, no custom meshes

Also: every table look is listed for everyone (Bone felt from Brass & Bone now sits in the picker and in group / saved-roll pins); "Nearest" rounds .5 up and below .5 down; the designer has no 3D preview — "Roll it" is the preview.

9aFirst launch — only the built-in set, group "Unfiled", no saved rolls, no history, no sessions. The strip invites the first save.
9bFirst launch — Saved rolls empty state.
9cInvalid notation: red badge under the formula on the tray, squiggle in the editor, rolling blocked.
9dSaved-roll icons print in the roll's colour tag (or custom colour).
9eSaved-roll statistics — group roll-up line, per-roll chart of observed vs. expected, and a table of every rolled formula with mean, expected and Δ.
9fImport — source picker (file / URL / git). Thorin refuses (name exists); Goblins succeeds.
9gImport success — what was added, from where, nothing existing touched; "Open Goblins" switches the active group.
9hDice sets after "Check for updates": Brass & Bone 1.3.0 available as a tag; the detail screen gets an Update button.
9iUpdate in progress — download bar, then validation, then installed; cancel while downloading. Live: tap "Update to 1.3.0" in 9h's detail.
9jTable picker with Bone felt from Brass & Bone — no private tables.

Try next: "onboarding card on first launch explaining shake-to-roll" · "update-all when several sets have updates" · "collection export dialog"

8Group table switcher · saved-roll statistics · export My dice · designer for every shape · cleanup

Removed: session share, built-in export (the repo's examples/ set is linked instead), the "low battery" power-saving option. No visual shake indicator — the rendered dice are the feedback.

8aGroup switcher now carries "Table for Thorin" — App default or any look; wins over Settings while the group is active, loses to a saved roll's own pin.
8bSaved-roll statistics — pick a roll of the active group; observed totals as ink bars against the exact expected distribution as red marks; mean vs. expected, range, last result.
8cMy dice details — every shape you doodled, plus Export as zip gated on a license dropdown.
8dFace designer on a d20 — base-die selector, triangular face mask clips the strokes, 20-face strip scrolls; kite for d10/d18, pentagon for d12, circle for d2.

Try next: "copy face → paste with rotate/mirror in the designer" · "empty states for first launch" · "disabled-set fallback badge in the breakdown"

7Graph marks your roll · designer banner off the tray · per-roll table
7aOutcome graph opened after a roll: a solid red line at the rolled total with its exact / at-least odds; mean stays dashed. Shown only while the graph's formula matches the roll.
7bSaved-roll editor with "Table for this roll" — Fireball is pinned to Black felt; the tray switches when it is thrown.

Try next: "show the roll's percentile as a number on the graph" · "pin a table per group from the group switcher"

6Set details · sessions · per-throw rounding · default-set resolution · import refusal · squiggles · no d3

Also in this turn, not shown as separate phones: the picker remembers the last set per group; plain d20 resolves to the default set from Settings and falls back to Built-in when that set lacks the die (the breakdown says so under the group); rolls are blocked while the formula has an error; the d18 silhouette is the enneagonal trapezohedron; d3 is gone from the set, picker and stats; seeds are never exposed and there is no replay.

6aSet details — Brass & Bone: status, author, license, clickable source with commit, dice rendered from the set, default-set and manage actions. Tap any set row to get here.
6bSet details — Nordic runes, validation failed: the report replaces the dice grid; folder kept for an update.
6cSessions — buckets for statistics with roll counts and nat 20s; tap to make active, rename inline, delete moves rolls to Unfiled, create new.
6dResult sheet for a formula with division — Down / Nearest / Up for this throw only; the total updates, the dice stay. Default comes from Settings (Down).
6eImport refused — a collection whose group name already exists is rejected outright; nothing merges.
6fUnsupported notation gets a red squiggle under the offending range; the tray says "Fix the formula to roll" and every roll action is disabled until it parses.

Repo follow-up (I can't push): drop d3 / triangular-prism from README, docs/dice-notation.md and docs/dice-sets.md, and note "no replay, seed not exposed" in docs/statistics.md. Try next: "set details for My dice with an export-as-zip action" · "session summary share sheet"

5Dice sets: long-press to disable / remove · statistics per set
5aLong-press (or right-click) a set → sheet-style dialog: Remove deletes the folder, Disable keeps it but hides its dice; statistics are kept either way. The bundled set can't be touched.
5bStatistics filtered to Brass & Bone — its own die list, tiles and histogram; the table below lists every set:die ever thrown.
5cStatistics across all sets (default) — "brass:d20" and "d20" roll up into one d20 line here, listed separately in the table.

Try next: "swipe a set row to reveal Disable / Remove instead" · "per-face histogram in the set details" · "confirm Remove with the set's roll count"

4Decisions locked · set dropdown · designer colour picker

Defaults are now 1b stack layout, 1f full result sheet, 1h row picker, 1k bar graph, 1o row-style saved rolls. 1a and every phone without an explicit variant reflect them.

4aSet selection is a dropdown under the picker row — name, note and a check; "Install another set…" jumps to Dice sets.
4bHome with the locked defaults and a settled roll.
4cFace designer: custom-colour swatch after the 12 presets; the face strip scrolls sideways.

Try next: "collapse turn 1's unused variants" · "set dropdown remembers the last choice per group" · "add a d10-tens die to Brass & Bone"

3Dice picker — custom dice and mixed sets
3aGrid sheet sectioned per installed set: Built-in, Brass & Bone, My dice. Counts add up to one formula — 2d6 + brass:1d20 + brass:1d8.
3bRow picker: the leading "Set" cell cycles Built-in → Brass & Bone → My dice; tapped dice carry the set prefix, bone-coloured on the tray. Result mixes both sets.
3cType-first: set chip beside the shortcuts; a missing die errors per set (brass:1d12 — no d12 in Brass & Bone).

Try next: "show the set name under each die on the tray" · "remember the last set per group" · "let plain d20 resolve to the group's default set"

2Notation entry on the roll screen · dark mode (system by default) · version + repo link in Settings
2aTap the formula on the tray (dashed underline) to type notation; the keyboard slides up, Enter rolls. Also works in 1a.
2bDark mode, roll screen with result — ink and ground swap, red stays, felt unchanged.
2cDark mode, outcome graph.
2dSettings — Appearance (System / Light / Dark) at the top; version and GitHub link at the bottom.

All phones in turn 1 now follow your system's dark-mode setting. Try next: "black felt when dark" · "keep the notation field always visible" · "add a version row to the menu too"

1dInfinity — first pass, all screens, working notation parser and exact outcome graph

dInfinity

Android dice roller where the roll is a physics simulation. Designed from the repo's spec docs (no UI code exists yet) in the Modernist system: Archivo, one red, 2px rules, zero radius, everything flush left. The tray follows the chosen table look; the 3D dice are flat grayscale silhouettes standing in for the render.

Assumptions
  • Roll screen is home; every other destination sits behind the top-bar menu (a full-screen list with rules).
  • Active group (Curse of Strahd / Thorin) is switched from the top bar and doubles as the statistics session.
  • Rolls, breakdowns, history and stats are computed live: the notation grammar, keep/drop/explode/reroll/min, the table capacity rule (30 % floor, 0.40 min scale, hard cap 100) and the exact PMF all follow the docs. Physics is faked with a random face + tumble.
  • Natural max faces print in red; dropped dice are struck through. Tap a bar in the graph for exact numbers.
How to try it

Every phone below is live. Tap dice in the picker row (long-press removes), tap the tray to roll, tap a saved roll to roll it, long-press to edit. Type 500d6 to see a refusal, 2d20kh1 + 6 for advantage, 8d6! to explode. The face designer canvas takes finger/mouse strokes.

Full prototype

Default combination — stack layout, full result sheet, picker row, bar graph, tile-style saved rolls. Use this one to walk the whole flow.

1aHome, green felt, Thorin active

Roll screen layout

Where the chrome sits relative to the tray. Same state in all three: 3d6 + 1d20 − 4 just rolled.

1bStack — picker above the tray, saved tiles below. The by-the-book option.
1cOverlay — the tray is the whole screen; chrome prints in light ink on the felt; saved rolls behind a pull-up.
1dLedger — fixed-height tray up top, dense list of the active group's rolls with last results filling the rest.

Result sheet density

The bottom sheet after the dice settle. Per-group rows with subtotals, then modifiers, as agreed.

1eCompact — one strip: total, formula, all dice inline. Tray stays mostly visible.
1fFull — big total, kicker, group rows with subtotals, modifiers, actions.
1gPoster — the total as a red field (the system's one place for red as a ground), rows beneath.

Dice picker interaction

How dice get into the plan without typing. All three write the same formula string, so the graph, breakdown and stats are identical.

1hRow — tap adds, long-press removes, count badge on the die. Your default.
1iGrid sheet — every die in the set with − / + and a count; roll straight from the sheet.
1jType-first — formula field with die shortcuts; parse errors underline the offending range.

Outcome graph treatment

Exact distribution of 2d20kh1 + 6, mean dashed, ±1σ shaded. Toggle P(= k) / P(≥ k); tap for exact numbers.

1kBars — discrete bars, σ band behind, mean line.
1lSteps — a solid stepped area with an ink top edge; tapping sets a red target line.
1mLedger — a numbers table with inline bars; for players who want the odds of hitting AC 15, not a picture.

Saved-roll tile style

The active group's rolls: favourites first, then by recent use. Tap rolls, long-press edits. Also changes the strip on the home screen.

1nTiles — two-up surface cards, icon, name, formula.
1oRows — dense ruled list, formula right-aligned, pencil per row.
1pPoster — favourites as display-size bands with a red kicker; the rest as rows.

Other screens — one take each

Reachable from the menu in 1a; shown here directly.

1qMenu — full-screen list, rules between rows, grouped Play / Look back / Customise / App.
1rSaved roll editor — live-validated formula with mean and range, icon pack, colour tag, group, favourite.
1sDice sets — installed list; Brass & Bone validated with 3 warnings and a fairness preview for its custom d7.
1tDice sets — skulls.zip rejected; three errors with file:line, nothing installed.
1uTable picker — built-in looks on the real box, "use a photo", group pinning note. Picking one recolours the tray.
1vFace designer — d6, skull on the 1. Draw on the canvas; pen widths, eraser, fill, stamp, undo/redo, face strip.
1wStatistics — last-rolled die by default; natural highs in red, histogram against the fair line, all-dice table.
1xHistory — three sessions of seeded rolls with per-group breakdowns; nat-20 totals in red.
1ySettings — power-saving (off / on / low battery), shake, haptics, sound, rounding, default set, session.
1zPower-saving result — no render; plain grey echo of the table, result appears at once.

Try next: "make 1c the home but with the sheet from 1g" · "combine 1h row with a formula field like 1j" · "black felt by default" · "add the fairness preview to set details"