02b Β· Dashboards

One dashboard per manager

A different home screen for Alex, Annie and the sweets team, Ruth, Mark and the Directors β€” plus the Hermes Reminder Bot that messages or calls anyone who hasn't opened theirs.

5 role dashboards Β· Hermes remindersπŸ“„ DASHBOARD.mdVersion 1.1 Β· 4 October 2026 The daily home screen for every staff member, how the app knows whether each person has looked at it, and how the Hermes Reminder Bot chases people who haven't β€” by message first, then a phone call.
πŸ–₯ Dashboard mock-up Β· one per managerial roleIllustrative sample data
πŸ₯§ Good morning, Alex
Savoury Production Manager Β· Monday 5 Oct 2026 Β· as at 07:20
βœ“ Seen todayπŸ€– 6
14
Savoury ctns to make today
3
Short lines blocking dispatch
1.4 wk
Lowest cover Β· SQFQBB
2
Expected POs this week
MEL Mon Β· SYD Thu
πŸ”ͺ Make-list Β· today + 3 days
CodeProductWhenMakeWhy
SQFPCMPie Chicken & Mushroom 160gToday8 ctnsfor MEL Wed
SQFLRPPie Lamb & Rosemary 160gToday6 ctnsshort 2
SQFTFSTomato & Feta ScrollTue10 ctnsforecast
SQFQBBQuiche Bacon & BrieWed6 ctnscover 1.4 wk
SQFCBESCroustade Bacon Egg & SpinachThu4 ctnsok
⚠ Shortfalls blocking dispatch
OrderKitchenDispatchShort
ORD-0412dnata MELWedSQFLRP βˆ’2 ctns
ORD-0415dnata SYDMonSQFQMG βˆ’1 ctn
ORD-0417dnata BNEWedSQFTFS βˆ’3 ctns
πŸ“¦ Weeks of stock cover (savoury)
Quiche Bacon & Brie
1.4
Pie Lamb & Rosemary
2.3
Tomato & Feta Scroll
3.1
Pie Chicken & Mushroom
4.6
Frittata LSP
6.0
πŸ”„ Menu-change watch

No orders for 6+ weeks but stock on hand:

CodeProductStock
SQFQMG8Mushroom & Goat's Cheese 8cm212 uwrite-off risk
SQFRPQRed Pepper Quiche96 ureview

1Purpose

Every person starts the day on one screen that tells them what needs them today. If they haven't opened it by their check-in time, the Hermes bot messages them; if they still haven't, it calls them; if that fails, it tells their manager.

2Dashboard layout (?page=dashboard β€” becomes the home page after login)

2.1 Top bar

2.2 KPI tiles (everyone)

TileShowsClick β†’
Dispatching today# orders / cartons, % readyDispatch schedule
Dispatching tomorrow# orders, # not ready, bookings missingDispatch schedule (tomorrow)
New ordersreceived since yesterday 16:00 (airline / non-airline)Orders list
Short items# lines short, cartons shortPacking / Missing items
Awaiting actionuninvoiced Β· unconfirmed Β· unallocatedOrders list filtered
Bot proposalspending approvalsBot inbox
Stock alertsbelow minimum, negative, slow moversProducts filtered
Expected orderskitchens "due" to order but silent (Pattern Bot)Airline analytics

2.3 Role dashboards β€” one per managerial role

