PisteCast Guide
Everything an operator needs. The header above is live — if the score chip is ticking, the system is working while you read this.
01 How it works
The scoring machine is the only source of score, clock, cards, and priority. This system never writes to it — the referee's machine is always right, and the stream just mirrors it. Control adds the human context: which fencers are on the strip, the event, the round.
There are two ways the Bridge can read the machine — Ethernet is the one to use:
- Ethernet (recommended) — the FA-07 speaks the Cyrano network protocol over its Ethernet port: clean data, and it even sends the fencer names. See Connect over Ethernet.
- USB / serial (fallback) — the older path, reads the machine's serial repeater output in the browser Bridge page. Works, but no names and more finicky wiring.
02 Connect over Ethernet
This is the good path: one network cable, clean data, fencer names included, and nothing to solder. The machine and the laptop just need to be on the same network.
- Find the FA-07's IP address in its network/Ethernet menu (e.g.
192.168.1.230). - Get the laptop onto the same network as the machine. The reliable
way is a cable straight from the machine to the laptop, then give the
laptop a matching static IP (for a machine at
192.168.1.230:sudo ifconfig <adapter> alias 192.168.1.100 netmask 255.255.255.0, and re-run it if the cable is ever unplugged). A building wall jack is often a different network from the machine's even when both are plugged into it, and guest WiFi can never reach it — so bring the USB-Ethernet adapter. Thenping 192.168.1.230until it answers. - Open the Bridge page, and in the Ethernet (Cyrano) card type the machine's IP and click Connect. The status flips to Live and score, clock, and names start flowing.
Serving the overlay from the cloud (pistecast.com)? The button only works when the server runs on the club laptop. To read the machine at the club but serve the overlay from pistecast.com, run the bridge on the laptop as a forwarder — the exact copy-paste command (with your key filled in) is in Control → Settings → Cloud bridge.
node src/tools/cyrano-bridge.js --port 50103 --server prod
(or --server local if the overlay is served from the laptop).
Fencer names come through from Fencing Time automatically. More than one
strip? Run one bridge per strip, each with its own forwarding port and
an --strip N flag so it feeds the right board — e.g.
--port 50104 --strip 2 --server prod.Alt-1.
The referee's sequence is Alt-1+NEXT (zeroes the board and requests the match)
→ Alt-1+BEGIN (red "Match Running" light on; the machine now streams) →
START/STOP (starts the clock) → fence → Alt-1+END. Pressing NEXT or
BEGIN without Alt-1 just beeps. Two rules:
never restart the machine while the bridge is running (it re-grabs it on
boot), and if anything ever looks stuck, stop the bridge — the machine
releases itself within 40 seconds.Fencer names auto-fill. When the machine knows who's fencing (names loaded via Fencing Time), the overlay names them automatically — no need to pick fencers in Control. A Control assignment still wins if you set one.
03 Bridge app (download)
The easiest way to feed the machine into pistecast.com from any computer — no Node, no command to copy. Download the small bridge app, run it, and it relays the machine's score/time/lights to the overlay. Leave the window open; that's the whole job. It's the same read-only relay as the Ethernet card, just packaged so a non-technical operator can run it.
- Download it — Windows, Mac (Apple Silicon), or Mac (Intel). Not sure which Mac? Apple menu → About This Mac: "Apple M…" is Apple Silicon.
- Get your bridge key — in Control → Settings → Cloud bridge, use Copy key. You paste it into the app once. Keep it private; anyone with it can push scores here.
- Run it and answer the first-run questions: bridge key, then cable vs. Fencing Time forwarding, and finally the overlay strip number (default 1) — the strip this feed shows up on in Board and the overlay. Leave it at 1 for a single strip; set 2, 3, … when you run one app per strip. It saves your answers next to the app, so after the first time it's just open-and-go.
Windows
- Double-click
pistecast-bridge.exe. If Windows shows "Windows protected your PC" (the app isn't code-signed), click More info → Run anyway. - If Windows Firewall asks, click Allow.
- Paste your bridge key, choose 1 (plugged into the FA-07), accept the default IP, and set the overlay strip number (1 unless you're running more than one strip).
- Success looks like
server connectedin the window. Close it to stop relaying.
Mac
Because the app isn't Apple-notarized, the first launch goes through Terminal (one time). Open Terminal and run, from where the file downloaded:
(Intel build: use pistecast-bridge-mac-intel in each line.) If macOS
asks to accept incoming network connections, click Allow. Paste your
bridge key, choose 1, accept the default IP, set the overlay strip
number — success is server connected. After the first run it's just
./pistecast-bridge-mac again.
Reading a real machine
To actually relay scores, the computer must be on the machine's network — cable
it straight to the FA-07 and give it a matching static IP (machine at
192.168.1.230 → computer at 192.168.1.100, mask
255.255.255.0; see Connect over Ethernet).
Then start a bout on the machine: the app prints INFO lines with the
score and the overlay updates live.
04 Bridge page (USB fallback)
The USB/serial path, for when Ethernet isn't available. Minimal by design: connection status, a live score readout, and a frame counter. Healthy looks like this:
- Serial port: connected
- Server: connected
- Frames: counting up at roughly 24/s, green dot pulsing
- CRC errors: zero or nearly so
If the USB cable is knocked out, the page watches for the device returning and reconnects on its own. If the server connection drops (network blip), the bridge buffers everything and replays it when the server returns — a 30-second outage doesn't lose the bout.
Simulate machine runs a fake bout with no hardware — useful for testing the overlay, training a volunteer, or checking OBS before the machine is set up.
05 Control page
Running more than one strip? A strip switcher appears in the header — it picks which strip this Control drives, so Start bout, Swap sides, and the Live preview all act on the chosen strip. With a single strip there's no switcher and nothing changes. See Board for adding strips.
Bout tab
Up next: fill in a bout and press Add to queue instead of Start bout to line it up. The queue shows on the Board, the club page and the watch page, so spectators know who is on deck. Nothing starts by itself — the referee owns that — so press start now (or Start next on the Board) when the strip is ready, and the queued entry becomes the live bout.
Pick the camera-left and camera-right fencer, set the target (5 for pools, 15 for direct elimination — this drives auto-logging), optionally event and round, then Start bout. When the clock hits 0:00 or a fencer reaches the target, the result is logged automatically — no typing. End bout now logs it early with the current score.
Live tab
Shows the actual overlay exactly as OBS renders it. The checkerboard is what's transparent on stream. When in doubt, trust this view.
Roster tab
Add fencers one at a time. Display name is what appears on stream — the roster name is never mangled to fit. Click any fencer for their record and bout history.
Import tab
Paste or upload a CSV — columns
name, display_name, club, nation, weapon (only name is
required; nation is a 2-letter code like us). The
preview shows exactly what will be imported and flags problem rows; nothing
saves until you commit.
Clubs tab
Upload each club's logo once (under 2 MB). The preview shows it against dark and light backgrounds — a logo that looks like a white box there will look like a white box on stream. Clubs with no logo get a colored circle with their initials, which always looks fine.
Results tab
The bout history — every auto-logged bout grouped by day, with final scores. This is the record the Stats tab is built from.
Stats tab
Season standings from those logged bouts: bouts fenced, win–loss, touches scored and received, indicator, and win rate. No manual entry — it all comes from results.
Settings tab
Identity display chooses flags vs club marks on the bar, with a live
preview. auto is the right default: club always, flags only when
the two fencers' nations differ. The overlay URL for OBS lives here too —
regenerating the token breaks the old URL, so only do that on purpose. That URL
is strip 1's; for other strips, get each strip's own URL from
Board. The spectator links are here as well — see
below. User accounts and the cloud bridge key live here too.
Sharing the bout with people who aren't there
Two public links, in Settings → Spectator links. Neither needs a login,
and neither uses the OBS token, so nothing you do to them can break your stream.
Give the club a name and a link there — /club/on-point-fencing
— and that is the address you hand out; leave the link empty and you get an
unlisted token URL instead. A custom link is meant to be guessable: it is a front
door. New spectator token retires the token URLs; to retire a custom link,
change or clear the link itself.
- Club page (
/club/…) — the one to send. Every strip running right now with its live score, a tap into any of them, and the day's results underneath. It is permanent: send it once, it works all season. - Single strip (
/watch/…?strip=1) — the live audience screen for one piste. Names on plates that light with the lamps, the score at the size of the room, the clock and period, what just happened ("Left hit", "Double · L→R +12 ms", "Priority — Weber"), and the run of touches along the bottom. Beside it: head to head between these two from your own logged bouts, the score by period, cards and priority, who is up next, and your sponsor. Good on a phone and good on a second monitor (⛶ goes full screen). It follows the strip, not one bout, so it keeps working as fencers come and go.
On Board, Share bout on any strip gives you that strip's link with Copy, Email it (opens your own mail app, nothing to configure) and the club link beside it.
Venue screens
Two more views off the same link, both on the Club page tab.
Lobby wall puts every strip on one screen, sized to fill it, with a QR in
the corner — the TV by the door, F11, done. Printable QR sign is an A4
sheet with a big code and the link underneath; tape it where people stand, and
add ?strip=2 for a sign that opens one piste instead of the club
page. The codes are generated from whatever your club link currently is, so
reprint after you change it.
Fencer pages
Names in the club page's results are links: tap one for that fencer's record — bouts, win–loss, indicator, touches, last five, and every logged bout with the opponent's name linking on again. Same numbers as your Stats tab, from the same query. It shows the broadcast display name, never the roster record name.
Sponsor
On the Club page tab: a name, an optional link and a logo, shown in the corner of the live audience screen. Logos are re-encoded as PNG so a transparent one still looks right on the dark panel. Leave it empty and the panel is not drawn at all — nobody sees an empty "Sponsor" box.
Notices and photos on the club page
The Club page tab has a composer: a title, some text, an image, or any combination. Posts show up on the club page straight away — pool sheets, "DE starts at 1pm", a photo from the day. Pin one and it sits above the live strips; everything unpinned sits below them, so a flyer never buries the scores. Photos are re-encoded on upload (which also strips the location data a phone camera writes into them) and capped on the page, with a tap for the full size. Delete removes the post and its image. Posting needs a login; reading does not — the club page is public, so write accordingly.
06 Board — running more than one strip
A fresh install has one strip (Strip 1) and you can ignore this whole section — everything just works. The Board page is for when you stream more than one piste at once: it shows every scoreboard live in a grid, and it's where strips are created and named.
- Add a strip — on Board, + Add strip, give it a name (e.g. Piste 2) and an optional label (the machine's IP or a location). Adding strips is an admin job.
- Feed it — each strip needs its own bridge pointed at that strip's
number: the bridge app asks for an overlay strip
number, and the CLI/Fencing Time path takes
--strip N(see Connect over Ethernet). Strip 1 is the default, so a single bridge with no strip set feeds Strip 1. - Drill in — click a strip for the big view: Swap sides, Open overlay ↗ (that strip's own OBS URL — see below), Open Control, rename/relabel, or delete it (only strips with no logged bouts can be deleted).
Each strip has its own overlay URL: the same token with a
?strip=N on the end, e.g. /overlay/<token>?strip=2.
Control's Bout tab and its overlay preview follow the strip picked in the header
(Control). For a venue TV, /display/<token>?strip=N
is a full-screen scoreboard on that same token.
07 OBS setup
- Copy the overlay URL — for a single strip, from Control → Settings; for a
specific strip, use Open overlay ↗ on that strip in
Board (it carries the right
?strip=N). - In OBS: Sources → + → Browser.
- URL: paste it. Width 1920, height 1080. Leave the custom CSS box alone.
- Done — the background is transparent and the bar sits in the lower third.
Streaming more than one strip? Add one browser source per strip, each
with that strip's own ?strip=N URL from Board.
The overlay animates in only when it has data, so an empty scene before the first bout is normal. A small STALE badge on the bar means the feed stopped — the score shown is the last known good one, frozen rather than zeroed. Check the Bridge laptop.
08 Swap sides — read this one
The machine's idea of "left" is relative to itself, not the camera. Worse, the machine has its own change-position button that flips its display without telling anyone. So at some point the overlay will show the fencers on the wrong sides. This is normal and takes one tap to fix:
Rule of thumb: fix mirroring with Swap sides. Use Swap fencer assignment only when the wrong people were entered on each side to begin with.
09 Accounts
Control and Bridge require a login; the first visit to a fresh install asks you to create the admin account. Two roles:
- operator — bouts, roster, clubs, imports: everything a volunteer does on stream day.
- admin — all of that plus user accounts, settings, and the overlay URL.
Volunteers can request their own account at /signup — it sits as pending approval until an admin approves it in Control → Settings → User accounts (approve as operator or admin, or deny). Admins can also create accounts directly there.
Forgot password? There's no email here — the reset goes through an admin. Request a reset from the login page; the admin sees the request in User accounts and generates a one-time reset link (valid 1 hour) to hand over in person or by text.
The OBS overlay needs no login (its secret URL is its key), and this guide and the landing page stay open to everyone on the network.
Fencer stats come free with results: click any fencer's name in the Roster or Results tabs for their record, touches for/against, indicator, recent form, and bout history — all built from auto-logged bouts.
10 Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| STALE on the overlay | Frames stopped reaching the server | Check the Bridge tab: is it open, serial connected, frames counting? Reseat the USB cable if not. |
| machine offline in the header | No bridge is running | Ethernet: on the /bridge page, enter the machine IP and
Connect. USB: same page, click Connect to FA-07. |
| A strip stays offline on Board, or Control drives the wrong strip | No bridge is feeding that strip's number, or the header strip switcher is set to a different strip | Point a bridge at that strip (the app's overlay strip number, or
--strip N), and in Control pick the strip in the header
switcher. |
| Ethernet bridge shows no data | Laptop and machine on different networks | Confirm the FA-07's IP (its menu) and that the laptop can
ping it. A building wall-jack is often a separate
network from the WiFi — get both on the same one. |
| Referee can't BEGIN / remote dead / clock won't start (often 0–0, 3:00) | Machine is in "software-controlled" mode with no match loaded, or is waiting for an END approval that never came — an old bridge, or a second controller (Fencing Time + our bridge both connected) | Stop every bridge, then wait 40 seconds or power-cycle the FA-07 with the bridge off — it comes back in normal local mode. Run only one controller: the current bridge with Active on (no Fencing Time), or Fencing Time + our listen-only bridge on port 50103. |
| Bridge restarted and the machine went quiet for a while | The FA-07 answers only one software address and keeps the previous one for ~40 s after its last message | Normal — wait up to 40 s. (The bridge keeps a fixed port so a plain restart usually picks up at once.) |
| Fencers shown mirrored | Machine vs camera orientation | Swap sides in Control. One tap. |
| Score frozen but bout is live | Bridge lost the serial port | Bridge page → it usually auto-reconnects; otherwise click Reconnect serial. |
| Overlay blank in OBS | Wrong/old overlay URL | Copy the current URL from Control → Settings into the browser source. (Was the token regenerated?) |
| Names missing, score fine | No active bout, and the feed has no names (machine has none loaded) | Start the bout in Control — hardware shows regardless, names need a bout. |
| CSV import mangles accents | File isn't UTF-8 | Re-export the sheet as CSV UTF-8 (Excel: "CSV UTF-8" in Save As). |
Hardware assembly and wiring live in a separate sheet:
docs/ASSEMBLY.md in the repo.