/roll /r
The total, with the expression normalized so you can check what it read.
/roll 2d6+32d6 + 3 = 13@rollrobot
Dice for tabletop RPGs in any chat — D&D, Pathfinder, World of Darkness, Shadowrun, Fate, Call of Cthulhu.
Open in TelegramOpen @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.
Five commands, the same in private chats and groups. /roll and /full take notation; send either bare for a plain d20.
/roll /rThe total, with the expression normalized so you can check what it read.
/roll 2d6+32d6 + 3 = 13/full /fThe same roll, die by die. Dropped struck through, a natural high or low arrowed; in a counted pool, successes bold and failures underlined.
/full 4d6kh34d6kh3 = 14
[6↑, 5, 3, /full 4d10>=6f14d10>=6f1 = 2 successes, 1 failure
[10↑, 7, 3, 1↓]/randomd100 and nothing else, for when you just need a number out of a hundred. Same as /roll d100.
/roll d1001d100 = 73/ask /aA 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.
/ask works too: no question, just the answer, for a call already spoken aloud at the table.d2, so it is a fair coin and nothing more./ask Should we open the door?Should we open the door?Yes ✅
/ask/helpThe notation guide in one message, with links to the playground and the reference. This page in short, without leaving Telegram. /start prints the same.
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 /pChooses 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.
Sneak past, Talk it out. | and ; do the same, and a line break outranks both, so a pasted table splits row by row.| or ;, then a comma, then plain spaces. Reach for | when an option contains a comma — Rope, 50ft | Torch splits into two, not three./pick Goblin patrol | Empty room | Treasure hoard/pick Sneak past, Talk it out, Set an ambushNone 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.
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 = 26Two 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 -31d20 - 3 = 11A number on its own is a die: /roll 20 rolls a d20.
/roll 201d20 = 12к 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к62d6 = 8۲۰ rolls a d20. Arabic-Indic and Persian numerals fold to ASCII before parsing; a quoted name keeps its own numerals untouched.
/roll ۲۰1d20 = 17Type @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.
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.
2d6 | Two six-sided dice. |
d20 | The count defaults to one. |
2d20+5 | Arithmetic: + - * / and parentheses. |
(1d6+2)*3 | Parentheses group whatever you put in them. |
(1d4)d6 | A computed count: roll 1d4, then that many d6. |
4d6kh3 | Keep the highest three — an ability score. |
2d20kh1 | Advantage: the higher of two d20. |
2d20kl1 | Disadvantage: the lower. |
4d6dl1 | Drop the lowest; dh drops the highest. |
{1d8!, 1d6!}kh1 | Keep across a group — each sub-roll competes as one die. |
d8! | A maximum roll adds another die. |
d8!! | Compound: the extra folds into the same die. |
d8!p | Penetrating: every extra die takes −1. |
5d10!=10 | Explode on a threshold, not the top face. |
2d6r<3 | Reroll under 3, as often as it takes. |
2d6ro<3 | Reroll once, keep the second result. |
4d6min2 | Lift every die to at least 2. |
4d6max5 | Cap every die at 5. |
12d6>=5 | Every 5 and 6 counts as a success. |
7d10>=6f1 | Count successes, subtract 1s as failures. |
1d20+7 vs 15 | Check against a DC, answered as a degree of success. |
4dF | Fate 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. |
The roll each table reaches for first, ready to copy.
Attack with advantage: two d20, keep the higher, add your bonus.
/full 2d20kh1+72d20kh1 + 7 = 26
[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 201d20 + 12 vs 20 = Critical Success (natural 18)
[18] + 12 vs 20A Storyteller pool: successes on 6 or better, every 1 cancelling one.
/full 7d10>=6f17d10>=6f1 = 4 successes, 1 failure
[8, 6, 2, 10↑, 1↓, 4, 7]Hits on 5 and 6 across the whole pool.
/full 12d6>=512d6>=5 = 5 successes
[5, 3, 6↑, 2, 4, 5, 1↓, 6↑, 3, 5, 2, 4]Trait die and wild die, both exploding; the higher of the two counts.
/full {1d8!, 1d6!}kh1{1d8!, 1d6!}kh1 = 9
{Four Fudge dice plus a skill rating.
/full 4dF+24dF + 2 = 3
[1, 0, -1, 1] + 2Roll under your skill on percentile dice.
/roll d%1d100 = 37One 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.
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.
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.
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.
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.
Quote a name at the end and it appears above the result: /roll 2d20kh1+7 "Perception". It works for /pick too.
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.
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.
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.