A public, always-on, UTC-disciplined running timecode anyone can lock to — so productions stay in sync across locations (a GoPro rig, a coast-to-coast crew). Free, keyless, read-only; nothing leaves the client.
↑ live, running in your browser right now via the SDK below.
<script type="module">
import { DropFrame } from "https://dropframe.app/dropframe.js";
const df = await DropFrame.connect();
setInterval(() => console.log(df.timecode("29.97df")), 100); // live SMPTE time-of-day
</script>
That's it — df stays locked to the global timecode; read it whenever you render. It keeps
itself in sync in the background and falls back to the device clock if offline, automatically.
Get dropframe.js (MIT — drop it in your project).
| Method | Returns |
|---|---|
df.now() | Global time, ms since the Unix epoch (UTC). |
df.date() | The same instant as a Date. |
df.timecode(rate?, opts?) | SMPTE time-of-day string, e.g. "13:45:09;12". Default "29.97df", UTC. |
df.frame(rate?, opts?) | { h, m, s, f, fps, df, utc, label } for programmatic use. |
rate ∈ 23.976 · 24 · 25 · 29.97 · 29.97df · 30
(drop-frame → ;, non-drop → :). opts: { utc: false } uses the device's local wall clock.
| Property | Meaning |
|---|---|
df.state | "locking" → "global" (locked) or "fallback" (on device clock) |
df.dispersion | ± uncertainty in ms; null on fallback |
df.offset | ms added to the device clock to reach global time |
df.edge | which edge served (transparency), e.g. "SJC" |
df.onChange(cb) | subscribe to {state, dispersion, offset, edge}; returns an unsubscribe fn |
df.stop() / df.start() / df.ready | pause / resume / first-sync promise |
df.dispersion (± ms). It's a network time reference (~ms accuracy) —
great for keeping devices aligned across locations, not a substitute for sample-accurate genlock.