Skip to content

About

Where every fielder goes, on every play. An interactive whiteboard for youth baseball and softball defence.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Simple Fielding

Where every fielder goes, on every play. An interactive whiteboard for youth baseball and softball. Drag the ball from home plate to wherever it's hit, and all nine fielders move to their jobs: who gets the ball, who's the cutoff, who covers the base, and who backs it up.

Free, with no ads and no accounts. It's built for an iPad first, works on phones, and has a projector mode for team meetings.

Try it: https://simplefielding.com (the web app is at /app/).

A companion to Simple Pitch Counter.

What it does

  • Drag to hit. Pick a grounder, line drive, fly ball, pop-up or bunt, then drag the ball to where it goes. Drop it on a fielder and it's caught or fielded; drop it in a gap and it's a hit. A tap anywhere on the field works too, which is easier with a mouse on a projector.
  • The defense works itself out. An engine derives each fielder's job from the situation: runners, outs, batter's side and field size. It isn't a fixed library of canned plays. Override the result (caught, single, double, triple) to compare.
  • Smooth 2D animation of fielders, runners and the ball: flight arcs, bounces, throws through the cutoff, and "Out!" calls. It has a scrubber, half speed, replay, and chalk-line paths you can turn on or off.
  • Plain-words jobs for all nine positions, color-coded by role: gets the ball, cutoff/relay, covers, backs up, stays ready. Tap a player or a job to spotlight it.
  • Other plays: steal of 2nd (coverage by batter hand), steal of 3rd, the 1st & 3rd double steal, passed ball or wild pitch, primary lead and pickoff, secondary lead and back-pick, and the softball look-back rule.
  • Build a play, step by step (tablets and computers): start with the pitch, then answer "What happens next?" one step at a time. The choices fit who has the ball: the pitch is caught, hit, gets by or is strike 3 in the dirt; a fielder throws (with an optional fake), runs with it, tags a runner, steps on a base or holds it. Tap who catches it, on the field or in the list; tap where a ball goes or a fielder runs. In each step, send runners on, back, or partway, and drag fielders to move them. The coach calls every safe and out. Undo, redo, a name, then Save to My plays or Share as a link. Phones watch and share built plays.
    • Endings: a play can fork after any step ("he commits" or "he turns back"), and endings can fork again ("bad toss"). Steps shared by endings are marked; the link carries every ending, and anyone watching can switch.
    • Mistakes: a throw can be wild (tap where it ends up) or dropped. The ball is loose, the player at fault gets the E badge, and the next step is whoever gets it.
    • Coaching it: pause, open the Whiteboard, move players to where they should have been and draw, then Play it as built to watch the rest of the play from that moment.
  • Eighty-six ready-made plays in the play library, in eleven groups (some only for softball or the 90 ft field), for running a practice. Press N for the next one.
  • Fields: Little League baseball (60 ft, no leadoffs), 50/70 (leadoffs), fastpitch softball.
  • Whiteboard mode (W): freeze any play, or the starting positions, and change it by hand. Drag fielders, runners and the ball, and draw chalk lines and arrows on top. An Apple Pencil or stylus always draws and a finger always moves, and pressure sets the line width. It has undo/redo, clear and reset, and the drawing stays over the play when you replay it.
  • Your team (T): add players and drag them into positions, or press and hold a fielder to name them. The field can show position, first name, last name, initials or number, so a coach can talk to their own players. Stored on the device only.
  • Projector mode (P): full screen, with the field only.
  • Fielding lessons (Learn): separate baseball and softball courses, from T-ball and 8U up to 13U/14U and beyond, that you can filter by position. Each lesson is a short read, then plays where you're one fielder: the play freezes at the decision and you drag yourself the way you'd go. You're graded on heading the right way, not on hitting an exact spot. Communication and sportsmanship are lessons too. The coaching cues follow Little League's curriculum and other published youth programs. Progress is stored on the device only.

docs/SCENARIOS.md is the coaching reference: every play, every job, and the youth conventions the app follows where coaches disagree.

Project structure

simple-fielding/
├── app/                  the web app (and, later, the payload for the iOS and Android shells)
│   ├── index.html
│   ├── css/app.css
│   ├── js/field.js       field geometry, in feet
│   ├── js/engine.js      the play engine: situation + batted ball → every fielder's job → timeline
│   ├── js/scenarios.js   the play library
│   ├── js/team.js        the roster: players, positions, label styles (stored on the device)
│   ├── js/teamui.js      the Team sheet, drag-and-drop, the press-and-hold position editor
│   ├── js/playlog.js     the play log and replay codes (used by tester reports)
│   ├── js/training.js    the fielding lessons: tracks, stages, lessons, and grading
│   ├── js/render.js      SVG drawing and animation playback
│   └── js/app.js         UI: situation, drag-to-hit, playback
├── website/              the companion site: homepage, guides, privacy (guides are generated, see below)
├── content/              guide sources (content/articles/*.html), the position pages (positions.json), the share-image template
├── docs/SCENARIOS.md     the coaching reference
├── tests/                engine unit tests (node:test) and UI tests (Playwright)
├── marketing/icon-layers/ icon layers for Icon Composer (Liquid Glass) and a monochrome version
├── scripts/              icon and baseball generation, screenshot helper
├── tools/feedback-apps-script.gs  receives tester reports into a Google Sheet
└── tools/check-for-personal-data.sh

No framework and no build step. The scripts are classic <script> files rather than ES modules, because native WebView shells load the app from file://, where modules are blocked. This is the same approach as Simple Pitch Counter.

Running it

npm install
npm start               # serves app/ on http://localhost:3344
npm test                # engine tests + Playwright UI tests
npm run icons           # regenerate PNG icons from app/icon.svg and app/icon-dark.svg
npm run site            # rebuild the guides, position pages, sitemap and robots.txt (checks every play against the engine)
npm run site:og         # ...and re-render the share images
npm run hero            # re-bake the homepage hero animation from the engine

Testing on a device

Tester mode adds a Report button to every play. Tap the version number in Settings five times to turn it on. A report carries what the tester says should have happened, plus a log of the play and a #replay= link that reopens it exactly. Reports go to a Google Sheet through tools/feedback-apps-script.gs (setup steps are at the top of that file), or are copied to the clipboard if no address is set.

Deployment

simplefielding.com is self-hosted: bash scripts/deploy-nas.sh publishes it over SSH. The server's address, port, user, key and folder come from the environment or a gitignored deploy.env, never the repo. The website is at the root and the app under /app/. The tests and the personal-data check run on every push and pull request (.github/workflows/test.yml).

License

The settings gear icon is from Lucide (ISC License, Copyright (c) Lucide Contributors).

PolyForm Noncommercial 1.0.0.

About

Where every fielder goes, on every play. An interactive whiteboard for youth baseball and softball defence.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages