Independent analysis by a PPS parent, not an official Portland Public Schools product. Official material: PPS rightsizing scenarios and October 6, 2026 Board of Education meeting materials. Built with AI, directed by a PPS parent (how).
School by school
Pick a school to see its enrollment over time: what it actually was since 2018-19, what Portland State University forecasts on today’s boundaries, and what PPS projects under its Status Quo, Scenario A and Scenario B. You can add the example plans too.
These lines come from different sources and are not perfectly comparable. Actual enrollment counts every student in the building. PSU forecasts each school on today’s boundaries. PPS’s figures are PPS’s projection under each scenario. Our model counts the neighborhood kids zoned to the school plus its program kids, on a 2031-32 basis. How our model compares with PPS’s figures.
Same numbers as a table
Sources
Caveats
- The example plans’ numbers are model estimates, built from Census blocks rather than PPS’s student records, so they may not hold up on PPS’s real data. Each plan’s lines stay fixed while enrollment follows PSU’s July 2026 forecast.
- Actual enrollment here is second-hand: the PPS Data Explorer project compiled it from federal (NCES) and state (ODE) files. An independent check matched every figure shown here against those federal and state files, joined by school ID; Hayhurst’s and Odyssey’s split before 2022-23 comes from PPS’s own counts via the project and was not checked. Federal figures for one year can differ from PPS’s own October counts by a few students.
- All figures are whole-school counts, every grade in the building. When a plan changes a school’s grades (for example, a K-8 becoming K-5), its line drops partly because grades leave, not because fewer families live nearby.
- Focus options and alternative schools enroll by lottery or application, not by neighborhood. Our model does not size them, so they show actual enrollment, PSU and PPS’s figures only.
- Forecasts within about 15% of a size threshold are uncertain. See the backtest in backtest.md.