No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Vagner Rodrigues 4671eec3a6 Turn the pomodoro presets into an icon dropdown
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>
2026-08-27 13:08:32 -03:00
.gitignore Pomotimer: pomodoro com registro diário e relógio em tela cheia 2026-08-27 10:28:55 -03:00
CODE_OF_CONDUCT.md Add project documentation 2026-08-27 10:36:41 -03:00
CONTRIBUTING.md Add eight languages, RTL support and a two-column language menu 2026-08-27 12:59:25 -03:00
index.html Turn the pomodoro presets into an icon dropdown 2026-08-27 13:08:32 -03:00
LICENSE Add project documentation 2026-08-27 10:36:41 -03:00
README.md Add eight languages, RTL support and a two-column language menu 2026-08-27 12:59:25 -03:00
SECURITY.md Bring README and SECURITY up to date with v1.3.0 2026-08-27 12:48:07 -03:00

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:0009:25 (25min, focus) [Checkout] Implement login — https://git.example/pull/12
- 09:2509: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 via http://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.