All detailed versions

03 / 03

sidurofe

Shifts for doctors: a requirement for every hour, self sign-up and swaps with validation.

Creative Labs · UI/UXPrototypePrivate demoProduct thinkingAI-assisted build

sidurofe’s requirement matrix: a table of hours against days, each cell with the required number and its staffing status, and a group of selected cells outlined in green.

A working prototype of a shifts system for doctors in a medical service that runs around the clock. You set how many doctors are needed in every hour, the doctors sign up themselves, and a supervisor and an administrator see, assign and approve swaps. Real sign-in, permissions and a server - and a visual design still to come.

Note Every doctor, supervisor and administrator on the screens is an invented account from the prototype’s demo data, and the screens were captured from a clean copy of it with a fresh database. The interface is grey and neutral on purpose: this is an operational wireframe, and its visual language has not been designed yet. This is written for development, information systems and management.

My contribution
Specification, the logo and the opening animation, and direction of the build with Claude Code.
Discipline
Creative Labs · UI/UX
Product state
Prototype · Private demo

01

Where it stands

sidurofe is an interactive wireframe that really works: a server, a database, sign-in by role, and permissions enforced on the server - with demo data. It was built to prove the operating logic and the flows before anyone designs: grey on purpose, with the final visual design still ahead.

  1. Idea
  2. Working wireframe
  3. Visual design
  4. Production back end
  5. Controlled pilot
  6. In daily use

Today: a wireframe that runs end to end with three roles. Next: the visual design (a Figma kit is ready), and in parallel the product decisions that were left open.

Works today

  • Three roles with real sign-in: doctor, supervisor and administrator

    Salted password hashes, a signed session cookie, and every action checked on the server by role and ownership.

  • A staffing requirement for every hour, with specialty floors that keep places

    Availability is decided at the shift level only; assigning to the calendar and the virtual queue is planning for the administrator and does not affect availability.

  • A doctor’s mobile app: open shifts, my schedule, swaps and availability for reinforcement

  • Information separated on the server: a doctor never receives other doctors’ names

    Other people’s shifts arrive anonymous, only for working out occupancy; supervisor notes and reinforcement data do not arrive at all.

  • Swaps with six checks before approval

    Each check has a policy: blocking, or a warning only.

  • Undo of the last action, and notifications of shift changes within a configurable time window

  • A Figma kit ready: tokens, components and a build guide

Needed to be fully functional

  • The visual design in Figma, following the token and component kitDesign

    Seven key screen skeletons; the rest are composed from them. The wireframe stays beside Figma as the interactive specification.

  • A production data layer: relational tables instead of one documentDev

    Today the doctors’ domain is stored as one JSON document managed by the reducer - enough for a prototype. The model is already defined, and has to be normalised.

  • Organisational sign-in instead of demo accounts, and a password resetIS

    Today every demo account shares one password, and a reset goes only through the administrator.

  • Real notifications to doctors by e-mail, and an Excel file that is really producedDev

    Today the e-mail is simulated, and the Excel export is a complete preview (columns, format, split by assignment) without a file.

  • Hosting with persistent storage, backup and an audit logIS

    On the demo host’s free tier the database resets at every restart - convenient for a demo, not for real use. An audit log (who changed what and when) is proposed and not built yet.

  • Six open product questionsManagement

    For example: partial approval of a swap, several volunteers for one request, and cancelling your own shift - see the end.

What has not been tested: use by real doctors, production data, the load of around a hundred and fifty doctors (for which the by-name selection and filtering were designed), and accessibility. “Today’s date” in the demo is fixed on purpose, so that the story stays consistent.

02

From the pain to the product

