Try it right here
This loads the live project from its own domain, exactly as a visitor would see it.
What it does
Six embeddable widgets that turn a ticketing system's reporting API into plain guidance for visitors: which timed-entry slots are gone, whether a day is likely to sell out, and which nearby days are a better bet.
A GitHub Action runs two reports every fifteen minutes and publishes static JSON. There is no server to run and no API key exposed in a browser. Risk is modeled as supply against expected weekday demand rather than raw percent sold, because a day sitting at 60% the night before can still sell out to walk-ups by mid-morning.
What it can do
- Six widgets: alert banner, time-slot grid, week planner, date check, month outlook, year heatmap
- Sitewide dismissible floating banner, deployable through Google Tag Manager
- Sell-out risk model using sales pace, lead curves, and day-of-week behavior
- Permanent monthly archive enabling year-over-year ghost overlays
- Hand-maintained closures file honored by every widget, with named reasons
- Staff-facing monitor page; mock mode runs the whole stack with no API key at all
Make it your own
Start by forking the repository into your own organization. Everything below assumes you are working in your fork, not this one.
- Ask your ticketing admin to create a reporting-only integration user and request an API key. Until it arrives the repo runs in mock mode and the whole demo works end to end.
- Add
ACME_API_KEYas a repository secret. Set the report-ID repository variables — the shipped defaults are the Library's own report definitions and must be replaced. - Edit
closures.jsonwith your holiday closures and weekly closed days per season, and set your thresholds and tickets URL inconfig.json. - Settings → Pages → Deploy from a branch,
main, root. ReplaceCNAMEand add the DNS record. - Run the Update availability data workflow, then check that the generated JSON looks right.
- Add the script once per page plus any
<div data-trpl-widget="…">containers. Tune the thresholds inday_risk()if your demand pattern differs.
Stuck on a step? Open an issue on the repository. Questions from people adapting these for their own institution are the most useful feedback we get.