Session Hire Blueprint
00The journey

One system for the whole job

Live since 30 September 2026

A web app for Session Hire that works on a phone in a field as well as on a laptop in the office, keeps Google Calendar working during the move, and will hand off to Crewbox on site.

Follow one job through the business. Eight chapters, with the parts of the app that do the work under each.

  • Built
  • In progress
  • Planned
  • Built, waiting on a key

    01Overview

    The company in numbers, the app in three parts

    1,000sassets in the warehouse
    0of them barcoded today
    100+freelancers on the books
    100sjobs a year

    Projects and planning

    Jobs split into phases (prep, build, show, load out) with their own dates, kit and crew.

    Warehouse and stock

    Labels, scanning out and in, availability you can trust, repairs and inspections.

    Crew and light finance

    Freelancer offers, call sheets, timesheets and staff leave, then quotes, invoices and exports.

    02Progress

    Where the build is

    Loading the latest entry…

    Latest: stocktakes and rolling counts

    Counting Bay A2 on a phone: 1 of 2 found, the scan field, and a speaker scanned here that the record keeps at Bay A1, with the amp rack still to find
    Counting a place. Labels scanned, with no signal needed; what isn't as recorded is said at once.
    A finished count of Bay A1: 9 of 10 found, one speaker not found with Report missing beside it, and counted kit one short with Set to 3
    What it found. Each difference with its fix one tap away.

    Jobs, the start of Phase 1

    Each job has its client, venue, status and phases, and each phase shows how its days will read on the calendar. Crew are asked for from the job, and a rename reaches the crew too. Cancelling a job cancels its crew. (Decision 0007)

    Jobs tab on a phone: List, Week and Month at the top, a search box, filters for coming up, past and not going ahead, a confirmed job with 0 of 2 crew booked, and the new job form
    The list. What's coming up, and how much crew is booked.
    A job's page on a phone: Nissan launch, confirmed, with its client, venue, dates and crew, and the Build phase with its calendar titles and a call for two audio techs
    A job. Its phases as the calendar will show them, with their crew.

    A way up from every page, and everything where it lives

    Every page under Jobs, Stock, Crew and the Menu has its way up in the top bar, in view however far down the page is: one link on a phone, the whole way down as breadcrumbs on a desk. (Decision 0039) Each area names its pages in a row under the header, every address starts with its area, and old links land on the new pages. (Decision 0041)

    A job's page on a phone scrolled to its end, with All jobs still at the top under the company name
    On a phone. One link to the page above, still there at the foot.
    A pick list on a desk, with Jobs, Liffey Brands Shoot and Pick list as breadcrumbs under the company name
    On a desk. Jobs › the job › Pick list.
    Stock on a phone with Catalogue, Places, Labels, Counting, Testing and Repairs in a row under the header, Places marked, and the list of places below
    An area's row. Stock's pages side by side, the open one marked.

    A page for each venue and client

    Each venue and each client opens on a page of its own with its details, documents and jobs. A document is a file, or a link to where it's shared, or both: links work now, files once the storage bucket is set up. (Decision 0032)

    A venue's page on a phone: Northbank Conference Centre with its address and Map link, its loading bay note, and its documents: a tech spec and an auditorium floor plan as links, each with Open, Change and Remove
    A venue. What it sent, kept once for every job there.
    A client's page on a phone: Brightwater Conferences with its head of events, Declan Moore, his number and email, and its documents: a contract for 2026 and a purchase order as links, each with Open, Change and Remove
    A client. Who to ring, and the contract and purchase orders.

    Confirmed jobs onto Google Calendar

    Connect a Google account on the Account tab and pick its calendar. Every day of every confirmed job, from today on, goes on it in the format crew know, with the venue, the day's crew by name and a link back, and follows the job within seconds. Anything changed by hand in Google is put back each night. (Decision 0008)

    Account tab on a phone: the Google Calendar card says confirmed jobs go on Test calendar, written by ops@sessionhire.com, with Check now, Change calendar and Disconnect
    Connected. Which calendar, which account, and Check now.
    A job's page on a phone: the Build phase is on Test calendar with a link to open it, and the Show day couldn't be written, with Google's reason
    Each phase. On the calendar, on its way, or why not.

    Crew invites and their answers

    With the switch on the Account tab on, crew offered or booked on a confirmed job are invited to its days on Google Calendar, as ops do by hand today, and their Yes or No there counts as their answer, as on their link. Guests hear from Google only when it matters. A No from someone already booked is shown to the office rather than unbooking them. The switch starts off. (Decision 0009)

    Account tab on a phone: the Google Calendar card says crew invites are on, with 4 invites to 2 people on their way, and a button to turn them off
    The switch. Says what goes out before it does.
    A job's page on a phone: Niamh is confirmed but said no to the second day on Google Calendar, with a warning to call her; Conor is invited with no answer yet; Seán has no email address, so no invite
    The answers. Under each person, with what needs a call.

    The week and month planner

    Week and Month, beside the jobs list, lay out every job with anything on, or every person, a row each. Each day says which phase it is, as the calendar titles it, and how many of its crew are booked. Confirmed jobs are solid and quotes dashed; a day is green once its crew are booked and amber while some are still to find. Clashes are listed above, in words, with the job to open: booked while unavailable, or booked twice, and offers that would clash if they said yes. Worked out on each device, so it needs no signal. (Decision 0010)

    The planner's week by job on a phone: two things to sort out, Aoife booked on a day she's unavailable and Dara offered a job on a day she's away; below, Web Summit's Show days with 0 of 2 crew in amber and Nissan launch's Show with 1 of 1 crew in green, the job names kept on the left
    A week by job. Scrolls sideways, names kept in view.
    The planner's week by person on a phone: Aoife booked on Web Summit, with Tuesday marked as a clash because she is also unavailable; Conor offered the build days; Niamh booked on them
    A week by person. Booked, offered, away, and the clash.
    The planner's month on a laptop: March 2031 with a row per job and a column per day, each phase-day as a short code such as Bu for Build, green or amber for its crew, and the quote and the enquiry dashed
    A month on a laptop. Every day at a glance; a date opens its week.

    Bringing in the jobs already on Google Calendar

    The office picks a calendar the connected account can see, its own or an organiser's shared with it, and a first day, and the app shows every job it would bring in before anything is saved: phases and days read from titles as they're typed today ("Nissan - Build 1/2"), the venue from the location, and the crew from the guests, booked, offered or declined by their answer. Jobs can be unticked or renamed, and people on the invites chosen for the crew list. Bringing in saves it all in one go; looking again shows only what's new and lists events changed in Google since. Nothing is written to Google and nobody is emailed. (Decision 0011)

    Bringing jobs in on a phone: the calendars the connected account can see, its own chosen, then Aoife Byrne's and Session Hire Gigs shared with it, and the first day to bring in from
    Choose a calendar. Its own first, then any shared with it.
    What would come in, on a phone: Nissan with its Build, Show and Load out days, a new venue and its crew; more days for Aviva, brought in before; Web Summit unticked; and a button to bring in 2 jobs and more days for 1 job
    Look before bringing in. Untick, rename, then bring in.

    Everyone's own bookings in their own calendar

    Each person has a feed of the jobs they're booked on for Google, Apple or Outlook Calendar, at an address of its own that can only show bookings: it's safe in a calendar they share, and New link retires it. Freelancers find it on their page, the office copies it from the Crew tab, and staff who also work jobs have it on the Account tab. The server answers calendar apps from memory, so their hourly looks don't wake the database. The last part of Phase 1. (Decision 0012)

    A freelancer's private page on a phone: under Your bookings, a subscribe link for iPhone, Mac and Outlook, the address to add in Google Calendar, and a note that it only shows bookings so it's fine in a shared calendar
    Freelancer. Subscribe, or add the address in Google.
    Account tab on a phone, signed in as Ciara Walsh: the card Your bookings in your own calendar, with the feed address, Subscribe and Copy address
    Staff. Their own feed, on the Account tab.

    The warehouse catalogue, the start of Phase 2

    The Stock tab lists products by department, with a search that finds a product, an item's number or a serial; a scanner that types a label's number and Enter opens the item. A product is numbered, each one labelled SH- and six digits, or counted, like cables. Numbered kit can be counted until it's labelled, and each item added takes one off the count, so the total is right from the first day. A number is never used twice, cases hold items and counted stock, and each place shows everything kept there. It all works with no signal. (Decision 0013)

    Stock tab on a phone: a search box for a product, number or serial, department filters, and three products: Amp rack with 1 item, d&b Y10P with 2 items and 4 not labelled yet, and XLR 10 m with 8 counted; below, the new product form
    The catalogue. Products by department, and how many.
    A product's page on a phone: d&b Y10P, Audio, numbered, 6 in all with 2 labelled and 4 not yet; its items SH-000101 and SH-000102 at Bay A3, and the form to add the next one
    A product. Labelled one after another.
    A case's page on a phone: SH-000151, an Amp rack kept at Bay A3, with Move, Change details, New label and Retire; in it, SH-000101 d&b Y10P and 8 × XLR 10 m, and a form to put an item in
    A case. Where it's kept and what's in it.
    A place's page on a phone: Bay A3 with 3 items and 12 counted; here, the case SH-000151 with 1 item and 8 counted in it, d&b Y10P SH-000102, and 4 d&b Y10P not labelled yet
    A place. Everything kept there.

    Kit on jobs, with shortages

    A job's page lists the kit it needs from the stock list, by department, for the whole job or one phase; a line for the whole job covers the days between its phases too. Each line says whether there's enough on its days once the other confirmed jobs have theirs, and if not, by how many, when, and who has the rest. Enquiries and quotes are pencilled in: checked as if they went ahead, never counted as taken. Short is never refused: a short line offers to subhire the ones it's short. The jobs list flags kit short, the Stock tab lists it, and a product's page lists its jobs. Worked out on each device, so it needs no signal. (Decision 0014)

    A job's Kit card on a phone: kit held Wed 4 Sep, no days before or after; 4 × d&b Y10P for the whole job on Wed 4 Sep, in red: short 2 on Wed 4 Sep, 10 owned, 8 on Electric Picnic; a button to subhire the 2 short, and the form to add more kit
    Short. By how many, when, and who has the rest.
    Electric Picnic's Kit card on a phone: 8 × d&b Y10P for the whole job, in amber: enough, unless Longitude goes ahead, then short 2 on Fri 6 Sep; 30 × XLR 10 m for the show, enough with 10 to spare
    Pencilled in. Enough, unless a quote goes ahead.
    Stock tab on a phone: the Kit short card lists d&b Y10P short 2 on Longitude, Fri 6 Sep, marked Quoted
    On Stock. Every line short from today on.
    A product's page on a phone: d&b Y10P, 10 owned, on Electric Picnic (8 needed, enough unless Longitude goes ahead), Fuel launch (4 needed, 2 subhired from PRG, enough with none to spare) and Longitude, quoted
    A product. The jobs it's on, and what's free.

    Getting kit ready and back

    Each job holds its kit a day before it's needed, to get it ready, and a day after, to check it back in, so a job the day before or after can't have the same speakers. Any job can say from none to 14 days of each from its Kit card: none before when it has its own Prep phase, or none either side when kit goes straight from one job to the next. A shortage on one of those days says so. Kit still out after its job isn't counted as free until it's scanned back in. Whole days, since phases have no hours yet. (Decision 0031)

    A job's Kit card on a phone: Kit held Tue 3 Sep to Thu 5 Sep, a day before to get it ready, a day after to check it back in; the form to change it open with 0 days before and 0 after, the usual days in a hint, Save and Cancel; under it 4 × d&b Y10P for Wed 4 Sep, short 2 on Tue 3 Sep, getting it ready, 10 owned, 8 on Electric Picnic, short on 2 other days too
    Days held. A day either side, changed per job.

    Printing labels

    Numbers are set aside a run at a time before their labels are printed, so an item given the next free number never takes one waiting on a roll. A label is black on white: a QR code holding just the number, the number in large type and "Session Hire", and the product's name on an item's own label. They print here from the browser, one to a page on a label printer or 65 to an A4 sheet, or from a spreadsheet a label maker prints rolls and metal tags from. Scanning a label that isn't on anything yet offers to put it on an item; the product and place stay for the next one, so labelling a shelf is a scan and Enter each. (Decision 0015)

    The Labels screen on a phone: how many labels and what for, a note that SH-000001 to SH-000012 are set aside, and under Set aside the run SH-000001 to SH-000012, Roll from Label World, set aside today, 0 of 12 on items
    Set aside. The numbers for a roll, before it's printed.
    A run's page on a phone: the printer, a label printer 50 × 25 mm, 25 × 25 mm or A4 sheets of 65; a preview of SH-000001 to SH-000003, each a QR code, the number and Session Hire; Print 12 labels; and For a label maker, a spreadsheet of all 12
    Printed. Here, or by a label maker.
    The Stock search on a phone with sh5 typed: SH-000005 isn't on anything yet, one of the labels set aside today for Roll from Label World; product d&b Y10P, kept at Bay A3, one of the 3 counted there, and Put SH-000005 on it; below, the Labels card with the next free number, SH-000013
    Claimed on scan. Which product, and where it's kept.
    An item's page on a phone: SH-000005, a d&b Y10P at Bay A3, with Print label open: the printer, then its label with the QR code, SH-000005, Session Hire and d&b Y10P, and Print the label
    An item's own. A new one, from its page.

    Scanning with the camera

    Scan beside the Stock search turns the phone's camera on, in the app. Point it at a label and its item opens; a maker's serial in a barcode finds its item too, on Android. A label on nothing yet asks what it's on, with the camera still on and made small, so labelling a shelf is a scan and a tap each. It reads one label after another, a label held still only once, with a flash, a beep and a buzz. It works with no signal, and the pictures never leave the phone. (Decision 0016)

    The Stock tab on a phone with Scan pressed: under the search, the camera's square picture with a white frame to put the label in, Point the camera at a label, and Sound and Stop camera buttons
    Scan. The camera, under the search.
    The Stock tab on a phone scanning: a small camera picture of a QR code, Read SH-000002, and under it SH-000002 isn't on anything yet, one of the labels set aside today, with product d&b Y10P, kept at Bay A3, and Put SH-000002 on it
    A new label. What it's on, with the camera still on.

    Pick lists, and kit out and back

    Each job has a pick list, from its Kit card: every product on the kit, how many the job needs from Session Hire's own, how many are out, and where to find the rest, place by place with the item numbers there. Going out, each label scanned with the camera or a scanner is out with the job, and the answer comes at once; counted kit is counted out, and a case takes what's in it along. A scan is never refused: one that doesn't match the plan (not on the kit, too many, still out with another job) is kept and says so. Coming back, the same page says what's still out. It all works with no signal, and every phone agrees once it catches up. (Decision 0017)

    A job's pick list on a phone, going out: the camera's answer in amber, SH-000004 Shure SM58 out, it isn't on the kit for Nissan launch; under Kit to go out, d&b Y10P 1 of 2 out with Bay A3: SH-000002, SH-000003 to find and SH-000001 out with Not going beside it; XLR 10 m 12 of 12 out in green, counted; and under Not on the kit, Shure SM58, 1 out
    Going out. What's out, and where the rest are.
    The same pick list coming back with no signal and 2 changes waiting: 12 back, 3 still out; SH-000003 isn't out, so there's nothing to bring back; d&b Y10P 1 still out, SH-000002 with Back beside it; XLR 10 m 2 still out, 2 counted out and 10 back; Shure SM58 all 1 back
    Coming back. What's still out, with no signal.

    Faults, missing kit and repairs

    Coming back on a pick list, an item just scanned can be reported damaged, with what's wrong and whether it can still go out; an item still out can be marked missing, and so can counted kit. A missing item that turns up and is scanned is marked found. The Stock tab's Faults and repairs card is the repair list, each with repair notes and how it ends: fixed, not faulty, found, or written off, which retires the item or takes counted kit off the count. Kit missing, or damaged and not fit to use, isn't counted as owned, so a job's kit shows it short. It all works with no signal. (Decision 0018)

    A pick list coming back with no signal and 6 changes waiting: 18 back, 1 still out, 4 missing; the last scan, SH-000001 d&b Y10P back: 1 of 3 back, with Report damage to SH-000001 under it; d&b Y10P 1 still out, 1 missing, SH-000003 with Back and Missing beside it and Missing: SH-000002 in a dashed orange pill; XLR 10 m 17 back, 3 missing, with Report damage to counted XLR 10 m
    Coming back. Damaged and missing, reported as it's scanned.
    An item's page: Fault, damaged, can't go out: Blown driver, in orange; under Faults, a card with an orange stripe saying Damaged, can't go out, back from Nissan launch, reported today at 13:39, Blown driver, Repair notes: New driver fitted, €180, and buttons Fixed, Not faulty, Write off and Repair notes; then Report damage and Report missing
    On the bench. Repair notes, then fixed.

    Made-up data, and starting fresh

    Until the real stock and crew lists are in, the Account tab puts a few weeks of made-up jobs, crew and stock into an empty app, to try every part of it: speakers short between two jobs, offers to chase, items to label, a pick list. Every screen says "made-up data" beside its name while it's in. Start fresh deletes everything but the staff accounts, after a backup, once "delete everything" is typed; every phone empties itself and drops what it had waiting, so nothing made up comes back. (Decision 0019)

    The Jobs tab on a phone, its top bar saying Jobs · made-up data in amber: Coming up (5), Past (1) and Not going ahead (1); Harbour Lights Festival for Shannonside Festivals at Riverside Park, confirmed, crew 5 of 9, kit short; Brightwater Tech Summit, confirmed, crew 1 of 2, kit short; Corrib Arts Week, quoted, kit short in amber
    Made up. Said on every screen while it's in.
    The Account tab on a phone: the Made-up data card says when it was put in, that starting fresh deletes every job, person, product and item, and the history, on the server and on every phone, and that backups are off, so it can't be undone; delete everything typed in the field, and the Delete everything button in burnt orange
    Start fresh. Only once the words are typed.

    PAT tests and thorough examinations

    A numbered product says how often its items need a PAT or a thorough examination. Each test is recorded on the item, passed or failed, with the day and who did it, or a shelf is tested as a batch by scanning each item as it passes, with It failed for one that didn't. The app works out when each is next due; the Stock tab lists what's failed, overdue or due in the next 30 days. Failed or overdue kit isn't counted as owned, and scanning it out for a job warns. It all works with no signal. (Decision 0020)

    Test a batch with no signal and 1 change waiting: PAT pressed, by Volt Testing Ltd, today; the last scan, SH-000003 d&b Y10P: passed, next due 30 Sept 2027, in green, with It failed under it; Tested here: 4, with SH-000002 failed in orange
    A shelf at a time. Scan each one that passes.
    An item's page: Testing, PAT failed on 30 Sept 2026: it can't go out until it passes, in orange; under Inspections, a card with an orange stripe saying PAT failed on 30 Sept 2026, can't go out until it passes, Record a test, and 2 recorded: Electrical test (PAT) failed, 30 Sept 2026, Volt Testing Ltd
    Failed. Kept off jobs until it passes.

    Call sheets

    Each phase of a job has a call sheet: its days, where with a map and the venue's access notes, the running order, who's on for each call and when, and who to ring on the day. The office's shows everyone with their numbers, who's still to answer, the kit and the client, prints on A4 and copies for a WhatsApp group. Everyone who has said yes gets their own on their private link, with no app: who else is on by name only, and the one number of the contact on the day, who sees the crew's numbers and the kit on theirs. (Decision 0021)

    The call sheet for Harbour Lights Festival, Show, on a phone: Mon 5 Oct to Tue 6 Oct for Shannonside Festivals, with Print and Copy for a WhatsApp group; under On the day, Aoife Brennan picked as the contact on the day, whose name and number go on everyone's call sheet; then Where, Riverside Park, Limerick
    The office's. Picked who to ring; print or send.
    Dara's call sheet on their private link: Harbour Lights Festival, Show, Mon 5 Oct to Tue 6 Oct; You, Sound No.1, call 12:00, food on site, blacks please; On the day, ring Aoife Brennan on +44 7700 900105; Where, Riverside Park, Limerick, open the map, load in from the north gate; then the running order
    The freelancer's. No app: their call, who to ring, where.

    Timesheets

    Freelancers bill a day rate, so a timesheet is the days worked at the booking's agreed rate, and extras such as parking or mileage. From a booking's first day the freelancer sends theirs from their private link, with no app, their booked days already ticked. The Crew tab lists those to approve and those not in yet; the office changes anything that needs it, says why, and approves it in one step, or fills one in for someone. The freelancer then sees what was approved and what changed. (Decision 0022)

    Check and approve on a phone: days worked, Sun 20 Sep and Mon 21 Sep ticked; day rate 320; extras Parking 18 and Mileage 20, each with Remove; a note for Dara, Mileage at the civil service rate; in amber, They'll see these changes from what they sent: Mileage, €20, not €25.50; 2 days at €320, and €38 of extras: €678; and Approve €678
    The office's. Changed, said why, approved.
    Laoise's timesheet on her private link: Autumn Gala, Show; Stagehand, Sun 20 Sep to Mon 21 Sep; €200 a day, as agreed; days you worked, both ticked; extras, with Parking and 12 in the first row and two empty rows; a note for the office; and Send to the office
    The freelancer's. No app: days ticked, extras added.

    Crew booking, started early

    The office offers a job and sends it by WhatsApp, text or email. The freelancer answers from their own link, with no app or login, and can take only some of the days. Nobody is double booked, and on a shortlist the first to say yes gets it. (Decision 0002)

    Office crew screen: a job for Electric Picnic with an offer to Aoife ready to send by WhatsApp
    Office. Offer made, message ready for WhatsApp.
    Freelancer's private page on a phone: the offer in full with day checkboxes and Accept or Decline
    Freelancer. No app: pick days, accept or decline.
    Office crew screen after the answer: Aoife confirmed for two of three days
    Back in the office. Answer arrives live and is confirmed.

    Design system

    Colours, type and components from the app, now in Figma. Same names as the code, light and dark. Below: the Crew area rebuilt only from the library.

    The Crew screen built from design system components, in light and dark
    Light and dark. One frame, one setting switched.
    03Principles

    Three rules everything else follows

    Open and flexible

    "The closed ecosystems, their way is the only way."

    • Full API, webhooks and export of everything, any time.
    • Phases, statuses, roles, fields and templates are settings, not code.
    • Any warning can be overridden with a note; overrides are logged, not blocked.
    • New departments arrive as modules on one core, like Crewbox.

    Meet freelancers in the middle

    "A they come to us, not a meet in the middle."

    • No app or login needed to get work: SMS, WhatsApp, email and calendar invites with one-tap links.
    • Availability read from their own calendar, busy or free only.
    • Certificates and bank details entered once.
    • Hours become a ready-made invoice they approve.

    Offline is normal

    Being on site means the internet may be poor.

    • Reading and common actions work with no signal: scan out and in, report a fault, accept a job.
    • Nothing is lost: every change waits on the device until the server confirms it.
    • Real time when online: changes show on other screens within a second.
    04How it works today

    A gig is a row of all-day calendar events

    Read from the calendars on 29 September 2026: 58 events from June to October. Each phase of each day is its own event, titled Project - Phase n/m, with the venue as location and the crew invited as attendees. Accepting the invite is the crew's confirmation.

    AcceptedNot answeredExample shape; crew counts illustrative

    What the calendar carries

    • Two ops staff organise; crew are invited. About two thirds of attendees use personal Gmail, Outlook or iCloud addresses.
    • Descriptions are usually empty. When filled, they hold a kit list (4 x d&b Y10P) and a run of show.
    • A shared Session Hire Gigs calendar exists but is empty.

    What that means for the design

    • The unit of scheduling is the phase-day, so the model has projects with phases.
    • Calendar sync must produce this exact shape so crew see no change on day one.
    • RSVPs map onto crew assignment status, both ways.
    • Freelancers need magic links, not company logins.
    05The market

    Six tools, the same five blind spots

    Rentman, TeamTrack, Current RMS (being renamed OnRent Events), Flex, HireHop and easyjob, compared from vendor sites and reviews in September 2026. The last column is what Session Hire's system aims for.

    Where not to compete: Rentman's quoting and invoicing breadth and HireHop's core stock handling. Matching them is enough. Full detail and sources in the competitor audit under Full documents.

    06Architecture

    Phones send requests; the server decides

    Each device keeps a local copy of what its user needs and an outbox of changes. Changes are sent as requests ("add 4 × Y10P to Nissan") that the server confirms or turns down with a reason, so the rules hold whichever device a change comes from. When two people offline both book the last four speakers, both bookings stand and both show short until someone sorts it, rather than one silently vanishing. Things that already happened in the real world, like a scan, are always accepted and reconciled afterwards.

    Phone or laptop App (PWA)works with or without signal Local copyonly this person's jobs and stock Outboxchanges wait here until confirmed Free text (notes, run of show)uses shared documents thatmerge, as in Crewbox requests upchanges down,by sequence number API server checks availability and rules confirms or turns down each request streams changes to every device runs calendar sync, emails, PDFs talks to Crewbox and exports Postgres EU region point-in-time recovery nightly backup, tested full audit trail

    Walk through it: two people, four speakers, no signal

    Step 1Both book offline
    Aoife: 4 × Y10P → Nissan pending
    Dara: 4 × Y10P → Fuel pending

    Only 4 are free that week. Both phones show the booking as pending.

    Step 2Outboxes send

    Each request carries its own id, so a retry is never counted twice.

    Step 3Both kept, both flagged
    Nissan short 4
    Fuel short 4

    The server keeps both as asked, and every device works out that the week needs 8 and there are 4. Short is a warning, not a refusal: the count may be unfinished, or the rest about to be subhired (Decision 0014).

    Step 4A task, not a silent undo

    Dara sees "Short 4: 4 owned, 4 on Nissan", taps Subhire the 4 short and adds the supplier. Both jobs then have enough. Nothing was lost, and the shortage showed on every screen until it was sorted.

    What each device keeps

    WhoSynced to their device
    Ops and officeLive projects from 30 days back to 12 months ahead, full catalogue, crew
    WarehouseCatalogue, assets, cases, locations, pick lists for the next 14 days
    Crew chief on a jobThat job: phases, crew and phone numbers, kit list, run of show, venue
    FreelancerTheir own offers and bookings, call times, venues, their documents. Never other people's rates.

    The data at a glance

    Projects
    • Job for a client, with a status (built)
    • Phase: prep, build, show, load out… (built)
    • Equipment line by department (built)
    • Crew requirement per phase (built)
    • Quote, versioned
    • Client, contact, venue (built)
    Stock
    • Product: the model (built)
    • Asset: one item, hidden id (built)
    • Identifier: QR, serial, RFID… (SH numbers built)
    • Container: case, rack, bundle (built)
    • Movement: every scan (built)
    • Maintenance: faults and tests (built)
    People
    • Person: staff, freelancer (built), supplier
    • Documents with expiry
    • Availability: days off (built)
    • Assignment: offered → confirmed (built)
    • Timesheet
    Money
    • Price lists and rates
    • Quotes and invoices in EUR
    • VAT 23% and 13.5% per line
    • Freelancer costs
    • Dashboard and exports
    LayerChoiceWhy
    LanguageTypeScript throughoutSame as Crewbox; shared types
    AppReact, Vite, installable PWA; Capacitor for scanning laterSame as Crewbox
    On the deviceSQLite in the browser, IndexedDB fallbackReal availability queries offline
    ServerFastify with shared schemasSame as Crewbox
    DatabasePostgres, EU region, point-in-time recoveryDate-range queries for availability
    Sign-inGoogle Workspace for staff; a private link for each freelancerBuilt (Decisions 0002 and 0003)
    Sync engineOur own, on the Crewbox patternDecided and tested (Decision 0001)
    BackupsNightly, to a separate bucket, each proved by a test restoreBuilt (Decision 0004)
    Error alertsSentry, EU data, from the server and every phone; uptime and backup checksBuilt (Decision 0005)
    History and exportEvery change kept with who, when and on what device; one file with everything as spreadsheets and JSONBuilt (Decision 0006)
    JobsClients, venues, jobs and their phases, changed field by field so two people's edits both standBuilt (Decision 0007)
    Google CalendarThe app writes confirmed jobs to one calendar, as one connected account, on each change and in a nightly checkBuilt (Decision 0008)
    Crew invitesCrew are guests on their days' events; their answers are read back every two minutes by asking Google what changed, so the database sleepsBuilt, switch off (Decision 0009)
    PlannerThe week and month by job or by person, with clashes flagged, worked out on each device from what it already holdsBuilt (Decision 0010)
    Calendar importThe jobs on an organiser's calendar come in after a look at everything first; each event-day is remembered, so looking again shows only what's newBuilt (Decision 0011)
    Personal feedsA read-only calendar feed for each person, at an address worked out from their private link; every feed kept in memory and rebuilt only after a changeBuilt (Decision 0012)
    Warehouse catalogueProducts numbered or counted; items with a hidden id and a Session Hire number never used twice; places; cases up to five deep; numbered kit counted until it's labelledBuilt (Decision 0013)
    Kit on jobsEach job's products and how many, for the whole job or a phase; shortages per day worked out on each device, with confirmed jobs holding kit and enquiries and quotes pencilled in; subhire on the lineBuilt (Decision 0014)
    LabelsNumbers set aside a run at a time by the server, so none is given out twice; labels printed from the browser or by a label maker from a spreadsheet; a label not on anything yet put on an item by scanning itBuilt (Decision 0015)
    ScanningThe phone's camera reads labels in the app, one after another, with no signal: the phone's own barcode reader on Android, a QR code reader in the app elsewhere; an item's label opens it, a new label is put on an itemBuilt (Decision 0016)
    Pick listsEach job's kit, where to find it and what's out; kit scanned or counted out and back in on a phone with no signal, a case taking what's in it along; a scan that doesn't match the plan kept and said; jobs going out soon and kit still out on the Stock tabBuilt (Decision 0017)
    Faults and repairsKit reported damaged or missing, on return from a job or at any time, items and counted kit alike; the repair list with repair notes, closed as fixed, not faulty, found or written off; kit that can't go out taken off what's free for jobs; a missing item scanned is foundBuilt (Decision 0018)
    InspectionsPAT tests and thorough examinations of lifting gear recorded on each item, one at a time or a batch by scanning, kept for good; how often set per product; when each is next due worked out on the phone; failed and overdue kit taken off what's free for jobs and warned about when scanned outBuilt (Decision 0020)
    Call sheetsEach phase's day sheet worked out from what the app holds: in the app with no signal, on A4, copied for a WhatsApp group, and on each freelancer's private link; the contact on the day sees the crew's numbers and the kit, the rest of the crew who's on by name onlyBuilt (Decision 0021)
    TimesheetsOne for each confirmed freelancer booking, from its first day: the days worked at the day rate and the extras, sent from the freelancer's link with a plain form; checked, changed and approved by the office in one step, with what was sent kept beside what was approvedBuilt (Decision 0022)
    Quotes and moneyA price list for kit, crew roles and client discounts; a quote on each job built from its kit and crew, every line open to change, VAT at 23% or 13.5% a line, versions kept as they went, printed as an A4 PDF the office sends itself; the client's answer, the invoice and the payment recorded; Money for the director and office: by month, who owes, freelancers owed, margin per job, and files for the accountantBuilt (Decision 0042)
    Own calendarsA freelancer shares when they're busy by pasting their own calendar's private iCal address on their link, or the office adds the one they sent; read every few hours, only busy times kept, never what or where; busy shown in the planner, on their page and as a warning when offering work; one tap stops it; nothing written to anyone's calendarBuilt (Decision 0044)
    Made-up dataWeeks of made-up jobs, crew and stock put in through the server's own rules, to try the app before the real data; Start fresh deletes everything but the staff accounts after a backup, and every phone drops its copy and what it had waitingBuilt (Decision 0019)
    Kit ready and backEach job holding its kit a whole day before and after by default, to get it ready and check it back in, changed per job from its Kit card; shortages on those days said; kit still out after its job taken off what's free until it's scanned inBuilt (Decision 0031)
    07Google Calendar

    Keep the calendar, change nothing on day one

    The system writes to the shared Session Hire Gigs calendar in today's format and listens for changes in seconds. Each project runs in one of two modes, and new projects switch to app-led once Phase 1 is live.

    Built so far: app-led writing (Decision 0008)

    A member of staff connects one Google account on the Account tab and picks one of its calendars: Colly's test calendar first, Session Hire Gigs later. The app then keeps every day of every confirmed job from today on there, in today's format, and takes a job off when it is cancelled. Event ids are worked out from the job, so a retry never makes a double, and a hidden mark keeps the app to its own events. It runs when something changes and checks the calendar once a night, so the database can sleep. Past days are never changed.

    Built so far: crew invites and their answers (Decision 0009)

    A switch on the Account tab, off to start with. When on, everyone offered a place on a confirmed job, or booked on it, with an email address in the app, is a guest on its events on their days, invited by the connected account; crew can't see each other's addresses. Their Yes or No counts as their answer through the same rules as their link: the first to say yes gets the place, a No to every day declines, Maybe waits, and a No from someone already confirmed is flagged for the office instead. Google emails guests only when they are added or taken off, or the title, date or place changes. Every change reads the event first, so guests added by hand and answers given in the meantime are kept. The server asks Google every two minutes which events changed and only touches the database for a new answer. Next: edits flowing back for calendar-led jobs.

    Built so far: bringing jobs in (Decision 0011)

    The jobs already on the organisers' calendars come into the app from the Jobs tab: all-day events are read from a chosen day to two years ahead, the title split at its last " - " into job and phase, a job's days in a row made into phases, locations matched to venues and guests to people. Everything is shown before it's saved; TBC or hold brings a job in pencilled in. Each event-day is remembered by Google's own id, so the other organiser's calendar or a second look brings in only what's new. The organiser's calendar keeps these jobs' events, so the app doesn't write them to the jobs calendar too.

    Session Hire system projects, phases, crew own id stored on each event Session Hire Gigs calendar one all-day event per phase-day crew as attendees new and changed phases, crew invites RSVPs: accepted, declined edits in Google move the phase

    Calendar-led: ops can keep working in Google. Moving an event moves the phase; RSVPs update crew status.

    Importing history

    Built: the jobs on an organiser's calendar come in grouped by the text before the last " - ", phases in order, guests matched to people, and job sheets kept in the notes as written. Kit lists stay in the notes for now; turning them into kit lines can come once the stock list has the products to match them against (Decisions 0011 and 0014).

    Personal feeds

    Built: every person has a feed of their own bookings that works in any calendar app, at a read-only address that's safe in a shared calendar, on their page, the Crew tab and, for staff, the Account tab. The server answers from memory, so calendar apps don't keep the database awake. (Decision 0012)

    08Crewbox

    Office to site, and back again

    Crewbox runs on site with no internet: chat, push-to-talk, running order, patch, lighting and the show log. Session Hire's system covers everything before and after. They meet twice per event.

    Session Hire job, crew, running order,patch and lighting plans repair queue for assets Crewbox on site offline comms boxshow log records faults Before: show pack (files, then direct push) After: technical faults become repair tickets
    Step 1 · works now

    Show pack as files

    • Patch CSV and lighting CSV in Crewbox's own formats
    • Running order and a crew list with the join QR
    • The crew chief loads it on the box
    Step 2 · needs Crewbox work

    Direct link

    • Keyed import: event, channels, named crew, running order
    • Show log readable by key, as JSON
    • Asset tag on fault reports
    • Optional crew clock-in for timesheets
    09Stock tracking

    From zero labels to trusted availability

    No stock is barcoded yet. The recommendation is a QR code plus a readable number on every item, scanned with phone cameras first, with RFID kept for later where it pays off most: cables.

    Session Hire
    SH-004217
    d&b Y10P · polyester label
    Session Hire
    SH-000318
    Amp rack · riveted metal tag

    The number is what people read out; the QR code, which holds just the number, is what phones and scanners read. The item's real id is hidden, so a worn label can be replaced without losing its history.

    Built so far: the catalogue, kit on jobs, labels, scanning, pick lists, repairs, inspections, days to get kit ready, and stocktakes (Decisions 0013 to 0020, 0030 and 0031)

    The Stock tab holds every product, numbered or counted, each numbered item with its Session Hire number, the places kit is kept and the cases it lives in. Numbered kit can be counted until it's labelled, so the app knows everything owned from the first day and shows how far the labelling has got. Labels can go on over weeks: an item takes the number on its label, typed or scanned, or the next free one. A number is never used twice, even after a new label. Jobs now list the kit they need, and each line says whether there's enough on its days, so shortages show before the day; until the counting is done, some will be counts not finished yet. Labels print here or from a spreadsheet a label maker works from, on numbers set aside so none is given out twice, and scanning a new label puts it on an item: the product and place are picked once, then each label on the shelf is a scan and Enter. Phones scan labels with their camera in the app, with no signal too. Each job has a pick list saying where its kit is, and kit is scanned out to the job and back in, with every scan kept even when it doesn't match the plan. Kit that comes back damaged or doesn't come back is reported as it's scanned, goes on the repair list, and isn't counted as free for jobs until it's fixed or found. PAT tests and thorough examinations are recorded on each item, or a shelf at a time by scanning, and kit that failed or is overdue is kept off jobs the same way. Each job holds its kit a day before and after, to get it ready and check it back in, and kit still out after its job isn't free for the next. Places and cases are counted on a phone, a few each week, so every place is counted each quarter.

    MethodCost per tagReads from a phone browser?Role
    QR codeCentsYes Android native, iPhone via a libraryPrimary
    Code 128 barcodeCentsYesReads manufacturer serials
    UHF RFID€0.50 to €4No needs a handheld readerLater, for cables and bulk
    NFC€1 to €3Android onlyOptional backup
    Bluetooth tracker€5 to €40NoFind a few high-value cases
    GPS tracker€35 to €100 + SIMNoVans

    Labels by kind of kit

    • Most gear: polyester, thermal transfer with resin ribbon, laminated.
    • Road cases and rigging: riveted or bonded metal tags.
    • Cables: heat-shrink or wrap-around flag labels, or tracked as bundles.
    • Rigging hardware: engraved mark, which the law requires anyway.

    Cases hold things; scanning the case moves them

    Truck pack · Nissantemporary
    Amp rack SH-000318sealed
    3 × d&b D20 · power distro · network switch
    Cable bundle: 20 × XLR 10 mbundle

    Rollout

    Label trialTest materials on a few cases and cables over real jobs. Starts now.
    Compliance itemsLifting gear and electrical items that need inspections.
    High-value gearLabelled as it comes back from each job.
    CasesMetal tags; contents recorded.
    CablesAs bundles first.
    StocktakeA full baseline count, place by place on a phone, once the stock list is in.
    Cycle countsA few places each week, longest since counted first, so every place is counted each quarter.

    Starter hardware is roughly £4,000 to £6,000: two rugged Android scanners, pocket and ring scanners, a label printer and a portable labeller. Prices are estimates; get supplier quotes.

    Irish rules to build in

    • Lifting gear (S.I. 299/2007): thorough examination every 6 months for lifting accessories and hoists, 12 months for items that support lifting gear, a register, and a lasting mark on each item.
    • Electrical equipment (Reg. 81): user checks before use, periodic inspection, and testing where appropriate, at risk-based intervals.
    • Anything overdue cannot be scanned out without an override.
    10Roadmap

    Build order

    Each phase replaces something people do today and is useful on its own. The riskiest piece, offline sync, is proven first.

    11Decisions

    What's settled and what's open

    12Full documents

    The source documents

    Everything above is drawn from these files in the repo's docs/ folder. They are rebuilt into this page whenever they change.

    Built from docs/ on branch main of legofsalmon/sess-sys. To update: edit a markdown file, then run node scripts/build-hub.mjs.