Table
Dice set for the picker
{{ planText }}
{{ errPre }}{{ errMid }}{{ errPost }} — {{ errMsg }}
Invalid notation{{ capText }}
{{ errPre }}{{ errMid }}{{ errPost }} — {{ errMsg }}
{{ capText }} · Enter rolls
{{ refusedMsg }}
Power-saving mode
Same physics, no rendering. The result is identical to what the tray would show.
{{ d.label }}
dropped
{{ hintText }}
No saved rolls in {{ groupName }} yet. Roll, then Save from the result — or start one here.
{{ groupName }}
Pick dice{{ planText }}
{{ gs.name }}{{ gs.meta }}
{{ p.id }}{{ p.count }}
{{ res.total }}
{{ res.title }}
{{ d.label }}{{ res.modText }}
{{ res.title }}
{{ res.total }}
{{ res.total }}
{{ res.kicker }}
{{ res.title }}
{{ g.text }}
{{ g.setName }}
{{ d.label }}
{{ g.sub }}
Modifier
{{ m.text }}
Arithmetic applied as written: {{ res.formula }} · {{ res.roundingText }}
{{ res.scaleNote }}
Division for this throw
{{ res.roundNote }}
{{ res.pinnedLabel }} · pinnedpinned per division
dInfinitySession · {{ sessionLabel }}
{{ s.name }}
Works fully offline. Network is used only when you install a set, a table or a collection from a URL.
Outcome graph
{{ gErrPre }}{{ gErrMid }}{{ gErrPost }} — {{ gErrMsg }}
{{ gNote }}
{{ stepsTopLabel }}
kP(= k)P(≥ k)
{{ r.k }}{{ r.p }}{{ r.c }}
{{ ledgerMoreText }}
{{ st.min }}mean {{ st.meanText }} · dashed · red = your roll{{ st.max }}
{{ rollText }}
{{ pickText }}
{{ c.label }}
{{ c.value }}
{{ gCap }}
Table
{{ groupPath }} · favourites first, then by recent use. Tap to roll, long-press to edit.
Nothing saved yet.

Name a formula, give it an icon — “Longsword”, “Fireball” — and roll it with one tap. Or import a collection someone shared.

{{ r.useText }}
{{ r.formula }}
{{ edTitle }}
{{ edErrPre }}{{ edErrMid }}{{ edErrPost }} — {{ edErrMsg }}
{{ edStats }}
{{ customHex }}
"Default" follows the group's pinned table, then Settings → Table.
Dice sets
{{ updateNote }}
Sets are never checked or updated on their own — tap Check for updates when you want to look.
Install from a URL or file
GitHub, GitLab, Codeberg or any https archive. Nothing from a set ever runs; it is parsed, validated and rejected on error.
Fetching and validating… {{ installUrl }}
Brass & Bone 1.2.0 validated
Ada Example · CC-BY-4.0 · commit 4f1c9e2 · 5 dice, 1 table, 5 textures (2.6 MiB)
3 warnings — the set installs, you should know
{{ w.where }} {{ w.text }}
skulls.zip was rejected
sha256 9b7e…c210 · 1.8 MiB · Nothing was installed and no other set was touched.
3 errors
{{ w.where }} {{ w.text }}
Installed
Long-press a set to disable or remove it.
{{ s.name }}{{ s.version }}
{{ s.meta }}
{{ s.updateTag }} default disabled
Dice set
{{ detail.name }}{{ detail.version }}{{ detail.statusText }}default set

{{ detail.description }}

Author
{{ detail.author }}
License
{{ detail.license }}
Source
{{ detail.sourceLabel }} · {{ detail.commit }}{{ detail.sourceLabel }}
Installed
{{ detail.installed }}
Dice · {{ detail.diceCount }} · rendered from the set
{{ d.label }}
{{ d.id }}
Validation report
{{ w.where }} {{ w.text }}
The folder is kept so an update can fix it. Its dice are hidden; notation referencing it falls back to the built-in set.
Export as zip
Pick a license before sharing; it is written into diceset.toml. The zip can be uploaded to a git repo as-is.
{{ exportedNote }}
Saved rollsSession · {{ sessionLabel }}
{{ rsGroup }}
{{ rs.name }}
{{ rs.formula }}
{{ t.label }}
{{ t.value }}
{{ t.sub }}
Totals · observed (ink) vs expected (red marks){{ rs.n }} rolls
{{ rs.min }}expected mean {{ rs.expMean }}{{ rs.max }}
{{ rs.verdict }}
RollRolledMeanExpectedΔ
{{ r.name }}{{ r.n }}{{ r.mean }}{{ r.exp }}{{ r.delta }}
No saved roll in {{ groupName }} has been rolled during “{{ sessionLabel }}” yet.
Sessions{{ sessionCount }}
A session is a bucket for statistics. One is active at a time — pick it here or from the tray header; every roll from then on lands in it.
No sessions yet.

