← Work

Workforce Scheduling

Rota

A scheduling platform for creating and managing employee rotas. Built for small teams that need something faster than a spreadsheet and simpler than enterprise workforce software.

ReactNext.jsTypeScriptPostgreSQL
Rota — scheduling interface showing weekly employee rota

Weekly schedule view with employee assignments and shift management.

Overview

The platform is multi-tenant: each organisation's rotas, staff, and shifts stay fully isolated, with managers getting full control and staff seeing only what applies to them.

  • Create and publish weekly rotas in minutes.
  • Each organisation's data is fully isolated (multi-tenant).
  • Role-based access for managers and staff.
  • Built for small hospitality teams, not enterprise HRMS.
Staff shifts view

Staff view of shifts.

Build

The editor is built for speed: creating a rota takes minutes, not the half hour it takes in a spreadsheet, with every interaction cutting steps between deciding a schedule and publishing it.

Next.js and TypeScript handle the frontend. PostgreSQL enforces multi-tenant isolation at the row level, with role-based access checked on both the UI and the API. Session auth keeps the login flow simple without a third-party provider.

Holiday Requests — employee request form

Holiday requests — employee submission view.

Swap Requests — shift swap management

Swap requests — shift exchange between staff.

Frontend

React · Next.js · TypeScript

Schedule views, rota editor, and role-conditional UI for managers and staff.

Backend

Next.js API Routes

Business logic, role enforcement, and data access with organisation-scoped queries.

Database

PostgreSQL

Multi-tenant schema with organisations, employees, rotas, and shift records.

Auth

Session-based

Role-based access control with separate permissions for managers and staff.

Rota — full platform overview

Full platform view — schedule builder, team overview, and role-based navigation.

Multi-tenant isolation was the one decision that had to be right from the first database query. Retrofitting row-level isolation after the fact would have meant rewriting almost every query in the app.