What's new
The main changes
- Sprints can be repeated with
again, chained into rounds withthen, and started at a time of day, such asat 14:30. - You can report or fix a word count after the scoreboard posts.
- Setup is one command, /settings .
- Pets are a collection now, managed with /pets .
/cancel starts a vote when other people are in the sprint.
A few of these were fixed years ago in code that never made it to the live bot, so they’re new to you even if they’re old to me.
Basic sprinting is the same: /sprint , /join , /words .
The defaults haven’t changed: a 15-minute sprint, a 1-minute join window, and 3 minutes after time’s up to report your word count before the scoreboard posts. Longer sprints get a longer word-count window, up to 10 minutes. When time’s up, Sprinto says how long you have to report your word count.
Word counts
You can report or fix a word count after the scoreboard posts. For 10 minutes after time’s up, /late adds your word count or corrects it, and Sprinto edits the scoreboard. The next sprint can start while this late window is still open.
The person starting a sprint can change the late window. late 20 makes the late window 20 minutes long. The late window can be up to 60 minutes. late none turns the late window off. To change the late window for every sprint in a channel, add the late option to the channel’s default sprint.
Asking for a late window over 60 minutes, such as late 99, is refused, and the reply names the maximum.
tare is back. @Sprinto#2517 tare 1000
sets your starting count to 1,000 words and keeps your total, so the words you wrote this sprint are counted from 1,000. tare +50 moves your starting count up 50 words, and tare -10 moves it down 10 words. Use tare when the starting count you joined with was wrong; /words changes only your total. tare last worked in November 2019.
You can paste Sprinto’s reply back as your word count. @Sprinto#2517 words 1,250 words (250 new) sets your total to 1,250 words and your starting count to 1,000 words, so Sprinto’s reply shows the same “(250 new)” you sent.
More numbers can be spelled out, such as for twenty and fifty new.
/same uses the count you last joined with. Every join records the count you joined with, including a plain
/join
, which starts you at 0 words. So after a plain join, /same offers 0 words next time.
Sprinto corrects obvious typos in a word count, and says so. A small ↳ line says what was changed. When your word count could mean two things, Sprinto shows a button for each meaning.
You still get time to retry after an error. If your first word count gets an error reply, the time to try again is given back to you.
See During the sprint for how word counts work.
Sprint commands
again and identical
Two new ways to run the channel’s last sprint again.
again runs the last sprint command again. Anything random is rolled again, and start times like in 5 or iab count from now. Use it for “do that again”.
identical repeats the last sprint’s exact times: the same wait, the same length and the same time to report word counts. Use it when you want an exact copy of the last sprint.
You can add options to either one, with an optional but:
again can’t repeat a sprint set to a clock time (at :45, until :00). Sprinto says so and suggests identical.
Chains
Chain up to 8 rounds in one command with then.
Repeat a round with x or times.
The length you give is writing time, in a chain or not. for 20 x3 is three rounds of 20 minutes’ writing each. To make each round take exactly 20 minutes with the word counts inside it, use round 20 x3.
pomo is 25 minutes of writing, then 5 minutes until the next round starts. pomo is short for for 25 gap 5. The word counts are collected inside those 5 minutes, so pomo x4 starts a round every half hour. In a chain of 5 or more rounds, the break after round 4 is at least 15 minutes, counted from when the word counts close. Another preset, dream, runs a 10-minute sprint that starts on the next 5-minute mark.
The break comes after the word counts. Unless you set a break length, each round’s word-count window is followed by a 5-minute break, so the next round starts 5 minutes after the word-count window closes. Set a different break with break 7; rest, smoko and take also mean break.
gap 5 sets the whole time between rounds, word counts and break together, counted from when writing stops. sprint 15 gap 5 x3 starts a round every 20 minutes. The word counts are collected first, and the rest of the gap is the break. next 5, next in 5, next round in 5 and next focus in 5 mean the same as gap 5, and Sprinto writes a gap back as next, for example in /explain.
A break between rounds is at most 1 hour, or 2 hours with please. The limit applies however the break is written, such as break 20, gap 25 or break until :30. A longer break saved in a default sprint is cut to 1 hour.
The default sprint can include a gap between rounds, with settings preset 20 gap 10 or settings preset 20 break 7. Setting a default gap replaces the default break, and setting a default break replaces the default gap. The default gap has no effect on a single sprint.
To stay in for the next round, report your count with next. Or say all once to stay in for the rest of the chain:
all carries your total forward into each round, and all 1000 does the same starting from 1,000 words. To start every round from 0, use all 0.
/leave
takes you out of the chain.
last one stops a chain after the round that’s running. That round finishes as usual, and the rest of the chain is dropped. last round, last block, last focus and last sprint also stop the chain. The person who started the chain, or a @Sprint MC, can stop a chain this way.
See Chain sprints for more, and Chain timing for diagrams.
Clock times and your timezone
at and until take a time of day: at 14:30, at 2:30pm, at half past two, at quarter to five, until 15:00. quarter of five, quarter after and quarter before work too. A time without am or pm means the next time the clock shows it, so at 1:30 typed at one o’clock is half an hour away.
A time of day needs your timezone. Set it with
/timezone
: type a city, country or timezone abbreviation (Brisbane, Japan, PST) and pick from the matches, each shown with the time there now. If you use a time of day without setting a timezone, Sprinto tells you to set one. Minute marks like at :30 work without a timezone.
/timezone on its own shows your timezone and the time there, next to the current time as your device shows it. /timezone none clears it.
/settings me
shows your timezone too.
Or name the place in the command: at 10:30 est, at 6:30 new york, until 14:00 Europe/Paris, at 10:00 GMT+2.
Other ways to write a time also work: offsets (at 14:00+10, at 14:00Z), ISO 8601, a pasted Discord timestamp, and forms from other languages (午前10時, 14h30, 14 Uhr). at 10:30 to 11:00 and at 10:30-11:00 run from the first time to the second.
The usual limit on how far ahead a sprint can start still applies: a time of day can be at most 50 minutes away. A time of day can’t be part of a channel’s default sprint; minute marks can.
In a timezone half an hour off UTC, such as Adelaide or Kolkata, at :30 means half past on your clock. Minute marks in channel and server defaults stay on UTC. /sprint explain says whether it used your clock or UTC.
If no end time fits between for at least and for at most, Sprinto says so. The reply names the shortest for at most that would work. The old bot ran an ordinary 15-minute sprint instead. When part of the conflict comes from the channel’s or server’s default sprint, that part is dropped, and /sprint explain says which part.
More ways to set start and end times
in at least is the new name for grace. in at least 2 sets the shortest wait before an at or next start. grace still works.
in next 5+1 skips a mark that’s less than 1 minute away. in next 5 starts on the next 5-minute mark, however close it is. In a chain, break next 10+2 ends the break on the next 10-minute mark that’s at least 2 minutes away.
You can say the mark in words: next 5 minute mark, at the next 5 minute mark, in the next 5 minutes, next quarter, next half and until the next hour all work.
for the next 30 starts now and ends in 30 minutes. Any wait comes out of the 30 minutes: for the next 30 in at least 3 waits 3 minutes, then you write for 27 minutes. The old bot refused for the next 30.
on :30 means at :30.
end -5 puts the word-count time inside the sprint. With for 20 end 5, you write for 20 minutes, then have 5 minutes for word counts. With for 20 end -5, you write for 15 minutes and word counts are collected in the last 5 minutes, so the sprint is over at 20 minutes. Sprinto shows for 20 end -5 as round 20 end 5.
Mid-sprint chimes
Sprinto can post chimes during a sprint: messages that say how much time is left. The old bot posted nothing between the start and time’s up. A sprint has chimes only when they are set in your sprint command or in the channel’s default sprint, or when the sprint uses the marathon (60 minutes) or megathon (120 minutes) preset. Those two presets add a chime at halfway.
In a chime time, a minus sign counts back from the end of the sprint, and a plain number counts forward from the start. A sprint can have up to 5 chimes. no chime or no bell turns off the channel’s default chimes.
By default, a chime pings nobody. To be @-mentioned by a sprint’s last chimes, set Max chimes in /settings me to how many chimes should ping you, from 0 to 5. The default is 0.
Dice and random lengths
3d6 rolls three six-sided dice and adds them up, so the sprint is 3 to 18 minutes long, and much more often near the middle than at either end. d20 rolls one die, 3d6+10 adds 10 minutes, 3d6 - 2 takes off 2 minutes, and 2d6 + d20 rolls both sets. 5.3 + 2d12 works too.
roll 3d6, dice 3d6 and random 3d6 also set the length. 3d5h is still read as 3 days and 5 hours. @Sprinto#2517 roll 2d6 + d20
rolls dice without starting a sprint.
random can go in front of anything that rolls: random 5 to 9, random 3d6, random micro. however long spins the random wheel, like hel.
Start early, and join as you start
/go starts the sprint now, without waiting for the join window to end. The sprint keeps the length you chose, or the end time you set with until: if you use /go 1 minute after sprint in 5 until :30, the sprint still runs to :30. Only the person who started the sprint, or a @Sprint MC, can use /go.
In a chain, /go during a break starts the next round at once. The round keeps its planned end time, so you write for longer, and no later round moves. /go is refused if the round would become longer than the channel’s max-sprint.
Start the sprint and join it in one command. The number is your starting count, in words. Sprinto posts it as an ordinary join, so others in the channel can see that you’ve joined.
Dry runs
Put explain in front of any sprint command to see what it would do, without starting a sprint. Sprinto shows the times, and says which parts came from your command, which from this channel’s defaults, and which are his own defaults. Only you see the answer; add public to show it to the channel.
/explain is a command too. On its own, it describes the sprint running in this channel, or what a new sprint here would do. Its options let you choose which sprint to describe, how much detail to show, a sprint command to try, and whether to post the answer. Under the answer is a dropdown for more or less detail and a Post to channel button.
Live countdowns
Countdowns update live, in your own timezone. Sprint and join-window countdowns use Discord’s live timestamps. When the join window or the sprint ends, Sprinto edits the countdown one last time, so it doesn’t read “3 minutes ago” afterwards. The end of a sprint is shown as a countdown by default; the old bot showed a clock time.
Other sprint fixes
in 10 to 20 starts between 10 and 20 minutes from now. The old bot dropped the lower number.
A hyphen makes a range: for 10-15 and in 1-2 work, and so do the dashes that phone keyboards type.
A channel default that no longer fits is skipped. If later changes to the server’s settings put a channel’s default sprint out of range, Sprinto skips that default and runs an ordinary sprint. /explain says which part was skipped.
Undo and redo work, up to 100 steps back.
See Sprint (all options) for the full list.
Pets are a collection now
You keep a collection of pets, and pick one to sprint with you. The old bot gave you a single emoji pet. The pet in your companion seat is your companion. You have one companion at a time, and you can’t swap companions during a sprint, because your companion is already on the scoreboard. Everything is in one panel:
Pets from the old bot were carried over. If you were supporting Sprinto when the new Sprinto took over, your pet is already in the panel. If you weren’t, your pet is kept hidden, and comes back with the same name and look the first time you get a companion seat again.
More at Pets.
Setup got much simpler
The old bot had about ten near-identical setup commands: setup-set-allowed-channel, setup-unset-allowed-channel, setup-pingroles-set, setup-set-show-quotes, setup-set-walltime and so on. They’re all gone, replaced by one command with subcommands.
Most settings can be set once for the whole server. In the old bot, almost all settings were per channel. A setting you once applied to ten channels one at a time can now be set once with /settings server .
channels adds, removes and resets sprint channels, and lists them, for example @Sprinto channels add.until :00/:30 for at least 5. A default with an end time also needs for at least, which sets the shortest sprint length allowed. Admin
Sprint Admins only. A Sprint Admin is the server owner, anyone with the Administrator or Manage Server permission, or anyone with a role named Sprint Admin.
to change.There’s a typed form too: settings <key> <value>. As values, it accepts on, off, sometimes, default and their common synonyms. If it doesn’t recognise the value, it shows the current value. If it doesn’t recognise the key, it lists the keys.
The channel and server panels show only what you’ve changed from the defaults. On a newly set up server, the panel is nearly empty, because every setting is at its default.
Some settings are new, or newly documented. Here are their defaults:
| Setting | Default | What it does |
|---|---|---|
family-friendly | on | Keeps the sweary quotes and replies out. |
tidy-sprints | off | When on, Sprinto deletes its own join and word-count confirmations, to keep a busy channel readable. |
shuffle-leaderboard | off | When on, shuffles the order of the scoreboard. |
theme | random emoji | The emoji used in sprint announcements. |
max-sprint | 2 hours | The longest sprint allowed in the channel or server. 2 hours is also Sprinto’s own limit. |
max-sprint is the only setting a channel can’t loosen: if the server and the channel both set it, the smaller value applies, and adding please doesn’t get past it.
Carl-bot can start sprints again. If a channel opts in with settings carl on, another bot set up to do so, such as Carl-bot, can @Sprinto in that channel to start a sprint. See
Carl-bot x Sprinto.
More on all of this at Settings and Set up your server.
Pings
pinguser N pings for N sprints. Asking to ping someone for the next 3 sprints now pings them for 3 sprints.
People who have left the server are dropped from ping lists. In the old bot, they were still tagged unless someone removed them by hand. Sprinto now checks and drops a few each sprint, so a long ping list gets shorter over the first few sprints.
Only people on the ping list get pinged. The participant line at the start of a sprint still shows everyone who has joined, but only people due a ping get a notification.
People on their last ping are listed first. People marked (last ping) now come before the other names, after any role mentions. The (always) tag next to people who are always pinged is gone: it said the same thing about the same people every sprint.
You can stop pings for someone else. /admin-forget-user stops pinging one writer in this channel. You can give it a mention or a pasted user ID, so it still works after the writer has left the server ( MC Sprint MCs and Sprint Admins only. A Sprint MC is anyone with a role named Sprint MC. Sprint Admins can do everything a Sprint MC can. or Admin Sprint Admins only. A Sprint Admin is the server owner, anyone with the Administrator or Manage Server permission, or anyone with a role named Sprint Admin. ). /admin-forget-all-users stops pinging everyone in this channel ( Admin Sprint Admins only. A Sprint Admin is the server owner, anyone with the Administrator or Manage Server permission, or anyone with a role named Sprint Admin. ). Both reply only to you.
See Ping me for the whole set.
When Discord is the problem
Sometimes slash commands stop working because of a problem at Discord. Sprinto now tells you when that happens.
Sprinto posts a note when slash commands stop reaching him. In a channel with a sprint running, the note says what to type instead, such as @Sprinto join same or @Sprinto words 200. When slash commands work again, Sprinto crosses the note out. If Discord’s status page reports the problem, the note says so and links status.discord.com.
/ping shows response times, with a chart. It shows Sprinto’s response time, Discord’s published API response time and how response times vary across Sprinto’s shards (its connections to Discord). It also shows which shard your server is on, and a chart of response times over the last two hours with Discord incidents marked. It lists the ping-list commands too, for anyone who meant /pingme . @Sprinto#2517 ping shows the same.
When Discord has an incident open, /ping shows it on its own highlighted card. If Sprinto last checked Discord’s status page more than a minute ago, /ping checks the page again first.
During a Discord incident, Sprinto’s status reads “Listening to status.discord.com”. Sprinto’s status is the line under his name in the member list. It shows this text while Discord’s status page reports a problem.
The status changes as soon as Discord’s status page reports a problem, without waiting for commands to fail.
When Discord has an incident open, a sprint’s results end with a one-line note about it. The note replaces a tip or notice, but never a quote, and each server sees the note at most once a day.
Smaller changes you might notice
- Replies to feedback reach you. /feedback still posts anonymously to the support server. If I reply, the reply is posted in the channel you sent the feedback from, so you don’t have to join the support server to hear back.
- I can post notices to every server without an update to Sprinto. They appear under the sprint results, in the same place as the quotes, and each server sees each notice once. The old bot’s notices were written into its code, which is why the last of them expired in 2021.
for 30 minutes starting in 8 minworks. The old bot rejected it as an unknown option.- A message wrapped in underscores isn’t read as a command, however many words are in it.
_takes a deep breath_used to be read as a command, from its first word. - The random phrases rotate as intended, so the same one comes up less often.
- If Sprinto was offline during a sprint, he says so when he’s back. If Sprinto missed a sprint’s time’s up, he reopens the word-count window when he’s back, with a “late by N” note. A sprint whose whole ending was missed gets one wrap-up message.
- The vote link points at top.gg. The old discordbots.org link still redirects.
- Help links point here, at sprintobot.com, instead of the old GitHub wiki.
- The big-number easter egg now cites The Lord of the Rings (about 481,103 words).
What works differently
If you used the old bot, these are the changes most likely to surprise you.
/cancel
starts a 2-minute vote when other people are in the sprint. The sprint is cancelled if the ✅ votes are at least twice the ❌ votes and come from at least a quarter of the sprinters; people who don’t vote aren’t counted on either side. A Sprint MC’s ✅ cancels the sprint at once, and
/cancel-please
still cancels without a vote. Before the sprint starts, or if nobody else is in it, /cancel still ends it straight away.
On a single sprint, next 5 is refused. Use in next 5. In the old bot, next 5 started the sprint on the next 5-minute mark. Now next 5 is the same as gap 5, which sets the time between rounds in a chain, so on a single sprint Sprinto refuses it and shows both meanings. next 5 minute mark and at the next quarter still start the sprint on a clock mark, and Sprinto writes in next 5 itself when it repeats a sprint or saves a default.
Three commands are read differently.
| Command | Old bot | Now |
|---|---|---|
at 00 to 35 | A random length of up to 35 minutes | Starts at :00 and ends at :35 |
15 til 45 | Waited 15 minutes | Starts at :15 |
sprint 3 to 10 | Ran until the next :10 | A random length from 3 to 10 minutes |
Commas group digits. sprint 1,000 used to run for 1 minute. Commas, underscores and apostrophes now group digits in durations, word counts, tare, pingme and chimes.
Typo correction is stricter. spront and jion are still corrected, but ordinary words said to Sprinto are no longer read as commands. In the old bot, @Sprinto good luck! could start the sprint early for everyone waiting. A command that ends or resets something for other people must now be typed correctly.
Not in this release
Some things from the old bot aren’t in the new one. Straight answers:
delay Nno longer holds the join window shut so a sprint can be queued to start later. It was used about 1,000 to 2,000 times a year, so it wasn’t nothing, but it made the code much more complex. The word itself still works:delay 10now means the same asin 10, a plain wait before the start with the join window open. A way to schedule sprints is planned.Voice. The chime in a voice channel is built, but it hasn’t been proven in a live call yet, so it’s switched off at launch. It was only ever enabled for about 32 servers. It’s planned to come back. See Voice.
Some of the Active Sprinter role diagnostics.
If you were relying on any of these, say so with /feedback and it’ll help me sort out what comes back first.
Under the hood
Kept short on purpose, but a few of these affect you:
- Rewritten in Rust, on a single scheduler whose deadlines are written to a PostgreSQL database. A restart no longer loses sprints that were running.
- Sprinto writes down what happened before he announces it. A crash now costs at most one message, and never produces a duplicate announcement.
- Quotes and phrases are data rather than code. If someone reports a quote that’s wrong, tasteless or misattributed, it can be corrected or pulled the same day instead of waiting for a release.
- Most commands and replies are deliberately the same. Most of this work went into making the familiar bits harder to break.