The Dashboard
The dashboard is the main screen showing all your clients. From here you can search, filter, and open client records.
Top bar
- Pebble logo — hover to see the current dashboard version. Click to jump back to the last client you had open.
- Add Client — opens a blank client form to create a new record.
- Reports — opens the reports overlay (see Reports).
- Help — opens this page.
- Search box — search by client name, contact name, email, or phone number. Press / anywhere on the dashboard to focus it instantly.
- Sync indicator — green dot shows the dashboard is connected and up to date; hover for the last-synced time.
- User menu (initials avatar, top right) — sign out.
Adding a client
Click Add Client in the top bar. A blank client form opens. Fill in the details and click Save Client. The record is created and immediately appears in the dashboard.
Fields auto-save as you type — you don't need to click Save after each change when editing an existing client. A "Saved" toast confirms each save.
Views
Use the view toggle buttons (top right of the dashboard) to switch how clients are displayed. You can also press ← / → when no client panel is open to cycle through views.
Today view
The default view on load. Shows cards for any client with a consultation scheduled in the next 30 days, plus clients with recent emails, files, or notes. Cards are grouped by the client's group.
Each card shows the client name, practitioner, planned consult month, status tags, and recent emails / files / notes for that client. You can edit the practitioner, month, and status tags directly on the card — click the pill or the tag area to open a popup editor without leaving the today view.
Each card can be collapsed to show only the name, practitioner, and month row — click the chevron next to the group label, or hover over a card and press Space. Use the Collapse All / Expand All buttons above the card grid to collapse or expand every card at once. Collapsed state is remembered per client across page reloads. Hover over any card and press Enter to open the client detail panel.
Active view
A sortable, paginated table showing all active clients (hidden groups such as Gone Quiet and Waiting List are excluded). Each row shows name, status tags, practitioner, services, consult month, and contact. Rows have two quick-action buttons:
- Quick email — opens the email compose window for that client.
- Quick note — adds a timestamped note without opening the full client record.
Click any status tags, practitioner, or month pill directly in the row to change that value inline — a popup editor appears without needing to open the client record. Status tags open the same two-column Available / Selected picker as the client detail view.
Column headers are clickable to sort.
Inactive view
Shows clients from groups that are hidden in the Active view (Gone Quiet, Waiting List, Waiting for Genetic Tests, Historical Clients). Same table layout and inline editing as Active view. Useful for reviewing dormant or historical clients.
Calendar view
Shows clients by their scheduled consultation date in a monthly grid. Navigate months with the arrow buttons. Click any event to open the client record.
List view
The same consultation date data as the calendar, shown as a chronological list. Useful for seeing upcoming consultations in order.
Planned Consult bar
Below the filter controls, colour-coded month pills show how many clients are scheduled per month. Click a pill to filter to that month. The bar chart within each pill is proportional to the busiest month.
Filtering & Searching
Search
Type in the search box to filter by client name, contact name, email, or phone. Results update as you type. Press / to focus the search box from anywhere on the dashboard.
Filter dropdowns
The filter panel (press f to show/hide) contains dropdowns for:
- Status Tags — filter by one or more status tags (e.g. Active, Results back, Ready for Call).
- Services — filter by service type (e.g. HTMA, GI Map).
- Group — filter by the group the client belongs to.
- Consult Month — filter by planned consultation month.
Click the × button at the left of the filter bar to clear all active filters at once.
Practitioner bar (admin only)
Admin users see a row of practitioner buttons below the main filters. Click a practitioner name to show only their clients. Non-admin users automatically see only their own clients.
Non-admin users are automatically filtered to their own clients and cannot see other practitioners' records.
Client Detail
Click any client row (or card, or calendar event) to open the client detail panel. It slides in from the right and shows the full client record alongside the dashboard.
Navigating between clients
When you have a filtered list, use the ← / → arrow buttons at the top of the detail panel (or the keyboard ↑ ↓ arrow keys) to move to the previous or next client without returning to the dashboard.
Left column — client details & invite status
- Group — the group this client belongs to.
- Status Tags — one or more status tags describing this client's current state (e.g. Active, Results back, Ready for Call). Click Edit Status Tags to open the dual-list picker and add or remove tags.
- Practitioner — the assigned practitioner.
- Planned Consult Month — the month consultation is expected.
- Services — click Edit Services to choose from available service types using a dual-list picker.
- Consult Date & Time — the scheduled consultation. Click the time button to use the clock picker.
- Call — free-text field for call link or phone number (full column width).
- Invite Status — whether the onboarding invite has been sent.
- Invite Date, Test Order Sent, Chase Sent — date fields tracking communications.
- Questionnaire — questionnaire completion status.
- Commission — commission status for referrals.
- Client/Child Name, DOB, Adult/Child — patient details.
Middle column — contact details & notes
- Contact First/Last Name — the parent or contact person's name.
- Email — contact email address. To store multiple addresses (e.g. a work and personal email), enter them comma-separated:
first@example.com, second@example.com. The first address is used for sending; all addresses are searched for email history and WooCommerce orders.
- Phone — contact phone number.
- Address — street address (two-thirds of the row width).
- Europe/US — region selector (one-third of the row width, beside Address).
- Notes — the full notes field for this client (see Notes).
Auto-save
Changes save automatically 800 ms after you stop typing or change a field. A small "Saving…" then "Saved" toast confirms each save. You can also force an immediate save with Ctrl+Enter (or Cmd+Enter on Mac).
Notes
The Notes section is in the middle column of the client detail form.
Adding a note
Click Add Note, or click anywhere inside the notes area. A modal opens with a pre-filled timestamp and your name. Type your note and click Add Note (or press Ctrl+Enter). The new note is prepended to the top of the notes field.
Editing notes
Click the Edit button (or click directly in the notes display area) to switch to a plain text editor where you can freely edit the entire notes field. Click Done or click away to save.
Quick notes from the table
Click the icon on any table row to add a timestamped note without opening the full client record.
Automated notes
Certain actions automatically prepend a timestamped entry to the notes field — for example, when an invite, test order, or results email is sent, when a file is uploaded or deleted, or when a questionnaire is automatically received and uploaded.
Email
The Email tab (default tab in the right column of the client detail panel) shows the full email history for the client's email address and lets you send new emails.
Email history
Emails are listed with date, direction (sent/received), which mailbox they came from, subject, and a preview. Click any email to read the full message. Use the ↑ ↓ arrow keys to navigate the list once you have clicked into the email panel.
Email history is searched across all configured mailboxes. Each email shows which mailbox it came from so you can see the full picture across the team.
Composing a new email
Click New Email. The compose panel opens with:
- To — the client's contact name and email address (pre-filled).
- CC — pre-filled with the practitioner's email where applicable.
- Subject — free text.
- Template — click Add template to pick from templates in the Templates board. You can add multiple templates; their bodies are joined with a divider in the order selected. The subject is taken from the first template added. Click the × on any chip to remove a template.
- Attachments — click the paperclip button to select from the client's uploaded files to attach to the email.
- Rich text editor — supports bold, italic, underline, headings, colour, lists, and links.
- Include booking details — tick this to automatically append a summary of the client's services, practitioner, and planned consult month to the email body.
Replying to an email
When viewing an email, click Reply. The compose panel opens with the subject pre-filled and the original message quoted at the bottom.
Saving a template
After composing an email, click Save as Template to save the current subject and body as a reusable template in the Templates board.
Quick email from the table
Click the icon on any table row to open the compose window for that client without opening the full record.
Files
The Files tab shows all files attached to the client and lets you upload new ones.
Uploading a file
Click Upload. Choose a file from your computer (maximum 25 MB). The file is stored against the client's record and a note is automatically added recording the upload.
Opening a file
Click any file name or the open icon to preview it in the dashboard (images and PDFs preview in-frame; other types download).
Deleting a file
Click the delete icon on a file and confirm. The file is removed and a note is automatically added recording the deletion.
File deletion is permanent and cannot be undone.
Products & Services
Products tab (WooCommerce)
Shows a summary of all WooCommerce orders matched to the client's email address(es). The summary table shows each product, total quantity ordered, total spend, and date of most recent order. Below the summary is a chronological timeline of individual orders — click any order card to open it in WooCommerce. If the client has multiple email addresses, all are checked.
Services tab (QuickBooks)
Shows a summary of QuickBooks Online invoices matched to the client's email address. The summary table shows each service, total quantity, total spend, and most recent invoice date. Below the summary is a chronological timeline of individual invoices with their status (Paid, Overdue, Open).
If QuickBooks is not connected, a connect button is shown.
Actions
Single-client actions
At the bottom of the client detail panel, the following actions are available for existing clients:
- Send Invite — sends the "New client invite" email template to the client, sets the Invite Date to today, and sets Invite Status to Sent.
- Test Order — sends the appropriate test order email(s) based on the client's services (HTMA, GI Map, OAT), sets the Test Order Sent date, and adds a note.
- Send Chase — sends the "Samples chase" email template, sets the Chase Sent date, and adds a note.
- Chase Q — sends the "Questionnaire chase" template and adds a note.
- Results Back — sends the "Results back" template, adds the "Results back" status tag, and adds a note.
- Ready for Call — sends the "Ready for call" template, adds the "Ready for call" status tag, and adds a note.
- Historical — moves the client to the Historical Clients group, adds the "Historical" status tag, and adds a note.
- Gone Quiet — moves the client to the Gone Quiet group, sets Planned Consult Month to Pending, and adds a note.
- Duplicate — creates a copy of the client record.
- Delete — permanently deletes the client record. This cannot be undone.
Email-sending actions (Send Invite, Test Order, Chase, etc.) require the appropriate email templates to be set up under ☰ → Templates.
Inline quick-edit
In the Active and Inactive table views, click any status tags area, practitioner badge, or month pill to change that value immediately — no need to open the client record. Status tags open the two-column Available / Selected dual-list popup; practitioner and month show a simple dropdown. The row updates in place when you save or select.
The same inline editing is available on Today view cards — click the practitioner badge, month pill, or status tags area on any card.
Reports
Click Reports in the top bar to open the reports overlay. Reports are based on the clients currently visible in your dashboard (respecting any active filters).
By Practitioner
A stacked bar chart and summary table showing how many clients each practitioner has per planned consult month. Useful for spotting capacity imbalances.
By Service
The same chart and table broken down by service type (HTMA, GI Map, OAT, etc.) per month.
Hover over chart bars to see exact counts. The table below the chart shows the full breakdown with totals per practitioner/service and a grand total row.
Keyboard Shortcuts
Today view
| Key |
Action |
| Space |
Collapse / expand the card the mouse is hovering over |
| Enter |
Open the client detail panel for the card the mouse is hovering over |
Active / Inactive / List views (no client panel open)
| Key |
Action |
| / |
Focus the search box |
| f |
Show / hide the filter control panel |
| ↑ / ↓ |
Navigate to the previous / next client in the filtered list |
| ← / → |
Cycle through dashboard views (Today → Active → Inactive → Calendar → List) |
| Enter |
Open the hovered or first visible client |
Client detail panel open
| Key |
Action |
| ↑ / ↓ |
Navigate to the previous / next client in the list. After clicking into the email panel, navigates the email list instead. |
| ← / → |
Cycle through the right-column tabs (Email, Files, Products, Services) |
| Space or Enter |
Close the client panel and return to the dashboard |
| Ctrl+Enter |
Force an immediate save of the current client record |
| Esc |
Close any open modal (services picker, notes, email compose, confirm dialog) |
Anywhere
| Key |
Action |
| R |
Refresh the current client record or reload the client list |
Keyboard shortcuts are disabled when the cursor is in a text input, textarea, or select field.
Automation & Pollers
The dashboard includes several background services that run automatically on the server and handle incoming emails without any manual action.
Test results poller
Monitors the results inbox for incoming test results emails from the lab. When a result email arrives, it is automatically matched to the client's record, the file is uploaded, the client's notes are updated, and a notification is sent to the practitioner.
Questionnaire poller
Monitors all configured mailboxes (Inbox only) for unread emails with PDF attachments whose filename contains "Questionnaire". When a questionnaire is received:
- The client's name is read from the PDF form (the Name field at the top of page 1).
- The name is matched against client records.
- If a match is found and the file is not already uploaded, it is automatically attached to the client record.
- A note is added to the client record and a notification email is sent to the practitioner (with admin CC'd).
- The email is marked as read to prevent reprocessing.
If no matching client is found, or if the PDF name field is blank, an alert email is sent to the admin address so the file can be handled manually.
The questionnaire poller only processes PDF attachments. Word document (.docx) questionnaires cannot be automatically parsed — clients should be instructed to use Acrobat Reader to fill and return the PDF version.
Contact form poller
Monitors the contact mailbox for new enquiry emails from the website contact form and routes notifications to the team. Emails that aren't contact-form submissions can be pulled into a new customer record via the From Email button on the Add Customer form.
Admin & Configuration
Non-sensitive configuration is stored in backend/.env on the server. The following settings are available:
Mailbox settings
| Variable | Description |
MAIL_DOMAIN |
Your email domain (e.g. pebblenutrition.co.uk). Used to expand bare usernames to full addresses. |
MAIL_SEARCH_MAILBOXES |
Comma-separated list of mailbox usernames (or full addresses) to search when loading email history and scanning for questionnaires. Example: contact,kathryn,charlotte,hayley. |
MAIL_FROM |
The default "from" address for outgoing emails. |
Active view
| Variable | Description |
HIDE_GROUPS_IN_COMPACT_VIEW |
Comma-separated group names to hide in the Active view (shown instead in the Inactive view). Default: Gone Quiet,Waiting List,Waiting for Genetic Tests,Historical Clients. These groups still appear in the Today, Calendar, and List views. |
Poller settings
| Variable | Description |
ENABLE_RESULTS_POLLER |
Set to true to enable the test results poller. |
RESULTS_POLL_INTERVAL_MINS |
How often (in minutes) the results poller checks for new emails. Default: 1. |
ENABLE_QUESTIONNAIRE_POLLER |
Set to true to enable the questionnaire poller. |
QUESTIONNAIRE_POLL_INTERVAL_MINS |
How often (in minutes) the questionnaire poller checks for new emails. Default: 5. |
RESULTS_ADMIN_EMAIL |
Admin email address for alert notifications when a questionnaire or result cannot be matched to a client. |
ENABLE_CONTACT_POLLER |
Set to true to enable the contact form poller. |
After editing backend/.env, restart the service with sudo systemctl restart pebble-dashboard for changes to take effect.
Change History
A summary of recent updates to the dashboard, most recent first.
Thursday, 22 October 2026
- Add BOOK GI-MAP client action — emails Hayley to request a test
- Orders view: remove Get Label(s), add Completed bulk action
- Rework Orders view mobile card: hide bulk-select, reposition fields
- Add About panel with version strings, replacing Status modal's git tag
- Switch static-asset caching from long max-age to always-revalidate
- Bump dependencies to fix npm audit vulnerabilities
- Set isRecipientABusiness on automated Royal Mail shipments
Wednesday, 21 October 2026
- Exit CDP when a search is entered
- Remove unused Existing Client field from UI
- Stack Customer/Client columns on CDP mobile instead of tabbing
- Fix List view mobile card: last-contact field jumping to front
- Add mobile card layout to Orders view
Tuesday, 20 October 2026
- Fix Track123 lookups silently failing after a carrier change on their portal
- Add Compact view toggle to the Orders view
- Plan Editor PDF: By Time of Day defaults, page-break fixes, CDP Plans tab icons + Duplicate
- Plan Editor: Excel-only catalogs, productType restructure, row colours, default footer
Monday, 19 October 2026
- Supplement catalog: add Product URL/Product Name, drop Type/Function; Plan Editor dosing table and PDF improvements
- Add known-IP allowlist for the access log analyzer
- Add script to fix Amazon orders' VAT treatment in QuickBooks
- Add WooCommerce -> Royal Mail shipment automation, editable Woo Status, and shipping method column
Sunday, 18 October 2026
- Add dark mode, fix client-name URL bug, make CDP bookings a two-column grid
- Restructure Supplement catalog: add Name as primary field, rename Product Name to Description, drop Product Form
- Plan Editor: add reusable Plan Templates, Retrack button, block reorder/duplicate, remove Word import
Saturday, 17 October 2026
- Fix topbar: health-dot load-order race, blinking checking state, move Active Sessions to user menu, search box glitches
- Migrate delivery tracking from TrackingMore to Track123; add a registration cache
Friday, 16 October 2026
- Add Supplement/Supplier catalog to the Plan Editor, plus a resizable PDF preview panel
- Add Royal Mail delivery tracking and a live system-status topbar indicator
Thursday, 15 October 2026
- Show one client at a time in the CDP, selected by booking card
- Add NordicVMS (GI-MAP test) order poller
- Sort CDP bookings list by Consult Month; add From-picker to Reply composer
- Add Regenerus (OAT test) order poller
Wednesday, 14 October 2026
- Email admin@ when a Calendly webhook creates, reschedules, or cancels a booking
- Block .yaml/.yml requests in nginx
- Fix Calendly event-type lookup and client-name question matching
Tuesday, 13 October 2026
- Block /config and non-manifest .json requests in nginx
- Tag HTMA bookings when Mineral Check confirms samples received
Sunday, 11 October 2026
- Make manual client block expand collapse other siblings (accordion)
- Redesign Customer Detail Panel: stacked client blocks replace tabs
Friday, 9 October 2026
- Disable link clicks inside the email compose window
Thursday, 8 October 2026
- Add right-click context menu to List and Today view booking cards
Wednesday, 7 October 2026
- Add Calendly integration; fix practitioner-clear and quick-picker overflow
Friday, 2 October 2026
- Add 2FA, admin Users view, merge Practitioners into Users, fix search autofill
- Add configurable forced password expiration policy (default 90 days)
- Add "Last Contact" column to List view; collapse Other Bookings by default
- Make the Split view divider draggable
Thursday, 1 October 2026
- Orders view: group by Created date, show Status as its own column
- Deduplicate to-dos instead of creating repeats with new due dates
Wednesday, 30 September 2026
- Fix authorization gaps found in security audit
- Fix email font-family fallback, close duplicate-customer race, add on-demand digest
Monday, 28 September 2026
- Remove dead code and consolidate duplicated validators
Sunday, 27 September 2026
- Move Add Client to Bookings tab; stack Today sibling cards horizontally
- Double-click a customer to open in a new standalone window
- Remove multi-client bulk actions; friendlier {{clientName}} tag
Thursday, 24 September 2026
- Fix List view Services save bug, and minor polish
- Update reply email signature to use the brown logo
- Rebrand email template: cream/brown palette, new logo assets
- Add permanent redirect from tuesday.pebblenutrition.co.uk to dashboard.*
- Update README to reflect current architecture and features
- Add audit log, session-expiry warning, and several fixes
Monday, 21 September 2026
- Add Split view toggle, cc-aware email search, and Today to-do panel reorder
Wednesday, 16 September 2026
- Orders view: fix pagination on refresh, sort by date, add Label column
- Schedule Call: make ICS invite to customer optional
Tuesday, 15 September 2026
- Change email template accent background from light blue to teal
- Orders view: fetch Woo enrichment before first render
- Orders view: thumbnail-only product column, fix tracking link font
Monday, 14 September 2026
- Add Orders view: live Royal Mail shipments enriched with Woo order data
- Log analyzer: add request-span, login-success detection, and WHOIS
- Add admin-only Active Sessions view under System Status
Thursday, 10 September 2026
- Fix: Delete Booking button stuck on "Deleting..." after success
- Add nginx access log analysis script for security review
- Fix: New Booking no longer carries over previous booking's Call Details
Wednesday, 26 August 2026
- Fix: restore pdfjs-dist dependency removed by mistake during the audit cleanup
- Fix HTMA file recognition for current mineralcheck.com filename format
Thursday, 20 August 2026
- Email composer: attach a file from the customer's file store
Friday, 14 August 2026
- Security fix: require auth on GET /api/templates and /api/templates/meta
- Extract email routes from server.js into routes/email.js
- email-poller: bound the four per-job dedupe sets, name the shared pattern
- Fix CSS class collisions found in the audit: status-pill, today-loading, em-list-panel
- Cleanup pass: remove dead code, consolidate duplicated logic, fix stale docs
- Email composer: join templates with blank line, not a divider rule
Tuesday, 11 August 2026
- Practitioner filter: pin Kathryn first, rest alphabetical
- Today view: index all recipient addresses from sent emails
- Bump client-modal.js cache version to force browser refresh
- Add Customer: 'From Email' button pre-fills form from contact inbox
- Email dedup: merge mailbox labels for same message across multiple mailboxes
Monday, 10 August 2026
- Woo-order-poller: stop moving contact form emails to Orders folder
Thursday, 30 July 2026
- Woo-order-poller: fix 404 from $orderby and absolute nextLink URLs
- Woo-order-poller: fix detection of WPMailSMTP-sent order emails
Tuesday, 28 July 2026
- Search auto-switches to List+inactive; email history year/month timeline
- Remove email-history debug logging
- Email history: all-time, Clients folder, paginated Graph fetches
- Today view: collapse-all button, filter-aware cards, correct CDP click routing
Monday, 27 July 2026
- Today view: pulsing pebble logo while email cache loads; booking sub-card layout polish
- Today view: customer-first card layout; fix no-booking customers; contact form auto-creates customer
Friday, 24 July 2026
- Add Amazon → QBO Sales Receipt sync script and QBO tax code fixer
- Today view: group by customer, dedupe emails, fix historical booking display
Thursday, 23 July 2026
- Add Customer/Client add modals, security fixes, booking delete cascade
Wednesday, 22 July 2026
- Today mobile todos view; calendar agenda; email click fixes; PDF landscape+dividers; inactive filter persists; customer ID in list; email body lazy-fetch
Monday, 20 July 2026
- Add MS365 login, CDP Plans subtab, remove PLAN/ACCOUNT header buttons
Sunday, 19 July 2026
- gitignore: exclude generated supplements.tsv
- Today view: fix todos on first load; sync dot blinks while loading; refresh btn to filter row; relative sync time
- Supplement library: products + dosing notes schema; TSV extract script
Saturday, 18 July 2026
- Unified email poller; CDP details collapsible; mobile card clicks; status UI compacted
Friday, 17 July 2026
- CDP header: show client name in muted text when customer has single client
- Fix curly-quote syntax error in email-history.js toast strings
- Fix attachment upload in CDP email tab using currentClientId fallback
- Add WooCommerce order email poller; CDP tab/UX polish; remove today-view cache logs
- Delete booking: warn and cascade to client+customer if last booking
- Customer model: Customers table, CDP tab restructure, remove email assignment
Thursday, 16 July 2026
- Fix email reply template substitution; close picker on selection
- Files: rename; PDF streams direct download; Services summary hidden; Word import name extraction
- Plan editor: remove version history feature
- Plan editor: PDF polish, footer block, collapsible cards, attachments, status colours
Wednesday, 15 July 2026
- Plan editor: item-based rich_text, note template library, route/UX fixes
- Fix Content-Disposition for non-ASCII filenames; add .puppeteerrc.cjs
- Fix plan editor: correct client context + puppeteer cache dir
- Nutritional Plan Editor: schema, API, editor UI, supplement library, PDF generation
- Account page: per-category file panels, multi-client, practitioner in consultations
Tuesday, 14 July 2026
- CDP: collapse Other Bookings section by default
- Cleanup: remove dead one-off scripts (debug-digest-email, migrate-dob)
- Today view: progressive rendering + consult panel layout tweaks
- DB maintenance: 6 more duplicate merges + fix Christina Dickerson record
- DB maintenance: merge 73 duplicate client records (5 passes)
- Daily digest: unified section header styling; Charlotte-as-test support
- Daily digest poller: "What's happening today" email per practitioner
- List view: muted colour for contact name in Client column
- Notes Export: browser download instead of archiving to Files; HTMA category broadened to match 'HTMA' filename; Analyse button follows category match
- Add Genetic Results file category (MaxFunction/genetic/genes match)
- Status panel: check MS Graph connectivity per mailbox
- Fix: admin/poller emails show 'Pebble Tuesday' as sender name
- Fix: poller deeplinks used client_id instead of booking_id
- Email shortcut opens history viewer; new login logo
Monday, 13 July 2026
- Email archive action; QBO Bill To email; Refresh flushes Graph cache
- Cleanup: remove dead reminders/todos code after merge
- Reminders: CDP Send/Cancel/Add/Clear; list-view overdue bell indicator
- Fix: CDP reminders fetch was using client_id instead of booking_id
- Fix: reminders CDP route shadowed by clientRoutes catch-all
- Reminders: show pending reminders in CDP todos tab; Today view due/overdue only
- Automated reminders: action-triggered prompts on the Today view
- Practitioners: use DB colour map for all practitioner pills
- Settings: add Practitioners tab with name, email, colour, active fields
- Raise apiLimiter from 120 to 300 req/min
- CDP: equal-width columns for DOB / Age / Adult-Child row
- CDP: DOB / Age / Adult-Child on one row via 3-col sub-grid
- Age/DOB/Adult-Child: layout fix + auto-set Adult/Child from age
- Add Age field to client record: derived from DOB, manual override if absent
- Add DOB migration script: free text → ISO 8601
Sunday, 12 July 2026
- Remove FILTERS label from filter toggle button
- Status modal: border-radius 0
- Status modal: move to About in hamburger menu; add Check button
- Status modal: improve version/timestamp footer layout
- Status modal: show friendly message when backend is down
- Refresh button: await cache invalidation before re-fetching email history
- Move Settings above Help in overflow menu
- Remove special character requirement from password policy
- passwordrules: remove pattern attr, add allowed special chars list
- Revert password autofill polling
- Poll new-password field to patch Chrome autofill missing special char
- Patch Chrome password suggestion to include special character
- Add pattern + minlength to new-password input for Chrome suggest
- Add passwordrules attribute to tell browsers about special char requirement
- Change-password modal: wrap fields in <form> for browser password manager
- Password security: complexity policy, force-reset CLI, change-password UI
- Replace inline inactive toggle with standalone filter button beside Clear Filters
- Status modal: add active/inactive booking counts; remove version tooltip from logo
- Add system status modal: DB, MS Graph, QBO, Woo health + pollers + client count
- Security: add missing authorization guards to settings and client action routes
- Clean remaining Monday references from docs, schema, and scripts; rename parseMondayUtc
- Remove Monday.com: delete config, dead services, migration scripts; clean all references
Saturday, 11 July 2026
- Settings UI: colours from DB, Schedule Call clock picker, drag reorder, bulk colour
- Mobile layout fixes, Schedule Call save/cancel, Settings enum editor
- Mobile polish: CDP padding, filter tweaks, tray onclick fix
- Mobile layout: CDP tabs, action tray, client list card layout
Friday, 10 July 2026
- Today to-do cards: small checklist icon left of the checkbox
- Today to-do cards: fix name alignment + bump contact font
- Today panel: align to-do fields with consult cards; smaller sub-text; wrap Call
- Today to-do cards: add contact sub-line + italic text (match consult cards)
- Today view: merge consultations + to-dos into one date-grouped list
- File viewer: stop arrow keys from also switching views behind the modal
- File viewer: fix blank image (drop the 404-ing filename URL segment)
- File viewer: render images in a real <img>, not an iframe (fixes auto-fit)
- File viewer: fit images, real PDF filename, prev/next with arrow keys
- Files tab: make the file-type badges a little smaller
- Files tab: use inline-SVG file-type badges (font glyphs unreliable)
- Files tab: reserve fixed width for the file-type icon slot
- Files tab: fix invisible file-type icons (webfont glyph range)
- Today card: collapse hides only the notes/files/emails body
- Files tab: in-frame viewer on card click; external-link icon opens new tab
- Consult pill: highlight when scheduled for today; fix arrow-key view cycling
- Filters: close the header filter dropdown when an option is selected
- Filters: move tag/service/group/month filters into compact column headers; drop sorting
- Client view booking cards: use the shared consult pill style
- Today card: consult pill hugs its content (not full-width)
- Today card: use the same consult pill as the compact list
- Compact list: style consult date/time as a pill like the Today card
- Filters: icon-only Clear-filters button + hide "All" chips
- Filters: replace three per-bar clear buttons with one "Clear filters" button
- Today + compact views: click the consult date/time to open Schedule Call
- ToDo shortcut highlight: filled pill (white icon on green/red)
- Highlight the ToDo shortcut button when a client has open / overdue to-dos
- Today to-do cards: match consult-row styling + fix text wrapping
- Today view: redesign the left-panel to-do list
- Today view: don't create a client card for an open to-do alone
- Client detail: split bookings panel into Active + Other sections
- Email tab: bulk-assign selected emails to a client
- Refresh: force a full Graph cache flush + keep the active client-view tab
- Booking card: click the consult date/time to open Schedule Call
- Schedule Call: new-date in preview, Cancel→modal, dedicated Calendar Invite template, CC practitioner
- Schedule Call owns scheduling: disable silent calendar sync, read-only consult date, set Call field
- Schedule Call: send BOTH the ICS invite and the branded contact@ email
- Schedule Call: single native ICS invite carrying the HTML (no duplicate)
- Schedule Call: stop the duplicate native invite — drop the calendar attendee
- Schedule Call: create the Teams meeting only on Send; HTML body in the event; new subject
- Schedule Call: build the invite as an editable HTML email from a template
- Add Schedule Call invite: contact attendee, Teams meeting, preview + Send
- Rebuild the Documents feature on SQLite (email-composer attachable files)
- Route client-note writes through the DB; stop the Monday-direct poller; tighten CSP
- find-duplicate-files: add --delete-exact-dupes prune mode
- Add read-only duplicate-file scanner
- Today view: dedupe shared-email clients by id so multi-booking clients aren't flagged Unassigned
Thursday, 9 July 2026
- Drop dead MONDAY_* vars from .env.example
- find-blank-questionnaires: print client + filename for each flagged file
- Add blank-questionnaire finder script (dry-run by default)
- Move action display order into the DB; drop actions-order.json + orphaned JSON stores
- Remove monday.com OAuth route + "Connect Monday" UI (Monday removal 2/n)
- Remove Monday storage backend: collapse the facade to SQLite (Monday removal 1/n)
- Remove the 2000-char Notes limit + counter (post-SQLite)
- Fix Historical clients missing from compact search; stop special-casing Historical
- Fix Create Invoice populating the wrong customer/client (SQLite id collision)
- Load all clients in one query; search inactive is now client-side (SQLite)
- Allow disabling the board-cache via TTL=0 (post-SQLite cutover)
- Add --files-only mode to the migration script (Phase 6)
- Fix sqlite meta group ids to strings (active-list group names)
- Add Monday -> SQLite data-migration script (Phase 6)
- Route attachment-sync upload/dedup through the facade (Phase 4)
- Route woo/practitioner-email + attachment-sync email fallback through the facade (Phase 4)
- Route the Today-view fetchers through the data facade (Phase 4)
- Relax the /api/config MONDAY_BOARD_ID gate for the sqlite backend (Phase 4)
- Route qbo.js + royal-mail.js client/booking reads through the facade (Phase 4)
- Mark call-reminder-poller as the one deferred Phase-4 consumer
- Route the results + questionnaire pollers through the data facade (Phase 4)
Wednesday, 8 July 2026
- Route the contact-form poller through the data facade (Phase 4)
- Route the Actions editor through the data facade (Phase 4)
- Route the Templates editor through the data facade (Phase 4)
- Migrate the calendar-events + attachment-sync stores to SQLite tables (Phase 4)
- Migrate the email-assignment store to SQLite tables (Phase 4)
- Migrate the client to-do store to the todos table (Phase 4)
- Route files.js through the data facade (Phase 4)
- Client-detail + active-list UI fixes
- Fix QBO invoice lookup: client-scope + match by contact name
- Route clients.js action/template machinery through the facade (Phase 4, part 2)
- Add maintenance mode: block data writes + login-page notice
- Add DATA_BACKEND facade + wire clients.js core through it (Phase 4, part 1)
- Add SQLite data-access modules (Phase 3 of the Monday -> SQLite migration)
- Fix Services/Status Tags edit: populate fresh on open, PATCH single field
Tuesday, 7 July 2026
- Fix booking fields never populated on client-detail open (real root cause)
- Add better-sqlite3 dependency (Phase 3 of the SQLite migration)
- Fix Practitioner/Month/Group/Call/consultDate reverting after closing client detail page
- Add SQLite schema for the Monday.com -> SQLite migration (Phase 2)
- Add retry-with-backoff to mondayQuery for transient Monday-side errors
- Declutter Services/Status Tags modals: drop title bar and Done button
- Fix New Booking creating a blank Practitioner
- Remove History/Activity Log tab (frontend and backend)
- Add script to compare legacy Client tracker vs migrated Clients/Bookings
- Fix booking-switch autosave race that silently blanked booking fields
- Add one-time script to backfill truncated clients' Notes as archive files
- Fix stale board cache after dynamic actions commit field updates
- Notes: hard cap at 2000 chars with live counter, plus Save Notes archive
- Fix email "About" dropdown showing Booking details instead of a plain Client list
- Fix rekey-todos.js: todos are Client-scoped, not Booking-scoped
- Fix New Email quick action: To address blank when opened outside detail page
- Active list view: fix To Do shortcut passing Booking id instead of Client id
- Fix Today view: To Do (and related id-keyed lookups) used Booking id instead of Client id
- Client detail page: swap Bookings and Contact/To Do columns
- Add Client: name the Booking after the client and set sane defaults
- Fix findOrCreateClient to match by name, not email+contact
- Notes tab: add spacing around the Add/Edit/Clear button row
- Booking card: Status Tags/Services share row 2, card background tinted by Group
- Fix booking card: consult date and time wrapping onto separate rows
- Notes tab: remove redundant "Notes" header, add top padding
- Move Notes to a right-panel tab (before Email); Contact details to center column above To Do; Bookings list fills entire left column
- Booking card layout: float Practitioner+Month right, Consult date/time and Call on their own rows
- Fix client detail page closing itself on every booking-card edit
- Sort the client detail page's Bookings list by the board's own group order
- Let the Bookings card-list flex to fill available vertical space in col-1
- Fix ReferenceError: remove dangling call to deleted _updateServicesDisplay
Monday, 6 July 2026
- Rework Bookings list as an editable card-list (no separate detail panel)
- Redesign client detail page for multi-Booking clients
- Add GET /api/clients/:clientId/bookings for the client detail page redesign
- Fix Files tab and email attachment-sync: frontend was passing Booking id where a Client id is required
- Fix consult-date timezone bug: migration wrote local time as if it were UTC
- Phase 4: local JSON store re-keying scripts
- Phase 4 Batch 5: contact-poller, questionnaire/results pollers, practitioner-email
- Fix: chunk Client id batch-fetch in recent-files/recent-notes to Monday's 100-item limit
- Phase 4 Batch 4: Today-view endpoints, QBO, Royal Mail, Woo, Files, attachment-sync
- Phase 4 Batch 3: dynamic actions engine + call-reminder-poller
- Phase 4 Batch 2: Clients/Bookings write paths
- Phase 4 Batch 1: Clients/Bookings join foundation + read-only endpoints
- Allow /var/pebble-dashboard store paths to be overridden via env
- History tab: label dashboard-made changes as "via Pebble Dashboard"
- Fix Products/Services tabs: long summary tables hid the timeline below
- Add Message of the Day popup shown once per browser after login
- Fix consult date/time not migrating, remove 6 dead columns, real single-select Planned consult
- Fix TDZ crash, missing status labels, and idempotency gaps found in test batch
- Resolve conflicting Client fields per-field, preferring "Current clients"
- Add CSV round-trip for the migration review file
- Add Clients/Bookings matching + migration script (Phase 2/3)
- Add Clients/Bookings board config (Phase 1 of migration)
- Invoice modal: update in place instead of duplicating; log note on Save/Send only
- Ship Test Kit: prefill Address Line 1 with full address minus postcode
- Fix call reminder emails missing the HTML template header/footer
Sunday, 5 July 2026
- Add QBO invoice creation from client detail page
- Remove dead backend endpoints/exports, consolidate poller duplication
- Remove dead CSS and fix undefined --pn-bg/--pn-card variables
- Skip auto-uploading standard boilerplate docs (questionnaires, price lists)
- Fix Left/Right arrow-key tab cycling to include History, drop dead timeline
- Add client "History" tab backed by Monday's activity_logs API
- Fix broken inline (cid:) images in the email viewer
- Make ambiguous/unassigned emails more visually obvious
- Attachment sync ambiguity fix; upload-to-client button; Today card cleanup
Saturday, 4 July 2026
- Mobile topbar: search overlay + fixes; Today card tweaks
- Email history: bulk delete; attachment sync: no notes, no Today files
- Files tab: multi-select + bulk delete; Products tab: sort by last ordered
- Actions editor: tabular layout; topbar hamburger; email attachment sync; fix email delete
- Today cards: restructure rows + last-updated in row 1 + styled chevron
- Today cards: colour-code last-updated timestamp by recency
- Actions config page + Today card last-updated timestamp
Friday, 3 July 2026
- Help: update Today view, bulk actions, keyboard shortcuts
- Today cards: Space uses hover (mouseover) not focus for card target
- Today cards: capture-phase keydown on document; tabindex=-1 on all inner buttons
- Today cards: document-level capture click handler to block Space-click
- Today cards: use pointerdown to distinguish mouse vs keyboard click
- Today cards: suppress Space-click via capture-phase flag on grid
- Today cards: remove onclick from card; use delegated mouse click only
- Today cards: use event.detail===0 to suppress keyboard-synthesised clicks
- Today cards: fix Space triggering click via flag suppression
- Today cards: Space toggles collapse, Enter opens client; focus ring
- Today cards: group label left-aligned; hide collapse/expand until rendered
- Today cards: move chevron to group row; more top padding on header
- Today view: collapse/expand individual cards and collapse/expand all
- Bulk bar: fix top position to calc(topbar-h + filters-h)
- Bulk bar: increase vertical padding to 10px / min-height 52px
- Fix fetchAllActions to push full action object not just name string
- Bulk bar: fix bulkAllowed check (Monday boolean = 'v'); fix layout
- Bulk bar: fix z-index (51 > filters 50); fix offsetHeight timing
- Bulk bar: pin to top below filters; track height in --bulk-bar-h
- Actions board: bulkAllowed flag filters bulk bar
- Dynamic actions board; bulk email sending
- Templates editor: open to all users; hide Reports for non-admins
- Templates editor: migrate into dashboard as full-page view
- Today view: inline note composer on client cards
- Today view: group chip click-to-edit with live card update
- Client deeplinks; admin email from-name; mailbox error resilience
- Inactive client search; Outlook calendar sync; CDP inline editing; email sort; UI polish
- Remove dead code; call reminder timezone fix; filter bar click area
Thursday, 2 July 2026
- Action system: field updates, email-less actions, dynamic config
- Dynamic action buttons from Monday Templates board
- Email composer: template tags, Salutation/Signoff templates, booking details improvements
- Restore 24h Today window; API timing off by default
- Today view: timing debug, Graph/Monday query reduction, 12h window
Wednesday, 1 July 2026
- Email history cache: invalidate on Refresh button; disable API timing
- Performance: board + email-history caching; Today card layout; API timing
- Reply composer: support template insertion; Products tab: remove Period column
- Redistribute status tag colours across full spectrum
- Status tag colours; help page updates; remove deleted Monday columns
- Fix mobile main-content padding not applying (specificity order)
- Fix thread assignment in Today view; mobile padding; calendar overflow
- Move order/invoice timelines into Products and Services tabs; remove History tab
- Multi-email support via text column; today view email sort fix
- Email thread assignment: auto-associate replies to same client
- Mobile polish: filter bar fixed position, filter/tab/layout fixes
- Email composer: multi-select template picker
- Today view: chronological ordering, group chip on card, single-column layout; Test Order: compose-first workflow; contact-poller: BST timestamp fix
- Contact poller: no auto-reply, match existing clients by email+name; email history: surface contact form emails via replyTo; refresh button: refresh current client only when detail panel is open
Tuesday, 30 June 2026
- Remove unused Royal Mail Click & Drop API spec
- Mobile-responsive pass: topbar, client detail, table, bulk bar, filters, Today view
- Move client To Do panel into middle column, add popup + clear-all
- Polish To Do feature: drop practitioner field, collapsible Today panel, quick-view shortcut
- Add dashboard-native To Do feature for clients
- Add Files quick-view shortcut to Today cards and table rows
- Show attachment badge in Today view; retry Graph requests on throttling
- Add manual email-to-client assignment for shared addresses
- Fix Today view: include Historical group in hidden-group filter, search Archive by date
- Add Royal Mail Click & Drop integration for shipping test kits
- Today view: show shared-address emails on every matching client's card
- Add Outlook email flag support: badges, toggle, and age-bypass in Today view
- Validate client email before sending to Monday, return clear 400 instead of raw GraphQL error
- Add Enter-to-save and Escape-to-cancel for inline popup editors
Monday, 29 June 2026
- Sort status tags alphabetically when rendering
- Security hardening: fix XSS, escaping, auth and injection findings
- Today consult panel: apply group colour background to appointment rows
- UI polish: contact name inline, group colour header, active-only filters
- Remove Invite Status, Questionnaire, Commission fields from client detail view; add migration scripts and static tag colours
- Add PWA manifest and PNG favicon for Chrome app install
- Today cards: show only email/notes activity, not upcoming consults
- Today view auto-refresh at configurable interval
- Hide consult panel until data is ready
- Remove Today heading from initial load skeleton in dashboard.js
- Today view renders immediately; remove list view code; fix stale header
- Remove Today heading and List view
- Support comma-separated multiple email addresses per client
- Add delete email, client count badge, and filter pill fixes
- Fix toolbar pill-select sizing and add group colours
- Replace plain filter selects with coloured pill-select dropdowns
- Consultation panel: top-align consult time with multi-line client details
- Consultation panel: remove border radius
- Consultation panel: bump font sizes by 2px throughout
- Consultation panel: split contact and call onto separate lines
- Consultation panel: show contact name and call details below client name
- Consultation panel: show practitioner as coloured badge
- Fix today layout rebuild: check for today-consult-panel not today-grid
- Always show view-switcher button labels
- Today view: two-panel layout with consultation list on the left
- Add inline Services dual-list editor to today and table views
- Update help page to reflect current dashboard functionality
- Inline dual-list Status Tags editor + today-view inline editing
- Consolidate table views: one Compact table + new Inactive view
- Silence git config warnings from version lookup under systemd sandbox
- Remove app reads/writes of legacy Status 1/2 columns (data kept in Monday)
- Status Tags dual-list editor; remove unused Kanban (Columns) view
- Today view: query only active groups for recently-updated items
Sunday, 28 June 2026
- Status Tags: replace Status 1 + Status 2 with one multi-select column
- Status tags: column-creation + migration scripts, config wiring
- Dashboard: collapsible filters, view-switcher relocation, compact Consult column
- Highlight today-view emails from the last hour
- Products/Services tab counts show unique items, not order/invoice count
- Add auto-generated change history to the help page
- Products summary: thumbnails, shop links; fix Services scroll
- Group client files by category; always show HTMA Analyse button
- Restructure client tabs: Products, Services, History timeline
- Add combined order + invoice history timeline
- QBO invoices: paid date on cards + service summary section
- QBO: clearer "no matching customer" message showing what was searched
- QBO: match customers via targeted queries, not a full-table scan
- QBO: expired/invalid refresh token drops to clean reconnect state
- Fix .env.example: move inline comments to their own lines
- Re-enable QuickBooks Invoices tab for sandbox testing
- QBO: capture intuit_tid on API errors for support diagnostics
- QBO compliance: encrypt tokens, redirect callback, secure cookies, headers
- Add disaster-recovery artifacts for clean-server rebuild
- Sample nginx: raise body limit on email endpoint for attachments
- Improve compose attachments and booking-section styling
- Show and open attachments in sent/received emails
- Add QBO disconnect endpoint and in-app disconnect control
- Allow pebblenutrition.co.uk as email attachment host
- Add public privacy policy and terms pages for QBO production access
- Add email/note quick-action icons to today cards
- Fix today-view note times showing one hour ahead
- Put note text on its own line, un-bolded, below timestamp + username
- Defer hidden-view groups to background for faster today/compact paint
- Restyle reply signature: left-aligned header, blue logo, consolidated text
- Prefill salutation/booking/signoff in compose; refresh view after send
- Open prefilled compose for email actions; defer side effects to send
- Add Schedule Call action to prefill consultation email
- Refresh button now clears today view email/files/notes cache
- Fix practitioner filter bar disappearing after page load
Saturday, 27 June 2026
- Fix pebble loader vertical centering — use fixed positioning
- Remove dot dot dot from pebble loader
- Pebble loader: larger size, heartbeat pulse animation instead of rotation
- Centre pebble loader vertically in today and table loading states
- Replace all remaining text spinners with pebble logo loader
- Use pebble logo loader in Today view loading state
- Use full pebble logo SVG in loaders instead of shape-only inline SVG
- Use spinning pebble logo as shared loader on initial load and HTMA modal
- HTMA modal: minimum 1.2s loader display so animation is visible
- HTMA modal: spinning pebble logo loader animation
- Fix HTMA filename detection for double-underscore names
- Fix file open to preserve filename in address bar
- Broaden HTMA file detection to match LAST_FIRST_NUM_NUM pattern
- Add HTMA PDF analysis — CLI script and in-app modal
- Fix email modal key handling, today spinner, and eh-item scope bug
- Refactor initial load: single render after all data ready
- Fix Today view scroll/overflow; add bottom padding to all views
- Today view: respect filters; remove Recent view; fix practitioner bar
- recent-files/notes: use Monday __last_updated__ filter instead of full board scan
- recent-files/notes: filter out inactive groups using HIDE_GROUPS_IN_COMPACT_VIEW
- Fix recent-files and recent-notes: paginate all board items (was capped at 100)
- Today view: show recent notes (last 24h) per client card
- Today view: open file directly in new tab instead of client files tab
- Today view: show files uploaded in last 24h per client card
- Today view: arrange groups in 3 columns instead of stacked rows
- Today view: reduce recent emails window from 48h to 24h