Every update shipped to Custody Note, newest first.
v1.9.12
Latest
•Form subsections expanded by default with completion status chips
•optional compact collapse in Settings
•trial starts reported to custodynote.com for admin stats
•subscribe links point to custodynote.com/pricing
v1.9.11
•First macOS edition — signed and notarised for Apple Silicon and Intel Macs
•Download from custodynote.com/download (Mac and Windows)
•Automatic updates on Mac and Windows when a new version is published
v1.9.10
•Licence validate retries without expired account token
•clears stale session when falling back to licence key
v1.9.9
•Email my key uses licence key not practice email
•backup entitlement from server status
•honest offline validate
v1.9.8
•Cloud backup entitlement re-checked after licence validate
•home banner shows real server error
•licence email only reports success when sent
v1.9.7
•Cloud backup: show real licence/device-limit errors instead of generic local-only state on multi-PC installs.
v1.9.6
•Officer email templates: clearer dropdown labels and subject lines
•improved body wording for all nine templates
•workflow-friendly template order in the email type list
v1.9.5
•Officer Emails: Attendance time field on custody-note panel and one-off screen, included in generated email bodies
•Clear fields button on custody-note panel
•Outlook Web compose hardening and tests
v1.9.4
•Officer Emails: restored a separate Home screen panel for one-off officer emails without needing a saved custody note
•One-off officer emails can generate the existing templates, copy recipient/subject/body, and open Outlook Web for manual sending
•Release publishing now keeps GitHub releases as drafts until the Windows installer, blockmap, and latest.yml updater metadata are uploaded
v1.9.3
•Officer Emails right-panel module and workflow hardening
•QuickFile settings configured-state fix
•CRM1 gender checkbox reset fix
•Billing/finalise/list workflow regression fixes
v1.9.2
•Restore Officer Emails to the right-hand form panel
•Set officer email drafts ready for Outlook on save
•Fix list and finish-matter workflow regressions found by release tests
v1.9.1
•Officer Emails: moved from the right-hand context column into its own full-width standalone section directly below the custody note form, with its own heading and intro line
•same templates, drafts and Outlook Web flow as v1.9.0
v1.9.0
•Officer Emails rebuilt to match product spec: right-hand panel in the custody note (#form-context-panel), nine fixed templates, no forbidden fields (rank/DSCC/custody ref removed from this flow)
•New encrypted table officer_email_drafts with full draft lifecycle; main-process IPC officer-email-drafts-* (list/get/create/update/duplicate/cancel/delete/mark opened/mark sent/open Outlook/copy/preview)
•Outlook Web compose only — URL built in main; renderer calls openOutlookDraft(id); user sends manually. Removed v1.8.0 auto-launch stack (lib/outlookLaunch.js, officer-emails:* IPC, email-launch helpers)
•Deleted legacy modules and tests: renderer/officerEmails.js, officerEmailTemplates*, email-templates.js, email-modal.js, email-pending-globals.js, data/email-templates.json, docs/officer-email-improvements.md, smoke/send-officer scripts, and the old officer-email / quick-email / outlookLaunch test files
•Stripped list Email OIC + OIC badge, billing Officer Email Copy row, Add-Ons officer-templates settings card, home cards, ~800 lines of obsolete CSS (.email-oic-*, .quick-email-*, .qe-*, old .officer-email-page)
•Added lib/officerEmailDrafts.js (pure rules) + six node:test unit files under tests/officerEmailDrafts.*
v1.8.0
•Officer Emails relaunched with reliable Outlook launch: choose how the Send button opens — Outlook desktop (.eml draft), Outlook on the web (M365 deeplink), default mail app (mailto:), or copy-only
•Settings > Email shows what auto-detect found on this machine (Outlook desktop install, default mailto handler) and includes a Re-detect button + diagnostics log
•Always-on Copy Subject / Copy Body / Copy Email / Copy Full buttons on Quick Email and Officer Emails — the email content is never lost even if the launch fails
•PII-safe email-launch.log records every send attempt (domains and lengths only — no addresses, subjects or bodies)
•Restored every pre-v1.6.23 surface: Officer Emails home card, Email OIC button on each record in the list, standalone Officer Emails view with Templates / Drafts / Compose tabs, Settings toggle for the Officer Email Templates add-on
•1205/1205 unit tests pass
•renderer smoke test (73 checks) passes
v1.7.1
•Officer Emails restored: per-record right-hand drawer prepares Outlook Web compose drafts for the current custody note (manual send only)
•copy/paste-only workflow with Copy Subject + Copy Body + Open in Outlook Web
•full lifecycle (draft -> opened -> sent / cancelled)
•1121/1121 unit tests pass including new officerEmailTemplates suite
v1.7.0
•Restore Billing button in bottom navigation
v1.6.24
•Published installer build of v1.6.23 (which was version-bumped in metadata only). Bundles the Officer Emails removal - Quick Email, Email OIC and Officer Emails surfaces are gone (UI, IPC, templates, helpers, styles, tests). Licence-request emails, firm contact emails and other unrelated email fields are unchanged.
•Auto-updates from v1.6.22 jump straight to v1.6.24.
•Finish matter: Start billing process button is disabled in markup until the Finish matter screen runs readiness logic - avoids an enabled orphan control before navigation.
v1.6.23
•Remove the Quick Email / Email OIC / Officer Emails feature in full (UI, IPC, templates, helpers, styles, tests). The app no longer composes or sends officer mail
•licence-request emails, firm contact emails, and other unrelated email fields are unchanged. Auto-updates from v1.6.22.
•Settings: removes the Officer Email Templates add-on row, the Custom Email Templates editor, and the OIC entitlement labels.
•Records list: removes the Email OIC button, OIC Sent badge, and the Quick email to officer toolbar entry-point.
•Home: removes the Officer Emails and Quick email to officer cards.
•Internal: drops preload's CustodyEmailCompose bridge, ~870 lines of officer-email CSS, send-officer-sample-email script, and the email-launch.log diagnostic.
•Finish matter: Start billing process is disabled in markup until the Finish matter screen runs readiness logic — avoids an enabled orphan button before navigation and keeps the in-app smoke test green.
v1.6.22
•Officer Emails: subject line can now be copied from a prominent hero button, plus inline Copy buttons next to the Subject input on Compose and the Subject value on Preview
•Officer Emails: templates are fully user-editable via a Manage templates… modal — add, edit, duplicate, cancel edits, delete with confirm, and Restore defaults
•the four built-in templates are now seed data, every template can be modified or removed
•Tests: 31 passing officer-email unit and integration tests covering the store, manager, subject-copy, and existing copy-only flow
v1.6.21
•Removed bundled email-send-trace.txt, Help/Testing shortcuts, preload api.openEmailSendTrace and main IPC — stale documentation for removed Outlook launch paths
•Removed dead Outlook stack: open-outlook-email IPC, Main openOutlookWebEmail.js / openComposeEml.js, lib/outlookWebComposeUrl.js, renderer email-draft-open.js and outlook-email-invoke.js, detect-outlook-desktop IPC, preload emailAPI bridge
•Copy-only everywhere: Settings splash Contact Us, Share App email, LAA form email button and Documents workflow email now copy To/Subject/Body to clipboard instead of invoking Outlook Web
•Officer Emails: dropped Officer collar/reference field, Outlook handler/login-hint/detect-outlook dev wiring, mailto/OWA URL diagnostics, Email send trace button; simplified Testing tab and dev diagnostics
•email-pending-globals.js exposes only save/get/clear pending draft; CustodyEmailCompose remains for {{placeholder}} merge
•Deleted obsolete unit tests (outlookWebEmail.module, openComposeEml) and Playwright quick-officer-email specs + edge CDP helpers
•Unit tests and email policy sources updated for v1.6.21
v1.6.20
•Officer Emails: copy-and-paste only - removed Open in Outlook / Open in Outlook Web / Reopen Outlook / Continue opening draft / Copy and reopen fallback panel from Hero, Compose, Preview, Side panel and Quick Email modal because the Windows launch path was unreliable (Outlook PWA hijack, Edge sign-in prompts, Default-browser interception)
•Compose tab now shows Copy Email Body, Copy Officer Email, Copy Subject, Copy Full Email + Save Draft, Mark as Sent, Cancel
•Preview tab adds a Copy Subject button
•Records list adds per-record Copy Officer Email and Copy Subject buttons
•Compose Advanced launch options (Edge InPrivate / Outlook desktop / Default browser) and the Outlook sign-in hint field were also removed
•All helper text rewritten to drop sign-in and may-require-sign-in phrasing
•CustodyEmailCompose preload bridge unchanged so any future opt-in launcher can reuse it
•1229 unit tests, 65 audit tests, 73 in-app stress checks all green
v1.6.19
•Fix v1.6.18 launch regression where Custody Note opened to a blank window with only 'Run in Electron: npm start'
•root cause was Electron's sandboxed preload failing to resolve a relative require inside app.asar
•the email-compose helper is now inlined into preload.js so window.api / emailAPI are always wired
•Add PII-safe startup diagnostics and an in-app renderer guard so a broken preload bridge cannot silently fake a marketing/demo page
•Add a browser-PWA cleanup helper (scripts/repair-launch-shortcut.ps1) that finds and removes orphaned Chrome/Edge/Brave web-app shortcuts and Apps and Features entries that could hijack the desktop launch
v1.6.18
•Removed the web demo and PWA build entirely
•the only supported distribution is the signed Windows installer published to GitHub Releases
•fixes the splash screen redirecting to the web demo warning gate inside the Electron app
v1.6.17
•Officer Emails: copy-and-paste primary workflow with Copy Email Body as the main button
•Pending email draft saved before opening Outlook so sign-in interruptions do not lose the email
•Continue opening draft fallback panel after Outlook is launched
•Clipboard API with textarea fallback for non-secure contexts
v1.6.16
•Fix Windows Quick Email: OWA compose opens in Edge InPrivate
•avoids Outlook PWA dropping compose deeplink
v1.6.15
•Officer Emails: remove hardcoded login hint and legacy stored hint
•signatures use Settings fee earner or [Your name]
•bundled email-send-trace.txt copied to app data with Help + Testing shortcuts
•privacy fixes in tests and sample script
v1.6.14
•Officer Emails: use OWA path=/mail/action/compose (work alt) so Microsoft 365 new shell opens compose instead of dropping the compose deep link to inbox
•open-external-url allowlist accepts both OWA compose URL shapes
v1.6.13
•Officer Emails: prepare standardised emails to officers (bail details, attendance confirmation, disclosure update, general), open them in Outlook on the web via a strict allowlisted shell.openExternal handler, and keep a local record on this device with full draft / opened / sent / cancelled lifecycle
•Removed older Quick Email feature replaced by Officer Emails
v1.6.12
•Quick Email: new Settings toggle 'Always use Outlook on the web (M365 work)' that hard-overrides Outlook desktop detection and pins the most reliable compose URL
•Quick Email: fixes the v1.6.11 case where .eml drafts were handed to Edge (PWA) instead of Outlook desktop and ended up showing a malformed OWA URL with no compose path
•Quick Email: route-preview pill now clearly says 'Outlook on the web (M365 work — forced)' when the toggle is on so you can see exactly what will happen before clicking Send
v1.6.11
•Quick Email: smart-routes to Outlook desktop draft when Outlook is installed (no more landing on the inbox)
•Quick Email: route-preview pill and dynamic Send button label show the resolved Outlook target before you click
•Quick Email: clipboard fallback if both shell.openExternal and the browser launcher fail
•Quick Email: Copy ALL debug URLs button (dev mode) for testing all three compose endpoints
•Bug fixes and reliability improvements
v1.6.10
•Follow-up fix from installed-app telemetry: work-account Outlook route now uses https://outlook.office.com/mail/deeplink/compose?... again. Runtime logs showed ?path=/mail/action/compose was accepted and launched but still normalized to Outlook home/inbox in this environment.
•Kept release-safe diagnostics in <userData>/email-launch.log plus compose-signature checks and warning toasts, so future route normalization issues are visible and traceable.
•Updated Outlook routing/browser fallback/tests to match the restored work compose deeplink route; full Outlook + Quick Email regression suite passes.
v1.6.9
•Added release-safe Outlook launch diagnostics in the installed app: main process now writes account type, launch method, host/path, and compose-signature result to <userData>/email-launch.log for each Quick Email launch attempt.
•Added compose-signature detection to returned launch metadata and a renderer warning toast when Outlook launches with a non-compose signature, so users immediately know the app detected a route mismatch.
•Expanded regression coverage for Windows personal msedge-cli launches and explicit non-compose detection via _composeSignature helper.
v1.6.8
•Fixed Outlook Web launch for Microsoft 365 accounts that were landing on home/inbox instead of compose: work-account URLs now use https://outlook.office.com/?path=/mail/action/compose&to=...&subject=...&body=... (auth-resilient compose route).
•Kept existing encoded to/cc/bcc/subject/body transfer and preserved body formatting; updated browser fallback path and all Outlook routing tests/smokes to the new canonical work compose route.
•Regression tests pass for Outlook URL building, main-process launcher, Quick Email payload transfer, routing policy, and window hardening.
v1.6.7
•Windows Quick Email / Outlook Web: launch Edge by spawning msedge.exe with the compose URL as a single argument (resolved from standard install paths or PATH). The previous implementation invoked cmd.exe `start msedge <url>`, which broke URLs at the first `&` query separator — Outlook opened with a truncated link or not at all.
•Renderer: when a second Send is triggered while the first email IPC is still in flight, the guard now returns `{ skipped: true }` instead of an empty resolve, so the UI does not show false "Opening…" success toasts.
•Regression tests: full Outlook + Quick Email suites pass.
v1.6.6
•Quick Email Outlook launch hardening for Windows: HTTPS compose links are now opened via Edge's command-line (`msedge <compose-url>`) instead of relying only on Electron `shell.openExternal`, after a real install showed Outlook was not opening at all.
•The exact launched URL is still the normal compose deeplink: https://outlook.office.com/mail/deeplink/compose?to=...&subject=...&body=... . The app does not use the microsoft-edge: protocol wrapper.
•If Edge command-line launch fails, the app falls back to Electron `shell.openExternal` and reports the launch method in testable metadata.
•Quick Email validation feedback now says clearly when Outlook was not opened because required fields are missing, and the success toast says it is opening the Outlook compose window.
•Added regression tests for Windows Edge command-line launch and fallback. Total: 1191/1191 unit tests pass; Quick Email as-user smoke passes 8/8 scenarios.
v1.6.5
•Quick Email Outlook launch fix for Microsoft Edge / new Outlook Web: work-account sends now open the plain HTTPS compose deeplink directly (https://outlook.office.com/mail/deeplink/compose?...), with no microsoft-edge: protocol wrapper.
•Fixes the case where Edge redirected to outlook.cloud.microsoft/mail and landed in the Inbox/home screen instead of creating a compose email.
•Kept the existing encoded to/subject/body parameters and compose path; tests now assert the launched URL contains /mail/deeplink/compose? and is not wrapped in microsoft-edge:.
•Updated routing regression tests and smoke journey. Total: 1189/1189 unit tests pass; Quick Email as-user smoke passes 8/8 scenarios.
v1.6.4
•Quick Email to Officer: Send via Outlook Web now defaults to the real Microsoft 365 compose deeplink (https://outlook.office.com/mail/deeplink/compose?...), not a generic Outlook inbox/home URL. The URL is built with encoded to, subject and body parameters and preserves paragraph breaks.
•Added strict inline validation before opening Outlook: officer email must exist and look valid, and client name, police station, date and time must be present. Failed validation keeps all typed data intact and shows a compact inline message inside the modal.
•Disclosure emails now match the requested wording: subject starts 'Disclosure request - <client> - <station> - <date>'; body uses a rank-aware salutation (Jarvis -> Officer Jarvis, DC Jarvis stays DC Jarvis) and uses 24-hour time such as 09:00.
•Quick Email footer/action bar restyled as a compact dark Custody Note action bar with left/right button groups: Send / Copy / Save on the left, Clear / Cancel on the right. Clear and Cancel are now proper visible buttons.
•Quick Email date/time picker icons are now visually integrated into the Date and Time inputs instead of appearing as detached square buttons underneath.
•Added/updated acceptance tests for the David Walter / Maidstone / 30052@kent.police.uk case, Outlook compose deeplink content, inline validation, rank-aware salutations, and the updated smoke journey. Total: 1189/1189 unit tests pass.
v1.6.3
•Quick Email: pressing 'Send via Outlook Web' no longer auto-clears the form. Outlook can fail silently (pop-up blocker, mid sign-in, network glitch) and the previous behaviour wiped your typed content even when no email actually went out.
•New 'Clear' button in both the Quick Email modal and the per-record Officer Email modal. Clearing now requires a confirmation when there is content to lose, so the data is only ever cleared when you explicitly choose to.
•New rotating-wheel ('counter style') date and time picker. Tap the calendar/clock icon next to any date or time field — including the attendance date and time, time of first contact, time set off / arrived / left, and station-visit times — to scroll Day / Month / Year / Hour / Minute on a thumb-friendly wheel.
•Wheel picker has Now / Cancel / Done, snaps to row boundaries, re-clamps the day when you change month/year (29 Feb 2024 vs 28 Feb 2025), and writes back the standard ISO value so existing auto-save and validation keep working. Native typing in the input still works as a fallback.
•Picker auto-attaches to dynamically-added inputs too (e.g. additional station-visit cards), driven by a MutationObserver — no extra wiring needed in any view.
•16 new tests for the wheel picker (parse/format helpers, attach + open + commit, Cancel preserves value, Now writes the current time, day re-clamping). 4 new tests for the Quick Email Clear behaviour. Total: 1186/1186 unit tests pass.
v1.6.2
•Quick Email: choose where 'Send via Outlook' opens — Outlook.com (personal), Outlook on the web (M365 work / school), or your default email app (Outlook desktop / Mail). Settings -> Your Details -> 'Quick Email opens in'.
•Fix: previously the button always tried Microsoft 365 (outlook.office.com), which silently fails for users on personal Outlook.com / Hotmail accounts — recipient/subject/body never reached Outlook.
•Personal Outlook.com URLs no longer force Edge on Windows (your default browser handles outlook.live.com directly).
•mailto: mode opens Outlook desktop / Apple Mail / Thunderbird directly with the recipient, subject and body prefilled.
•When the email body is too long for the URL, the FULL body is now copied to the clipboard automatically and a toast tells you to paste it.
•Special characters, line breaks, ampersands and apostrophes are encoded exactly once across all three modes.
•23 new regression tests covering account-type plumbing, encoding, line-break preservation and clipboard fallback (1168/1168 tests pass).
v1.6.1
•Fix: Quick Email -> Outlook now sends the typed message body by default (the H02 confirm dialog used to default to 'subject only' which silently stripped the body)
•'subject only' remains as an opt-in for legally privileged matter
•'Don't ask again' now remembers the chosen mode across sends
•new regression tests pin the defaults end-to-end
v1.6.0
•Security hardening pass: Electron defence-in-depth (window-open / navigation / permission default-deny, header-level CSP, no third-party script origins)
•PBKDF2 iterations bumped to 600,000 for recovery and key escrow with transparent legacy migration
•Outlook Web compose now requires per-session confirmation with subject-only mode that strips body from URL
•idle-lock default 10 minutes plus immediate force-lock on OS lock-screen / suspend / shutdown
•recent contacts moved out of localStorage into the encrypted settings DB
•sql.js bundled locally instead of loaded from a CDN
•admin email allow-list now sourced from CUSTODY_ADMIN_EMAILS env var
•redacting log helper plus append-only security event log at userData/security.log
•new SECURITY.md, PRIVACY_AND_CONFIDENTIALITY.md, MANUAL_ACTIONS.md, and SECURITY_AUDIT_REPORT.md
•npm run security:audit gate runs npm audit plus an in-tree secret scanner
•1133/1133 tests pass
v1.5.26
•Settings -> Display & Layout Studio: new 'Always show three-column layout' option that keeps the left section list and the right matter-summary / section-status panel visible on smaller screens (overrides the automatic collapse below 1200/1280px). Side panels use slightly tighter widths in this mode so the middle form column remains usable.
v1.5.25
•Licence: nerijus83@gmail.com added as a complimentary lifetime user with unlimited devices and full add-on access
v1.5.24
•Voluntary note: 'Voluntary attendance confirmation' (status, rights, pre-interview caution, sub-type, constable) moved out of section 1 to the end of section 3, after client details and welfare. PDF and validation updated to match.
•Quick email: a successful Outlook send now clears the selected template and any optional sections so the form resets cleanly for the next email
•Quick email: removed the 'Custody number', 'DSCC reference', 'Allegation summary' and 'Reply by' optional fields, and the matching lines from the bail-details, disclosure and follow-up templates
•Quick email: every built-in template can now be edited or hidden; a new 'Restore defaults' link brings them all back
•Built-in template changes are stored as per-user overrides so app updates won't overwrite them
v1.5.23
•Voluntary note: removed the redundant 'Legal advice requested?' field
•Persistent version banner: now visible on every page, shows installed version + update status (idle / downloading / ready)
•Bottom nav: removed the '£ All open' button and renamed 'This matter' to 'Billing'
•Open matters practice-wide list view removed
v1.5.22
•Quick email: form clears after a successful Outlook send (failure preserves your text)
•Voluntary interview note: free-to-leave advice moved to the consultation section, status fields relabelled and reordered for chronology, PDF layout updated to match
•Update check: clarifies installed vs latest published version
v1.5.21
•Auto nav: section sidebar shows at 1200-1279px
•Section navigation hint
•Remove Discord e2e
•help/settings copy
v1.5.20
•Footer: release build date/time
•get-app-version returns buildTime
•release script sets buildTime
•UI and home billing widget updates
v1.5.19
•Remove file/matter reference from police station, voluntary, and INVB forms and PDFs
•billing summary PDF header
•workflow and completion UI
v1.5.18
•About this build: the footer now shows the version together with a local date and time — the moment this build was first run on this computer (after install or auto-update), stored in app-version-state.json under userData. Tooltip on the version chip also lists the installer's build date from package.json (release).
•Check for updates: toasts and the settings update status line now include the app version and the current date and time when the check reports you are up to date, so you can see at a glance that the check was recent.
v1.5.17
•Section 9 / Finalise visibility: fixed three real bugs that left users with no Finalise button anywhere on a draft. (1) The bottom-bar Finalise pill (#bottom-bar-finish-pill) is a global element in index.html, but its update was gated behind in-section buttons that only exist after the user has navigated to Section 9 — so the pill stayed display:none on sections 1-8. Now the pill + readiness panel are updated unconditionally, before the in-section button block. (2) When the user navigates to Section 9 for the first time, populateSectionContent() lazily mounts #form-finalise-bar / #form-end-billing-btn / #form-post-finalise-bar with their initial inline display:none, but showSection() never re-ran updateFormBarVisibility() — so they stayed hidden. Now we re-run it after lazy section render on timeRecording.
•Section 9 file-completion (billing-readiness) panel: the panel background used color-mix() with a literal `white`, so it rendered as a near-white surface even in dark mode. Combined with --text being near-white in dark mode, the title, summary copy and 4-step checklist were essentially invisible (rendered as ghosted/strikethrough-looking text). Added an html.dark override that gives the panel a true dark background, and explicit dark-mode text colours for the title, copy, summary, steps and warning callout.
•Tests: new e2e regression spec finalise-button-visibility.spec.ts seeds a draft (custody and voluntary), opens it from the Records list, and asserts the bottom-bar Finalise pill is visible on Section 1 and BOTH the in-section bar and the pill are visible on Section 9, in both light and dark themes.
v1.5.16
•Voluntary: fixed cases where 'Custody record read?' still appeared on finalise. If attendanceMode was missing in saved JSON, the app used to default it to custody before choosing the form — voluntary matters then ran INVC (custody) validation. Now we infer voluntary from workType === 'Voluntary Police Station Attendance' or attendanceSubType starting with voluntary_ before defaulting to custody, and we align prefill when the open form is the voluntary form.
•validateBeforeFinalise: if the active form is voluntaryFormSections, we set attendanceMode to voluntary and always run validateVoluntaryForm (not validateAttendanceForm). validateAttendanceForm also treats activeFormSections === voluntaryFormSections as off the custody path for custody-record / grounds-for-arrest checks (defence in depth).
v1.5.15
•Voluntary attendances no longer surface custody-record questions. When the custody form is being used in voluntary-interview mode (Voluntary Interview? = Yes), the leftover §3 fields — Custody record issues, Arresting Officer Rank & Name, Arresting Officer Collar / Badge No. and the Arrest & Detention sub-heading — now hide alongside the rest of the custody-record block.
•Section 6 (Consultation) note 'Client details ... from custody record are in Section 3' now switches to a neutral wording when the matter is a voluntary interview. The §6 checklist labels 'Confirmed Personal Data on Custody Record' and 'Explained Reason for Arrest' have been re-labelled to 'Confirmed Personal Data' and 'Explained Reason for Arrest / Attendance' so they read correctly on both custody and voluntary interviews; the group label moves to 'Personal data & disclosure'.
•Finalise validation: the 'Custody record read?' missing-field warning no longer fires for voluntary attendances or voluntary interviews (previously the check triggered any time a stale custodyNumber was on the record). The 'At least one ground for arrest' warning is now also gated on attendanceMode != voluntary.
•Documents step: the Prepared Statement template substitutes 'Attendance type: Voluntary attendance' for the 'Custody No.' row when the record is a voluntary attendance / voluntary interview.
v1.5.14
•Finish matter is now a dedicated full-page Billing screen (#view-matter-billing) instead of a modal overlay. Top of the screen shows a header card with client / firm / station / date / status and a single Start billing process button.
•When the attendance note is finalised, the 3-step workflow (Documents & attachments → Billing review → Review & complete) is mounted inline on the page below the header — no more popup, full keyboard and screen-reader access, easier to navigate to/from while drafting.
•All previous entry points route to the new screen: form Finish matter / Prepare finish matter buttons, the bottom-bar Finalise/Finish-matter pill, the billing-readiness panel Open finish matter button, and the per-row Open button on the Open matters list.
•Workflow stepper refactored to support both inline and overlay rendering. Overlay path retained as a defensive fallback for older callers and e2e tests; new mountWorkflowInline() is exposed for the dedicated screen.
v1.5.13
•Finish-this-matter workflow: Step 1 (Documents & attachments) now shows an Archive button in the footer — matching steps 2 (Billing review) and 3 (Review & complete). Once the attendance note is finalised the matter can be archived from any of the three workflow screens without forcing the user through the remaining steps.
•Archive button on every step shares the same QuickFile guard (offer to send the bill first if QuickFile is configured but no invoice exists), automatically records billing and office completion timestamps, saves the record as completed, archives it, and switches the list view to the Archived filter.
v1.5.12
•CRM1 official PDF (v16, Feb 2025): UFN header combs (page 1) now populated from the record's UFN — DDMMYY/NNN distributed across the 9 boxes around the printed slash. Previously cleared and left blank even when the firm's UFN was on the matter.
•CRM1 official PDF: removed incorrect dependants mapping. The dependants count was being written into FillText15, which sits on page 7 inside the “calculate the total allowable deductions” block, not the page-8 dependants box. The page-8 dependants question has no AcroForm field on v16 (handwritten on the official form), so the page-7 deductions area is now correctly left blank when no deduction figures are captured.
v1.5.11
•PDF (custody & voluntary): §1 — client middle name row; cover and HTML title use full name including middle
•PDF — §2: single-visit journey shows visit label, multi-client on-site times, and visit notes (aligned with station visit card); voluntary multi-visit also exports visit notes and multi-client details
•PDF — §6: instruction confirmation (signature required, auto date/time) before the advice block; voluntary §6 adds dependants, capital, gaps in evidence, email consent, advice-follow-up fields, and benefit “Other” text
•PWA/telephone PDF cover: client name includes middle name for consistency
v1.5.10
•Workflow Step 2: hide misleading 'Send Bill to QuickFile is now unlocked - click it in the footer' card when QuickFile credentials are not configured
•replace with a clear 'QuickFile not configured' notice and an 'Open QuickFile settings' shortcut so users are no longer told to click a button that does not exist.
v1.5.9
•Fix: app no longer fails to launch with 'Custody Note could not load your saved data - no such table: firms'. initDb() called _safeAddColumn('firms', 'contact_name TEXT DEFAULT " \')
v1.5.8
•Fix: "Generate PDF" on the police-station custody / voluntary attendance note now works for any record, regardless of size. Previously the renderer packed the entire HTML (including base64-encoded signature PNGs and long interview notes) into a `data:text/html;...` URL via `encodeURIComponent`, which silently exceeded Chromium's ~2 MB URL cap on records that contained signatures or substantial notes — the offscreen window would never fire `did-finish-load`, the 60 s timeout would eventually fire (long after the user gave up), and the toast displayed nothing useful. The renderer now writes the HTML to a temp file in `app.getPath('temp')` and uses `BrowserWindow.loadFile()`, which has no size limit
•Fix: "failed to generate police station attendance note — h is not a function" is resolved. An IIFE inside `buildPdfHtml()` declared `var h = ''` to accumulate the multi-station-visit HTML, which shadowed the outer `const h = esc` HTML-escape helper and caused Chromium to throw `TypeError: h is not a function` whenever a record had more than one station visit. The accumulator is renamed to `visitHtml`, and a new regression test (`tests/policeStationAttendanceNotePdf.test.js`) locks the fix in by parsing app.js and asserting only one `h` declaration exists in `buildPdfHtml`
•Fix: PDF generation now surfaces real error messages instead of silently appearing to do nothing. Three new failure listeners on the offscreen `webContents` (`did-fail-load`, `render-process-gone`, plus the existing 60 s timeout) capture and reject the IPC call with a descriptive Error, which the renderer's `.catch` then shows in the failure toast. A new "Desktop folder does not exist" pre-flight error is emitted with OneDrive Known-Folder-Move guidance when the resolved desktop path is missing
•Fix: documents-screen.js now picks the correct PDF builder for each record via `window.getPdfBuilderForData(data)` instead of `getActivePdfBuilder()` (which read the currently-loaded `formData` global). Generating a custody-note PDF while looking at a telephone matter (or vice versa) used to silently use the wrong template; it now always renders the template that matches the record being generated. `buildPdfHtml`, `buildVoluntaryPdfHtml`, `buildTelephonePdfHtml`, and `getPdfBuilderForData` are now exposed on `window` so the workflow screens can reach them
•Security/integrity: the database write path now refuses to encrypt with no master key (throws `CN_NO_MASTER_KEY`) instead of silently writing plaintext, and a generation counter (`_dbWriteGeneration`) prevents async + sync writes from corrupting each other. Backup writes (manual, scheduled, latest) now go through a Promise-based atomic-write helper. Audit-log snapshots are deduplicated on write and pruned past a 90-day retention window on startup
•Security/integrity: licence-store key now refuses to fall back to plaintext-on-disk when `safeStorage` is unavailable (throws `CN_NO_SAFE_STORAGE`); E2E test hooks (`__CUSTODYNOTE_E2E__`) are no longer exposed in packaged builds; sensitive admin IPC channels (`custody:adminLogin`, `custody:adminSetPassword`) are rate-limited to 5 attempts per minute and verify the calling frame is a trusted file:// URL
•Security/integrity: sandboxed `import-record-from-path`, `local-backup-restore`, `open-path`, and `print-pdf-file` IPC handlers — each now resolves real paths via `fs.realpathSync`, restricts to user-reachable roots, validates extension and size caps, and rejects path-traversal / symlink attacks. `set-settings` now validates URL-shaped settings (`cloudBackupUrl`, `syncApiUrl`, `cloudApiUrl`) before persisting. `renderHtmlToPdfBuffer` and `preview-pdf-base64` enforce 25 MB / 50 MB DoS caps
•Database integrity: `PRAGMA foreign_keys = ON` is now set on every DB open; all 30+ schema migrations go through a single `_safeAddColumn(table, def)` helper that only swallows "duplicate column name" and re-throws / logs every other ALTER failure (previously a malformed migration could be silently lost); multi-step writes wrap their UPDATE + audit-log INSERT in `BEGIN`/`COMMIT`/`ROLLBACK` via a new `dbTx()` helper
•Sync: enqueue() no longer deletes a queue row that's currently mid-push (which used to lose the new local change after the in-flight push completed). On any push error, the 60 s health-check skip cache is invalidated immediately so the next cycle actually re-checks `/api/health` instead of pretending the API is reachable
•LAA forms: `safeSet` / `safeCheck` now report (not silently swallow) every form field that couldn't be set during CRM1/CRM2/CRM3/Declaration generation, and the resulting PDFs are flattened (`form.flatten()`) so AcroForm fields can no longer be edited after export. CRM2's CheckBox2 and CRM3's `Name_of_court` mappings are corrected (CheckBox2 only ticks for genuine criminal/attendance/police-station work types; Name_of_court no longer falls back to the police-station name)
•Outlook Web compose: very long URLs (over the practical Edge/Chrome ~6 KB cap) now have their body trimmed with a clear notice rather than silently failing in OWA, and CR/LF in the subject line is stripped to prevent header injection in clients that parse the deeplink. The compose URL is no longer logged to the support bundle (it can contain client PII)
•Renderer hardening: `Save & Exit` and `Save Draft` re-collect form data inside their button handlers so edits made between opening the dialog and clicking the button are no longer lost; finalisation now requires `firmId`, `oicName`, and `ourFileNumber`; the interview-vs-arrival time check uses numeric minute comparison instead of string sort; `Ctrl+Enter` follows the proper validate → finalise flow; the empty-draft check is stricter so finished records aren't mistakenly soft-deleted; `JSON.parse` of stored record data is wrapped in try/catch with a user-visible toast on corrupt rows
•Telemetry: the main-process log now records every successful PDF write with its byte size, source HTML length, and target path; failures log all three plus the underlying error message, so future regressions can be diagnosed from one log line
•Tests: full unit suite is now 1078 assertions, all green (added `policeStationAttendanceNotePdf.test.js` for the variable-shadowing regression and updated `billingWorkflow.test.js` to accept either literal `ALTER TABLE` or `_safeAddColumn(...)` patterns post-refactor)
v1.5.7
•Fix: app no longer fails to launch silently after install. The previously published v1.5.6 .exe shipped with a corrupted app.asar — the top-level package.json had been overwritten with a fragment of the Playwright HTML report, and main.js was truncated mid-file with main/adminAuth.js content appended (producing a duplicate `const crypto = require('crypto')` SyntaxError). Either defect on its own makes Electron exit with code 1 before any of the app's JavaScript runs, with no window, no log entries, and no Windows Error Reporting record. v1.5.7 is rebuilt cleanly from source and installs over the broken v1.5.6 with no data loss
•Fix: startup now sweeps any orphaned `attendances.db.<pid>.<ms>.<hex>.tmp` files older than 60 s from %APPDATA%/custody-note. These are temp files written by the atomic-save path that survive if the app is killed between write and rename. A single user had accumulated 80 of them at 490 MB each (35 GB of leaked disk space), and the resulting near-zero free space on C: is what corrupted the v1.5.6 build in the first place. The cleanup runs once per launch in `cleanStaleDbTempFiles()` at the top of `initDb()` and is idempotent / safe to run when no temp files exist
•Build: `electron-builder`'s file glob (`build.files` in package.json) now explicitly excludes `playwright-report`, `test-results`, `tests`, `docs`, `.git`, `.cursor`, `.vscode`, `.vercel`, `.env*`, scratch dirs (`extracted-installed`, `test-extract*`, `vfy`, `orig-extract`, `verify-pj`), all `*.log`/`*.bak`/`*.tmp` files, and release-only scripts (`release.mjs`, `sync-website.mjs`, `capture-screenshots.js`, `prepare-trial.js`). Smaller asar, fewer files in the same packing pass, fewer surfaces for cross-file corruption
•Build: new `npm run verify:built-asar` step runs automatically AFTER `electron-builder`. It opens the freshly built dist/win-unpacked/resources/app.asar, extracts package.json + main.js + preload.js + updater.js + updateState.js, and verifies each one parses, starts with its expected first line, and meets a minimum size. Any failure aborts the build with exit 1 — corrupted .exe files can no longer be released
•Tests: full unit suite (1071 assertions), Playwright e2e (26 specs, 33-step stress journey), and smoke test (83 checks) all green on the v1.5.7 source
v1.5.6
•Fix: “Billing invoice no.” (the synthetic CN-prefixed reference) is no longer shown anywhere — removed from all 6 PDF templates (custody summary, custody admin, voluntary cover, voluntary call details, voluntary admin) and from the in-app billing panel. It only ever confused users vs. the real QuickFile invoice number; the real QuickFile reference (“Invoiced: #123”) is unaffected and still appears on the form once the bill is sent
•Fix: QuickFile no longer attaches the attendance-note PDF twice. When the workflow billing screen sends user-selected documents (extraAttachments[]), the legacy auto-rendered attendance-note PDF (attachAttendanceHtml) is now skipped — only the documents you tick in the billing screen go to QuickFile. The standalone billing panel (which never sends extraAttachments) keeps its single auto attachment, so neither path regresses
•Fix: Voluntary attendance §3 (Client Details & Welfare) no longer duplicates the forename / middle / surname inputs already entered in §1. §3 now shows a clear read-only sectionNote — “Name: from §1 — … entered in Section 1 (Case Reference & Arrival)” — with the actual saved name appended in green. Removes a long-standing source of inconsistent data entry
•Renderer: sectionNote handler now supports an opt-in dynamicNameRefSection1 flag that appends the live name from data.forename / data.middleName / data.surname — keeps the message accurate without inventing a new field type
•Tests: new tests/v1_5_6_fixes.test.js (13 assertions across 3 suites: PDF/panel cleanup, QF gate, voluntary §3). Existing billingWorkflow + billingOverhaul tests inverted to assert the new absence of “Billing invoice no.”. Full unit suite now 1071 assertions, all green
v1.5.5
•UX: “Add new firm” inline form (§1 instructing-firm picker) is much clearer — every field has an unambiguous label so you can always tell what goes where, even after typing has hidden the placeholder. Labels rewritten: “Firm name” → “Instructing firm name”, “Contact name (person instructed)” → “Contact at firm (the person who instructed you)”, “Contact phone” → “Phone number for that contact”, “Contact email” → “Email for that contact”
•Fix: “Source of referral” field has been REMOVED from the inline Add-new-firm form. Source of referral (Duty Rota / agency / own private etc.) is a property of the matter, not of the firm — a firm can be your own private firm on one matter and act as agency on another. The matter form’s §1 already has its own Source of Referral field, so nothing is lost; you just answer it once, in the right place
•UX: A clear “← Back” button now sits at the TOP-LEFT of the inline Add-new-firm form (separate from the bottom Cancel) so a user who opened the form by mistake or made a typo and wants to start over has an obvious escape hatch without having to scroll past every field
•UX: One-line intro at the top of the inline form (“Add the instructing solicitor’s firm — i.e. the firm that instructed you to attend the station. Only the firm name is required; everything else is optional and can be edited later under Manage Firms.”) makes it instantly obvious what the form is for
•Tests: tests/timeBreakdownPanel.test.js extended with v1.5.5 assertions (Back button, intro, removal of Source-of-Referral, new label strings, new CSS classes including dark-mode rules); full unit suite is now 1058 assertions, all green
v1.5.4
•Fix: VAT field on the Step 2 billing screen now defaults to 20 (i.e. 20%), not 2000. Settings stores VAT as a percentage string ("20") but the rest of the system expects a decimal fraction (0.20); without normalisation the value was being multiplied by 100 twice, so the VAT input rendered as "2000" and the live invoice preview showed an obviously wrong total. The fix normalises the value at the settings boundary and adds defence-in-depth guards in both billing renderers so any old cached value or legacy DB row can’t resurrect the bug
•New: shared _normaliseVatRate(raw, fallback) helper in app.js — always returns a decimal fraction in [0, 1], divides by 100 if raw > 1, and falls back gracefully on null/empty/NaN/negative input
•Tests: new tests/vatRateNormalisation.test.js (18 assertions) covers settings parse, the helper itself across 11 input shapes, and both billing renderers; full unit suite is now 1050 assertions, all green
v1.5.3
•Fix: workflow Step 2 — the QuickFile send button is now clearly labelled “Send Bill to QuickFile” (was “Generate Invoice”, which users did not recognise as the QuickFile action). The locked, unlocked, in-flight, success and failure messages all use the same explicit wording so it is obvious which button uploads the bill to QuickFile
•Fix: Archive guard — if QuickFile is configured and no invoice has been sent yet, clicking Archive (on Step 2 “Archive & close” or Step 3 “Archive”) now shows a 3-way choice: “Send Bill to QuickFile first (recommended)”, “Archive without sending to QuickFile”, or “Cancel”. Stops a matter being silently archived without the bill ever reaching QuickFile
•New: shared showChoice() helper in renderer/toast.js for stacked multi-option modals; exposed on window for any future workflow that needs more than yes/no
•Tests: new tests/quickfileSendButtonAndArchiveGuard.test.js (17 assertions) plus updated billing-workflow regression tests so the v1.5.3 wording and archive guard cannot silently regress
v1.5.2
•Fix: time-breakdown panel — “All visits — chargeable attendance & advice (totals)” now reads from the recorded visit times via aggregateMinuteBuckets, not from the user-overrideable adviceSocial / adviceUnsocial fields in §9. Stops the panel showing e.g. “Visit 1 attendance = 78 mins, All visits totals = 36 mins” when an old override flag is still in place
•Fix: when a manual override on the §9 attendance fields disagrees with the auto totals, the panel now shows an amber “Manual override active” note explaining which figure will actually be billed and how to reset it
•Fix: inline “Add new firm” form on §1 rebuilt as a labelled stacked layout (Firm name *, Contact name, Contact phone with grouped None / N/A / Not applicable quick-fills, Contact email, Source of referral). Each field is on its own row with a clear label that doesn’t disappear when you start typing
•Fix: “Add Firm” button on the inline form is now solid primary (was outline-only and looked disabled in dark mode); “Cancel” is plain secondary
v1.5.1
•Hotfix: rebuild after v1.5.0 shipped a corrupted updater.js that crashed the main process on launch (SyntaxError: Unexpected identifier 'Optimiz')
•Build hardening: verify-release-consistency.mjs now runs node --check on main.js, preload.js, updater.js and updateState.js, and refuses to build if any first line, size or parse check fails
•Tests: new tests/criticalFilesIntegrity.test.js asserts the same guarantees in CI so silent file corruption can never ship undetected again
•Voluntary §1 now leads with Voluntary Status & Rights (attendance, free-to-leave, caution, notice of rights, legal advice, sub-type, constable-present), so the most decisive context is captured first
•Quick Capture: trimmed to the 8 essentials (attendance type, client name, station, offence, DSCC, instruction received, first-contact time, instructing firm, notes); referral / OIC / times / custody # collapsed under "More fields" to keep the screen one-glance
•45-min reason converted to a structured select (already engaged, travelling, in court, awaiting interpreter / AA, awaiting booking, etc.) with an "Other (specify)" details box — validators updated for all three forms
•Density default = compact for new installs (existing user choice respected); textareas capped at ~5 rows and grow on focus; global search hidden while a form is active to stop stray custody numbers triggering record searches
•PDFs: page-1 "Defence summary" panel (outcome, outcome code, next date, next venue, interview position, headline advice, outcome notes) added to custody, telephone and voluntary builders
•PDFs: Appendix A/B renamed to "Annex A — Video Capture" and "Annex B — Video Identification Parade"
•Inline DSCC private toggle on the full custody / voluntary / telephone forms (matches the Quick Capture pattern); checkbox sizing fixed throughout
v1.4.225
•UX audit batch 1 — essentials
•Validation: voluntary form section indices remapped, broken adviceGiven requirement removed, date auto-populated from instructionDateTime when missing
•Bottom bar: dynamic Finish pill (Finalise / Finish matter / Archive) reachable from any section instead of only Section 9
•Bottom bar: removed duplicate progress-dot row
•Outcome chip in form context bar; outcome surfaced on records list and added to search haystack
•PDF: audit footer (fee earner, finalised at, last edit, app version) on every page in custody, telephone and voluntary builders
•Telephone PDF: LAA declaration prose now rendered before the signatures, matching custody/voluntary
v1.4.224
•Sequential multi-visit flow: sorted, collapsible visit cards with per-visit disbursements, notes, miles and parking
•section 9 per-visit breakdown table with auto-fill and manual overrides
•chronology warnings
•CI test fixes
•multi-client per-visit time window for on-station billing
v1.4.223
•Quick Email - clears the form and saved draft after sending so the next email starts fresh
v1.4.222
•Multi-visit station attendances on one record (per-visit travel, waiting, miles, parking, disbursements)
•PDF and LAA validation updates
v1.4.221
•Duplicate attendance: stricter clear policy. New draft now keeps station, OIC, firm, fee earner, date, offences, disclosure officer, interviews, comms log and attending contacts
•everything else (advice, disclosure narrative, custody/arrest, conflict/means, outcome, fees, photos, signatures, CRM14, billing/QuickFile links, officer email log and workflow timestamps) is reset for the new client. Encrypted photo files are no longer copied to the duplicate.
v1.4.220
•Duplicate attendance: DOB, address, and retainer DOB/address cleared for the new client
•retainer autofill waits until client details are entered
•postcode lookup shows a clearer message when the service returns 402 (billing or quota).
v1.4.219
•Quick Email: Delete template button next to Edit for your saved templates (same confirmation as the edit panel)
v1.4.218
•Quick Email to Officer: template-first redesign — pick the email you want to send and the form below adapts to show only the fields needed
•optional sections vanish cleanly when fields are blank
•Save as new template needs only a name
•Edit panel uses [BRACKET LABELS] instead of {{tokens}}
v1.4.217
•Open matters: new Uninvoiced revenue pill shows total projected revenue across all matters not yet invoiced (incl. VAT)
•Reports: removed duplicate Billable Attendances sub-report — its data, filters, and revenue total now live on the Open matters view
•Quality: cross-shell unit-test runner fixes Windows CI (PowerShell does not expand shell globs like bash does)
v1.4.216
•Billing integrity (P1): archived matters no longer appear in billable list — prevents duplicate invoices for cases already billed outside QuickFile
•Quality: full automated stress-test suite — 33-check end-to-end lifecycle journey covering intake, draft, edit-after-save, finalise, lock, archive, billable-list, and search
•Quality: SQL contract regression tests for billable-attendances handler
•Quality: new test:all orchestrator runs unit + e2e + smoke in one go
v1.4.215
•Billing workflow: instructing firm name now stays correct — meta is refreshed after invoice data loads, firms list backfills missing firmName, open workflow syncs form first
•Finish matter: step 3 is Archive + Close only — archiving records billing and office completion automatically (no separate mark-complete buttons)
v1.4.214
•Fix: 'Mark billing complete' and 'Mark office work complete' buttons now work correctly inside workflow (confirm dialog z-index fix)
•Billing default narrative: Police station attendance prefix
•LAA Declaration: CRM3 fields (counsel, advocacy, involved another way)
•Tests: crm1PdfFill regression
v1.4.203
•QuickFile: sync next invoice number with ledger before create
•retry on duplicate invoice number
•Invoice # (QuickFile reference) field in attendance form section 9
•IPC quickfile-suggest-next-invoice-number
•tests updated
v1.4.202
•CRM1 official PDF: fill Comb1-9 for NI
•normalise NI
•fix numeric fields (0)
•middle name in first name
•Fee earner signature: Settings choice draw per record vs saved scan/image
•getEffectiveFeeEarnerSig for PDFs LAA and conflict cert
•main LAA merge
•Conflict certificate: attendance date row and rep signature from effective sig
v1.4.201
•Matter completion workflow (step 3) with office checklist and post-invoice CTAs
•clearer practice-wide vs current-matter billing labels
•billing readiness panel wired
•finalised to completed status for office handoff
•tests and audit updates
v1.4.200
•End-to-end auto-update test from v1.4.199 with customRemoveFiles override
v1.4.199
•CRITICAL: override NSIS customRemoveFiles to skip un.atomicRMDir that aborts on locked files — use Delete /REBOOTOK + RMDir /r instead
•Root cause: Cursor IDE holds app.asar handle; un.atomicRMDir rename fails → 'Failed to uninstall old application files' error 2 → abort
v1.4.198
•End-to-end auto-update verification from v1.4.197
v1.4.197
•CRITICAL FIX: remove /T (tree-kill) from NSIS taskkill — it was killing the installer itself because Windows sees it as a child of Custody Note.exe
•Fix lock probe: bypass Electron ASAR intercept with process.noAsar for accurate file-lock detection
v1.4.196
•End-to-end auto-update verification from v1.4.195 with NSIS REBOOTOK fix
v1.4.195
•NSIS: Delete /REBOOTOK on app.asar and main exe so locked files (IDE/AV) no longer abort uninstall with error 2
•Updater: disable differential downloads to avoid checksum mismatch fallbacks; persist debug NDJSON to %APPDATA%\custody-note\debug-1083ef.log
•Updater: count each install failure once (lastCountedInstallAttemptAt); do not clear failure state on spurious update-not-available while pending
v1.4.194
•Smoke-test: end-to-end auto-update from v1.4.193 (with NSIS pre-clear fix)
v1.4.193
•NSIS installer: pre-clear app.asar and exe with rename fallback to survive external file locks from IDE indexers and antivirus
•Root cause found: Cursor IDE holds file handles on app.asar, blocking all NSIS uninstall/replace operations
v1.4.192
•Smoke-test release to verify end-to-end auto-update from v1.4.191
v1.4.191
•Force app.exit(0) 500ms after quitAndInstall to release file handles immediately, preventing NSIS 'failed to uninstall old application files' errors caused by slow graceful shutdown
v1.4.190
•Smoke-test release to verify the fixed installer handoff from v1.4.189
v1.4.189
•Fix critical installer handoff race condition: window destruction in closeForInstall triggered app.quit() before quitAndInstall could spawn the NSIS installer
•Harden NSIS custom script with retry kill, 6s total wait (up from 2s), and file-based diagnostic logging to cn-nsis-install.log
•Add non-silent diagnostic install mode for visible NSIS error diagnosis
•Suppress disableWebInstaller warning by setting autoUpdater.disableWebInstaller = true
v1.4.188
•Smoke-test release for the new modular updater to validate 1.4.187 to 1.4.188 update flow
•No functional app changes beyond the updater verification bump
v1.4.187
•Replace the monolithic main.js updater with dedicated updater.js and updateState.js modules
•Add persisted updater state, electron-log based updater logging, and explicit failed-install loop protection
•Use a single guarded quitAndInstall path and remove the unsafe direct install fallback
•Keep existing update IPC/UI wiring while improving recovery messages and aligning status text with the 6-hour check cadence
•Make NSIS runAfterFinish explicit and add focused updater regression tests
v1.4.186
•Restore a direct end-of-case button for Documents, Attachments and Invoice
•Make the documents and invoice workflow reachable from the final page without relying on the bottom nav or post-finalise banner
v1.4.185
•Billing empty-state now distinguishes 'no records yet' from 'no matches for current filters'
•Uploaded file checkboxes in billing invoice no longer misleadingly appear selectable (they cannot be auto-attached to QuickFile)
•Finalise: duplicate-check and confirm-dialog failures now show user-visible warnings instead of failing silently
•Add .catch error handling to all fire-and-forget setSettings and firmSave calls
•Fix null-safety crash in billing preview recalculation when elements are not yet rendered
•Remove dead _wfBillingLoaded variable from billing screen
•Add diagnostic logging to billing view load, invoice creation, and email-modal save
v1.4.184
•Fix billing view showing empty — archived records that still need invoicing now appear in the billing list
•Include archived_at in billing view data for UI badges
v1.4.183
•Fix billing failure — remove duplicate IPC handler registration that blocked all billing and QuickFile handlers from loading
•Clean up duplicate previewPdfBase64 entry in preload bridge
v1.4.182
•Fix blank document preview — PDFs now open in system viewer
•Add Save to Desktop and Email buttons for each generated form
•Remove redundant Section 9 billing card — use post-finalise bar or bottom nav instead
v1.4.181
•NSIS installer now kills running app before overwriting files — prevents 'Failed to uninstall old application files' error
•Hardened auto-update shutdown: force-exits process after quitAndInstall to release file handles
•Enabled elevation for installer to handle locked files
v1.4.180
•Billing workflow: generate CRM1-3, Conflict Cert, Client Instructions, Prepared Statement, and Attendance Note PDFs directly in the Documents step
•Select which generated forms and uploaded files to attach to QuickFile invoices
•Multiple PDF attachments now uploaded to QuickFile with each invoice
•Wider 20px scrollbars for improved accessibility
v1.4.178
•Fix views not displaying content - replaced broken absolute-positioned CSS transitions with reliable display toggle
•Ensure all screens are scrollable and responsive
v1.4.177
•Fix faint button text colors for better readability
•Bump border-radius on all buttons to 10px
•Widen scrollbar from 8px to 14px for easier scrolling
•Progress bar rebuilds correctly when switching between form types (e.g. custody to telephone)
•Smoke test updated to handle attachments-before-billing confirm dialog
v1.4.111
•Auto-migrate legacy saved templates: old templates with hardcoded names are automatically converted to {{placeholders}} on first use
•Saved templates now correctly fill in current officer name, client name, station and date instead of showing stale values from when they were saved
•Billing: LAA forms checklist (attach official PDFs), Applicant Declaration in generated docs; previews without forced print; Desktop LAA PDF filename client — station — date — form — firm
•Billing readiness: clearer finalise → invoice → archive steps; rebuild section progress dots when switching form type (e.g. telephone)
•Smoke test: dismiss attachments prompt before asserting billing overlay
v1.4.110
•Fix: Settings Save no longer overwrites Outlook Web email defaults
•Sync email settings to DB value at startup (prevents stale defaults)
•saveSettings merges cached values with stored settings consistently
•Fixed scroll cut-off — Reports, Authorities, Help, Station Mileage and Quick Capture screens now scroll fully to the bottom
•Fixed attendance form content being clipped in compact and comfortable density modes
•Slimmed the right-side scrollbar from 44px to 10px — cleaner, more space for content
•Native scrollbars across the app are now thin (8px default) and scale via Settings
•App layout now adapts to viewport height — smaller windows reduce nav bar size and hide text labels to save space
v1.4.105
•Fixed postcode URL encoding — postcodes with spaces (e.g. SW1A 2AA) were being sent as SW1A%2B2AA instead of SW1A2AA, causing lookups to fail even with a valid API key
v1.4.104
•Fixed postcode lookup — 'Find Address' button now correctly reads the API key from settings and fills all address fields
v1.4.103
•Fixed: billing emails open via Outlook Web compose consistently
•Fixed settings save for email-related options
•Fixed race condition in Officer Email modal that could overwrite compose routing mid-flight
•Added settings note clarifying Outlook Web requires a work/school Microsoft 365 account
v1.4.102
•Bug fixes and improvements
v1.4.101
•Bug fixes and improvements
v1.4.100
•Bug fixes and improvements
v1.4.99
•Bug fixes and improvements
v1.4.98
•Bug fixes and improvements
v1.4.97
•Bug fixes and improvements
v1.4.96
•Bug fixes and improvements
v1.4.95
•Bug fixes and improvements
v1.4.94
•Calendar date picker for Date of Birth
•Medication field now starts with Yes/No/N/A dropdown
v1.4.93
•Fix: Outlook Web email defaults no longer reset when saving other settings
v1.4.92
•Add built-in Disclosure Request and Bail Confirmation templates to Quick Email
•Fix Quick Email templates not filling in officer name, client name, station and other details when a template is selected
•Live-update template body and subject as form fields are typed, so placeholders reflect the latest values
•Fix Save as Template not detecting typed values and converting them to reusable placeholders
•Prevent auto-subject from overwriting template-set subject line
v1.4.89
•Protect attendance data on startup: stop instead of opening a blank database when encrypted records or licence files cannot be read
•Prevent portable builds from auto-updating into a different data location and force a synchronous database flush on shutdown
•Fix records list false-empty states for Custody / Voluntary / Telephone filters, stale pagination, and broaden indexed search
•Improve new attendance screen readability with corrected form text colours, visible context bar, and better compact/high-contrast text sizing
v1.4.88
•Fix Quick Email button not appearing on Home screen and Records list after app launch
v1.4.87
•Quick Email: add type of attendance, date and time fields; templates save with placeholders (e.g. {{oicName}}, {{clientName}}) for reuse
v1.4.86
•Quick Email: email an officer without creating a record first (Home screen + Records list)
•Save as Template: save any email you compose as a reusable template directly from the email modal
•Fix: Outlook Web compose applied to OIC emails when settings cache was empty
v1.4.85
•Fix app initialisation failure caused by variable scope conflict in renderField (SyntaxError: Identifier wrap already declared)
•Fix cloud backup connectivity when antivirus HTTPS scanning is active
v1.4.84
•Fix cloud backup connectivity when antivirus HTTPS scanning is active (self-signed certificate in chain)
v1.4.83
•Authority auto-fill: select a record and authority type, auto-fill from record data, prompt for missing fields, generate print-ready PDF
•Authorities view: dynamic cards with Fill from record button and record picker modal
•In-record authority picker: Generate Authority PDF dropdown in standalone Authorities section
v1.4.82
•Add in-record Email Instructing Solicitor section with template picker and open-in-email-app
•Custom email templates: scope (Use anywhere / Officer only / Solicitor only) and Edit in Settings
•Officer Email OIC modal: saved custom templates (officer/all) with placeholders; remember last template used
•Solicitor email picker shows default preset plus scoped custom templates; subject/body in PDF when present
•Peer-review fields (representations, follow-up) and solicitor email block included in PDF output
v1.4.80
•Open the QuickFile invoice automatically after creation when a preview link is available
•Improve billing panel contrast so text, inputs, and totals stay readable
•Add explicit dark-mode billing panel styling for clearer review screens
v1.4.79
•Surface Billing & Invoice directly in the time recording section
•Show invoice status and the billing workflow in a clearer in-form card
•Refresh the billing card immediately after QuickFile invoice creation
v1.4.78
•Make attachments easier to spot in the time recording section
•Promote the add attachment action with clearer styling and messaging
•Add an empty state so users can see where files will appear
v1.4.77
•Fix QuickFile credential clearing and cloud backup modal listener issues
•Restore firm context and concise no-reply officer email templates
•Make Auto section navigation responsive and align installed modules messaging with licensed add-ons
v1.4.76
•Added home-page section visibility controls so busy front-page blocks can be hidden
•Saved the new home visibility preferences in settings for a cleaner default workspace
v1.4.75
•Visual layout redesign across dashboard, editor shell, and settings control centre
•Added layout/display/accessibility preferences with richer status states and responsive polish
v1.4.74
•Admin and authorised accounts now automatically receive all add-ons (QuickFile, Email Templates)
v1.4.73
•Font size slider range extended up to 50px for maximum readability
•Header and navigation auto-clamp at large font sizes so controls stay usable
•Adjustable scrollbar size slider in Settings (1x to 4x width)
•Display density toggle: Compact, Default, or Comfortable spacing
•Persistent section sidebar on wide screens (1200px+) for quick navigation
•Context bar stays visible while scrolling instead of auto-hiding
v1.4.72
•Larger, more visible scrollbar that is easier to grab
•Font size slider now goes up to 28px for better readability
•Offence field in Quick Capture is now full-width for longer descriptions
•Time arrived labels clarified: your arrival vs client arrival at station
•New client arrival time field in Quick Capture separate from your arrival
•Offence auto-populates from Quick Details into Section 4 when empty
•Scroll performance improvements to reduce glitching
v1.4.71
•Billing: new Billing & Generated Documents panel on each custody record with matter details, billing preview, document list, review confirmation checklist, and one-click QuickFile invoice creation
•Billing: invoice narrative auto-generated from client, station, date and offence with manual editing, live recalculation of attendance fee, mileage, parking, VAT and totals
•Billing: duplicate invoice protection with warning prompt, billing audit log tracking all invoice and document actions, and email pack preparation for sending invoice to instructing firm
•Station Mileage: new admin view to set mileage from base for each police station, with search and bulk save — mileage auto-populates on billing panel
•Reports: new Billable Attendances report showing all completed but uninvoiced records with search, date range and firm filters, summary totals, and direct invoice shortcuts
•QuickFile: full invoice creation service that matches or creates the firm as a QuickFile client, adds line items for attendance fee, mileage and parking with VAT, and stores the invoice ID, number and link back on the custody record
v1.4.70
•Add-on licensing now gates QuickFile and Officer Email Templates by entitlement
•New Authorities section with proposed wordings and shortcut access from home and the gear menu
v1.4.69
•QuickFile: easier setup and import flow with Save and test / Save and import actions, plus a direct shortcut from Firms to QuickFile settings
•QuickFile: firm import now fetches clients in supported pages, improves client/contact mapping, and keeps imported firm details editable in the app
•Outcomes: removed case outcome status in favour of decision-only flows, with corrected bail fields for charged with bail, bail without charge and released under investigation
•Charges and email add-on: charged outcomes now pre-fill offence details from earlier sections, and email subject/body wording has been updated
•QuickFile firms remain local to each user's own encrypted app database and are not bundled into app updates
v1.4.66
•Reliability: database and backup writes now use atomic temp-file persistence to avoid dropped saves and rename races
•Sync: remote pull no longer overwrites dirty local records and now surfaces protected conflicts in diagnostics and the footer
•Security: supervisor approval now requires re-auth with the recovery or admin password before it is logged
•Security: idle session lock now requires a real password check before unlocking
•Sync: supervisor approvals now update sync metadata so approval state propagates correctly across devices
v1.4.65
•Records list: type filter (Custody/Voluntary/Telephone) now works; date sort has newest and oldest options.
•List actions: open, delete and duplicate show error toasts on failure; archive has 5-second Undo before committing.
•Duplicate record: time-sensitive fields (instruction time, waiting times, arrival notes) are cleared for the new visit.
•Bank holidays: fallback extended to 2030; GOV.UK API cache used when available.
•Recovery password: after 3 wrong attempts you can quit and try again later instead of being forced to a fresh database.
•Settings: auto-lock after inactivity (5/10/15/30 min); plaintext licence warning when safeStorage unavailable.
•First-launch wizard: recovery password prompt with machine-ID warning; optional set before finishing.
•Reports: CSV export with date range; Firms table: Edit button for in-place editing.
•Record form: History button shows amendment log; Add-Ons: custom email templates with placeholders.
•Fix: home backup status refreshes after success or failure; local restore checks for IPC before calling APIs.
v1.4.64
•First launch: a dismissible tip banner now appears suggesting users pin Custody Note to their taskbar or Start Menu for quick access. Shown once on Windows only.
v1.4.63
•Settings: backup restore lists now show readable labels — 'Latest snapshot' or '12 Mar 2026, 10:00 — hourly archive' — instead of raw filenames, for both cloud and local restore panels.
v1.4.62
•Settings: remove redundant App Status card (Backup/Network/Version). These values are shown in the footer and the main Backup card.
•Records list: PDF button now opens a print/preview window instead of silently saving to Desktop — choose Print or Save as PDF from the dialog.
•Backup: smarter retention — keeps last 24 hourly archives plus one per day for 7 days (max 31 files). Previously kept 48 hourly which only gave 2 days of history.
•Backup restore: after restoring from cloud or local backup, the scheduler is suppressed for 60 seconds then takes a fresh backup of the restored state — prevents the restored database being immediately overwritten by a stale scheduled run.
v1.4.61
•Settings: fix permanent 'Checking…' spinners in the Status card — network and backup values now update instantly when Settings opens.
•Settings: fix 'Backup now' button — now calls backup directly without requiring a record to be open.
•Settings: fix 'Check for update' button — now triggers the update check correctly from the Status card.
•Settings: add 'Restore from Local Backup' panel — lists backups from your local and off-site folders, lets you select and restore any one. Safety copy saved first.
•Email OIC templates: outcome-aware body text. When outcome is known, Templates 2 and 3 pre-fill charges, court date/time, and bail details from the record. When charged without bail or remanded, bail conditions are never mentioned.
v1.4.60
•Installer: Start Menu shortcut now reliably appears in the Windows apps list. Added menu category folder 'Custody Note' and explicit shortcut name so the app is easy to find and pin.
v1.4.59
•Records list: add PDF button to each row — exports directly to Desktop without opening the record.
•First-launch setup: add email address field; email is saved to Settings and pre-fills the From address. Test-email button appears as you type your address.
•First-launch setup: email is now saved when you click Save & Finish.
v1.4.58
•Outcome section: add Court Time field. When 'Charged without Bail', 'Charged with Bail', or 'Remanded in Custody' is selected, Court Date auto-fills to the next day and Court Time auto-fills to 10:00 — both remain fully editable. Court time also appears in the custody note print view.
v1.4.57
•Officer Email Templates: compose opens in Outlook Web (Microsoft 365). Copy Email, Mark Sent, and Cancel. Optional add-on in Settings → Add-Ons.
v1.4.56
•Fix Officer Email Templates add-on toggle: corrected layout rendering in Settings, toggle now auto-saves instantly without requiring the Save button, and the Records list updates immediately when the add-on is enabled or disabled.
v1.4.55
•Fix: Officer Email Templates add-on now activates correctly on app startup. Previously the Email OIC button would not appear until Settings had been visited in the same session.
v1.4.54
•Add Officer Email Templates add-on module. When enabled in Settings → Add-Ons, an Email OIC button appears on each record in the Records list. Click it to open a modal with three pre-filled templates: First Attendance Disclosure Request, Follow-Up / Outcome Request, and No Reply Follow-Up. Templates auto-populate officer, client, station, firm, date and fee earner details from the record. Supports Open in Outlook Web, Copy Email, Mark Sent, and Cancel. A Sent badge appears on the list row after marking sent. Feature is fully optional and has no effect on the core app when disabled. Designed for future paid licensing.
v1.4.53
•Remove PDF buttons from header and bottom bar. Add Print PDF button to each record in the list. First form section now has attendance type selector (custody/voluntary) to switch modes. Remove CRM1 signature requirement. Remove pre-charge engagement field and CN12/CN13 codes. Fix app version display in Settings. Updated PDF advert: Free trial at www.custodynote.com. Hide custody number from voluntary records. Responsive footer layout. Updated help documentation.
v1.4.52
•Fix PDF: attendance note and declaration now combined into a single PDF. Print buttons now open in-app print preview with Print dialog. Fixed voluntary attendance interview data missing from PDF output. Removed duplicate form element ID.
•Applicant declarations in records: Declared badge, Print Declaration button
•Unsigned declaration prompts for reason and shows on PDF
v1.4.44
•Print PDF button added to records list — export and open PDF directly from the record list
•LAA Declaration with client signature now embedded in Consultation section (after client understanding checkboxes, before conflict check) for both custody and voluntary attendances
•Fixed voluntary form checklist groups not rendering ('Data & disclosure' group was missing from render order)
v1.4.43
•Check for Updates button added to hamburger menu — visible on every page
•DB export cached — avoids re-serialising the entire database when data hasn't changed
•saveDb() is now idle-aware — defers disk writes until user has been idle for 3 seconds
•All backup functions (quick, hourly, manual) now use async file writes instead of blocking synchronous ones
•Manual Backup Now button uses cached export for near-instant response
v1.4.42
•Renamed 'First contact within 45 mins of instruction' to 'Within 45 mins of duty call' with Yes/No/N/A options (all form types)
•Fee Earner / Rep field added to custody form section 1, auto-fills from settings
•Firm contact details (name, phone, email) now saved back to firm database for auto-populate on future use
•Major performance fix — DB flush interval increased from 500ms to 30s, disk writes made async to stop main-process blocking
•Autosave debounce increased to 3s, autosave interval to 30s, backup scheduler much calmer (30min quick, 90s idle grace)
•Sync worker deferred from 1s to 15s after record change to reduce contention
•Added prominent green Backup Now button in form and app header for manual save+backup on demand
•Scrollbar widened from 8px to 16px with visible track and larger grab area
v1.4.41
•Voluntary outcome simplified — merged caseOutcomeStatus and outcomeDecision into single Outcome field
•Added new voluntary outcomes: Officer to Notify, Released Under Investigation, Youth caution, Referred to diversion programme, Further voluntary interview required
•Removed Charged options from voluntary form (use convert-to-custody instead)
•Removed Client Aftercare section from voluntary form
•Removed QuickFile integration from settings
•Removed editable LAA fee rates from settings (hardcoded defaults retained)
•Added Additional Modules Installed section to settings (placeholder for future modules)
•Website changelog now shows only the last 5 releases
v1.4.40
•Voluntary form rebuild — now mirrors the custody form with custody-specific fields removed, instead of a separate rewritten form
•Voluntary form gains full Offences section (4 offences with dates, mode of trial, statute)
•Voluntary form gains full Disclosure section (co-suspects, CCTV, witnesses, exhibits, PNC)
•Voluntary form gains full Consultation section (conflict check, eligibility, case assessment, advice checklist, signatures)
•Voluntary form gains multi-interview structure (same as custody)
•Voluntary form gains full Time Recording section (travel, waiting, time breakdown, case stage, invoice)
•Compact bottom bar — buttons further reduced to 24px min-height
v1.4.37
•Performance: typing is now smooth — single 200ms UI refresh instead of six cascading debounce timers per keystroke
•Autosave debounced to 1200ms; editor activity reported at most every 5s (no longer on every keystroke)
•Form change/blur no longer run full collectCurrentData on every field change — only before save/navigation
•Progress bar no longer rebuilds section index on every keystroke; list view caches parsed data per row
•Main process: audit diff skipped for draft saves (only computed on finalise); new index for list query
•Performance panel (Ctrl+Shift+P): shows autosave duration, sync queue, backup status
•PDF preview shortcut moved to Ctrl+Shift+F (Ctrl+Shift+P now opens performance panel)
•9 automated performance tests added
v1.4.36
•Critical finalise fix: replaced confusing validation modal with simple confirm dialog — user now sees 'X field(s) incomplete. Finalise anyway?' with OK/Cancel
•Fixed sync pull crash: removed undeclared ctx variable reference that caused ReferenceError on every sync pull
•Immediate disk persistence: finalise writes are now flushed to disk immediately (not debounced) to prevent data loss
•Toast rendering fix: confirm dialog messages now display line breaks correctly
•Enhanced debug panel (Ctrl+Shift+D): shows last finalise attempt, result, and DB status
•61 comprehensive automated tests covering the full finalise flow
v1.4.35
•Finalise flow streamlined: removed extra confirmation dialog — clicking Finalise now saves immediately when all fields are complete
•Clear progress feedback: toasts shown at every step ('Saving finalised record…', 'Finalise error: …')
•Stuck finalise flag auto-clears after 10 seconds (was 30s) so retrying is faster
•Entire finalise flow wrapped in try-catch — JS errors are now caught and shown to the user instead of silently failing
•Validation modal now shows helpful toast: 'X field(s) incomplete — click Finalise Anyway to proceed'
•Sync pull guard, retry with DB verification, and force-status fallback from v1.4.34
v1.4.34
•Critical finalise fix: added 3-attempt retry with DB verification after each write
•Sync pull guard: server can no longer overwrite a locally-finalised record back to draft
•Autosave hardened: quietSave blocked during finalisation
•Added attendance-force-status IPC as a last-resort fallback
v1.4.33
•Replaced 2-minute backup interval with idle-aware scheduler — backups now defer while typing and only run when there are real changes (minimum 10-minute gap)
•Fixed finalise not persisting — autosave race condition eliminated by stopping autosave and setting record status before the save IPC
•Calmer sync messages — 'Saved locally' instead of alarming 'API unreachable' when offline at police stations
•Enhanced diagnostics panel (Ctrl+Shift+D) with backup state, timing, and renderer status
•Sync on reconnect — online event and visibilitychange trigger immediate sync attempt
•Diagnostics panel — Ctrl+Shift+D shows queue length, connectivity, last error for support
v1.4.23
•Voluntary Attendance mode — new first-class workflow for PACE voluntary interviews (client not in custody)
•Home screen: separate cards for Custody Attendance and Voluntary Attendance; Voluntary uses dedicated green card
•Voluntary form: 7 sections; conversion to custody when arrested; billing readiness; confidentiality reminder
v1.4.22
•Save/Exit now shows a menu with 'Finalise & exit' and 'Save as draft & exit' — matches the help text and makes finalising easier to find
•Finalise flow — shows 'Finalising…' toast immediately so you know it's working; improved error handling when save fails
•Firms now save correctly — firms table schema fixed (contact_name was missing, causing saves to fail); error toasts when firm save fails; 'Add new firm' in form includes source of referral; selecting a firm auto-fills contact name, phone, email, LAA account, and source of referral
v1.4.21
•Fixed ENOENT crash when saving database — prevents concurrent saveDb calls from racing on rename; ensures userData directory exists; wraps save in try-catch so errors no longer crash the app
v1.4.20
•Attachments — now accepts any file type (PDF, Word, Excel, CSV, images); file icon shown for non-image attachments; size limit raised to 15MB
•Finalise — fixed silent failure when finalising a record; any pending auto-save is now cancelled before the finalise call to prevent a draft-save from undoing it; errors are now surfaced with a toast
•Performance — removed duplicate progress bar rebuild that ran on every field change; context bar update debounced to 250ms
v1.4.19
•Sync fix — httpPost now follows HTTP redirects (301/302/307/308) and checks status codes
•Sync fix — increased sync timeout from 10s to 30s to prevent timeouts with larger record sets
•Sync fix — push no longer blindly clears sync_dirty; checks sync_version to avoid losing changes made during push
•Sync fix — server-side push now writes to S3 in parallel batches of 10 (5x faster)
•Sync fix — server-side pull now reads S3 in parallel batches of 10 with 200-record cap to prevent timeouts
•Attachments moved to end of record near Invoices section with clearer description and guidance
•Legacy attachments from custody/disclosure/interview sections auto-migrated to new unified location
v1.4.18
•Sync fix — manual sync now reports correctly when not configured; pending count includes soft-deleted records
•Backup clarity — settings screen shows a clear summary of where backups go (local, off-site, cloud)
•Detect cloud folders button in Settings — finds OneDrive, Dropbox, Google Drive automatically
•Case assessment — now a dropdown (Strong / Medium / Weak / N/A) with reasoning box
•Client instructions — new larger text box for full client instructions above the summary
•Clothing / shoes / phone seized — if Yes, prompts for what was seized and notes
•Offence dates — clearer Start date / End date labels when Between is selected
•Dropdown defaults — most disclosure and evidence fields default to No or N/A
•Performance — form change handlers now update only the changed field inline; full DOM collection deferred
v1.4.17
•First-launch wizard — step 2 now asks where to back up (OneDrive, Dropbox, Google Drive auto-detected)
•Cloud folder detection — scans for OneDrive, Dropbox, Google Drive, iCloud and offers them as backup destinations
•Version check fix — v1.4.16 GitHub release was stuck in Draft; now published correctly
v1.4.16
•Performance — app reacts faster to input; debounced save, scoped DOM queries, reduced layout thrashing
•Database writes batched — disk I/O no longer blocks on every keystroke
•Smoother transitions — replaced expensive CSS effects with lightweight alternatives
•Offence dropdowns now show full grouped list on focus with type-ahead search
•Offence date qualifiers — On, Before, After, Between, On or about, Unknown
•Benefit type — N/A option added
•Confirmation of instructions — signatures optional via dropdown
•Next location hidden when bail without charge (police station to return to covers it)
•Sync status fix — no longer shows conflicting messages
•Sync now button restored on home screen
•Cloud backup works on restricted networks (cached entitlement)
v1.4.15
•Sync status fix — no longer shows conflicting 'all synced' then 'pending' messages; counts now reflect actual state
•Sync now button restored on home screen for manual sync
•Cloud backup works on restricted networks — cached entitlement used when licence server is unreachable (e.g. government WiFi)
v1.4.14
•Automatic record sync — changes sync within seconds across devices, Sync now button removed
•Version and changelog drift fix — website and app versions stay in sync
v1.4.13
•Security hardening — licence keys no longer sent in URLs; rate limiting and session checks improved
•Cloud key recovery — recover your encryption key from the cloud using your licence key if you forget your recovery password
•Recovery password must be at least 10 characters with uppercase, lowercase and a number
•Sync status and Check for updates moved to the footer with connection and backup status
v1.4.12
•Sync status and Check for updates button moved to bottom of screen with other status indicators
•Fix for sync indicator briefly showing before status loads
v1.4.11
•Sync status now confirms all records synced with count
•Check for updates button on home screen
•Update button changes to Install when update is ready
v1.4.10
•Cross-device record sync — records now automatically sync between devices every 2 minutes
•Licence validation fix — subscription status now correctly updates across devices
•Sync now button on home screen for immediate sync
v1.4.9
•LAA fee rates updated to Standard Crime Contract 2025 (SI 2025/1251) — fixed fee £320 and escape threshold £650 confirmed and harmonised across all police stations
•Licence status badge now visible permanently in the footer on every screen — shows Trial / Licensed / Expiring with colour coding
•System Status diagnostic panel added to Settings — shows live licence, cloud backup, and auto-update status with clear explanations
•Trial users now see an inline licence key entry box directly in Settings › Licence — no extra clicks needed
•Home screen shows a trial banner with direct link to licence key entry when on a free trial
•Fee earner name now saves and persists correctly across sessions
•Removed 'Prepare trial for email' developer tool from user-facing gear menu
•Version number no longer auto-increments on every build — versions only change on an explicit release
•Removed debug instrumentation
•Forgot-key rate limit fix
v1.4.8
•Licence key easier to find (home card, gear menu)
•Cloud backup clearer messaging
•Check for updates in Settings
•Support FAQ instead of Email Support
•Share Custody Note card
•New CN monogram icon
v1.4.7
•Cloud Backup section moved to top of Settings Backup card
•Footer 'Local backup only' is clickable and opens Settings
•Added 'Checking...' state when verifying cloud backup status
•Fresh entitlement check when opening Settings
v1.4.6
•Automated version and changelog sync with website
v1.4.5
•Automatic updates — the app now silently downloads and installs updates from GitHub Releases so subscribers always have the latest version
•Managed cloud backup — automatic encrypted backups to AWS London with no credentials stored in the app
•Support forum integration — community forum linked across the website
•Removed manual AWS S3 settings from the app (now fully managed via subscription)
v1.4.2
•Managed cloud backup — automatic encrypted backups to AWS London with no credentials stored in the app
•Support forum integration — community forum linked across the website
•Removed manual AWS S3 settings from the app (now fully managed via subscription)
v1.4.1
•Bug fixes and stability improvements
•Version display and build pipeline updates
v1.4.0
•UI refinements and accessibility improvements
•Backup and restore flow improvements
•Performance optimisations for large datasets
v1.0.0
•Initial public release
•Full attendance records with PACE review tracking (1st, 2nd, 3rd review — due and actual)
•Telephone advice (INVB) recording
•Quick Capture for incoming calls
•Client details, offence picker with type-ahead search
•Disclosure and OIC fields
•LAA outcome codes, stage reached, and fee codes
•Time recording (travel, waiting, attendance)
•Firm tracking and multi-firm billing
•Disbursements with VAT treatment
•PDF export of attendance notes for firms and clients
•Reports by month, firm, and station
•Local encrypted backups every 2 minutes (AES-256-GCM)
•Off-site folder backup (OneDrive, Dropbox, etc.)
•Tamper-proof cloud backup on AWS (subscriber add-on): permanent retention, UK data centre, per-subscriber isolation
•Licence key activation (30-day trial and paid subscription)