Find new milestone-specific exercises
For any Y instructor who wants to try a new exercise, or has students a previous exercise didn't work for and needs to try something new. Open it before a shift, or before a class if you have to. It opens on today's lesson plan.
Before, I repeated the same exercises every week, and if a student had trouble I had to come up with a new exercise on the spot. This is not a student manager app or a precise calendar app. This app has one aim: to give instructors new lessons fit for the YMCA structure.
- Today — All classes ongoing today, each with swappable cards that contain a shuffled list of exercises for each of the class goals, keeping things fresh.
- Finder — Get new exercises for a specific stage and skill from the database.
- Classes — Add the classes you teach, with the class session dates and stage.
- Pool — Adjust your pool settings so only exercises possible at your pool are present.
![]() |
![]() |
![]() |
![]() |
| Today's classes, cards ready to swap | A stage, a skill, new exercises | One exercise, in full | Only what your pool can do |
You need Xcode 27 or newer and Python 3 (standard library only).
python3 tools/dev/sync_resources.py --demo # bundle the made-up sample curriculum
open DeckPlan.xcodeproj # then run the DeckPlan scheme on a simulatorDue to copyright rules, this app doesn't contain the parsed data. The YMCA's PDFs are linked
below. Point a coding agent at them and at docs/CURRICULUM_FORMAT.md
and it can cheaply parse them into the JSON the app reads, in curriculum/. Then run the
validator, and read each stage against the PDF once before you teach from it.
python3 tools/core/curriculum.py --validate # check your transcription
python3 tools/dev/sync_resources.py # bundle it in place of the sampleThe curriculum, and where the YMCA's PDFs are
DeckPlan reads the YMCA Swim Lessons V6 curriculum — stages, skills, steps, activities, lesson
guides, topics — from JSON files in curriculum/. Those files are a transcription of the YMCA
Swim Lessons Instructor Toolkit, which is Copyright © 2016 by YMCA of the USA. All rights
reserved. They are not in this repository, not in any build shared with anyone else, and they
are not covered by this project's licence.
What is here instead is a made-up sample curriculum in examples/: the same shape, the same
field names, invented content. Every activity, step, topic and safety line in it was written for
this project. The tests run on it, and so does the app in demo mode.
If you are a YMCA instructor with access to the toolkit, you can transcribe your own copy into
curriculum/ (the format is in docs/CURRICULUM_FORMAT.md). Keep it
to yourself: it is the YMCA's material, not yours or mine.
The toolkit is published to instructors through the YMCA Swim Lessons Instructor V6 app at my.yapp.us/YSLSWIM, whose Toolkit tab links these PDFs, all © YMCA of the USA:
The programme as a whole — what the stages are and how a swimmer moves through them:
- Program Overview — the six stages and the two before them, and who each is for
- Stage Overview — each stage's skills and what a swimmer must do to finish it
- Skill Continuum: infant, toddler and preschool · school age, teen and adult — every skill across every stage, on one page
- Progress Tracker — the benchmark rows the app calls tracker rows
- Toolkit Introduction · Session Planner · Safety and Character Topics · Home Activities
Per stage — the two documents the app's data comes from:
| Stage | Lesson Guide (the eight sample lessons) | Skill & Topic Library (the activities) |
|---|---|---|
| A | Lesson Guide A | Skill & Topic Library A |
| B | Lesson Guide B | Skill & Topic Library B |
| 1 | Lesson Guide 1 | Skill & Topic Library 1 |
| 2 | Lesson Guide 2 | Skill & Topic Library 2 |
| 3 | Lesson Guide 3 | Skill & Topic Library 3 |
| 4 | Lesson Guide 4 | Skill & Topic Library 4 |
| 5 | Lesson Guide 5 | Skill & Topic Library 5 |
| 6 | Lesson Guide 6 | Skill & Topic Library 6 |
Everything in one file: Complete Toolkit (459 pages, 8.8 MB).
A Python core is the reference, written first; the Swift port that drives the app has to produce byte-identical output on every fixture (docs/CANONICAL_JSON.md defines the encoding and the hash). Plans are deterministic: the same class, day and pool give the same plan, and Shuffle is a seeded draw, with random seeds in the works. Everything stays on the phone: no accounts, no network, no analytics. The stack is SwiftUI, a local Swift package and the Python standard library, with no third-party dependencies.
Folders and tests
| Folder | What is in it |
|---|---|
tools/core/ |
the Python reference core: the pool filter, the day plan, shuffle, the finder, classes, the CLI |
DeckPlanCore/ |
the Swift port of that core as a local package, with its own tests |
DeckPlan/ |
the SwiftUI app; only AppModel*.swift talks to the core |
examples/ |
the made-up sample curriculum and the fixtures both cores are held to |
tests/, DeckPlanCore/Tests/, DeckPlanTests/ |
the three test suites |
docs/ |
how the curriculum is encoded, the canonical JSON and hash, and the test list |
Comments in the code cite the project's design notes by name and section (SPEC, PLANNER, REDESIGN, the decisions log). Those notes are kept private; the code and the tests are the reference.
python3 -m unittest discover -s tests # the Python reference core
(cd DeckPlanCore && swift test) # the Swift port
python3 tools/dev/sync_resources.py --demo # the app, on the made-up sample
python3 tools/dev/xcode_sources.py --check
xcodebuild -project DeckPlan.xcodeproj -scheme DeckPlan \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' testThe code is licensed under PolyForm Noncommercial 1.0.0: free for personal use and for any nonprofit organisation (a YMCA included), not for selling. The licence covers this project's own code and the made-up sample data. It cannot and does not grant any right to the YMCA curriculum described above.
DeckPlan is a personal project by a swim instructor. It is not affiliated with, endorsed by or sponsored by YMCA of the USA or any YMCA association, and "YMCA" is their trademark.