My interpretation of each role (please correct anything that's off):

PersonRoleMy interpretationDashboard focus
AlexSavoury Production ManagerRuns production of the savoury lines β€” quiche, pies, croustades, scrolls, domes, frittata β€” mostly for the airline caterers. Owns "Alex's excel" (Production Planning) and decides what gets made when stock is short.What do I make today and this week?
Annie + sweets teamSweets Production ManagersRun production of the sweet lines β€” danishes, tarts, friands, cakes, tartlet shells β€” for both airline POs and the Annie Makes Cakes non-airline customers, including bespoke cake enquiries.What sweets do I make, and which Annie Makes Cakes orders need me?
RuthOffice ManagerRuns the order desk for both businesses: order intake, Xero invoices (SkyCrest + Annie Makes Cakes), customer confirmations, transport bookings (Roadmaster / driver / pick-up), and approving bot drafts. Day-to-day admin of staff and reminders.Which orders need paperwork or bookings today?
MarkGeneral ManagerAccountable for daily operations across production, packing, dispatch and office: on-time dispatch, shortages, stock risk, team follow-through. Escalation point for the Hermes ladder.Is today on track, and where is it slipping?
Tisna, Heri, ViviDirectorsOwners / board level: performance and trends rather than daily tasks β€” volume, customer concentration, product mix, menu changes, compliance, risks. Read-only.How is the business trending?

Packing staff keep the simple Packing dashboard (pick list, Allocate / Dispatch buttons).

Alex β€” Savoury Production

Annie & sweets team β€” Sweets Production

Ruth β€” Office Manager

Mark β€” General Manager

Directors β€” Tisna, Heri, Vivi

Reminder rules by role (defaults β€” adjust)

RoleCheck-in byHermes ladder
Alex, Annie & sweets team07:00Message β†’ SMS β†’ call (opt-in) β†’ Mark
Ruth08:30Message β†’ SMS β†’ call (opt-in) β†’ Mark
Packing staff07:00Message β†’ SMS β†’ call (opt-in) β†’ Ruth / Mark
Mark08:30Message β†’ SMS only (no call)
Directorsβ€”No daily chase; weekly summary Monday 08:00

2.4 Insight widgets

2.5 Staff "seen today" board (Ruth, Mark, admin)

StaffRoleCheck-in bySeen atRemindersStatus
AlexSavoury Production07:0006:52β€”βœ… Seen
AnnieSweets Production07:0007:18WhatsApp 07:15βœ… Seen (after reminder)
RuthOffice Manager08:3008:05β€”βœ… Seen
e.g. Packing 1Packing07:00β€”WhatsApp 07:15, call 07:45πŸ“ž Escalated

3"Seen" tracking β€” how the app knows

CREATE TABLE IF NOT EXISTS staff_profiles (
  username TEXT PRIMARY KEY,          -- links to users.username
  display_name TEXT NOT NULL,
  role TEXT NOT NULL DEFAULT 'office',   -- savoury_prod | sweets_prod | office_mgr | gm | director | packing | admin
  mobile TEXT DEFAULT '',             -- E.164, e.g. +61400000000
  channel TEXT DEFAULT 'whatsapp',    -- whatsapp | telegram | sms | email
  work_days TEXT DEFAULT 'Mon,Tue,Wed,Thu,Fri',
  checkin_time TEXT DEFAULT '07:30',
  call_allowed INTEGER DEFAULT 0,     -- staff opt-in for phone calls
  manager_username TEXT DEFAULT '',
  on_leave_until TEXT DEFAULT '',
  active INTEGER DEFAULT 1
);
CREATE TABLE IF NOT EXISTS dashboard_views (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT NOT NULL, view_date TEXT NOT NULL,
  first_seen_at TEXT NOT NULL, last_seen_at TEXT NOT NULL,
  view_count INTEGER DEFAULT 1,
  UNIQUE(username, view_date)
);
CREATE TABLE IF NOT EXISTS reminder_log (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT NOT NULL, reminder_date TEXT NOT NULL,
  step INTEGER NOT NULL,              -- 1 message, 2 message+summary, 3 call, 4 manager
  channel TEXT NOT NULL, status TEXT NOT NULL,   -- sent | delivered | answered | failed | acked
  provider_ref TEXT DEFAULT '', detail TEXT DEFAULT '',
  created_at TEXT DEFAULT (datetime('now','localtime'))
);

4Hermes Reminder Bot

4.1 What Hermes is

Hermes Agent (Nous Research, open source) is an always-on AI agent with:

4.2 Escalation ladder (default β€” editable per person)

StepWhen (after check-in time)ChannelMessage
0at check-in timeβ€”Seen? β†’ stop. On leave / not rostered β†’ stop.
1+ 15 minWhatsApp (or Telegram)"Morning Alex β€” your Skycrest dashboard hasn't been opened yet. 3 items need you today: 2 shorts, 1 make-list. Open: https://skycrest.id/stock_control.php"
2+ 30 minWhatsApp + SMSShort summary of today's items + "Reply OK to acknowledge"
3+ 45 minPhone call (Twilio, only if call_allowed)Spoken: "This is the Skycrest assistant. You have 2 orders to pack for dispatch today and haven't opened the dashboard. Press 1 to acknowledge."
4+ 60 minMessage to manager"Packing 1 hasn't seen the dashboard or answered (message 07:15, call 07:45). 2 orders dispatch today."

Stops immediately when the person opens the dashboard or replies OK. Maximum one call per person per day. No messages outside 06:00–18:00 or on non-rostered days.

4.3 Architecture

 Shared host (existing)                        Small VPS / office mini-PC (new)
 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚ stock_control.php            β”‚  HTTPS     β”‚ Hermes Agent                     β”‚
 β”‚  β€’ dashboard + seen tracking │◄──────────►│  β€’ cron: every 15 min 06:00–11:00β”‚
 β”‚  β€’ ?api=agent_unseen  (GET)  β”‚  bearer    β”‚  β€’ messaging gateway (WhatsApp,  β”‚
 β”‚  β€’ ?api=agent_reminder (POST)β”‚  token     β”‚    Telegram, SMS, email)         β”‚
 β”‚  β€’ ?api=agent_ack      (POST)β”‚            β”‚  β€’ telephony skill β†’ Twilio call β”‚
 β”‚  β€’ cron: other PHP bots      β”‚            β”‚  β€’ skill: skycrest-reminder      β”‚
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4.4 Hermes skill: skycrest-reminder (outline)

Schedule: every 15 minutes, 06:00–11:00, Mon–Fri (Australia/Sydney)
1. GET  /stock_control.php?api=agent_unseen            β†’ list of {user, step, channel, mobile, summary}
2. For each entry:
   step 1–2 β†’ send_message(platform=channel, to=mobile, text=template)
   step 3   β†’ telephony: twilio call (TwiML <Say> summary, <Gather> press 1)
   step 4   β†’ send_message to manager
3. POST /stock_control.php?api=agent_reminder           β†’ log each send (status, provider ref)
4. Inbound reply "OK" / keypress 1 β†’ POST ?api=agent_ack
Never: message anyone not in the staff list; call without call_allowed; exceed 1 call/day/person.

The telephony skill's own safety rule says to confirm before calling. Here the confirmation is given in advance by policy: staff opt in (call_allowed), the owner approves the ladder, and calls are limited to the allow-listed staff numbers.

4.5 Costs and setup (indicative)


5Admin screens