The TimerBox stream timer is a page you point a browser source at. Every setting is a query parameter, so the URL is the whole configuration: no account, no saved state on our end, nothing to break. Build one visually at /stream/, or write it by hand from this page.
The base URL is https://timerbox.app/stream-embed/. Parameters combine freely. Anything invalid falls back to a sane default, because a mangled URL might already be live on someone's stream, and a blank source mid-broadcast is not an acceptable failure mode.
Stability: these parameter names are a contract. URLs get pasted into OBS and forgotten; renaming a parameter would silently break running overlays. Names and accepted values stay backward compatible. Defaults can move (sound became none on 2026-08-14), so a hand-written URL that leans on one is worth making explicit.
Live Examples
These are real embeds, running now. They stay quiet because sound defaults to none; each also carries nobeacon=1, so reading the docs never counts as a timer in use. Your own URL doesn't need it.
?duration=5m&sound=none
?duration=10s&overtime=true&style=ring&fontsize=medium&sound=none (wait ten seconds and it goes into overtime)
?duration=15m&style=bar&color=%23facc15&message=BRB&sound=none
Timing
duration
How long the countdown runs. Takes unit form (5m, 1h30m, 90s), colon form (5:00, 1:30:00), or a plain integer, read as minutes. Up to 24 hours. Default: 5m. Ignored when at is set.
/stream-embed/?duration=10m
at
Count down to a clock time instead of a duration. Takes 24-hour time (at=20:00), 12-hour time (at=8pm, at=8:30pm), or a full date-time (at=2030-08-01T20:00, with an optional offset like -05:00).
A plain time targets the nearest occurrence: at 6 PM, at=20:00 counts to tonight's 8 PM. If the time passed less than 12 hours ago, the timer shows 00:00 rather than quietly counting to tomorrow. Reloads recompute from the clock, so scene switches and OBS restarts can't lose the target. One caveat for sharing: a plain time is read in each viewer's local timezone. Pin one shared moment with the date-and-offset form.
/stream-embed/?at=20%3A00&message=Live%20at%208
countup
countup=true counts up from zero with no limit. This is the marathon and elapsed-time setting. It doesn't add time on subs or donations, so it's not a full subathon timer. No alarm, because there is no target to hit. Ignored when at is set.
overtime
overtime=true keeps the countdown going past zero, counting up with a plus sign (+01:30). At zero, the page tries to play the alarm once. Honest and mildly motivating when you said 8:00 and it's 8:04. With at, a reload lands back exactly where the overtime should be, anchored to the target time; a source first loaded after the target skips the chime, since that moment already happened. Countdown modes only.
/stream-embed/?at=20%3A00&overtime=true
Reloads and Starting
resume
resume=true makes a duration countdown survive reloads: the end time is saved in local storage on your machine, and a reload mid-countdown picks up where it left off. A restored run continues immediately and does not wait for a new start trigger. Embeds sharing a duration and overtime setting share the saved entry, so identical timers across scenes stay in sync. A countdown that finished less than five minutes ago comes back showing its finished state; older than that, it starts fresh. With overtime the count itself picks back up, for up to an hour past zero. Duration countdowns only. at embeds don't need it.
/stream-embed/?duration=10m&resume=true
start
When a new page load begins. start=load (the default) starts as soon as the page loads. start=stream waits until you go live, which with countup=true makes a stream uptime counter. The advanced start=visible choice waits once for the first time OBS reports the source as visible after that page loads. It does not pause, resume, or restart the timer on later scene changes. If OBS loads or refreshes the page when the scene becomes active, it works the same as start=load. Both OBS-aware values fall back to load outside OBS. Ignored when at is set; a clock target is always armed.
/stream-embed/?duration=5m&start=visible&resume=true
Appearance
theme
The visual treatment. classic (default) is the plain TimerBox render. neon-dial uses 32 light cells as the remaining-time scale. sundial adds a shadow that becomes shorter as time runs out. acetate puts moving color layers in the digits. water-gauge lowers the water level as time runs out. broadcast-leader closes a gray aperture while a red signal sweeps across the frame. circle-grid moves four diagonal dot groups one step each second. ceramic-tile pours a new glaze across a kiln tile every minute. emberlight-hearth keeps a pixel fireplace burning under the time. pixel-x7 (Pixel Quest) drains an HP bar with the countdown. facet-k9 (Facet Shift) turns six rings of colored triangles one position per second. dream-m4 (Dreamfade Cat) fades a sleeping cat's color out and back, one minute each way. leaf-r2 (Botanical Bookmark) drains the color from a sprig of leaves for one minute and returns it the next. hex-sketch flips one of six lit hexagon panels into its next color every second. hex-c1 (Hex Cluster) runs one band of three colors through a ring of ten lit hexagon panels. Both go dark panel by panel in the last minute. All canvas themes work with a transparent or full background. Themes that honor bg are listed below. Unknown values fall back to classic.
A canvas theme starts on its selected ground or on transparency. TimerBox publishes it only after a complete frame is ready. If startup fails or the 1.5-second timeout passes, the page shows plain digits instead and keeps them for that page load. The timeout counts only time on screen, so a source that loads in a hidden scene waits for its scene instead of giving up. Classic and invalid theme IDs show digits at once. Clock-time and Resume sources stay numberless until their real value is ready.
/stream-embed/?theme=sundial&duration=5m
style
How the timer is drawn. digits (default) is just the numbers. bar adds a horizontal bar that drains as time runs out. ring wraps the digits in a draining circle. Count-up mode always renders digits, since there's no end to drain toward.
Themes only draw the styles they design. Sundial, Acetate, Neon Dial, Water Gauge, Broadcast Leader, Circle Grid, Ceramic Tile, Emberlight Hearth, Pixel Quest, Facet Shift, Dreamfade Cat, Botanical Bookmark, Hex Sketch, and Hex Cluster draw their own digit view. So theme=water-gauge&style=ring shows the Water Gauge and does not show the Classic ring.
palette
The theme's color set, resolved against the theme in the same URL. Circle Grid: signal, cobalt, mineral (default), or plum. Facet Shift: wild (default), broken, spokes, red, green, or mono. Hex Sketch: teal (default), mono, acid, or candy. Hex Cluster: northern (default), nemo, cyber, or sunset. Other themes ignore this setting, and unknown values use the theme's default.
/stream-embed/?theme=circle-grid&palette=plum&duration=5m
/stream-embed/?duration=5m&style=ring
message
Text under the digits. Defaults to "Starting soon...". Pass message= (empty) to hide it. URL-encode as needed; spaces become %20 or +.
endmessage
Text swapped in when the countdown hits zero. "Starting soon..." becomes "We're live!" without anyone touching OBS. Shows at zero even if message= hid the running text, and stays up through overtime=true while the timer counts past zero. Countdown modes only.
/stream-embed/?duration=5m&message=Starting%20soon...&endmessage=We're%20live!
msgfont
The message's typeface. dmsans, dmmono, dmserif, fredoka, caveat, bungee, or silkscreen. The end message wears the same one. Digits keep their own face. Only the font you pick is downloaded, so the choice costs nothing until you make it. Without the param, each theme wears its own default — silkscreen on Pixel Quest, fredoka on Dreamfade Cat, dmserif on Botanical Bookmark, dmsans everywhere else — and unknown values fall back the same way. msgfont=dmsans is how you put DM Sans on a theme that defaults to something else.
/stream-embed/?duration=5m&message=Starting%20soon&msgfont=caveat
msgsize
Message size as a percentage of the automatic fit, 50 to 200. Default 100. The layout still caps it so a 200% message can't crowd the digits out of a small source. Applies to the end message too.
/stream-embed/?duration=5m&message=BRB&msgsize=160
msgcolor
Message ink. Six hex digits, no hash: msgcolor=facc15. Without it the message uses the standard text color and dims at zero; with it, your color holds through every state, end message included. The digits follow color, which is a separate decision.
/stream-embed/?duration=5m&message=BRB&msgcolor=facc15
msgpos
Where the message sits. Two numbers, each 0 to 100: how far across, then how far down, both measured to the message's center. msgpos=85,10 puts it near the top right. Without it, each theme places the message automatically in its normal layout.
A custom position has a side effect worth knowing: the digits get the freed space back, so they render larger. Percentages hold across source sizes, which means a corner stays a corner whether the source is 800×600 or full 1080p. The builder at /stream/ lets you drag the message into place instead of doing arithmetic.
/stream-embed/?duration=5m&message=BRB&msgpos=85,10
digitfont
The face the numbers wear. dmmono (default, the TimerBox face, slashed zeros and all), chivomono (sturdy and neutral, plain zero), azeretmono (geometric, plain zero), or dotgothic16 (pixel grid, plain zero). Classic, Sundial, and Facet Shift honor it. Acetate, Neon Dial, Water Gauge, Broadcast Leader, Circle Grid, Ceramic Tile, Emberlight Hearth, Pixel Quest, Dreamfade Cat, Botanical Bookmark, Hex Sketch, and Hex Cluster set their own digit forms. The message has its own font (see msgfont).
/stream-embed/?duration=5m&digitfont=chivomono
transparent
transparent=true removes the background so the timer floats over your scene. OBS composites it cleanly; use a solid background when the timer is the whole scene.
ar
Legacy compatibility. Old copied URLs can contain 16x9, 1x1, 4x1, or 9x16. The timer keeps that shape inside the OBS source and leaves extra bands transparent. New builder URLs omit ar and fill the Browser Source. Keep this parameter in an old working URL; do not add it to a new one.
OBS dimensions are separate from the URL and must be entered in OBS. The current builder shows the exact Width and Height for Standard, Scene, Overlay, Square, or Vertical.
The bands are transparent to whatever composites the page, which in OBS is your scene. Opened in a plain browser tab there is nothing behind them, so they show the browser's own background.
/stream-embed/?duration=5m&ar=4x1&sound=none
fontsize
medium, large (default), or xlarge. Classic, Sundial, and Acetate use this setting. Neon Dial, Water Gauge, Broadcast Leader, Circle Grid, Ceramic Tile, Emberlight Hearth, Pixel Quest, Facet Shift, Dreamfade Cat, Botanical Bookmark, Hex Sketch, and Hex Cluster keep their designed scale after they load. The setting stays in old URLs and still controls the plain fallback frame if a theme cannot load.
color
Any CSS color, usually hex. Encode the hash: color=%2334d399. Digits, bar, ring, and the accent all follow it. Default is white, and anything the browser doesn't recognize as a color falls back to it. Themes use it differently: Sundial changes its digit ink, while Acetate changes the cyan film in its palette. Neon Dial, Water Gauge, Broadcast Leader, Circle Grid, Ceramic Tile, Emberlight Hearth, Pixel Quest, Facet Shift, Dreamfade Cat, and Botanical Bookmark keep their own complete palettes; Hex Sketch and Hex Cluster pick from their palette lists.
bg
Background color. Six hex digits, no hash: bg=1a2b3c. On classic it is a flat ground behind the digits. Sundial, Acetate, Neon Dial, Water Gauge, Broadcast Leader, Circle Grid, Ceramic Tile, Emberlight Hearth, Pixel Quest, Facet Shift, Dreamfade Cat, Botanical Bookmark, Hex Sketch, and Hex Cluster use it as the ground under their fixed artwork. It is ignored with transparent=true.
/stream-embed/?theme=sundial&bg=1c3a4a&duration=10m
shadow
Sundial's shadow strength, 0 to 100. Default 40. Transparent overlays on dark scenes may want more. 0 removes the shadow entirely, which rather misses the point of a sundial.
sound
The alarm at zero: none (default), bell, chime, gong, digital, singing-bowl, or soft-chime. The page tries to play the chosen sound through the browser source. OBS can include that audio in your stream. That's either the point or a problem, so the timer stays quiet until you pick a sound.
Counting
iid
A random tag the builder adds when you copy a URL. It tells us this setup exists and keeps working; it identifies a timer, not a person. Safe to remove, safe to leave. Hand-written URLs don't need one.
nobeacon
nobeacon=1 switches off the embed's usage report entirely. The embed also stays quiet when your browser sends Do Not Track or Global Privacy Control. Details in the privacy policy.
Notes for OBS
Enter the Width and Height shown by the builder. Standard is 800×600 — OBS's own default for a new browser source, so a fresh source needs no size edits; Scene is 1920×1080; 4K Scene is 3840×2160; Overlay is 1600×400; Square is 1080×1080; Vertical is 1080×1920. The URL cannot change these OBS fields. "Shutdown source when not visible" saves CPU. It also reloads the page on every scene entry, whatever the refresh box says. "Refresh browser when scene becomes active" does the same when Shutdown is off. Either way a plain duration countdown restarts on each switch, which is the right behavior for some BRB screens and exactly wrong for others. Pair resume=true or at with either box to keep one run going. The setup guide explains both boxes.
The embed is a plain web page, so it also runs in Streamlabs, XSplit, TikTok LIVE Studio, or any browser. Only OBS has usage data behind it. TikTok LIVE Studio was set up and checked by hand; the LIVE Studio setup covers it. The OBS-only features (start=visible, start=stream) start on load everywhere else.