How we got from “a doctor is needed in every hour” to a wireframe you can click. The story is reconstructed from the product’s documentation.

  1. The pain

    A service that runs round the clock, and scheduling done by hand

    When a doctor is needed in every hour of the day, with a minimum of each specialty in every hour, it is hard to know what is missing, who can cover and which track someone belongs to. The gaps are found late, usually by phone.

  2. The approach

    Not drawing screens - building a wireframe that works

    Instead of static pictures, a prototype with real roles, permissions and logic, grey on purpose. That way the architecture, the flows and the operating logic are tested before colours are chosen.

  3. The truth

    The real unit is a doctor-hour

    Instead of storing “shifts”, the assignment of a doctor to a single hour is stored. A continuous shift on any screen is the result of joining consecutive hours, and never a stored entity - so no two screens show two truths.

  4. The rules

    A requirement for every hour, and floors that keep a place

    Each hour has a total and a minimum for each specialty; the specialty floor keeps places so that free sign-up does not leave the last places to the wrong specialty.

  5. The server

    The same logic in the browser and on the server

    One pure reducer runs in both places: an instant update in the browser and persistence on the server, which also checks permission for each action and filters the information by role.

  6. The brand

    A logo, an opening animation and a design kit

    Steve designed the logo and the opening animation. Beside them a Figma build guide and a plugin that builds tokens and components were written, so that the visual layer is composition and not drawing every screen.

  7. Today

    A working wireframe, waiting for design and decisions

    What remains is design, a production data layer, and a few product questions that were defined and left open.

03

How the system works

The heart of the system is the requirement model. Each hour has two separate layers: first the shift, which decides for whom the hour is open to self sign-up; then the assignment plan - guidance for the administrator only, which does not change availability.

A specialty floor keeps places. Take 10 places with a minimum of 2 pediatricians: as soon as 8 family doctors have signed up, the remaining places are offered only to pediatricians, and a doctor whose floor is not yet filled always has a place kept.

  1. In

    The requirement for an hour

    The total, a minimum of pediatricians and a minimum of family doctors. The administrator edits in the matrix: drag, non-contiguous cells, copying a day or a week, and saved layouts.

  2. Step

    Availability

    Decided at the shift level only. The specialty floors keep places, and open places can be limited to a certain role.

  3. Step

    Sign-up

    The doctor chooses a start time and a length inside an open window, and enters the shift’s pool without an assignment - “not yet assigned”.

  4. Step

    Internal assignment

    The administrator assigns the hours to the calendar, the virtual queue or a custom type - by click or by drag. Progress bars show how much is missing in each type.

  5. Step

    A swap

    A request is opened to volunteers, with no names. Before approval six checks run, each with a policy: blocking or a warning.

    • Specialty matchCheck 1

    • Daily hours quotaCheck 2

    • Consecutive hours quotaCheck 3

    • Personal availabilityCheck 4

    • Overlap with an existing shiftCheck 5

    • The internal assignment is allowed for the replacementCheck 6

  6. Out

    Notifications and undo

    A change inside the configured window (36 hours ahead by default) pops up a notification for the administrator and the supervisor. Undo reverses the last action, and is blocked if somebody else acted after it.

04

Who sees and who does what

Enforcement is double: both in the browser’s routing and on the server, which filters the information by role and checks every action.

CapabilityDoctorSupervisorAdministrator
Staffing requirementsNoview (staffing view)edit
Other doctors’ namesno - anonymousYesYes
Internal assignmentNoviewedit
Supervisor notesNocreate and viewview
Doctor noteshis or her own onlyat the “administrator and supervisor” levelboth levels
A reinforcement shiftNoYesYes
Approving or rejecting swapsNoNoYes
Managing doctors, users and rulesNoNoYes

Drag actions (moving a shift, changing an assignment) are reserved for the administrator and always come with a confirmation window.

05

The administrator: requirements, staffing and management

Screenshots from the wireframe running on its demo data. Click a screen to scroll inside it.

