Everything built so far, one section per module: 18 modules, 77 pages and 104 screenshots at 1600 by 900 (73 of the current build on sample data and 31 more with live data). Click a picture to see it full size. Every name, number and date is sample data. The modules below run on sample data held in the page (nothing is saved and there is no sign-in); the last section, Live data, shows the same app reading and saving to a database.
To open the live pages: run npm start in the project folder, then use the “Open live” links (they open the shell at 127.0.0.1:4180 as the right sample user). Pictures were taken 2026-11-06 with npm run demo-shots.
1. Who sees what
The sidebar is built from each person’s permissions. A page or module someone may not use is not greyed out: it is simply not there. Same app, three different people:
Full access
The HR manager: every module, and the controls to change things.
What an employee sees about themselves and nobody else: profile and documents, leave and balances, this week’s timesheet, notices to read, onboarding and goals.
My timesheetsas Employee · open liveTeam approvalsas Line manager · open liveMissing submissionsas Line manager · open liveLocked periodsas HR manager (full access) · open liveTime codesas HR manager (full access) · open live
Fleet and dispatch
Vehicles, drivers and trip bookings with service, insurance and licence dates; double-booking is refused.
Vehicles & depotsas Fleet manager · open liveDrivers & licencesas Fleet manager · open liveTrips and bookingsas Fleet manager · open liveService and expiry dueas Fleet manager · open liveA vehicleas Fleet manager · open live
Time off
Leave requests and approvals with team cover, balances in days, who is away, leave policy and public holidays.
Leave requestsas Line manager · open liveLeave balancesas Line manager · open liveWho is awayas Line manager · open liveLeave types & policiesas HR manager (full access) · open liveHoliday calendaras HR manager (full access) · open live
Performance
Appraisal cycles, self-assessments, manager evaluations, probation reviews and improvement plans.
Exit casesas HR manager (full access) · open liveNotice & last working dayas HR manager (full access) · open liveClearance as the IT leadas IT lead · open liveExit interviewsas HR manager (full access) · open live
Communications
Notices to staff: inbox, announcements, policy notices with read tracking, and delivery rules.
Headcount by teamas HR manager (full access) · open liveAttendance and absenceas HR manager (full access) · open liveLeave takenas HR manager (full access) · open liveContracts and immigration expiringas HR manager (full access) · open liveRecruitment funnelas HR manager (full access) · open live
Phone (3CX)
Phone extensions for staff, the call log, missed calls that need a call back, and phone settings. Calls are listed, never recorded.
Users & rolesas HR manager (full access) · open liveAudit logas HR manager (full access) · open liveAccess reviewsas HR manager (full access) · open liveSystem settingsas HR manager (full access) · open live
3. Live data
Everything above runs on sample data held in the page. These screens were taken with the app reading and saving to a real database (a local scratch copy, sample people only), signed in as people with different permissions. The banner at the top of each page says so. The database, not the page, decided what each person could see and do.
Who gets which rows
The same page, three different sample people. The database decides which rows come back; the page only draws them.
HR managerThe database returns all 8 people.Line managerOnly the manager’s own team (2 people): the database leaves the rest out.Staff memberOnly themselves (1 person).HR manager overviewTasks, notices and count tiles are built from database rows, and only for the keys this person holds.
Casual work register
Reading and saving through the database. Whole-batch actions report exactly what was refused and why.
HR managerThe register for 4 Nov holds the one database line (a 6-hour draft).Staff memberNo casual key: the database refuses and the page shows Access denied.Site supervisorSees only their own site’s lines.ReviewerThe Awaiting review tab lists lines waiting for a decision.Add workersAdding workers sends a request the database checks (site, date, no duplicates).A new draft lineThe saved line comes back from the database as a draft.Bulk selectionSeveral lines selected for one action.Bulk resultThe database held 2 lines: approved lines are locked and a line waiting for review cannot change. The rest saved.Copy roster previewA preview of what copying a roster would add, before anything is saved.
People, employees, contracts and cases
Lists read from the database, paged and filtered on the server, with the sensitive details withheld.
People (HR manager)One page of 50 at a time; tile and tab counts come from the database.Employees (HR manager)Server-paged list; search is a database filter.Employee tabsCurrent, Recent starters, Need attention, Left and All are database filters, and each total matches its tab.Employee profileOne database read: summary, employment record, documents shown as “On file (not shown)” (no document numbers), emergency contacts.Staff memberA staff member’s directory holds only themselves.ContractsContract rows read from the database.Immigration casesCases read from the database; document numbers are never returned to this key.PlacementsIntern and NSS placements read from the database; an open-ended one shows “Open”.
Attendance
Who is expected, who came in and the weekly schedule, read from and saved to the database. Every save carries the version it saw, so a row someone else changed comes back stale.
Register (HR manager)Expected, marks and approved leave for every employee the caller may see.Schedules (HR manager)One week at a time from the database.Register (line manager)Only their own reports.Marking (line manager)A mark is saved through the database and the week is read again; the database repeats the hours and rest-day rules.Register (staff member)View only: no mark buttons without the write key, and only their own row.Changing a shift (HR)A shift change is saved with its version; a row changed by someone else comes back stale.
Leave requests
Requests, approvals and who may ask on whose behalf are decided by the database.
New request (HR manager)The “Who is it for” list comes from the database: HR sees everyone.New request (manager)A manager sees themselves and their reports only (3 people).Requests (manager)The manager’s own list, with their own request and their reports’ requests.Own leaveThe database refuses a manager deciding their own request, or one they created, and the page shows its message.
Not shown live: the pages not listed above still read sample data, and nothing has been applied to the shared DEV database yet.