- HTML 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
The four preset buttons become a picker like the language and theme ones, ordered 25/5, 40/20, 45/15, 50/10, each with its own icon (bolt, scale, hourglass, flame). Free-form times typed in the focus/break fields show as a raw label with no item marked — the dropdown helper gained an optional fallback for values outside the list. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
| .gitignore | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| index.html | ||
| LICENSE | ||
| README.md | ||
| SECURITY.md | ||
Pomotimer
Daily work-time tracking: a pomodoro timer with configurable intervals, a log of what you actually did (with project and link), and a Markdown report of your day ready to paste anywhere.
One HTML file. No build, no dependencies, no server, no account.
🇺🇸 🇧🇷 🇪🇸 🇮🇹 🇩🇪 🇫🇷 🇳🇱 🇷🇺 🇹🇷 🇮🇱 🇸🇦 🇯🇵 🇰🇷 🇨🇳 — 14 languages, RTL included
Getting started
Grab index.html from the latest release
and open it in a browser. That is the whole installation.
Or clone it, if you would rather follow main:
git clone ssh://git@git.govtech42.com.br:2222/govtech42/pomotimer.git
open pomotimer/index.html
Bookmark the page and always open it the same way — see Where your data lives.
To update, replace the file. Your entries are not touched: they live in the browser, not in the file.
What it does
Pomodoro
- Presets 25/5, 45/15, 50/10, 40/20, plus free-form focus and break lengths.
- Auto chains straight into the next phase; Full screen goes immersive on start; Audio enables the ticking over the final 4 seconds and a 2-second alarm at the turn.
- The timer stores the end timestamp rather than decrementing a counter, so it does not drift when the tab is in the background.
Daily log
While a block runs, you type what you are working on, which project it belongs to and a link (pull request, release, article). When the phase ends, the entry is recorded automatically with the real start time and duration.
- Log it now records something outside the timer, marked as focus or break — this covers time away from the desk (dishes, tidying up).
- Project is optional and autocompletes from projects you already used.
- Every row is editable in place (✎): fix the task, project or link without deleting and recreating it. Duration, type and timestamps stay untouched.
Report
Copy as Markdown produces the closing summary of the day:
## 2026-08-27
**Focus:** 3h35 (5 blocks) · **Break:** 40min
**By project:** Checkout 2h30 · Internal 45min · no project 20min
- 09:00–09:25 (25min, focus) [Checkout] Implement login — https://git.example/pull/12
- 09:25–09:30 (5min, break) Do the dishes
Per-project totals add up focus blocks only, so they match the focus total in the header exactly. There is also Print / PDF, which hides the controls and prints the report alone.
Clock
A second mode: full date and live time, in 24h or AM/PM. Handy in full screen on a side monitor.
Languages
Fourteen: English, Português (BR), Español, Italiano, Deutsch, Français, Nederlands, Русский, Türkçe, עברית, العربية, 日本語, 한국어 and 中文, picked from the two-column selector in the top bar. It follows the browser language on first visit and remembers the choice after that. Dates and the day report follow the chosen language too, and Hebrew and Arabic mirror the whole layout (RTL).
Adding a language means adding one entry to the I18N object in index.html — no build,
no extraction step, no translation files. Loading index.html?test fails loudly if a key
is missing from any language.
Stats
A third mode next to the timer and the clock: Day (stacked bars per hour, focus and break), Week (bars per weekday), Month (a calendar of dots sized by focus time — tap a day to drill in) and Year (a heatmap grouped by month). Each view shows the focus/break totals, block count, a focus-break ratio bar and the average focus by time of day. All of it is computed from the log you already have — nothing new is collected.
Themes
Supabase (default), Matrix, Twitter, Monokai, Dracula, Nord, Tokyo Night, Vercel and Anthropic — they apply to both modes and to full screen. On the Matrix theme, full screen gets the falling-character rain.
Where your data lives
Everything is kept in the browser's localStorage. Nothing leaves your machine,
nothing is sent anywhere.
That means your entries survive closing the tab, quitting the browser and restarting the computer — but they are tied to the browser + origin pair:
- opening via
file:///Users/…is one store, opening viahttp://localhost:…is another; - Chrome and Safari do not share with each other;
- a private window loses everything on close (the app shows a red warning in that case);
- nothing syncs across machines.
So: always open it the same way. The app explains this itself under the "Where is my data stored?" link.
To move entries between browsers or machines — or just to keep a backup — use Export and Import under the log. Export downloads a JSON file with every entry and your preferences; Import merges it into the current browser, skipping entries that are already there (so importing twice is harmless). Importing into an empty browser also restores your preferences.
Delete (the padlock button) wipes every entry after asking for the fixed password
123456 — a guard against accidental clicks, nothing more (see
SECURITY.md). Preferences are kept.
Format
// localStorage["pomo.log"]
[{ id: 1787832087864, // epoch ms, same as end
start: 1787830587864, // epoch ms
end: 1787832087864, // epoch ms
min: 25,
kind: "focus", // "focus" | "break"
text: "Implement login",
proj: "Checkout", // optional
url: "https://git.example/pull/12" }] // optional
// localStorage["pomo.cfg"]
{ f: 25, b: 5, auto: false, zen: true, audio: true,
h12: false, lang: "en", theme: "supabase", mode: "pom" }
Entries written before the proj field remain valid — there is no migration.
The exported backup wraps the same data: { v: 1, exported: "<ISO date>", cfg, log }.
Import also accepts a raw array of entries.
Development
The project is index.html and nothing else: HTML, CSS and JavaScript in the same
file, no transpilation. Edit, reload.
Opening it with ?test in the URL runs the checks on the pure functions — per-project
aggregation, duration formatting, clock parts and day key, ISO week numbers, the
focus-break ratio, the splitting of entries across hour/period boundaries, the backup
merge, and i18n completeness (every key present in all fourteen languages) — and prints
self-check ok to the console:
index.html?test
See CONTRIBUTING.md before opening a pull request, and SECURITY.md to report a vulnerability.
Icons: skillicons.dev (Supabase, Twitter, Vercel) and Tabler Icons (all others), both MIT, inlined so the app works offline.
License
MIT — see LICENSE.