A scheduling instrument, not a calendar app.
kalya computes availability to the minute and the timezone, and makes double-booking impossible at the database level. Precise, multi-tenant, and yours — with export and transparency as visible affordances, not buried settings.
What it does today
Every item here is running in production and covered by tests. No promises stated as features.
Double-booking is impossible
Non-overlap is a database invariant — a Postgres exclusion constraint, not application logic. Two people racing for the same slot: one commits, the other is cleanly refused. Verified in CI against a real database, under concurrency.
Timezone- and DST-correct
Availability rules are wall-clock in the host’s zone and resolved to exact instants per date, so a 09:00 rule stays 09:00 across a DST boundary. The engine is a pure function with explicit spring-forward and fall-back tests.
Every tenant’s data is walled off
Row-level security is forced at the database on every tenant table, fail-closed. Proven in CI as an unprivileged role that cannot bypass it — cross-tenant reads and writes are rejected, not merely filtered.
A hosted booking page, in Spanish
Each tenant gets a public page at kalya.app/<handle>, rendered in es-MX and branded to them. A visitor picks a service, a day, an exact slot, and confirms — end to end, tested end to end.
Self-service cancel + add-to-calendar
Every booking carries a private cancel link and a signed .ics feed. Cancelling is idempotent and frees the slot immediately. The booker never needs an account.
Standing schedules + a shared calendar
Weekly recurring commitments (a therapist’s standing slots) with holiday and cancellation exceptions, refused for conflict on both the resource and the subject — the clash is named, not hidden. Plus an org-wide calendar you publish once and everyone subscribes to.
Correctness is the product
A race for one slot returns a clean rejection, never a corrupt double-booking and never a 500. The database is the referee.
Across a daylight-saving change, a nine-o’clock rule is still nine o’clock. Tested against real spring-forward and fall-back dates.
Your schedule exports in an open, documented contract. Sovereignty over lock-in — a visible affordance, not a support ticket.
On the instrument bench
Direction, stated as direction. These are being built — they are not claimed above because they are not shipped yet.
Payments + CFDI, built for Mexico
Paid bookings through Dhanam, and a CFDI issued through Karafiel — the fiscal step no foreign scheduler can do. The data model reserves the fields today; the charge-and-stamp flow is on the bench.
An embeddable widget
Drop the booking flow directly into a site — the same engine, inline. Today the hosted page is the surface; the widget is next.
Two-way calendar sync
Google Calendar first — read busy-time, write the booking, attach a Meet link. The hardest integration in this space, scoped as its own workstream.
Teams, reschedule, reminders
Round-robin and collective team scheduling, first-class reschedule, and email/WhatsApp reminders. Sequenced deliberately after the core is proven.
Bring your center onto kalya
Onboarding is done with you today — we provision your services, hosts, and hours, and hand you a booking page at kalya.app/<your-handle>. Self-serve setup is on the way.