The staffing-requirement matrix: seven days against twenty-four hours, each cell with the required number, the minimum for pediatrics and for family, and the staffing status in colour.
The requirement matrix: the heart of the system
A daily staffing view: a card for each hour with progress bars for the shift, the calendar and the virtual queue, green when sound and red when short.
The daily staffing view
The weekly staffing view as a heat map: each cell shows how many signed up against how many are needed, and how many are short.
The weekly heat map - most of the demo is not yet staffed, which is its starting point
Schedule management: a table of shifts with the doctor, specialty, hours and the internal assignment for each hour, and removal buttons.
Schedule management: the internal assignment for each hour
Swap requests: a request awaiting approval with six checks, one of which blocks, and the history of approvals and rejections.
A swap: six checks, one of them blocking - it cannot be approved
Scheduling rules: hours quotas, the notification window, internal assignment types with a colour, and a policy for each swap check.
Scheduling rules: a blocking or warning policy for each check
User and permission management: accounts by role, a link to a doctor profile, password reset and deactivation.
Users and permissions

06

The supervisor: timeline, table and reinforcement availability

The supervisor sees every name, creates reinforcement shifts and adds notes, and does not edit requirements or approve swaps.

A daily timeline for the supervisor: a row for each doctor and shift segments coloured by assignment, with a specialty filter and a reinforcement-shift button.
Timeline: family on top and pediatrics below, with a dividing line
An operational table for the supervisor: shifts with filters, supervisor notes and doctors’ notes by visibility level.
The operational table
Availability for reinforcement: who is available now and later, with notes, and a button that creates a reinforcement shift with the window details filled in.
Availability for reinforcement: not a commitment, and a window already filled in

07

The doctor: mobile first

The doctor’s app is designed for the phone first: home, open shifts, my schedule, swaps and availability for reinforcement. A doctor abroad can see hours in local time - a display conversion only, and the data stays in Israeli time.

The doctor’s home: a greeting with a name, a monthly hours target with a progress bar, the nearest shift, a swap request in progress, and quick actions.
Home
Open shifts: choosing a day, a shift opened to choose a start time and a length, and an unavailable length marked.
Open shifts: choose a start and a length
My schedule: a list of upcoming shifts with adding a note and requesting a swap, and an open request with the note the doctor wrote.
My schedule
The swap-request window: choosing the range of hours and a reason, before sending the request.
A swap request
Swaps: requests open to volunteers, with no names, and my own swaps.
Swaps: open to volunteers, with no names
Availability for reinforcement: windows of time without limit in which the doctor can be asked to reinforce, which are not a commitment.
Availability for reinforcement: a window, not a commitment

08

Cracks and fixes

Design and logic decisions that grew out of real problems of an operational system.

  • The problem

    A “shift” means different things on different screens.

    The fix

    Only the doctor-hour is stored. Every shift on every screen is a join of consecutive hours and never an entity of its own.

  • The problem

    Free sign-up can leave the last places to the wrong specialty.

    The fix

    Specialty floors keep places: with 10 places and a minimum of 2 pediatricians, after 8 family doctors the remaining places open to pediatricians only.

  • The problem

    The planning numbers (calendar and virtual queue) can contradict the shift total.

    The fix

    A hard constraint: the split never exceeds the shift total. An excess is cut automatically by the same reducer, in the browser and on the server alike.

  • The problem

    Doctors should not see other doctors’ names.

    The fix

    The server filters the state by role: other people’s shifts arrive anonymous, only for working out occupancy; supervisor notes and reinforcement data never arrive. Enforcement is double: routing and server.

  • The problem

    An undo can quietly erase someone else’s change.

    The fix

    A strict last-in-first-out undo (up to 30 states): if another user acted after you, the undo is blocked.

  • The problem

    Approving a swap needs more than “looks fine”.

    The fix

    Six checks before approval, each with a policy: blocking (the request is even hidden on the server from doctors who do not pass) or a warning only, which the administrator can still approve.

  • The problem

    Hour ranges on a Hebrew page came out reversed (16:00-21:00).

    The fix

    Every numeric range is wrapped in a direction isolate, and a check on a real screen with real content was added to the design guide.

  • The problem

    The brand green could be read as “all is well”.

    The fix

    The status palette was shifted on purpose: sound in teal, short in red, over in amber - so that “our brand” is never “this is fine”.

  • The problem

    The database on the host’s free tier resets.

    The fix

    It became a feature of the demo - it always returns to the demo data. For production: a persistent disk or a managed database, a small change in one layer.