Your first roll starts one named after the active group. Create one below if you want a different name.

Deleting a session keeps its rolls — they move to "Unfiled". Rolls are never replayed or re-done.
Import and export
Import brings in rolls and groups from the URL of a JSON collection. Export writes the active session's rolls and statistics to a JSON file.
Table
The tray is your screen, walls at the edges — 240 × 108 mm upright, 108 × 240 mm rotated, so landscape fits a different spread. Only the look changes. Every installed look is listed, whichever set it came with.
{{ pinNote }}
Face designerface {{ faceNo }} of {{ dzSides }}
Base die
{{ dzShape }} · face values inherited from the built-in die
{{ faceNo }}
{{ s.text }}
Tap the face to place it. Any character works — a number, a rune, a letter.
{{ dzCustomHex }}
{{ designerNote }}
StatisticsSession · {{ sessionLabel }}
{{ t.label }}
{{ t.value }}
{{ t.sub }}
Face histogram · {{ statsDieId }}dashed = expected if fair
1{{ statsSides }}
{{ streakText }}
Set : dieThrowsHighsLowsAvg
{{ r.id }}{{ r.n }}{{ r.highs }}{{ r.lows }}{{ r.avg }}
HistorySession · {{ sessionLabel }} · {{ historyCount }}
Nothing rolled yet.

Nothing rolled in “{{ sessionLabel }}” yet. Every roll lands here with its breakdown, kept on this phone only. Switch session on the Sessions screen to see another.

{{ day.label }} · {{ day.count }} rolls
{{ h.time }}
{{ h.name }}
{{ h.detail }}
{{ h.total }}
Rolls in “{{ sessionLabel }}”. Kept on this phone only, with no limit and no pruning — every roll ever made stays.
Notation
Dice, then modifiers,
then arithmetic.
2d20kh1 + 5 [Attack]
2d20two twenty-sided dice kh1keep the highest one + 5a flat modifier [Attack]a label for history and statistics
Tap any example to load it on the tray. Capitals and spaces don't matter.
{{ g.name }}
{{ r.code }}{{ r.text }}
An unreadable formula is underlined in red on the tray and cannot be rolled — the message names the position.
Settings
{{ r.label }}
{{ r.desc }}
Example dice set on GitHub
dInfinity{{ appVersion }}
github.com/drehtuer/dInfinityApp
GPL-2.0-or-later. Your sets, tables and collections are yours.
{{ setDialog.name }}
{{ setDialog.body }}
Import a collection
Paste the URL of a JSON collection — a file, a raw git URL, any https address. Every formula is validated first; the import is refused if a group of that name already exists, and nothing is merged.
Export {{ exportName }}
Rolls with their breakdown, per-die statistics and the session's totals. Dice sets and tables are not included — they are installed from their own sources.
Session{{ exportName }}Rolls{{ exportRollCount }}File{{ exportFile }}
Exported
{{ exportFile }} · {{ exportRollCount }} rolls · {{ exportSize }}. Written to Files; nothing left this phone.
Importing {{ impName }}
{{ impFrom }}
{{ impPhase }}{{ impStep }}
Nothing is written until every formula validates. Cancelling leaves your collection untouched.
{{ impName }} failed to import
3 problems in the collection. Nothing was imported.
{{ e.where }}{{ e.text }}
Import refused
{{ impRefusedText }}
Imported {{ impGroupName }}
1 new group · 3 rolls ({{ impGroupRolls }}) · from {{ impGroupFrom }}. All formulas validated; nothing existing was changed. The source is kept so you can check for updates later.
Updating {{ upd.name }}
{{ upd.phase }}{{ upd.pct }} %
{{ upd.detail }}
First launch
Nothing to
set up.

Built-in dice are installed and the table is laid out. Shake the phone or tap the tray to roll. Everything else — saved rolls, your own dice, statistics — is in the menu, top right.

1 dice set0 saved rolls0 sessions
Upload an image
A photo or texture from this phone becomes a table look, saved into “My dice”. The dice, their size and the physics do not change.
{{ upFileName }}
{{ upFileMeta }}
{{ uploadFitNote }}
{{ confirmTitle }}
{{ confirmBody }}