This is an offline single-HTML app. No data goes to or from the internet after this page loads. Your log entries live in your browser's localStorage — on this device, in this browser, and nowhere else.
Your data is YOUR responsibility.
Clearing browser data, switching browsers, using private/incognito mode, or losing this device erases everything. Use the Export (⤒) button in the topbar to save a .pumapack backup somewhere safe — ideally after every session.
Press ? any time for help and keyboard shortcuts. To see the shape, import the bundled demo/north-pole-cirt.json sample (⌘O or drag it onto the window).
One line per entry, and
indent a line to attach it to the one above — which is how a
stack trace lands as one entry rather than forty. The quick-entry tokens are the
composer’s: ~when, @14:30, #tag,
@who, !chip. Entries are added to this log.
For anything where it will matter later that you wrote it down at the time. Type one line, press Enter, and it is on the record — stamped, append-only, on your device.
created_at records when you logged it and never changes. The display timestamp records when the thing happened, and you can correct it. That split is the difference between a log you can hand to someone and a document you merely typed.YYMMDD.hhmmss id derived from UTC, so you can reference a specific line in a report and have it still mean something a year later.#tag, @stakeholder, !chip and ~time are consumed straight out of the headline as you type it, with autocomplete. Nothing to fill in afterwards.~15:30 deploy went out stamps the entry at 15:30 today in the workspace's timezone. ~90m, ~yesterday 09:15, ~fri 17:00, ~2026-08-19 14:00 and ~15:30 utc all work too, so writing up a morning's worth of events at lunchtime is one line each. The When button shows what the token resolved to before you commit it.15:30, 9:05pm, -2h, yesterday 09:15, 2026-08-19 14:00 — a bare clock keeps the entry on its own day), click the headline to rewrite it (#tag and @who still work, and are added rather than replaced), and click the level for the chip picker. Enter saves, Esc cancels. From the keyboard: e, t and l on the focused entry. The rest of the row is inert — the pencil at the end of the line opens the full editor, where the description, the tag sets and the timestamp’s own zone picker live. Nothing opens because you missed a field by a pixel.<PRI>, Apache, [bracketed], JSON lines, logfmt, or a bare 09:12 — and the same ~when / @14:30 / #tag / @who / !chip tokens work as they do in the composer. Indent a line to attach it to the one above, which is how a pasted stack trace becomes one entry's description instead of forty entries. A date alone on a line sets the day for the bare times under it, a timezone picker says which zone the text was written in, and entries are added to the current log — re-pasting the same block adds nothing twice..log and .syslog import as a new workspace on the Level preset. RFC 5424, RFC 3164, bare BSD and journald-style lines all parse; <PRI> becomes the severity chip, host and app become #tags, and a line that parses as nothing at all is kept verbatim rather than droppedSee the Method tab for how these fit together, and Keyboard for every shortcut.
The discipline is speed at capture and detail afterwards. If logging costs you a thought, you stop doing it exactly when it matters most.
#tags, @people, a !chip and a ~time into the sentence as you type and they file themselves. Submitting an empty composer opens the full popup instead, for when you already know it needs more.¶ against entries that carry one, so a skim still tells you where the substance is.~time token, or correct the display timestamp / set a foreign zone in the When popover. What you cannot do is change when you wrote it, which is the point: a backdated entry is stamped as edited from the moment it is created.chip:, tag:, @, before:, after:, has:) alongside plain text, and highlights what matched.One log per thing. A workspace is cheap; a stream that mixes an incident with an experiment is not.
A ~ token anywhere in the composer sets the entry's display timestamp and is then removed from the headline. Everything is read in the workspace's timezone unless the token names its own. Type ~ and the autocomplete shows you what it resolves to, live.
~15:30~15:30:20, ~3:30pm, ~9am~90m~2h, ~-1d3h, ~3 days ago, and ~+30m to go forward~yesterday~today, ~tomorrow~fri~2026-08-19~8/19, ~08-19, ~8/19/26 are month-first~yesterday 09:15T or an @~15:30 utc~15:30Z, ~15:30+0200, ~15:30-04:00~nowA date on its own means 00:00, not the current time of day. A tilde that does not parse as one of these is left alone as ordinary text, so ~50ms and foo~bar stay in the headline.
PumaLogger stores everything in your browser's localStorage under the pumalogger.* prefix — on this device, in this browser, and nowhere else. There is no server, no account, and no entry ever leaves your machine.
localStorage is tied to this specific browser on this specific device.
Use Export in the topbar (or ⌘S) to write a .pumapack file containing every workspace and its prefs — the PumaWorx cross-app envelope. Re-importable here and structured so other PumaWorx apps can consume data.entries[].
Each tab's right-click menu also exports just that workspace, in your choice of format: .pumapack, .csv, .md, or .rtf. Copy timeline as plain text / Markdown / RTF writes the same content to the clipboard. Plain text is the one for a report body, an email or a chat message — [Aug 12 - 13:22 UTC] [ACTION] Item description, one line per entry, each naming its timezone, with the stamp and the level in square columns, no markup to be read literally by something that will not render it. Markdown and RTF paste formatted into Word, Pages, Notes, or any markdown editor.
⌘O (or drag-and-drop) opens the file picker for import. Imports always create a new workspace named after the source file — they never silently merge into your active dataset, so reimporting a backup leaves your live workspaces untouched. Merging is always a deliberate step: right-click the imported tab → Merge into… to fold it into an existing workspace (duplicate entries are detected and skipped).
⚠ Permanent. This erases every PumaLogger entry, tag, and preference stored in this browser. Export a backup first — there is no undo.
Still sure? Type DELETE EVERYTHING to finalize.
.pumapack.pumapack fileOn Windows/Linux, use Ctrl wherever ⌘ is shown.
PumaLogger is a lightweight, portable, offline timeline logger that runs entirely in your browser. It is for recreating incident timelines sourced from multiple local timezones, and it is built on ancient theories of bound-book incident response.
This tool is provided as-is, with no warranties or guarantees. It is not professional advice. By using it you accept full responsibility for any outcomes that result from your use.
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.