Turni: the shift schedule that fills itself in, within rest periods, breaks and contracts

A shift-planning app for small businesses, with a demo set in a fictional bar: the owner enters who is available and how many people are needed, and Turni drafts the week within rest periods, breaks and contracts, explaining what it cannot cover. Staff see their shifts on their phones and request leave and swaps. The maths runs in the browser. Try it without an account.

**Turni** (Italian for “shifts”) is a shift-planning app for a small business (a bar, a pharmacy, a shop, a care home), and here you try it on **a bar that does not exist**: Caffè Clessidra, with fifteen fictional staff. The owner enters who works there and how many people are needed, half-hour by half-hour; Turni drafts the week, the owner adjusts and publishes it, and staff see it on their phones.

**What it does**

- **The week, generated**: first it covers everything that can be covered without breaking a rule, then it shares weekends and closing shifts fairly, follows preferences and keeps working hours regular. - **The labour rules**: eleven hours' rest between shifts, the weekly rest, a break after six hours, the 48-hour average, the time slots of part-time contracts, each with its article (Italian Legislative Decrees 66/2003 and 81/2015); whatever changes from one collective agreement to another lives in a profile. You can fix things by hand by dragging, and while you drag the app tells you what would break. - **The explanations**: on Tuesday evening the kitchen is one person short, and Turni says why, person by person, in Italian: “Nessuno può coprirla: Simone è in permesso dalle 14; Luca è in ferie; Sara non è disponibile il martedì sera; Paolo ha il riposo fisso il martedì…” (nobody can cover it: Simone is off from 2 pm, Luca is on holiday, Sara is not available on Tuesday evenings, Paolo has Tuesdays off…). Turni only says a slot cannot be covered without breaking a rule when the solver has proved it. - **The staff app**: a PWA with your own shifts, even offline, holiday requests and shift swaps with colleagues, notifications and the phone calendar, linked through a secret address that can be revoked. Staff join with an invitation, without an email address or a password.

**Try it without an account**: from the landing page you get into the dashboard as the owner, or into the app as a member of staff. The server sends a copy of the fictional data, its logic runs in your browser and your changes stay there: nobody else sees them.

**The hard part** is the maths. HiGHS, the optimisation solver, takes more than 100 MB while it works, and on my server Turni has 150 in all: so it is compiled to WebAssembly and runs in the browser of whoever generates the week, in a Web Worker. On my PC it proves in under two seconds that the Tuesday evening gap cannot be closed.

Vue 3 and TypeScript, Fastify and MongoDB; every change goes through 368 automated tests and reaches the server through a GitHub Action.

Design, full-stack development and deployment · 2026

Vue.js, Fastify, MongoDB, HiGHS, WebAssembly

View the site

Andrea Coppetta