Timer Kit
How to run NRCD Live
FinishLynx and Meet Manager path for club track and cross country meets. No AthleticLIVE account required. Fans watch on NRCD with PR, club, meet, and nationals badges. Timers push results with a meet token and/or a signed-in Live crew account. Same home as registration and season results - not a separate live-only vendor.
A · Manual upload works as soon as Live is on and crew can sign in
(upload each FinishLynx .lif after the heat).
B / D automatic needs host setup first (Enable Live, bibs, one-time token)
plus the agent running on the timing laptop - that is why auto is not instant.
C is for custom software. D is for Meet Manager scoring
(FTP / publish), not a FinishLynx substitute.
Printable organizer + timer steps:
preflight checklists.
Your timing system stays primary
Most timing companies already run their own in-person stack (FinishLynx, Meet Manager, Athletic, local scoreboards, race clock, etc.). Keep using that on site. NRCD Live is a separate hookup: push heats/marks (and optional clock/board focus) so fans and clubs see the same meet on NRCD. You do not replace your FAT or venue displays with ours.
Heat sheets: timers can seed in Meet Manager from the entries CSV as usual. Hosts can also seed heats in NRCD (Entries page). Capacity differs by event (set Track lanes for the facility; override Lanes / max per event: sprints use lane count, distance uses a higher max). Events like the 200 are often marked Seed heats later until check-in, then seeded when ready.
Practice desk before your meet
Sign in with Google, then open
/upcoming-meets/0/live?mode=desk.
The Practice desk matches meet day: Clear all, Path A .lif upload,
Timer desk (clock / board focus / correct a mark), Path D HyTek upload, and a fixed practice
Bearer token for Path B/C (Authorization: Bearer ... on
POST /api/live/0/ingest).
Same meet id also has registration practice at
/upcoming-meets/0
(not listed on Upcoming meets).
All practice links:
Meet tools.
No install
A · Manual upload
Host adds Live crew (or they request). Crew signs in, uploads each .lif
after the heat, and can enter field attempts on the web. No Python. No token on the laptop.
Auto after setup
B · Folder watch
Windows .bat or macOS/Linux .command watches the FinishLynx LIF folder.
Needs Python + ingest token. Not instant: host must enable Live, assign bibs, and share the token first.
Custom software
C · Live Timer API
Your software POSTs JSON or LIF with a Bearer token. Not browser upload. Not the agent script (B is one client of C).
Why automatic is not available right away
Folder watch (B) and Meet Manager FTP (D) only push marks once the timing laptop is running NRCD's agent with the meet token and a folder/FTP target. That needs host steps first (Enable Live, bibs, copy token while it is shown) and a short install on site. Until the agent is running, use A: signed-in crew uploads each heat in the browser.
D · Meet Manager (FTP / publish)
Full Path D via local agent FTP (F11/F12), publish-to-disk, or Live ops upload - AthleticLIVE-style FTP, not a HyTek DB mirror. Use when MM is your results source; A/B remain the FinishLynx heat-by-heat paths. See Path D.
Path C is different from A and B
A uses an NRCD login. B is NRCD's folder watcher. C is any HTTP client (Meet Manager plugin, custom script, another stack). Details: Live Timer API.
Preflight checklists
Step-by-step for the meet organizer and the timer (login, deadlines, scratches, seeding, Live paths, finals). Same lists printable: Preflight checklists. Practice by role: Meet tools.
Meet organizer
Host preflight
Work top to bottom from the meet's Host home.
Easiest Live path for a first FinishLynx meet: enable Live -> assign bibs -> add Live crew -> they upload each .lif in the browser (Path A).
The Live page Preflight panel shows Live on / bibs / crew status.
1 · Account and meet
- Sign in with Google. Claim the host club (Personal Pro) if you have not yet.
- List the meet (or open it) -> Host home.
- Edit listing: name, dates, timezone, packet link. Set Event order / Schedule (order, start times, lanes/max, grade limits). Add finals display slots after prelims when you need them on the board.
- Enable roster registration. Set registration deadline and scratch deadline (date, time, timezone).
- Leave temporary teams / unattached off unless visitors without a claimed club must self-enter.
2 · While registration is open
- Share the Register link with visiting clubs (see how to register).
- Watch Entries as clubs enter seeds and relays. Hosts can also enter for a club from Register.
- Remind clubs: new entries stop at the reg deadline; team scratches stay open until the scratch deadline.
3 · After entries / before race day
- Download entries CSV for the timing crew (seeds, status, bibs when assigned).
- Seed heats in Meet Manager and/or on NRCD Entries (Seed heats / Reseed marks / Clear heats). Use meet track lanes and per-event max. If the timer seeds in MM/Lynx, they can push heat/lane back via Live desk Import heats after bibs are assigned.
- Mark Seed heats later for events held until check-in (often the 200); seed those when scratches settle.
- Check-in needs heats first (unless you turn on "allow check-in without heats" on the desk). Print or download heat sheets after seeding.
- On NRCD Live: assign bibs (or auto-assign). Re-download CSV so MM/Lynx competitor numbers match.
- Optional for Paths B/C: seed FinishLynx event-number maps from the schedule.
4 · Night before / morning of (Live handoff)
- Enable NRCD Live. Confirm green Preflight ready (red rows have Fix links).
- Path A (usual): add Live crew by email (timer and/or field judge), or tell them to Request to be timer when no crew exists yet. Confirm a pending request before fans should see Live.
- Paths B / C / D only: copy the ingest token while it is shown (one-time), download agent + starter for B/D, and send meet id + token (+ API link for C). Rotating the token later kills the old one - update the laptop if you rotate.
- Text the timer the Live URL, Timer home, and preflight checklists.
- Plan meet-day Check-in desk / clerk (desk scratches still work after the team scratch deadline).
5 · During the meet
- Run check-in / desk scratches; refresh heat sheets if seeds change.
- When ready, Seed heats for any seed-later events.
- After prelims: confirm finals on the schedule; timer advances (track Timer desk Prelim -> finals; field pad Take to finals / Start finals).
- Field marks: crew uses the field entry pad (LJ/TJ/throws/HJ/PV), not only .lif upload.
6 · After the meet
- From Host home / Meet director: Promote compiled Live marks (or download results CSV), or use Add Results if Live was not used.
- Disable Live when the day is done.
Timer / Live crew
Timer preflight
Host must Enable Live and assign bibs first. Easiest path: sign in as Live crew ->
Timer home -> Live desk -> upload each FinishLynx .lif (Path A).
Pick only one automatic path (B/C/D) if the host set that up.
1 · Account and access
- Create or sign in with Google using the email the host will add as Live crew (or the email you will use to request access).
- Open the meet (host text or Upcoming meets) -> Timer home or Live page. If no crew exists yet, click Request to be timer (provisional until the host confirms; then fans see Live).
- Confirm you can open Live desk (upload) and, if you judge field, field entry pad.
2 · Timing computer (path you are using)
- A · Manual upload: signed-in Live ops only - no Python, no token on the laptop.
-
B · Folder watch: from Timer home or Live desk, open
Download agent files - get
nrcd_live_agent.py+ Windows.bator macOS.command(paste the host's ingest token). Need Python 3.9+? Easy install: python.org/downloads. Put both files in one folder; run starter; point at the FinishLynx LIF folder; leave the window open all meet. - C · Timer API: meet id + Bearer token; your software POSTs to
/api/live/<id>/ingest. -
D · Meet Manager: same downloads as B; leave LIF blank and set FTP
2121(or MM export folder), or Live ops HyTek upload. Not a substitute for FinishLynx heat-by-heat FAT when Lynx is primary. - Load entries CSV / bibs into Meet Manager or FinishLynx so competitor numbers match NRCD bibs.
- After you seed heats in MM/Lynx: Live desk → Import heats (paste event+bib+heat+lane, or entries CSV with heat_number/lane_number filled) so NRCD heat sheets and Live start lists match the timing laptop.
3 · Before race 1 (dry run)
- Host Live page shows green Preflight ready (Live on + bibs when athletes are entered).
- A: upload a practice
.lif-> mark appears in Latest. - B: run starter (or
--preflight); drop one practice LIF -> Agent on. - C: POST one practice row (or Live page curl) -> mark shows.
- D: F11/F12 or preview-upload a practice HyTek file -> events appear.
- Optional: race clock Zero -> Start -> Stop; open venue tabs (Scoreboard / Monitor / Finish) on a second screen or TV (same Wi-Fi; fans OK once Live is public).
4 · Meet day
- Check-in desk or phone clerk for check-ins and scratches; heat sheets from Timer home.
- Track: after each heat, Path A upload - or leave B/D agent running - or keep C posting.
- Field: enter attempts on the field entry pad (check-in/scratch on the pad first). Outdoor LJ/TJ can record wind (m/s).
- Use Timer desk Prev/Next / board focus if fans stick on the wrong heat.
- After prelims: Prelim -> finals on the track Timer desk (take N, seed style), or field pad Take to finals / Start finals.
- Export Scratches CSV if clerks need a list.
Must fix before race 1
- Live enabled + bibs assigned when athletes are entered.
- Path A: you can sign in as Live crew. Paths B/C/D: current token works and agent/API is running.
- Competitor numbers in Lynx/MM match NRCD bibs.
- Heats seeded before check-in (unless the host allowed check-in without heats).
Host · before meet day
- Turn on roster registration and clubs enter athletes (how to register).
-
Assign bibs on the Live page (manual or auto-assign; default start is 1).
Optional gender filter for XC-style ranges.
Download entries CSV (includes
athlete_bibs) so the timing crew can load Meet Manager / FinishLynx start lists as usual. -
Optional for Path B/C/D: map FinishLynx event numbers (
001-1-02.lifto Men 1500m) or seed maps from the schedule. Path A can type the event name on each upload instead. - Enable NRCD Live. Path A: add Live crew by email. Path B: download agent.py + starter while the token is shown. Path C: share meet id + token + API docs. Path D: if scoring in Meet Manager, plan FTP/publish or Live ops HyTek upload (Path D).
Path A · Browser upload
- Host adds one or more NRCD emails under Live crew (timer, field judge, or both), or the timer opens the meet Live page and clicks Request to be timer when no crew exists (provisional access; host confirms before fans see Live).
- Timer signs in, opens the meet Live page, expands Live ops.
-
After each heat: upload the FinishLynx
.lif. Event name is optional when filenames like001-1-02.lifare mapped. Confirm the mark in Latest. - Optional desk tools: clock, Prev/Next board focus, correct a mark.
Printable path steps: Preflight checklists.
On the timing computer (Path B)
Skip this section for Path A (browser upload) or Path C (your own API client).
- Load the entries CSV into Meet Manager (or your usual start-list workflow).
- Time with FinishLynx. Leave LIF files in a watch folder (typical
EEE-R-HH.lifnames). -
Host downloads
nrcd_live_agent.pyand a starter from Timer & crew setup (token must be visible): Windows.bator macOS/Linux.command. Keep both in one folder, then run the starter (macOS:chmod +xthe.commandfile first, then double-click). Optional second prompt: HyTek/MM export folder. Or run the agent directly:
python scripts/nrcd_live_agent.py \
--base-url https://nationalrunningclubdatabase.com \
--meet-id MEET_ID \
--token "$NRCD_LIVE_TOKEN" \
--watch /path/to/FinishLynx/LIF \
--mm-watch /path/to/MM/exports \
--require-ready \
--label "finish-lynx-laptop"
Starters pass --require-ready (refuse to watch until Live preflight is green).
Check once without watching: --preflight.
Optional: --mm-watch for a Meet Manager export folder
(.json NRCD Live payloads; opaque .html is skipped unless a matching
.json sidecar sits beside it),
--clock-file / --clock-event for a running clock, and
--discipline field (or track / xc) to force type.
Default is --discipline auto: use the host event map or infer from the event name
(XC meets should use --discipline xc or map events as XC).
The agent prints a status line (connected, last upload, pending files) and heartbeats so the host sees
Agent on. State persists in .nrcd_live_state.json under the LIF folder
(or --state).
Scratches: NRCD roster scratch (register / check-in / clerk) shows as Out on Live start lists. Timer race marks DNS / SCR appear on result rows. A matched DNS also scratches the NRCD entry so start lists stay aligned; export scratches CSV for FinishLynx / Meet Manager when the laptop needs the same list.
Windows: run
scripts/nrcd_live_agent.bat or scripts/nrcd_live_agent.ps1
(prompts for base URL, meet id, token, and watch folders; or set
NRCD_LIVE_* env vars). Needs Python 3.9+ on PATH
(easy install if needed:
python.org/downloads,
check Add to PATH). No separate GUI; use the Live page on NRCD for desk controls.
macOS / Linux: run
scripts/nrcd_live_agent.sh
(same prompts / env vars), or the host-downloaded .command starter
(chmod +x, then double-click on macOS). Needs
Python 3.9+ (easy install if needed from
python.org/downloads
or brew install python).
Meet-day Timer desk
- Open the meet’s Live results page (signed in as host or Live crew). Results stay at the top; expand Live ops for the desk.
-
Use Prev / Next (or the focus dropdown + Show) so the heat·flight board
and scoreboard follow the current race. Projector URLs:
?mode=heatboard,?mode=board,?mode=monitor(square timer TV), and?mode=finish(finish line). - Set or clear the running clock so fans see event time on the page and scoreboard.
- After a camera misread: Correct a mark (time or DNS/DNF/DQ) or delete the row. Event/heat fields prefills from board focus.
Same actions are available via the board / rows API below (Bearer token, no login).
During the meet · what fans see
- By heat / flight - track heats, or field flight boards (Best + attempts). Start lists from registration appear until marks arrive.
- Compiled - best mark per athlete (fastest time on track; farthest/highest on field).
- Heat / flight board (
?mode=heatboard) - one heat or flight at a time for a projector. - Scoreboard (
?mode=board) - full dark display with event nav. - Timer monitor (
?mode=monitor) - square live monitor with huge clock and focused heat. - Finish line (
?mode=finish) - diagonal finish-line board of latest finishers. -
Race clock: Timer desk has Lynx-style
Zero → Start → Stop,
False start (restart), and Next/Prev + zero.
Shortcuts: Space / Z / R / N / P. Open Monitor tabs tick from the shared start
(~50ms) and update instantly via desk AJAX sync. Agent clock file may contain a
time or
START/STOP/ZERO/FALSE_START. Token API:POST /api/live/<id>/clockwith{"action":"start"}(or zero/stop/clear/false_start). - Search / Women·Men filters, a Latest ticker, and team scores (track place points from meet/series settings, default 10-8-6-…; XC NIRCA place-sum when enough finishers).
- Events follow the host event-map / schedule order. Results refresh automatically; new marks highlight briefly.
Host · after the meet
Permanent NRCD results are a host job. Meet Manager does not write them into the NRCD database by itself (Path D only feeds Live during the meet).
- On the meet Live page (Meet director): promote compiled live marks into the permanent results DB, and/or download results CSV (relays included when matched to entries or as team anchors; unapproved for non-admins).
- If you did not run Live: use Add Results (CSV or form). Same path as other club meets without Live. See Meet tools · host post-meet.
Not included yet
Native FinishLynx TCP / .lss scoreboard scripts.
Promote and results CSV above already cover writing Live marks into permanent NRCD results.
Live Timer API (Path C)
This is the HTTP API for custom timing software. It is not the browser upload (A) and not the folder agent script (B), though B calls these same endpoints. Auth: meet ingest token (shown once when the host enables Live). Meet id is the upcoming-meet id from the URL.
Authorization: Bearer <meet_token>
JSON results
POST /api/live/<meet-id>/ingest
{
"source": "agent",
"event_name": "Men 1500 Meter Run",
"gender": "M",
"heat": 1,
"discipline": "track",
"rows": [
{
"place": 1,
"bib": "104",
"lane": 3,
"first_name": "Pat",
"last_name": "Runner",
"team_name": "Test University A",
"result_time": "3:55.22"
}
]
}
Non-finishers: send "result_time": "DNS" / "DNF" / "DQ"
(or "status": "DNS"). FinishLynx LIF files that put those codes in the place or
time column are accepted. They sort after finishers (DNF, then DNS, then DQ) with no place.
Field example: set "discipline": "field" (or name the event clearly,
e.g. Men Long Jump) and send one row per attempt with
"mark", "attempt_num", and optional "wind" (m/s).
Use "flight" (alias of heat) for flight number.
Fouls can be "X" / "FOUL" / "NM".
The live page shows a flight board (Best + A1…An); compiled ranks by best mark
(higher wins). Discipline may also be xc.
{
"event_name": "Men Long Jump",
"discipline": "field",
"flight": 1,
"rows": [
{ "bib": "77", "mark": "6.55", "attempt_num": 1, "wind": "+0.8" },
{ "bib": "77", "mark": "FOUL", "attempt_num": 2 },
{ "bib": "77", "mark": "6.85", "attempt_num": 3, "wind": "+1.2" }
]
}
LIF upload
POST /api/live/<meet-id>/ingest/lif - multipart form field
file, plus optional event_name, heat,
gender, discipline.
If the filename encodes an event number and the host mapped that number, the mapped
display name / gender / discipline are applied when those fields are not passed explicitly
(or when discipline is auto / omitted).
Path D · HyTek Meet Manager (FTP / publish-to-disk)
Full Path D for clubs that score in HyTek Meet Manager. Closest to AthleticLIVE's
FTP path - not AthleticLIVE's HyTek Windows database connection.
If you also run FinishLynx, Paths A/B .lif remain the smoothest for heat-by-heat FAT;
Path D is the right primary path when MM is your results source.
Hands-free after agent setup (MM)
- Enable Live; download agent + starter while the token is shown (or paste token later to re-download).
-
Run the starter: leave FinishLynx blank for HyTek-only, set FTP port
2121(or run--ftp-port 2121with optional--mm-watch …). -
In HyTek Meet Manager → Internet / FTP settings: host
127.0.0.1, port2121, usernrcd, passwordlive(unless you overrode--ftp-user/--ftp-pass). -
After scoring: F11 (heat) or F12 (event), or publish results.
Files land in the drop folder; the agent settles rewrites then POSTs
/api/live/<id>/ingest/hytek.
No FTP? Use Meet Manager publish / export to disk into the same
--mm-watch folder.
Manual / API
- Browser: Live ops → Path D → preview → upload.
- API:
POST /api/live/<meet-id>/ingest/hytekmultipartfile. - Accepted files: classic Meet Manager text, headered CSV/TSV, or light HTML results.
Running clock
POST /api/live/<meet-id>/clock
{
"clock_display": "3:42.1",
"clock_event_name": "Men 1500m"
}
Board focus (next heat / event)
Shared focus for heat·flight board and scoreboard. Host / Live crew use Timer desk on the live page (Prev / Next, Set clock, correct mark). Token API:
POST /api/live/<meet-id>/board
{ "action": "next" }
{ "action": "prev" }
{ "event_name": "Men Long Jump", "heat": 2 }
Correct or delete a mark
After a camera error or false start dump: fix time / DNS·DNF·DQ, or remove the row. Live crew can do this on Timer desk; token API:
POST /api/live/<meet-id>/rows/<row-id>
{ "result_time": "4:12.55" }
{ "status": "DNS" }
{ "action": "delete" }
Or DELETE /api/live/<meet-id>/rows/<row-id>.
Agent heartbeat
POST /api/live/<meet-id>/heartbeat
{ "agent_label": "finish-lynx-laptop" }
Public feed
GET /upcoming-meets/<meet-id>/live.json?view=heats|compiled
(also returns heat_cards for heat/flight-board mode when
view=heats; field cards include field_athletes).
Supports ETag / If-None-Match (304 when unchanged).
Includes feed_etag in the JSON body.
Related guides
- Meet tools: practice sandboxes by role (host pre / timer / during / host post)
- Preflight checklists (printable / phone)
- Host Kit: claim, list, registration
- How to register: clubs and guests
- Upcoming meets: find the meet