Repository navigation
v0.2.0 — Named schedules, the weekly-hours editor, and a CLI
·
113 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Named availability schedules, a redesigned weekly-hours editor, a CLI
installer, and a body of race-condition and booking-page fixes — most found
by the dual-model review process this repo runs on every change.
Added
- Named availability schedules (migration
0007): a host can keep
several schedules ("Working hours", "Evenings") and assign one per event
type; unassigned event types follow the default. Guarded at the database,
not in application code: one default per user via a partial unique index,
delete blocked while an event type still points at a schedule, and the
event-type ↔ schedule link written with a scalar-subquery guard so a
concurrent schedule delete cannot leave a dangling reference. - Redesigned weekly-hours editor: per-day toggle switches and native
time inputs with one or more ranges per day (lunch-break splits), a
no-JavaScript "+ Add range" round trip, and a CSS-only show/hide — the
whole editor works with scripts disabled. In-progress typing survives
validation errors and add-range round trips instead of reverting. punctual-shCLI (cli/, published to npm; installs apunctual
binary):punctual initruns the whole self-host quick start — creates
the D1/KV/R2/Queues resources, writes their ids intowrangler.toml,
generates secrets, migrates and deploys, idempotently and resumably —
and refuses to adopt or overwrite any resource it did not create, in any
Cloudflare account, by design.punctual slotsprints live availability
from a running instance. Terminal identity per the brand: the wordmark's
green colon, shape-distinct status glyphs, no color when piped or under
NO_COLOR.- Booking page defaults to today's slots on first load instead of "Pick a
day", and the calendar highlights the selected day (and moves the
highlight when the guest switches days). - New accounts are bookable from creation: a default schedule is
provisioned at signup and backfilled on login for accounts that predate
it — previously a new host had no availability until they saved the form
once. - Optional GA4 analytics, scoped strictly to the marketing/docs pages.
Fixed
- Cross-table slug race (migration
0008): user signup and team
creation share one slug namespace but arbitrated it in application code;
two concurrent requests could claim the same slug. Aslug_claimstable
now makes the database the arbiter, written in the same atomic batch as
the row that claims the name. - A family of agenda-question edge cases: duplicated question when a
host's custom wording matches the builtin, legacy answers hidden after a
same-labeled replacement, stale-form loss of answers when a host edits
mid-fill, and a blank direct answer shadowing a filled older one. - Calendar month clamping no longer hides the last bookable day from
guests far behind the host's timezone, and the day panel can no longer
render for a month the calendar isn't showing. - Email templates: rendered and verified in real clients; fixed a broken
avatar-alt fallback, a raw IANA timezone id in the footer, and spacing
between the secondary action and the footer rule. - The public-page footer wordmark links to punctual.sh (new tab) rather
than the deployment's own homepage, and no longer inherits a
deployment's custom brand name. - Flaky wall-clock tests (rate limiter, "defaults to today") made
deterministic by measuring elapsed time instead of assuming it.