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.

Synthetic appointments per month, Sep 2019 to Jun 2025. One dot is one appointment.

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.

  1. GenerateA seeded model of an academic calendar writes three spreadsheets shaped like the original exports.
  2. ReconcileDifferent date formats, diagnosis codes and column names are mapped into one schema.
  3. Strip identifiersColumns that could identify a person are dropped as each file loads.
  4. AggregateOnly counts leave the build; no row-level record is published.
  5. SuppressAny count below 5 becomes 0 or Other, so it cannot be singled out.
  6. 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.