ShiftPlanner
A single-file employee shift scheduling application for a small team (a hotel/spa-style operation: the UI references "Therme"). It runs entirely in the browser — no server, no build step, no install, no account.
Version: 1.0.0 (see VERSION) Canonical source: src/index.html (2,789 lines, 136,212 bytes, md5 37207b2227899603f90c42e59ff1875a)
What it does
- Staff register — add, edit and delete workers, each with role and contracted hours per week.
- Shift templates — define reusable shifts with name, start/end time, colour and required headcount, then apply a template to a day.
- Month calendar — one month at a time, with per-day shift blocks, assigned workers, headcount limits (min/max) and free-text day notes.
- Absence tracking — record vacation, sick days and days off per worker; availability checks respect them.
- Automatic plan generation — a step-through generator that fills the month for selected workers, honouring:
- fairness priority (equal number of shifts / equal total hours / equal weekend shifts),
- maximum consecutive working days,
- minimum rest hours between shifts,
- maximum workers per shift.
- Conflict detection — flags double-booking, rest-period violations and consecutive-day overruns, with a conflict badge, "Fix conflicts" and "Clear Day" actions.
- Exports — CSV of the month's roster, and JSON backup of the whole plan.
- Import — restore a previously exported JSON backup.
- Light/dark theme.
What the buyer gets
shiftplanner/
├── VERSION 1.0.0
├── README.md this file
├── CHANGELOG.md
├── LICENSE
├── src/
│ └── index.html the complete application (open this)
├── docs/
│ ├── CANONICAL.md measurement record: why this file is canonical
│ └── USAGE.md non-technical, step-by-step instructions
└── archive/ four earlier/variant copies, kept for reference
├── mindtech__shiftplanner.html
├── mindtech__downloads__shiftplanner.html
├── mindtech__shiftplanner_v1.3.html
└── agando__shiftplanner_v1.3.html
One file is the whole product. There is nothing to compile and nothing to deploy beyond copying src/index.html somewhere and opening it.
How to run it offline
- Copy
src/index.htmlto the machine that will use it — a laptop, a USB stick, a shared folder, anything. - Double-click it, or drag it into any modern browser (Chrome, Edge, Firefox, Safari).
- That's it. The app is fully self-contained.
Verified: the file contains 0 <script src=…> tags, 0 <link> tags and 0 url(…) asset references. All CSS and JavaScript are inline. Nothing is fetched from a CDN, so it works with the network cable unplugged and from a file:// path.
The optional AI advisor is the only part that talks to anything, and it talks only to a server you run yourself (see below). With no AI server running, the panel shows "Not connected (start Ollama)" and every scheduling feature still works.
Optional: the AI advisor
The right-hand panel answers questions about the current schedule and can suggest changes. It uses a local Ollama instance:
- Default endpoint:
http://localhost:11434, editable in Settings and stored inlocalStorage['sp_ai_endpoint']. - Calls
GET {endpoint}/api/tagsto check the connection and list models, andPOST {endpoint}/api/generateto answer a question. - Default model
llama3.2; the UI also offersmistral,llama3.1,phi3,gemma2andminimax-m3:cloud. The choice is stored inlocalStorage['sp_ai_model']. - No cloud AI service is contacted — there is no OpenAI, Anthropic or Google endpoint anywhere in the file.
If you do not want AI at all, ignore the panel; it is inert without a server.
Where the data lives
In the browser's localStorage, on that machine and in that browser profile. Nowhere else. There is no backend, no sync and no telemetry.
| Key | Contents |
|---|---|
shiftplanner_v2 |
the full application state: workers, shifts, assignments, custom shifts, templates, settings |
sp_ai_endpoint |
the AI server URL |
sp_ai_model |
the selected AI model |
Consequences worth knowing:
- Clearing site data / "clear browsing history including site data" for this file erases the schedule. Use Export JSON regularly.
- The data does not follow the user to another browser or another computer. Move it with Export JSON → Import JSON.
- Opening the file from a different path or a different browser profile gives a different, empty store.
Archive
archive/ holds four older or variant copies of the same app, preserved unmodified for reference. They are not part of the product and are not maintained. Two of them contain a real drag-and-drop scheduler and a multi-provider AI layer that the canonical build does not have — see docs/CANONICAL.md §3 if you want to port those features forward.