11,834 clinic appointments that never happened.
A privacy-first dashboard built for a university student health clinic, shown with generated data instead of patient records.
Source: synthetic appointment records from the project's generator (seed 20250630), counted by its build after the three exports are reconciled. From 2023 the records include canceled and no-show bookings; the 2019–2022 export has no outcome field, so those years cannot be split into kept and missed appointments. Every monthly total shown is 5 or more. Smaller breakdowns follow the k = 5 rule: a count under 5 is published as 0 or folded into Other, so a published 0 can mean none or fewer than five.
Weekly pattern
Mornings early in the week are the busiest hours.
Appointments by weekday and starting hour, January 2023 to June 2025. The generator makes Mondays busiest and lunchtime quiet, so this shows how the table reads rather than how any real clinic runs.
Total appointments by weekday and hour
Darker cells hold more appointments. The number in each cell is its count.
Hours run 8 a.m. to 4 p.m., Monday to Friday; the clinic is closed at weekends in the generator. A cell showing 0 had fewer than five appointments, or none: the build publishes both the same way, so a small count cannot be singled out.
Appointment outcomes
About one appointment in nine ends as a no-show.
What happened to each booked appointment, by calendar year. 2025 covers January to June only.
Completed, canceled and no-show appointments, share of each year
Show the numbers
Source: appointment status in the 2023 and 2024–25 synthetic exports. The 2019–2022 export has no status field.
Seasonal illness
Respiratory illness clusters in winter.
Monthly appointments with each diagnosis, January 2023 to June 2025. Flu vaccinations are not counted as influenza. The winter season is part of the generator's model, not an observed outbreak.
A month at 0 had fewer than five appointments with that diagnosis, or none. Both are published as 0 so a small count cannot be singled out.
Show the numbers
Diagnoses
Respiratory illness and mental health lead the diagnoses.
Each export describes diagnoses differently, so the build reconciles them first. Older records carry one coded diagnosis; newer ones list several per appointment, and every one is counted.
Care categories, 2019 to 2022
Each diagnosis grouped by keyword. Vaccinations count as preventive care.
Source: the 2019–2022 synthetic export, one diagnosis per record.
Most common diagnoses, January 2023 to June 2025
Diagnoses listed on appointments; an appointment can list more than one.
Diagnoses seen fewer than five times are folded into Other rather than listed.
Visit types, share of each period
2023 (12 months) against January 2024 to June 2025 (18 months), so shares are compared, not counts.
Show the numbers
ADHD follow-up appointments per month
January 2023 to June 2025. They rise toward the end of each semester in the generator's model.
Months at 0 had fewer than five such appointments, or none.
Who books
The mix of patients barely changes between periods.
Share of appointments by gender identity and by race, 2023 against January 2024 to June 2025. These are proportions of synthetic appointments, not of students, and say nothing about any real campus population.
Gender identity, share of appointments
Race, share of appointments
Small race categories are merged into Other before counting, and a group with fewer than five appointments in a period is published as 0% for that period, the same as a group with none. When the 2024–25 export leaves gender identity blank, the legal sex field is used instead.
Show the numbers
Method and privacy
How the data is made and protected.
The original dashboard ran on real student health records inside a controlled workspace. Those records can never be published, so this public version runs the same pipeline on generated data.
- GenerateA seeded model of an academic calendar writes three spreadsheets shaped like the original exports.
- ReconcileDifferent date formats, diagnosis codes and column names are mapped into one schema.
- Strip identifiersColumns that could identify a person are dropped as each file loads.
- AggregateOnly counts leave the build; no row-level record is published.
- SuppressAny count below 5 becomes 0 or Other, so it cannot be singled out.
- CheckTests scan the output for emails, phone numbers and similar, and fail the build if a rule breaks.
What the synthetic data is
Appointments are drawn day by day from a fixed random seed: busy semesters, a winter break, quieter summers, weekday and hour preferences, and a seasonal mix of diagnoses. Every pattern on this page was put there by that model.
What it cannot tell you
- Nothing about real Stetson University patients or any real clinic.
- No causes: the charts show counts, not why they change.
- No clinical guidance of any kind.
Build and run it
The whole page is one HTML file with its data and font embedded, so it opens offline from disk. The code, tests and generator are in the GitHub repository.