TempoScript guide
TempoScript reads a Markdown script, splits it into sections at each time marker and guides you through them with timers. This page explains the marker syntax, presentation mode and the keyboard shortcuts.
Quick start
- Open the editor and replace the example with your own script.
- Before each section, add a line with a time marker such as
?05:00. - Check the preview on the right. Markers are hidden there; only your text shows.
- Press Start Presentation, then press Play or the Space key when you begin to speak.
A complete script looks like this:
?01:00 # Opening Introduce yourself and state the problem. ?05:00 ## Main idea ??02:00 First argument, with the example. ??02:30 Second argument. ??!! Take a question if someone raises a hand. ?00:30 ## Closing One sentence to remember. Thank the audience. ?!! ## Questions
This talk has a planned length of 6 minutes 30 seconds: the three timed top-level sections add up to that, and the final questions section is untimed. Text before the first marker is not part of any section and is not shown in presentation mode.
Time markers
A time marker is a line that starts with question marks, followed by a time in mm:ss or by !!. The number of question marks sets the nesting level. Each marker starts a new section that runs until the next marker.
| Marker | Level | Meaning |
|---|---|---|
?10:00 | 1 | Top-level section that lasts 10 minutes. |
??03:00 | 2 | Sub-section that lasts 3 minutes. It belongs to the level 1 section above it. |
???00:30 | 3 | Sub-section of a level 2 section. You can nest as deep as you need. |
?!! | 1 | Untimed top-level section. The timer shows elapsed time and there is no limit. |
??!! | 2 | Untimed sub-section. It has no limit of its own, but the parent section's time keeps running. |
Untimed sections
Use ?!! for parts whose length you cannot plan: questions, a live demo, an aside. The section timer still counts up, but the progress bar does not fill and nothing turns red. An untimed sub-section (??!!) sits inside a timed parent, so the parent's timer keeps counting while you are in it.
Rules
- Each marker goes on its own line, with nothing else on it.
- Minutes and seconds each take two digits:
?05:00,?00:45. The longest section is?99:55. - Seconds must be a multiple of 5 (00, 05, 10 … 55).
- A nested marker has exactly one more question mark than its parent.
- A sub-section cannot be longer than its parent section.
- The planned total is the sum of the timed top-level sections. Sub-sections spend their parent's time; they do not add to the total.
Fixing errors
The editor checks markers as you type. A line with a problem is underlined in red, the error is listed above the editor, and Start Presentation stays disabled until every error is fixed.
- Seconds must be a multiple of 5
- Round the seconds: write ?01:05 or ?01:10, not ?01:07.
- Invalid time marker format
- A line that starts with ? must be a marker. Use two digits for minutes and seconds (?05:00, not ?5:00). If the line is ordinary text, do not start it with a question mark.
- Invalid nesting level
- A marker can only go one level deeper than the one before it. Put a ? section before a ?? section, and a ?? section before a ??? section.
- Sub-block time exceeds parent block time
- Shorten the sub-section or lengthen its parent. A ??03:00 section cannot sit inside a ?02:00 section.
Presentation mode
Presentation mode shows the whole script with the current section at full brightness and the rest dimmed. The view scrolls to keep the current section in sight. The bar at the bottom has the timers and controls.
- Total: time since you pressed Play, next to the planned total.
- Block: time spent in the current section, next to its planned time.
- Parent: shown inside a sub-section. Time spent in the top-level section, next to its planned time.
- Progress bar: fills as the section's time passes. It turns red and pulses when you run over.
- Auto-advance: when on, the app moves to the next section as soon as the current one runs out of time. Untimed sections never advance by themselves.
Moving to another section resets the section timer. The total keeps counting until you pause or exit. The timers follow the clock, so they stay correct if the tab is in the background. Where the browser allows it, the screen stays awake while you present.
The buttons at the top right change the text size and switch to fullscreen. The text size is remembered for next time.
Keyboard shortcuts
| Key | Action |
|---|---|
| Space or P | Play or pause the timers |
| → or N | Go to the next section |
| ← or B | Go back to the previous section |
| F | Enter or leave fullscreen |
| + / - | Make the text larger or smaller |
| H | Show or hide the shortcut help |
| Esc | Exit presentation mode |
In the editor, double-click to expand it to full width, and press Esc or click outside to shrink it back.
Files and share links
- Export downloads the script as a Markdown file, markers included. Use it as a backup or to move a script to another device.
- Import loads a Markdown or plain text file into the editor. If you already have a script of your own, the app asks before replacing it.
- Copy link puts a link on the clipboard with the whole script compressed inside it. The script is in the part of the address after
#, which browsers do not send to the server. Anyone who has the link can read the script. Long scripts make long links, which some chat apps cut; export the file in that case. - Load example brings back the sample script.
Storage and offline use
Your script is saved automatically in the browser's local storage as you type. It stays on your device and is never sent to a server. Because it lives in one browser, it does not sync between devices, and clearing the browser's site data deletes it. Export important scripts to a file.
TempoScript is a progressive web app. After the first visit it loads without a connection, and you can install it from the browser menu (Install app or Add to Home Screen).
Found a bug or have an idea? Open an issue on GitHub.