CourtIQ

System architecture v3

Local-first · dual-camera · cloud optional. Combined architecture and version roadmap.

Start
V0.1
Offline PC
On-device
V0.2
Phone / stick
Full product
V1
Phone host
Scale
VX
Cloud server
CaptureTwo devices record independently — no streaming, no WiFi needed
Device A
iPhone / GoPro
Records to local storage
60fps · 4K
Fence-mounted
Device B
iPhone / GoPro
Records to local storage
60fps · 4K
Opposite fence
↓ copy video files to laptop after match ↓
Host — your PC / laptoppython pipeline.py — already written, run it now
Step 1
Audio sync
Cross-correlate audio tracks. Outputs offset in ms.
Step 2
Court calibration
Auto line detection. Homography per camera.
Step 3
Ball detection
TrackNetV2 on both videos.
Step 4
Triangulation
Fuse both cameras → 3D position + in/out.
↓ results saved locally ↓
Output — browser on PClocalhost:3000 after processing completes
Review
Court map + in/out
Heatmap · calls · trajectories
Export
JSON / CSV
Raw ball positions and bounce data
Why start here: Zero cost. No server, no WiFi, no streaming latency. The full pipeline is already written. Run it on the public TrackNet dataset today — no filming required. This is your testing and tuning ground before adding any infrastructure.
data flow
Video A (file)
sync_engine.py
court_detector.py
ball_detector.py
triangulator.py
Video B (file)
apply offset
homography B
detections B
bounce_detector.py
in_out_judge.py
results.json
browser UI
CaptureDevice A hosts local hotspot + processes. No internet.
Device A (host)
iPhone 15 Pro+
Records own camera
Receives B stream
Runs pipeline locally
Creates WiFi hotspot
Device B
iPhone / GoPro
Streams to Device A
via local hotspot
No internet needed
Alternative host
Jetson Nano / RPi 5
Dedicated GPU
4hr battery
Fence-mountable
→ future CourtIQ stick
↓ local WiFi · no internet ↓
Processing on-deviceSame Python pipeline as V0.1 — ported to CoreML for iPhone
Runs
Full CV pipeline
Sync · court · ball
Triangulation · in/out
Live results
Serves
WebSocket to Device C
Any phone / tablet
on same local network
↓ results to display ↓
Device CAny browser — phone, tablet, laptop on local network
Live
Court map + calls
Same UI as cloud version
Fully offline
Optional server path (V0.2b): The same Python code from V0.1 deploys to Render free tier in one day. Post-match video upload → server processes → results returned. Add live streaming later when WiFi is reliable at your court. These are parallel paths — don't block on server before on-device works.
Capture — any hardware combinationiPhone + iPhone · iPhone + GoPro · fixed club cams
Option 1
iPhone + iPhone
Both fence-mounted
60fps · local hotspot
Start here
Option 2
iPhone + GoPro
RTMP to Device A
Weatherproof · wide FOV
Option 3
Fixed club cams
Permanent install
QR code to start session
↓ local WiFi hotspot ↓
Host — Device A (iPhone 15 Pro+)Runs full pipeline · serves results · creates hotspot
Sync
Audio + NTP
±1ms initial sync
Corrects drift every 30s
Re-sync after cam move
CV
Court + ball + 3D
Auto calibration
TrackNetV2 tracking
Triangulation
Decisions
In/out + scoring
Confidence scoring
Serve logic
Auto scoring (V2)
Output
Results API
WebSocket live
REST post-match
Livestream (V3)
↓ results to display ↓
Device C — any screenBrowser only · no install · iPhone · iPad · Surface · laptop
Match
Live court map
Ball placement · heatmap
In/out calls · speed
Height over net
Match (V2)
Scoring dashboard
Auto score
Rally stats
Match grading
Training (V3)
Analysis view
Swing · overlay
Drill targets
Bounce height
Post-match
Review
Close-call zoom
Trajectory replay
Share / export
CapturePhones stream only — no processing, battery preserved all match
Device A
iPhone / GoPro
Stream only
WebRTC / RTMP
Device B
iPhone / GoPro
Stream only
WebRTC / RTMP
↓ WebRTC / RTMP over WiFi or 5G ↓
Cloud server — GPU instanceAWS / Render · same Python pipeline · scales to multi-court
Same pipeline
Full CV analytics
Identical to V1
Faster via GPU
Extra
Multi-court
Club subscription
Many courts at once
Extra
Global platform
Accounts · ranking
Racket lab · weather
↓ results API + livestream ↓
Device C + LivestreamAny screen + Twitch / YouTube / Rumble output
All modes
Full product
Match · training
Racket lab · weather
Extra
Livestream
RTMP to Twitch
Court map overlay
The key insight: V0.1 already runs the same Python pipeline. Upgrading to server is mostly DevOps — not rewriting CV code. The pipeline is identical; only the execution environment changes.
camera placement diagrams
Top-down — recommended camera positions
A B shared overlap Cam A Cam B net
Side profile — mounting height vs court coverage
net 1.5m — too low 2m — good 2.5m — recommended 2.5m 23.77m court
Ball trajectory + bounce detection (side view)
net +42 cm bounce height bounce (OUT +3cm) 114 km/h Cam A Cam B
Training mode — drill targets + serve challenge
T zone target wide zone target 8/10 serves ✓ T: 5/5 Wide: 3/5 avg 182 km/h baseline (server behind this line)
camera hardware combinations
V0.1 — start here
iPhone + iPhone
Already own these. Easiest to start. Good enough for V1 testing. Standard phone fence mounts.
iPhone + GoPro
Better weatherproofing. Wider FOV. RTMP stream. Best long-term outdoor setup.
Fixed cams (clubs)
Permanent install. QR login. Phones become Device C only. Club subscription model.
full feature map by version
V0.1 / V1 — Match mode core
Ball tracking + in/out
V2 — Match intelligence
Scoring + players + grading
V3 — Training mode
Coaching + analysis + drills
V4 — Platform
Racket lab · weather · community
core data flow — all versions
Cam A video
audio sync
court calibration
TrackNetV2
triangulation
Cam B video
apply offset
homography B
detections B
3D position
bounce detect
in/out + confidence
Device C UI
review + override
GPS + weather
racket profile
session context
platform (V4)
nice-to-have · parking lot
CourtIQ stickJetson Nano · built-in cam · battery · hotspot. Full offline. V4 hardware product.
Spin detectionNeeds 120fps + dedicated ML model. Rotations per second + kick height after bounce.
Re-sync after moveOne clap re-aligns if a camera is nudged between sets. ~3 seconds.
Mounting experimentsTest: corner vs sideline, 1.5m vs 2.5m height, sun vs shade on different surfaces.
Racket A/B lab10 serves with racket A vs B. Speed, placement, bounce height comparison report.
Weather + GPSAuto-pull temp/humidity/wind on session date from device GPS. Performance vs conditions.
Pro overlay sharingUpload your swing as a reference model. Other users can compare against you.
Global leaderboardAmateur ranking verified by CourtIQ match data. Tournament bracket tool.
Padel (V2+)Wall bounces add geometry complexity. Court detection needs updating for glass walls.
Critical dependency: Every feature in V2+ depends on V1 ball tracking accuracy. If bounce position is wrong by >3cm, all downstream features — scoring, training overlay, racket lab — inherit that error. Get V0.1 accuracy right before building anything on top of it.