Skip to the content
4 layers84 × 52 mmSideline cam hub, the printed circuit board in 3D

Input a video of your game and out pops the all player positioning data you want. for I put into Minutes

Size
84 × 52 mm
Copper layers
4
Thickness
1.6 mm
Parts
102
Nets
188
Pads
513
Tracks, vias
1,289, 334
Pours
16
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
20 Sep 2026
Updated
31 Oct 2026

Overview

Sideline cam hub is an open-source printed circuit board by dawsboss, from the dawsboss/Sports-Camera-Analytics- repository on GitHub. It is a 4-layer board of 84 × 52 mm with 102 parts on 188 nets, routed with 1,289 tracks and 334 vias.

It is built around the SHT45-AD1B-R2, TPS22917DBV and PCA9555PW, with the SN74AVC4T774PW, AP2112K-1.8TRG1 and ICM-42688-P among its other parts. Its parts include 37 resistors, 30 capacitors, 11 ICs, 11 connectors and 3 diodes.

Main components

9

README

README.md

Sideline

A pipeline that turns match footage into per-player data a coach can use. It is built for a fixed camera that sees the whole pitch; Veo follow-cam exports are the proof-of-concept input, used because the footage already exists and because a hostile input keeps the pipeline honest. The two differ in exactly one stage, registration, and everything else is shared. The design is in docs/SPEC.md; read it first.

Published aggregates land in Firebase next to the fixture that soccer-manager already tracks. Raw video never leaves the homelab.

Where this is

MilestoneState
M1 registration spikeRun on two real Veo exports. The classical detector fails the gate on both after every improvement that could be measured (per-frame grass colour, line thresholds that follow it, plausibility checks compared three ways on four datasets). A pretrained line network, unmodified, already finds on the worn field what the classical code cannot; fine-tuning it on this footage is the next registrar. The measurements are in spike/evals/ and the plan in docs/NEXT.md.
M2 skeletonAPI, Postgres, MinIO, RQ worker, S0 ingest and S1 sampling. Runs with no services on a laptop, or under docker compose.
M3 detectionFeasibility measured: players are found off the shelf, the ball is not, by any model tried. A ball detector trained on this footage is the gate for possession, passes and restarts. Not built.
M4 onwardNot started.

Run the M1 spike

text
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
sideline spike path/to/veo-export.mp4 --frames 200 --out spike/out

Then open spike/out/overlays/ and read the summary. spike/README.md says what the numbers mean, what the overlays show, and what the machinery cannot do yet. sideline spike --selftest runs the same thing on rendered frames with known truth, which checks the code rather than the footage.

Run the skeleton

With no services at all, against a directory and SQLite:

text
sideline ingest path/to/match.mp4 --pitch-length 100 --pitch-width 64
ls data/blobs/matches/<id>/

With the real stack:

text
docker compose up --build
curl -F file=@match.mp4 -F capture_mode=followcam -F pitch_length=100 -F pitch_width=64 \
     -F kickoff_offset_ms=95000 localhost:8000/matches

The API docs are at localhost:8000/docs, MinIO's console at :9001. The upload takes the accompanying inputs the spec lists (sm_match_id, roster, stints and periods as JSON, kickoff offset, pitch dimensions), stores the file under matches/{id}/source/, and queues S0 then S1. Every stage writes matches/{id}/{stage}/v{n}/ with a manifest.json recording its config and inputs; a re-run is a new version.

Layout

text
sideline/
  contracts.py        tracks/events/registration Parquet schemas, match.json, player_stats.json
  timeline.py         video time -> match seconds, via soccer-manager's periods and stints
  sports/             the plugin boundary; soccer.py is the pitch model, entities, stat definitions
  registration/       S5: one interface, two implementations
    followcam.py        per-frame fit from painted lines (the PoC)
    static.py           clicked landmarks once per placement, homography or spline (the product)
    lines.py            grass, paint, line segments
    synthetic.py        frames rendered through a known camera, for tests and the selftest
  storage/            blob store (local or MinIO) and the versioned artifact layout
  db/                 matches, jobs, stage runs, review decisions
  stages/             s0_ingest, s1_sampling
  api/                FastAPI
  worker/             RQ worker
  spike.py, cli.py    the M1 spike and the `sideline` command
docs/SPEC.md          the design, copied from the living doc
hardware/             the static rig (M9): what to buy, the printed four-camera head or hidden pod, aim cards
tests/                pytest; everything runs on a CPU with no services

Tests

text
pytest

Registration is checked against frames rendered through a known camera: box views must land within a metre of the truth, a midfield view with one crossing line must be refused with a reason, and a sweep of views must register at least 70% with few confident wrong answers. The stages, the API and the local pipeline run on a three-second synthetic clip. None of that is the M1 gate; the gate is real footage.

Parts

