Skip to content

Releases: jpysh/ayurcalm-scheduler

v0.4.0

Choose a tag to compare

@jpysh jpysh released this 16 Sep 08:24
7c5662b

The day sheet runs on one time axis, the demo data fills a real centre's day, and every test runs in CI.

Upgrading

docker compose pull && docker compose up -d --build. One migration runs on start, adding a buffer to each therapy; existing therapies keep 0 until you set your own in the Therapies tab. Nothing else changes for an install already running.

Day sheet

The sheet had been running two column systems over one time axis — hour bands plus meal columns sitting inside them — so a 13:30 therapy printed under a heading of 12:00 and read as a twelve o'clock appointment. There is now one axis: a meal appears in the band its sitting falls in, beside that hour's therapy, every entry states its own start time, and a band covering more than an hour says so (12:00–15:00). The patient column is fitted to the longest name on the sheet, and a meal with no plan behind it prints nothing rather than the bare word Breakfast.

Two fixes for bugs that shipped in 0.3.0. Cells with the same text in rows that were not adjacent were merged into a single box painted across the row between them, so a resident scanning their own row found someone else's meal in it. And a merged Notes box could be painted shorter than its own text and spill into the rows below. Both were found by printing a sheet for a full centre, which is also what this release makes possible to do.

Scheduling

Therapies carry a buffer — rest for the patient, cleanup for the room — which the scheduler blocks out after the treatment for the room, the therapist and the patient alike. It never shortens a room's opening hours: a 17:00 therapy with a 30-minute buffer still fits a centre closing at 18:00. Defaults for a fresh install come from what each therapy needs rather than a list to maintain, and a centre tunes them per therapy.

Demo data

Deterministic, so everyone who installs this sees the same centre, and fuller — about 40 residents treated a day across 20 rooms, which is what a centre of this size looks like on paper. Seeding at that size found a real bug on its own: the seed had never checked closing time and was booking treatments past it.

Tests

npm test now works, and every test runs in CI. Three had been failing or unrun for months because they need a database and a server and no CI job started one; they now run inside the stack the end-to-end job already builds. test:validation had been broken since authentication was added. Two tests that tested nothing useful were deleted, and an end-to-end test that an edit survives a reload replaced one of them. Tests that write to the database refuse to run against an install not marked as demo data.

Full changelog: https://github.com/jpysh/ayurcalm-scheduler/blob/main/CHANGELOG.md

v0.3.0 — day sheet by row, four months of demo data

Choose a tag to compare

@jpysh jpysh released this 14 Sep 08:39
52b6d64

The day sheet reads row by row, the demo data lasts four months, and no dependency advisories remain.

Changed

  • Day sheet — each patient's row holds everything for them; treatment notes
    moved from the end of the sheet into a Notes column. Long names shorten
    with .. instead of breaking mid-word
  • Demo data covers four months; Settings → Reset demo data from today
    rebuilds it
  • Ailments tab marked coming soon: it never saved (#34)
  • Express 5, react-router 7, Vite 8; npm audit reports no advisories

Fixed

  • Malformed or oversized request bodies return 400/413, a missing record 404,
    instead of 500
  • Merged day-sheet cells could spill text above their box

Tests

  • End-to-end suite replaced with four tests against a real install, run in CI

v0.2.0 — the day sheet works

Choose a tag to compare

@jpysh jpysh released this 11 Sep 18:08

The printed day sheet is what a centre actually runs on — one page, pinned to a notice board, read by patients and therapists alike. In 0.1.0 it printed an empty grid.

Fixed

The daily schedule PDF printed no text. Boxes where appointments belonged, with no therapy, staff or room name in any of them, spread over nine pages for a single day. Rows were drawn before the page-break check, and PDFKit paginates text that overflows a page while leaving the stroked boxes behind — so the words landed on a later page than their boxes.

A malformed request body crashed the API. Routes validate with Zod inside async handlers, and Express 4 does not pass a rejected handler to error middleware, so Node exited. Because JWT_SECRET is unset by default, the restart minted a new secret and signed every user out. One typo'd field in any form did it.

Sessions did not survive a restart. A secret is generated once into the database now, so an ordinary restart no longer logs everyone out. JWT_SECRET still wins when you set it.

Two high-severity advisories in Express's dependencies, both reachable on every request.

Added

Diet plans are records in the database, written in the app under the Diet tab's Plans button. A plan holds separate meals for a day with treatment and for a rest day, because a resident eats on both. Assigning one points at the plan rather than copying it, so correcting a plan reaches everyone on it — while anything written for one patient stays theirs. Editing tells you how many patients it will reach. Removing a plan patients are on retires it; their sheets keep printing.

Meals on the day sheet. Each patient's own breakfast, lunch and dinner print in the columns the day already had, resolved from what was written for that date, then their plan, choosing the treatment-day or rest-day side. How to eat around treatment prints once under the table rather than in every row.

Residents get a row even on a day with no therapy booked, because their meals are still theirs.

Three starting plans are seeded — everyday sattvic, internal oleation (snehapana), and the graduated return to food after purification (samsarjana krama) — written from published sources and meant to be replaced with a centre's own.

Removed

/patient/:token and /staff/:token. The token in the URL was read and then ignored: both pages fetched the whole patient or staff list and rendered the first row, so every link showed the same person. See #19 and #20.

Upgrading

git pull && docker compose up -d --build. Migrations apply on start. Nothing to edit; JWT_SECRET is now optional.

Full changelog: https://github.com/jpysh/ayurcalm-scheduler/blob/main/CHANGELOG.md

v0.1.0 — first public release

Choose a tag to compare

@jpysh jpysh released this 05 Sep 10:54

First public release of AyurCalm Scheduler — a self-hosted appointment and therapy scheduler for wellness centres.

Try it

git clone https://github.com/jpysh/ayurcalm-scheduler.git
cd ayurcalm-scheduler
docker compose up -d

Open http://localhost:8080 and sign in with admin@example.com / demo1234.

First boot creates the database, applies migrations, and seeds a demo centre — patients, therapists, rooms, therapies, a week of appointments and a daily programme. Change the demo password before putting this on a network; the server warns on every startup until you do.

What's included

  • Scheduling across therapists, rooms and therapies, with conflict detection
  • Auto-assign that respects room amenities, therapist availability and time off
  • Patients and stays, diet plans, centre and per-therapist time off
  • Recurring programme events and one-off sessions
  • Printable daily schedule PDF
  • Audit log of scheduling changes
  • Server-side authentication: bcrypt hashes, JWT sessions, every API route guarded

See CHANGELOG.md for detail, and CONTRIBUTING.md if you'd like to help.