Small, local-first tracker for baseball pitchers ages 15-18. Log an outing, choose an age group, and get a quick answer about whether the minimum rest requirement is met.
https://sujay709.github.io/pitcher-tracker/
The screenshots below are phone-sized captures from the app.
This is a static site, but it uses ES modules and fetch, so open it through a
local HTTP server rather than double-clicking player.html.
python3 -m http.server 8000Then open http://localhost:8000.
On a supported phone browser, use “Add to Home Screen” to install the tracker. The app includes a manifest and icons, but deliberately does not use a service worker or offline cache.
The installed iPhone home-screen app has storage separate from Safari. Outings logged in Safari will not appear in the installed app, so pick one place to use for tracking. The app follows the device light/dark preference automatically.
Use Export data below the history to download a JSON backup of the outings
and their IDs. The export is wrapped as a versioned object (version: 1) so
future schema changes can be handled safely. Use Import JSON to restore a
backup; imports also accept older bare-array exports. Invalid rows and outings
whose IDs already exist are skipped and summarized after import.
For a backup round trip, export the data, clear this site's storage, then use Import JSON to restore it. Confirm that history, status, and weekly totals match the original. The import rejects corrupted, empty, non-JSON, and files larger than 1 MB.
Enter a display name (a first name plus last initial is suggested) and your
team code in Send today's update, then tap Create update link. Copy the
link or send it from your device. The coach opens the link, reviews the update,
and taps Add to roster. The link opens coach.html and stores the encoded
snapshot after #; the coach page decodes it without sending anything back to
this app.
The display name, team code, and a randomly generated player ID are stored locally. The player ID is created once so later snapshots identify the same player rather than creating a duplicate. Sharing is never automatic. A snapshot includes arm health information, so share it only with your coach or team chat and get a parent or coach okay according to your team’s rules. The team code is only a match check, not authentication. Snapshot data is stored in the URL hash fragment, not the query string, so it is not sent in normal HTTP requests or server logs.
The coach page keeps a local roster, grouped by readiness and arm concerns. It also has a lineup planner for a selected date. Player cards show the snapshot age, so older updates are easy to spot; no roster data leaves the coach’s browser.
The app groups outings by date and only counts:
- Games
- Live BP
- Bullpens with effort 6 or higher
For each day that counts, it uses the pitch-count rest bands for the selected age group. The latest resulting availability date wins. A pitcher is marked green when that date has passed, yellow when it is within two days, and red otherwise. Yellow is an app reminder, not a Pitch Smart category. The weekly total uses the same “counts toward rest” rule and covers today plus the previous six days. The app adds one extra rest day for effort 9 or 10; that is an app rule, not a Pitch Smart rule. Catch and long toss do not add rest in this app. The result is not medical clearance.
The pitch-count bands come from Pitch Smart’s published pitch-count
guidelines. I checked the
source on 2026-10-09; the copy used by the app is in
data/guidelines.json.
- Outings and the selected age group live in this browser’s
localStorage. They are per device and per browser, so a phone and a laptop do not share data. - Browsers can clear site storage. Safari/WebKit treats website storage as best-effort and documents eviction when an origin has not had user interaction for a while, as well as eviction under storage pressure. Safari private browsing is ephemeral too. A long gap or private browsing session can therefore wipe the history. See WebKit’s storage policy and tracking-prevention notes.
- Exported backups are not encrypted by this app. Treat them like any other personal health-related record.
- This is guidance based on published recommendations, not medical advice.
- Shared snapshots include the raw outings through the snapshot date and are recomputed using the coach device's current date. Snapshots older than two days are shown as needing an update. A snapshot schema version rejects old formats rather than guessing how to read them.
This tool is not medical advice. A coach, parent, athlete, or clinician should use judgment and the pitcher’s actual condition, not this page alone, when deciding whether to throw.