09

Brand, splash and motion

The logo and the opening animation are Steve’s: a word with the letter resh inside a green circle at its heart, which in the opening settles in letter by letter. The interface itself is grey and neutral on purpose - density is the identity, so tight padding, modest corners and minimal shadows - until the visual language is designed in Figma.

The opening, once per full page load, and skipped for anyone who asked for less motion
  • Brand green#008C47Identity, navigation and primary actions
  • Dark green#00713APressed and emphasis
  • Warm ink#231F20Text
  • Ground#F5F8F5The app background
  • Sound#0D9488Teal, deliberately different from the brand green
  • Short · Over#DC2626plus #d97706 for over and #2563eb for information

Type

  • Assistant a Hebrew interface face; the design kit advises choosing a brand face with tabular figures

Design rules

  • Density is the identity: this is an operational tool, not a marketing dashboard.
  • The colours of the assignment types are data the administrator edits, so they are a swappable colour slot and not a fixed value.
  • The meaning of the status (short, sound, over) is a functional signal and not decoration, and has to stay unambiguous after the design.
  • RTL everywhere, and horizontal scrolling in the matrix and the timeline as a defined pattern and not a flaw.

10

Tools and how they fit

Two audiences, two ways: for the development team - the code in a private repository; for management - a live application in the cloud that opens from any computer.

  1. 01

    Specify

    The specification in Claude is based on a specification document: an architecture note and a requirement model written as the work goes, including open questions.

    • Claude Codethe specification conversation, based on the specification document, the build and the documentation
    • Figmawireframes
  2. 02

    Build

    Server and interface in one project, with no external interface libraries.

    • Next.js · React · TypeScriptthe interface and the API layer
    • Tailwind CSSstyling; every component was built from scratch
    • SQLite (node:sqlite)a built-in database, with no native dependency
  3. 03

    Brand and motion

    Steve’s logo and animation, embedded in the interface.

    • Illustratorcreating the logo
    • After Effectsthe opening animation
    • Lottieplaying the opening animation
    • SVGthe logo
  4. 04

    Hand-off to design

    So that the visual layer is composition, not drawing every screen.

    • Figmaa build guide, and a plugin that builds tokens, text styles and components bound to variables
    • html.to.designsuggested to import the running screens as a scaffold
  5. 05

    Share

    For the development team and for management, in different ways.

    • Gita private repository for the development team
    • Rendera deployment blueprint that puts a live demo up in one step

11

What it takes to run for real

Who has to decide or supply, and what. And the six product questions that were left open.

Design

Give the wireframe a visual language.

  • Tokens, components and seven screen skeletons in Figma, from the kit that already exists.
  • A Hebrew interface face with tabular figures.
  • RTL and accessibility checks on real content and long names.

Development and information systems

Turn the prototype into a service.

  • A relational schema instead of one document, and persistent storage with backup.
  • Organisational sign-in, a password reset, and real e-mail for notifications.
  • An Excel file that is really produced, and an audit log: who changed what and when.
  • A connection to a historical source for calculating requirements automatically, beside manual editing.

Management and operations

Answer six questions the prototype cannot decide.

  • Is part of a swap request approved, or always all of it?
  • When several volunteer for one request: who prevails, and who chooses?
  • Do reinforcement hours count against the requirement, or are they always “on top”? (Today they count, so a reinforced hour can show “over”.)
  • May a doctor cancel their own shift without a swap, and until when before the shift?
  • Where should the administrator set the monthly warning threshold?
  • The relation between automatic calculation of requirements and a manual override.