Open Standard v1

Every timer. One URL.

OpenWodTimer encodes workout timers — EMOM, Tabata, AMRAP, For Time — into a single URL parameter that any app can parse.

?openwodtimer=
9:41 ⚡ 87%
TABATA
00:20
WORK
Round 3 / 8
SCROLL

One parameter to rule all timers

OpenWodTimer defines a compact, human-readable, composable syntax for encoding any workout timer configuration in a URL. No backend needed. No proprietary formats. Just a query string.

Compact

An entire Tabata protocol fits in 27 characters. Share timers via QR code, text message, or hyperlink.

tabata(00:20,00:10,8)

Human-Readable

No UUIDs, no encoded blobs. Read the URL and instantly know it's a 10-round EMOM with 1-minute intervals.

emom(01:00,10)

Composable

Chain any workout types with mix(). Build competition formats, warm-ups, and complex training blocks.

mix(emom(01:00,5),rest(02:00),tabata(00:20,00:10,8))

HOW IT READS

?openwodtimer= mix ( ft ( 12:00 ), rest ( 05:00 ), amrap ( 10:00 ))
Containers Timer types Time values

Six types. Infinite workouts.

Every common timer format, encoded in a function call.

FOR TIME

ft()

Complete all work before the clock runs out. A countdown you race against.

19:42
Round 3/5
?openwodtimer= ft(20:00,5)

AMRAP

amrap()

As many rounds as possible in a fixed window. Push the pace, stack the rounds.

12:33
Rounds 7
?openwodtimer= amrap(15:00)

EMOM

emom()

Every Minute On the Minute. Work at the top, rest whatever's left.

00:42
Round 7 / 10
?openwodtimer= emom(01:00,10)

TABATA

tabata()

Alternating work and rest intervals. The protocol that changed HIIT forever.

00:14
WORK
?openwodtimer= tabata(00:20,00:10,8)

RSA

rsa()

Round Start At — explicit start times for each round. Perfect for wave starts and heats.

00:00
Heat 1
02:00
Heat 2
04:00
Heat 3
06:00
Heat 4
?openwodtimer= rsa(00:00,02:00,04:00,06:00)

MIX

mix()

Chain any workout types together. Build competition formats and complex training blocks.

FT
R
AMRAP
?openwodtimer= mix(ft(10:00),rest(03:00),amrap(12:00))

How it works

Four concepts. Zero complexity.

1

Pick your timer type

Six function names map to every common workout format.

ft() amrap() emom() tabata() rsa() mix()
2

Set the parameters

Times are MM:SS, counts are integers. That's it.

emom( 01:00interval (MM:SS) , 10rounds (int) )
tabata( 00:20, 00:10, 8 ) → 20s work, 10s rest, 8 cycles
3

Compose with mix()

Chain any types together. Nest as deep as 4 levels.

mix(
ft(12:00),// 12-min For Time
rest(05:00),// 5-min break
amrap(10:00)// 10-min AMRAP
)
4

Share the URL

Append to any compatible app URL. The timer config travels with the link.

https://owt.es?openwodtimer=mix(ft(12:00),rest(05:00),amrap(10:00))
Formal Grammar (BNF)
expression  = workout
workout     = ft | amrap | emom | tabata | rsa | mix | rest

ft          = "ft(" time [ "," int ] ")"
amrap       = "amrap(" time ")"
emom        = "emom(" time "," int ")"
tabata      = "tabata(" time "," time "," int ")"
rsa         = "rsa(" time { "," time } ")"
rest        = "rest(" time ")"
mix         = "mix(" workout { "," workout } ")"

time        = DIGIT DIGIT ":" DIGIT DIGIT
int         = DIGIT { DIGIT }

Try it live

Build a timer URL, see it validated in real time.

GENERATED URL
?openwodtimer=tabata(00:20,00:10,8)
PREVIEW
TABATA
00:20
Total: 4 min

Reference Parsers

Drop-in implementations for every major platform.

Open standard, open source

The specification is licensed under CC BY 4.0. All reference code is MIT. Fork it, extend it, build with it.

CC BY 4.0
Specification
MIT
Reference Code
v1
Current Version