Roll Robot

@rollrobot

Dice for tabletop RPGs in any chat — D&D, Pathfinder, World of Darkness, Shadowrun, Fate, Call of Cthulhu.

Open in Telegram

Getting started

Open @rollrobot, press Start, send /roll 2d6+3. You get the expression it read and the total.

Playing with a group? Add the bot to the chat. It replies to the message that called it, so several people can roll at once and each answer stays with its question. It needs permission to send messages, or it stays silent.

In a chat you cannot add it to, use inline mode: type @rollrobot 2d6+3 and tap the result. Nothing to add, no permissions to grant — the roll goes out as your own message.

Commands

Five commands, the same in private chats and groups. /roll and /full take notation; send either bare for a plain d20.

/roll /r

The total, with the expression normalized so you can check what it read.

/roll 2d6+3
2d6 + 3 = 13

/full /f

The same roll, die by die. Dropped struck through, a natural high or low arrowed; in a counted pool, successes bold and failures underlined.

/full 4d6kh3
4d6kh3 = 14 [6↑, 5, 3, 1↓]
/full 4d10>=6f1
4d10>=6f1 = 2 successes, 1 failure [10↑, 7, 3, 1↓]

/random

d100 and nothing else, for when you just need a number out of a hundred. Same as /roll d100.

/roll d100
1d100 = 73

/ask /a

A yes-or-no answer for the calls not worth a roll — is the door trapped, does the merchant haggle, does it rain tonight. Everything after the command is the question, quoted back above the answer.

  • No quotes needed. Punctuation, apostrophes and notation are all safe inside the question.
  • Bare /ask works too: no question, just the answer, for a call already spoken aloud at the table.
  • The answer is a d2, so it is a fair coin and nothing more.
  • Yes and No stay English in every locale — your interface language is a poor guess at the language of the chat.
/ask Should we open the door?
Should we open the door?
Yes ✅
/ask
No ❌

/help

The notation guide in one message, with links to the playground and the reference. This page in short, without leaving Telegram. /start prints the same.

Beta features

Shipped and usable, but not settled: anything here may change shape or leave the bot in a later update. The five commands above will not.

/pick /p

Chooses one option out of a list you give it — a random encounter, who takes first watch, which door. One die over the options, nothing weighted unless you say so.

  • Two options minimum, one hundred at most.
  • A comma is all it takes — Sneak past, Talk it out. | and ; do the same, and a line break outranks both, so a pasted table splits row by row.
  • Only the first separator present is used, in that order: a line break, then | or ;, then a comma, then plain spaces. Reach for | when an option contains a comma — Rope, 50ft | Torch splits into two, not three.
  • Repeat an option to weight it: it takes one slot in the list per copy.
  • A quoted name at the end labels the pick instead of joining the list.
/pick Goblin patrol | Empty room | Treasure hoard
Empty room
/pick Sneak past, Talk it out, Set an ambush
Talk it out

Special features

None of this is needed for an ordinary roll. It is what the bot has for people who use it every session and want the typing out of the way.

Quoted names

A name in double quotes at the end of a roll is quoted back above the result, so a chat full of bare numbers stays readable. It works on /roll, /full and /pick alike, and the curly quotes a phone keyboard substitutes are accepted as readily as straight ones.

The quotes are not optional. The parser accepts so much that an unquoted word cannot be told apart from notation with any certainty, so 2d20kh1+7 Perception is read as notation and fails, while 2d20kh1+7 "Perception" rolls and takes the name.

/roll 2d20kh1+7 "Perception"
Perception
2d20kh1 + 7 = 26

Space-separated form

Two or three numbers separated by spaces are read as a roll: /roll 4 6 is 4d6, and /roll 1 20 -3 is 1d20-3. The third number is the modifier, and it carries its own sign.

/roll 1 20 -3
1d20 - 3 = 11

Bare numbers

A number on its own is a die: /roll 20 rolls a d20.

/roll 20
1d20 = 12

Cyrillic dice letters

к and д fold to d before parsing, so 2к6 rolls 2d6. Russian, Ukrainian and Belarusian notation all work the same, and the Latin k of kh and kl is untouched.

/roll 2к6
2d6 = 8

Persian digits

۲۰ rolls a d20. Arabic-Indic and Persian numerals fold to ASCII before parsing; a quoted name keeps its own numerals untouched.

/roll ۲۰
1d20 = 17

Inline mode

Type @rollrobot and notation in any chat, including groups that have never heard of the bot. A list opens above the keyboard; tap a result to send it as your own message.

@rollrobot 2d20kh1+7 offers one roll under two headings, Roll and Full. Choosing changes the display, not the dice — never a reroll.

With nothing after the handle you get three presets: Roll and Full on a d20, Random on a d100.

A question adds an Ask result, leading the list when nothing rolled and trailing it when something did. A named separator between two things that are not notation — Goblin patrol | Empty room — puts Pick at the top instead. Spaces alone do not count here, unlike /pick, or every half-typed question would offer a pick beneath its answer. An inline pick carries its pool in the message, having no command above it to reply to.

Results are personal and uncached, so every query rolls afresh.

Notation

What you actually type. Case-insensitive and blind to spaces, so 2 D 20 KH 1 and 2d20kh1 are one roll. Each group below stops at the useful edge; the reference carries the rest, and the playground runs it.

