PumaTimer is a layered presentation timer. You write the day as an outline, and it runs one item at a time against a total that never moves. It is a single offline HTML file, so there is no server, no account and nothing to sign in to.
The work happens across three screens, in the order you need them: Paste is where a plan comes in as text, Plan is the editable table where you can see the wall-clock times each row resolves to, and Run is the dial you present against.
Nearly everything here has a keyboard shortcut, and the Keyboard tab lists them all.
One line is one item, and the same grammar is read in a row's name cell and in the Paste box. Anything you can paste, you can also type.
These are the tags. Nesting is not one of them — a section owns every row after it until the next section, which in pasted text means two spaces of indent and in the table means the row order you can see. There is no third level either way.
Coffee ~20 @10:00 #break
~20~1h30, [45m], 25 min or 0:35.@10:00@1, @1p, @1pm, @1:00, @13:00 and @1300 all mean one o'clock.@12:30-13:30@-13:30 pins just the end.#breakbreak, buffer and section, plus start and end for the day's own frame.//The clock only ever runs forwards. A @1:00 written below a @12:00 means one in the afternoon, which is what anyone writing an agenda means by it. Write @1:00am if you really do mean the small hours.
The # vocabulary is closed, and that is what makes it safe to peel a tag off the end of a title — Fix bug #abc123 keeps its name. If you meant one of these characters literally, escape it: \@, \~ and \# pass straight through.
Every presentation is stored in your browser's localStorage, on this device and this browser only. Nothing is uploaded anywhere.
Back up everything (⌘/Ctrl+S) saves every presentation and your theme and accent to a single .pumapack file. Restore from backup… reads one back and replaces everything here with it, after offering to back up what is here first. Both are here, in the command palette (⌘/Ctrl+K), and in the topbar menu on a narrow screen.
The Export button saves just this presentation. Import, or dragging a file onto the window, adds: a presentation comes in as a new tab, and nothing you already have is removed. If you import a presentation you already have, you are asked whether to replace it or add it as a copy. A backup imported this way asks whether to add its presentations alongside yours or replace everything. Settings… → Export run-sheet saves the current run-sheet — planned against actual — as Markdown for your own notes.
Import also accepts two other things. A .md, .txt or .outline file comes in as a new presentation, read as a plan. And a PumaTTX .pumapack — the same extension, but written by the tabletop-exercise planner — opens the exercise picker.
Danger zone. This erases every PumaTimer presentation in this browser. Back up everything first.
Type DELETE EVERYTHING to confirm:
This is a custom presentation timer engine that takes a variety of inputs and allows for in-flight adjustments and active time-banking. It was built to ingest PumaTTX showmaps, but will work for any type of presentation.
This tool is provided as-is, for informational and productivity purposes only. All timing decisions and records are your own.
PumaWorx is a suite of offline, single-HTML productivity apps that run entirely in your local browser. The entire suite is a personal, open source vibecoding project.
This is an offline single-HTML app. No data goes to or from the internet — no server, no account, no telemetry. Your presentations live in your web browser's localStorage — on this device, in this browser, and nowhere else.
Your data is YOUR responsibility.
Clearing this site's data, opening it in a private window, switching browsers, or losing this device erases every presentation. Back up regularly — ⌘/Ctrl+S backs up everything to a .pumapack you can restore from the topbar menu.
Press ? any time for keyboard shortcuts and help.