Case Study — 2025Powers Pickup.Earth

inki

Sports Tracking AI

Computer vision that turns a camera on a tripod into a full stat sheet.

The AI engine behind Pickup.Earth's player profiles — I designed the brand and output, and built the detection pipeline from scratch.

Role

Designer + Builder

Discipline

Computer Vision

Stack

PyTorch · OpenCV

Status

Powers Pickup.Earth

The Problem

A player profile is only as real as the stats inside it.

Profiles Without Substance

Player profiles are the heart of Pickup.Earth — but a profile with no stats is just a name and a photo. It stays hollow.

No Stat Infrastructure

Organized basketball has scorekeepers and box scores. Pickup ball has none of it. Nobody is charting shots at a Saturday run.

Manual Logging Kills It

The moment you ask players to log their own stats, you’ve added friction to the one thing that works because it has none.

The Data Already Exists

Every court has a game happening in front of a camera. The record is right there — it just has nothing reading it.

The Opportunity

Let the game generate its own record.

Point a camera at the court, run the footage through Inki, and the profiles fill themselves in. No scorekeeper. No manual logging. Just structured stats out the other side.

Generate real stats with zero effort from players

Populate profiles automatically from a single video feed

Turn detections into game-level events, not raw boxes

Give Pickup.Earth a history that captures itself

1 camera

is all it takes. Everything downstream — profiles, head-to-head, reliability — runs on what Inki sees.

How I Built It

From a video feed to a stat line.

The pipeline runs in stages. The point isn\u2019t the code — it\u2019s understanding the whole chain from raw pixels to a stat a player actually cares about.

Step 1

Video In

Raw game footage from a single court-side camera.

Step 2

Detection

A Roboflow-trained model finds players, ball, and hoop per frame.

Step 3

Tracking

ByteTrack (via Supervision) holds each player’s identity across frames.

Step 4

Game Logic

Possession, shot attempts, and hoop-locking turn frames into events.

Step 5

Stats Out

Structured, per-player stats — ready to feed a profile.

The Hard Part

Detection was never the challenge. Turning noisy, per-frame detections into stable, game-level events was. A single frame will happily tell you the ball is in three places at once. The work lived in the logic layer on top — hoop-locking to anchor a fixed scoring reference, and possession detection to decide who actually had the ball across a sequence rather than in any one frame. That\u2019s the gap between a model that sees a basketball and a system that understands a basketball game.

Python 3.11PyTorch + CUDAOpenCVRoboflowSupervisionByteTrackRTX 3070

My Role & Process

Designer and builder — the whole arc.

Most designers hand off the hard part. On Inki I owned all of it — the brand, the output experience, and the machine learning pipeline underneath that makes the output possible. I designed a product feature and built the system that feeds it.

The thing I care most about showing here: I don\u2019t just design around technical constraints — I can build the technical part myself and design it end to end.

Problem Framing

Why profiles felt hollow, and why manual stats were a non-starter

Data & Training

Labeled footage, trained a detection model in Roboflow

Detection + Tracking

PyTorch inference, ByteTrack for stable player identity

Game Logic

Possession, shot detection, made/missed, hoop-locking

Output UX

Deciding what becomes a stat, and where it shows up

Brand

The mark, the wordmark, the broadcast-ready visual system

What I Built

Solo — from the first labeled frame to the shipped stat on a profile.

Brand identity & logo
Detection model (Roboflow)
Multi-object tracking (ByteTrack)
Possession detection
Shot + made/missed detection
Hoop-locking logic
Structured stat output
Profile stat presentation
Broadcast graphic treatment
Full CV pipeline (Python)
Pickup.Earth integration
End-to-end system design

Design Decisions

Where the engineering became a product.

What becomes a stat

Raw CV output is noise — coordinates, confidence scores, boxes. None of it belongs in front of a user. The design job was deciding what turns into a stat, and surfacing it inside the existing profile so the intelligence stays invisible and only the value shows.

Broadcast-ready output

The same detection layer feeds Pickup.Earth’s broadcast graphics, so the treatment had to hold up on screen — not just in a data table. That constraint shaped how stats get framed and animated.

A brand grounded in players

The mark is a camera bracket framing a figure — machine vision "looking" at a subject, with a human form kept at the center. Dark, minimal, electric-blue accent: precise and technical without feeling cold.

The Payoff

Powering Pickup.Earth.

This is the loop that makes Inki matter. Without it, the whole social layer depends on manual input nobody would ever actually do. With it, the platform captures its own history — automatically.

Inki

watches the footage

Stats

get generated per player

Profiles

populate automatically

Social

head-to-head, Regulars, reliability

Status

Reliably detects players, possession, and made/missed shots on recorded footage, with output structured for player profiles. Built and trained locally end-to-end.

What\u2019s Next

Real-time processing, richer stats (assists, rebounds), and running against multiple gym camera feeds across Pickup.Earth locations.

That's a wrap

Interested in working together?

I'm available for new projects. Let's build something that moves people.

Back to Portfolio