Dice and arithmetic

2d6Two six-sided dice.
d20The count defaults to one.
2d20+5Arithmetic: + - * / and parentheses.
(1d6+2)*3Parentheses group whatever you put in them.
(1d4)d6A computed count: roll 1d4, then that many d6.

Keep and drop

4d6kh3Keep the highest three — an ability score.
2d20kh1Advantage: the higher of two d20.
2d20kl1Disadvantage: the lower.
4d6dl1Drop the lowest; dh drops the highest.
{1d8!, 1d6!}kh1Keep across a group — each sub-roll competes as one die.

Exploding dice

d8!A maximum roll adds another die.
d8!!Compound: the extra folds into the same die.
d8!pPenetrating: every extra die takes −1.
5d10!=10Explode on a threshold, not the top face.

Rerolls and clamps

2d6r<3Reroll under 3, as often as it takes.
2d6ro<3Reroll once, keep the second result.
4d6min2Lift every die to at least 2.
4d6max5Cap every die at 5.

Success pools and checks

12d6>=5Every 5 and 6 counts as a success.
7d10>=6f1Count successes, subtract 1s as failures.
1d20+7 vs 15Check against a DC, answered as a degree of success.

Other dice and functions

4dFFate dice, each one −1, 0 or +1.
d%Percentile — the same die as 1d100.
2d6+floor(1d4/2)Functions: floor, ceil, round, abs, min, max, sqrt, pow.

By game system

The roll each table reaches for first, ready to copy.

D&D 5e

Attack with advantage: two d20, keep the higher, add your bonus.

/full 2d20kh1+7
2d20kh1 + 7 = 26 [8, 19] + 7

Pathfinder 2e

A check against a DC. Beat it by ten for a critical success, miss by ten for a critical failure; a natural 20 or 1 shifts the result one step.

/full 1d20+12 vs 20
1d20 + 12 vs 20 = Critical Success (natural 18) [18] + 12 vs 20

World of Darkness

A Storyteller pool: successes on 6 or better, every 1 cancelling one.

/full 7d10>=6f1
7d10>=6f1 = 4 successes, 1 failure [8, 6, 2, 10↑, 1↓, 4, 7]

Shadowrun

Hits on 5 and 6 across the whole pool.

/full 12d6>=5
12d6>=5 = 5 successes [5, 3, 6↑, 2, 4, 5, 1↓, 6↑, 3, 5, 2, 4]

Savage Worlds

Trait die and wild die, both exploding; the higher of the two counts.

/full {1d8!, 1d6!}kh1
{1d8!, 1d6!}kh1 = 9 {[5], [6, 3]}

Fate

Four Fudge dice plus a skill rating.

/full 4dF+2
4dF + 2 = 3 [1, 0, -1, 1] + 2

Call of Cthulhu

Roll under your skill on percentile dice.

/roll d%
1d100 = 37

Limits

One roll is capped at 100 dice and 100 explode or reroll iterations. Ask for more and the bot says so instead of rolling — the caps are what keep a reply inside Telegram’s 4096-character limit.

A breakdown still past 3500 characters is dropped for the compact reply, so a large pool answers with its total rather than not at all.

/pick takes at most 100 options. A longer list is rejected, not trimmed: keeping the first hundred would quietly bias every pick toward the top while still looking like it worked.

A quoted name is cut to 100 characters, a question to /ask to 300.

FAQ

Do I have to add the bot to my group?

No. Type @rollrobot and notation in any chat, then pick a result — it is sent as your own message and the bot never joins. Adding it is only worth it when the table rolls often, since a command is shorter to type.

Does the bot read my messages?

It acts only on what is addressed to it: commands beginning with a slash, and inline queries beginning with @rollrobot. Ordinary conversation is ignored — there is no handler for it.

Is anything stored?

No. Nothing you send is kept: not the text of a question, not the options in a pick list, not a name you quoted, not a single result. What is recorded is the shape of a roll and nothing else — 2d6, 4d6kh3, the command it came from — with the Telegram user ID reduced to a salted hash so repeat use can be counted without the account being identified. That dataset is write-only; it exists to show which notation is worth supporting, and it cannot be read back into a conversation.

Are the rolls fair?

Every roll is drawn fresh from roll-parser’s generator, seeded anew each time. Nothing is precomputed, and no result carries over from one roll to the next.

Can I name a roll?

Quote a name at the end and it appears above the result: /roll 2d20kh1+7 "Perception". It works for /pick too.

Why is 4d6d1 an error?

A bare d after a pool is ambiguous — drop one, or roll that many dice again? Write 4d6dl1 to drop the lowest, or (4d6)d1 for nested dice.

My notation was rejected. What now?

The bot echoes what you sent with carets under the part it could not read, so the fix is usually visible in the reply. Awkward cases are quicker to debug in the playground, linked at the foot of this page.

What language does the bot speak?

The command menu, the inline titles and the notation guide follow your Telegram interface language across English, Spanish, Portuguese, German, Russian, Ukrainian, Belarusian and Persian; anything else falls back to English. Results are notation, so they read the same everywhere. Yes and No stay English on purpose — your interface language is a poor guess at the language of the chat you are writing in.