WOD Timer is a CrossFit workout timer for EMOM, AMRAP, For Time, Time Cap, Tabata, and clock mode in the browser or as a macOS desktop app.
English | 简体中文
| Common problem | How WOD Timer solves it |
|---|---|
| Generic stopwatch apps do not match actual WOD formats | Built-in modes cover EMOM, AMRAP, For Time, Time Cap, Tabata, and a plain clock |
| Switching between workout formats is slow | Mode tabs let you jump between formats without changing apps |
| Small mobile timers are hard to read during training | Large full-screen display keeps time visible across the room |
| Standard timers feel flat and easy to ignore | Audio cues and a 3D animated background create stronger workout rhythm |
| Browser-only tools are awkward to launch like real apps | The project also ships as a macOS desktop app via Tauri |
TL;DR — WOD Timer is a focused workout timer for common CrossFit-style sessions. It is small, local, readable, and easy to ship as both a web page and a Mac app.
- Clock mode keeps a large wall-clock style display visible when you are not running a workout.
- Time Cap mode counts down from a fixed cap in minutes.
- For Time mode acts like a workout stopwatch.
- AMRAP mode counts down a fixed working window.
- EMOM mode handles repeating intervals plus round count.
- Tabata mode supports alternating work and rest rounds.
- Audio countdown cues call out the final seconds of a round.
- Start, rest, and completion tones give clearer phase transitions.
- Visual warning state highlights the last five seconds.
- Browser-first frontend keeps the app simple to understand and easy to tweak.
- macOS desktop app is packaged with Tauri for normal app-style launching.
- GitHub Release workflow can build and publish a
.dmgfrom a version tag.
WOD Timer runs locally. There is no backend, no account system, and no workout data sync.
User input
|
v
HTML / CSS / JavaScript UI
|
+--> AudioManager (tones and countdown cues)
|
+--> ParticleBackground (Three.js visual layer)
|
+--> Tauri shell on macOS (optional desktop wrapper)
Download the latest macOS installer from GitHub Releases.
Open wod_timer.html directly in a browser.
npm install && npm run app:buildnpm install && npm run app:devModes: CLOCK | TIME CAP | FOR TIME | AMRAP | EMOM | TABATA
Status: PREPARE
Timer : 00:00:00
Round : ROUND 1 / 10
[ RESET ] [ START ]
- macOS if you want the packaged desktop app
- Node.js and npm if you want to build locally
- Rust toolchain if you want to build the Tauri app yourself
- Internet access for the current frontend asset setup, because the UI loads Google Fonts and Three.js from remote CDNs
| Mode | Inputs | Defaults | Behavior |
|---|---|---|---|
| Clock | None | N/A | Shows the current time |
| Time Cap | CAP (MIN) |
5 |
Counts down from a fixed cap |
| For Time | None | N/A | Counts up like a stopwatch |
| AMRAP | TIME (MIN) |
10 |
Counts down a work window |
| EMOM | EVERY (SEC), ROUNDS |
60, 10 |
Repeats intervals and tracks rounds |
| Tabata | Internal settings in code | 20 / 10 / 8 |
Alternates work and rest |
.
├── wod_timer.html
├── style.css
├── script.js
├── audio_manager.js
├── background_3d.js
├── package.json
├── scripts/
│ └── prepare-app.mjs
└── src-tauri/
├── src/main.rs
├── tauri.conf.json
└── icons/
wod_timer.htmldefines the timer UI.script.jsholds workout mode logic, timers, transitions, and UI state.audio_manager.jsgenerates local audio cues with Web Audio.background_3d.jsrenders the animated particle background with Three.js.src-tauri/packages the frontend as a macOS desktop app.
- CrossFit athletes who want a simple fullscreen WOD timer
- Coaches running EMOM, AMRAP, or Tabata sessions in a gym
- Home gym users who want a timer without logging into a service
- Developers who want a small Tauri example wrapping a static frontend
- Makers who want to fork and customize a timer for their own training style
Do I need the macOS app to use WOD Timer?
No. You can open wod_timer.html directly in a browser and use the timer without building the desktop app.
Does this project send workout data to a server?
No. The project is local-only. It does not include a backend, cloud sync, or user accounts.
Why are node_modules and src-tauri/target not committed?
Those folders are generated build artifacts and dependency caches. They are large, reproducible, and should stay out of the repository.
How do I publish a new downloadable version?
Create and push a version tag such as v0.1.1. The GitHub Actions workflow will build the macOS app and upload a .dmg to GitHub Releases.
Will WOD Timer work offline?
The local app logic is local, but the current frontend references Google Fonts and a Three.js CDN. If you want fully offline behavior, those assets should be vendored into the repo.
Issues and pull requests are welcome. If you plan to change workout logic or packaging behavior, open a short discussion first so the timer modes and release flow stay consistent.
Released under the MIT License.