102
QtyValueFootprintReferences
13100nCapacitor_SMD:C_0402_1005MetricC13, C17, C21, C25, C40, C41, C42, C43, C44, C45, C50, C52, C53
1047Resistor_SMD:R_0402_1005MetricR10, R12, R14, R16, R18, R20, R22, R24, R33, R34
8100Resistor_SMD:R_0402_1005MetricR40, R41, R42, R43, R50, R51, R52, R53
833Resistor_SMD:R_0402_1005MetricR11, R13, R15, R17, R19, R21, R23, R25
71uCapacitor_SMD:C_0402_1005MetricC10, C14, C18, C22, C30, C31, C51
610uCapacitor_SMD:C_0603_1608MetricC12, C16, C20, C24, C32, C33
5SH 4-pinConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalJ3, J4, J5, J6, J7
41kResistor_SMD:R_0402_1005MetricR4, R5, R8, R32
41nCapacitor_SMD:C_0402_1005MetricC11, C15, C19, C23
4FH12-22S-0.5SHConnector_FFC-FPC:Hirose_FH12-22S-0.5SH_1x22-1MP_P0.50mm_HorizontalP1, P2, P3, P4
4TPS22917DBVPackage_TO_SOT_SMD:SOT-23-6U3, U4, U5, U6
3M2MountingHole:MountingHole_2.2mm_M2H1, H2, H3
3greenLED_SMD:LED_0603_1608MetricD1, D2, D3
20Resistor_SMD:R_0402_1005MetricR2, R3
2100kResistor_SMD:R_0402_1005MetricR30, R31
210kResistor_SMD:R_0402_1005MetricR1, R7
2PCA9555PWPackage_SO:TSSOP-24_4.4x7.8mm_P0.65mmU1, U2
2SN74AVC4T774PWPackage_SO:TSSOP-16_4.4x5mm_P0.65mmU8, U9
2WE 68715014522sideline:WE_68715014522J1, J2
1+1V8TestPoint:TestPoint_Pad_D1.0mmTP5
1+3V3ATestPoint:TestPoint_Pad_D1.0mmTP3
1+3V3BTestPoint:TestPoint_Pad_D1.0mmTP4
12k2Resistor_SMD:R_0402_1005MetricR6
1AP2112K-1.8Package_TO_SOT_SMD:SOT-23-5U7
1GNDTestPoint:TestPoint_Pad_D1.0mmTP6
1ICM-42688-PPackage_LGA:LGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4yU10
1SHT45-AD1BSensor_Humidity:Sensirion_DFN-4_1.5x1.5mm_P0.8mm_SHT4x_NoCentralPadU11
1VIO 1V8/3V3Jumper:SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mmJP1
1XHS_BUSTestPoint:TestPoint_Pad_D1.0mmTP2
1XVS_BUSTestPoint:TestPoint_Pad_D1.0mmTP1

Similar boards

  • 4 layers65 × 56 mmRPi OLED Adapter, the printed circuit board in 3D

    RPi OLED Adapter

    RasmusB/RPi-OLED

    Adapter board for using a generic OLED with a Raspberry Pi

    35 parts
  • 6 layers100 × 60 mmAether, the printed circuit board in 3D

    Aether

    nasheed-x/aether

    Aether is a versatile flight computer for testing flight hardware and software, focusing on sensor fusion to monitor rocket states and interface with on-board systems.

    180 parts10
  • 4 layers394 × 110 mmGpu cluster backplane, the printed circuit board in 3D

    Gpu cluster backplane

    antmicro/gpu-cluster-backplane

    This project contains open hardware design files for a PCB supporting power distribution in a cluster composed of GPUs. This board has been derived from an open source d1600e-psu-breakout created by Antmicro.

    616 parts4Apache-2.0
  • 4 layers50 × 26.5 mmEnvironment sensor sip baseboard, the printed circuit board in 3D

    Environment sensor sip baseboard

    antmicro/environment-sensor-myra-baseboard

    This repository contains open hardware design files for Antmicro's Environment Sensor Board variant which includes the MYRA SiP as well as temperature, pressure and humidity sensors.

    59 parts3Apache-2.0
  • 4 layers98.5 × 193.5 mmSchematics, the printed circuit board in 3D

    Schematics

    apistol78/retrodack

    RetroDäck, handheld game console

    120 parts1MPL-2.0
  • 6 layers70 × 80 mmCm5-carrier v2, the printed circuit board in 3D

    Cm5-carrier v2

    ben5049/cm-carrier-hardware

    Compact CM5 carrier board with an M.2 E-key connector and a 1000BASE-T1 Ethernet PHY, as well as other optional IO.

    334 parts1AGPL-3.0
  • 4 layers90 × 56.1 mmK2-cm5-traeger, the printed circuit board in 3D

    K2-cm5-traeger

    Gamecard/k2-plus-cm5

    K2 Plus CM5 – Creality K2 Plus mit Upstream-Klipper auf einem Raspberry Pi CM5

    137 partsGPL-3.0

Questions

How big is the Sideline cam hub PCB?

It measures 84 × 52 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Sideline cam hub use?

102 parts, built around the SHT45-AD1B-R2, TPS22917DBV, PCA9555PW and SN74AVC4T774PW. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Sideline cam hub KiCad files?

From the dawsboss/Sports-Camera-Analytics- repository on GitHub, at the commit this page was made from: the board is hardware/pod-board/hub/sideline-cam-hub.kicad_pcb and its schematic hardware/pod-board/hub/sideline-cam-hub.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Sideline cam hub design in my own project?

Its repository states no licence, so its author keeps all rights: ask dawsboss before reusing the design.