What's New

Every release, in order — right back to the very first version, before it was even called PATKeeper.

Current version: v1.65.0
v1.65.0Cover Pages
Your details, your reference and your logo — all correct on the cover
  • Fix Logos were being stretched out of shape. A logo's proportions were recorded once when you uploaded it, and anything saved before the light and dark versions were introduced came back as a square — so a wide logo was squashed to fit. Proportions are now measured from the image itself every time it's drawn, everywhere it appears: page headers, cover pages, certificates and client logos. Nothing needs re-uploading.
  • Fix The extra paragraph you can add in Report Settings never appeared on a Detailed Test Report. It worked on the Summary Report but was silently dropped by all four cover styles. It now prints on every one of them, keeps your blank lines as real paragraph breaks, and shrinks slightly rather than overflowing if it's long.
  • New The document reference is now printed on the cover page, not only in the page footers — so a client quoting it back doesn't have to hunt for it.
  • New A "Tested By" block on the Banner and Editorial covers giving your company name, address, phone and email. These were previously only in footer small print; a test report is a record of who carried out the work, so they now sit beside the client's details.
  • Change The Banner cover has been reworked. The company logo is roughly twice the size and properly fills the coloured band, and the client's logo has moved out of the band to sit above the client's name, at double its previous size and on white where it's far more legible.
v1.64.0Report Layout
Detailed reports no longer waste half a page
  • Change The bordered visual inspection and electrical results tables are back in each asset's detail block. They were compressed a few versions ago to fit more per page; the saving wasn't worth the loss in readability.
  • Change Each block is now sized to what's actually in it and flows down the page, with a new page starting only when the next block genuinely won't fit. Previously a fixed number of blocks went on each page regardless of how tall they were, which left large bands of empty white space on most pages.
v1.63.1Wording
Notes covering several assets now read as plurals
  • Fix Summary page notes and portal group badges described a group of assets in the singular — "This asset…" even when it covered thirty. They now read "These assets…" where more than one is involved. Certificates, individual detail blocks and single portal rows are unchanged, since those really are about one asset.
v1.63.0Client Logos
Your client's logo on their reports, alongside yours
  • New A client's logo now appears on every page of their report, top right, opposite your own — and on all four cover styles.
  • New The logo automatically switches to its light or dark version depending on what it's sitting on, so it stays visible on the darker Banner cover.
  • Fix Long company names in the report header could run underneath the client logo. The header text is now held to the space actually available.
v1.62.2Cover Styles Fix
Choosing a cover style now actually changes the cover
  • Fix Cover style selection had no effect whatsoever. Two versions of the title page code existed in the file and the older single-layout one silently took precedence, so whichever style you picked, you got the same cover. The stale copy has been removed and the file checked for any other duplicates like it.
v1.62.1Report Settings Fix
The Report Settings dialog is fully working again
  • Fix Report Settings opened but stopped halfway through setting itself up, leaving the cover style cards, the branding preview and the Save and Cancel buttons unresponsive. The dialog appeared correct but nothing in it could be used.
v1.62.0Report Archive
Every report you generate is now filed and findable
  • New Every report gets its own reference — in the form PK-20260802-A4F19C — printed on every page and shown in the preview bar, so a report someone emails back to you months later can be traced to exactly what was generated and when.
  • New Reports are kept automatically, with the PDF stored privately against your account rather than only existing in your downloads folder.
  • New A Report Archive you can search by reference, client or filename, and download from directly.
  • Change Deleting a report never removes the record of it. The file is cleared and the deletion is stamped with who did it, when, and why, but the reference and its history are kept permanently — a reference can never be reused or quietly made to disappear.
v1.61.0Report Accuracy
A repair note that had been going missing on large reports
  • Fix Repair notes were vanishing from reports. A failure that was repaired and then tested again later printed no note explaining the repair, because the note was worked out from the asset's current status rather than from that specific test. On a large report this could hide the entire explanation of a failure. Notes are now tied to the test they describe.
  • New "Page 3 of 12" on every report page, so a printed copy can be checked for completeness.
  • Change Summary report readability: units are no longer repeated in every cell since the column headers already state them, figures are printed in black, and only failed readings are picked out in red. The Overall Status column keeps its full colour coding.
  • New The report builder offers to limit a report to the last test batch when you haven't already filtered to one.
v1.60.0Cover Pages
Four cover styles, and one place to set reports up
  • New Four cover styles for the Detailed Test Report — Classic, Banner, Sidebar and Editorial — so a report can be made to sit alongside your own documents rather than looking generic.
  • Change Report Settings is now a single dialog with three tabs — Content, Branding and Cover Page — instead of settings spread across separate places.
  • Change The Beta and Stable channel addresses have moved out of Report Settings, where they never belonged, into Company Details.
  • New Clickable links extended to the repaired assets table and to the failed assets list on the Summary Report cover, so you can jump straight from either to the asset itself.
v1.59Summary Report
The Summary Test Report rebuilt as a dense, scannable table
  • Change A line per test, grouped by room with a banner row for each, angled column headers to fit more columns on an A4 page, and a simple P, F or dash for each test with the actual reading printed beside it.
  • Change A dash now marks a test that wasn't applicable, replacing the less obvious "S".
v1.58.0Certificates
Continuity and flash tests now appear on certificates
  • Fix An appliance tested by protective conductor continuity rather than earth bond produced a certificate reading "No electrical test data recorded" — despite having been tested perfectly properly. Continuity and flash results are now shown like every other reading.
v1.57Failure Wording
One explanation of a failure, used everywhere
  • Change Reports and certificates worked out the reason for a failure separately, which meant the same failure could be described in two different ways. There is now a single explanation used by both.
  • New Continuity and flash added to the list of reasons a failure can be explained by.
  • Fix Five places were still showing raw device descriptions rather than your translated ones. Every display path has been swept and corrected.
v1.55Report Styling
Detail blocks now match the look of a certificate
  • Change Solid result badges and tinted callout boxes in each asset's detail block, matching how certificates already looked. The colours are taken from your own branding rather than being fixed.
v1.53 – v1.54Detailed Report
A proper title page, visual inspection detail, and a stricter definition of "repaired"
  • New A book-style title page on the Detailed Test Report, full visual inspection detail per asset, and a failures list on the cover you can click to jump to any of them.
  • Change "Repaired" now means the test immediately before the pass was a failure. Previously any earlier failure anywhere in an asset's history was enough to mark it as repaired, which overstated how much remedial work had actually been done.
v1.51 – v1.52Reports & Branding
Three report types, and a branding studio you can see as you edit
  • Change Three report types, all A4 portrait — Detailed, Detailed with Photos, and Summary.
  • Change Certificates are now generated from the asset itself rather than from the Reports menu, since a certificate always covers one asset and never a selection.
  • New A branding studio showing a live preview of your report as you change colours, logo and header, instead of having to generate one to find out.
  • Fix Saving Report Settings was wiping your branding. The save replaced the whole settings record rather than the part you'd edited, so changing anything on the Content side silently discarded your logo and colours.
v1.50.0Portal Parity
The portal catches up with the main app
  • Change The client portal is now full width, with collapsible filters, a location list that narrows as you filter, and the same Asset and Inventory view toggle the main app has.
  • New Reports and certificates generated on the free plan carry a short "Report made using the free version of PATKeeper" line. Pro removes it.
  • Change Pricing and billing wording made clearer: the trial is free and takes no card details.
v1.49.0Repaired Assets
An asset that failed and was put right is now shown as exactly that
  • New "Repaired" is now recognised everywhere — in the app, in the portal and on reports — rather than a repaired asset simply reading as a pass with a failure buried in its history.
  • Change The rules deciding whether an asset counts as a pass, a repair or a failure now live in one shared file used by both the app and the portal. They had previously been written twice, which is precisely how the two came to disagree.
v1.48.1Import Fixes
A long-standing import bug, and nothing dropped on the way in again
  • Fix Polarity Test was empty on every CSV import ever performed. The column name was being matched with a stray trailing space, so it never matched and the value was silently discarded.
  • Change All three import routes now keep columns they don't recognise rather than discarding them. An import happens once — anything dropped as it comes in is gone for good, so it's now held even where the app has nothing to do with it yet.
  • Change .DB imports now retain every individual test result row, including ones not yet mapped to a named field.
v1.48.0One Schedule
The portal shows the same dates as your calendar
  • Fix The portal was showing a different due date from the calendar. It worked the date out separately, based on the oldest asset on record, so clients with a few stale assets appeared years overdue when their next visit was actually months away.
  • Change The due date and job length now come straight from the schedule — the same figures your calendar shows, including any visit you've already moved. The portal simply displays them.
v1.47.1Portal Fix
The suggested date and job length now work
  • Fix The portal couldn't work out when testing was due, so it showed a generic message and the Suggest a date button did nothing. Dates were being handled in a different format in the portal than in the main app.
v1.47.0How Long It Takes
The portal knows how long the job usually takes
  • New The portal tells the client how long testing usually takes them — worked out from their own past visits, not a guess. A site that's taken four days each year is offered four days; one that's grown from one day to two is offered two.
  • New The booking form asks how many days will be needed, pre-filled with that figure, and the client can adjust it.
  • New Confirming a request books out the agreed number of days in your calendar, rather than assuming it matches last time.
v1.46.0Suggested Dates
The portal proposes the date testing is actually due
  • New The booking form now opens with the due date already filled in, taken from the retest schedule, and says where it came from — so clients are agreeing to a real date rather than guessing.
  • New If testing is already overdue, it suggests the soonest sensible weekday instead of a date in the past.
v1.45.1Portal Fix
Portal records show on first load
  • Fix The client portal showed no records until Reset Filters was clicked. The next-due banner was rendering before the table, so if anything about the scheduling data was unexpected it stopped the table appearing at all. The records now render first, and the banner can no longer affect them.
  • Change The portal shows its version at the foot of the page, so it's clear which build is live.
v1.45.0Clarity & Speed
A clearer billing panel, visible repeat flags, and a faster portal
  • Fix Billing & Credits no longer mixes up your plan with the one you could upgrade to. Current Plan now describes what you're actually on; upgrading to Pro is its own section underneath.
  • Fix Repeat test flags are visible without opening each asset. Flagged assets are marked on the collapsed row with a count, so you can spot them at a glance.
  • New Show only repeat tests — an "only" tickbox next to the flag setting narrows the table to just the flagged tests.
  • Fix The client portal loads faster. Finding a client's records was scanning every record on the account rather than going straight to them.
v1.44.1Import Menu
Column mapping is easier to find
  • Change Import with Column Mapping now appears in the Data menu alongside the normal import, as well as in Technician's Tools.
v1.44.0Fixes & Photos
Column mapping on demand, faster photos, and repeat-test flagging
  • Fix Only credit pack purchases count towards the licence — subscription payments don't. This is now enforced by the system rather than left to get it right each time.
  • New 🧭 Import with Column Mapping in Technician's Tools. The matching step only appeared automatically for files that didn't look like a PATKeeper export — now you can choose it for any file.
  • Change Photos start uploading the moment you pick them, with a thumbnail and progress, so by the time you press Save it's usually already done. Leave without saving and the photo is quietly discarded.
  • New Flag possible repeat tests — a tickbox above the table highlights the same asset tested twice within 5 minutes (or 15 minutes, an hour, or the same day). They're only highlighted, never removed.
  • Change The client portal now offers to arrange testing even when no retest date has been worked out yet.
v1.43.0Asset Notes
Note an asset before it's ever been tested
  • New 🔧 Asset Note in Technician's Tools — leave a note on any asset without opening its client first. Pick the client, type or scan the asset number, and its description comes up so you can be sure you've got the right one.
  • New Assets that don't exist yet can be added on the spot. Spotted something on site that's never been tested? Give it a number and a description and it goes onto the client's list straight away, so your note isn't lost waiting for a test that hasn't happened.
  • New These show in their own awaiting first test section — never mixed in with tested equipment — and fill in properly the moment their first real test is imported.
  • New Notes and photos save in the background here too, so nothing freezes while a photo uploads.
v1.42.0Client Booking
Clients can see when they're due and suggest a date
  • New The client portal now shows when testing is next due, right at the top — green when it's a way off, amber within two months, red once it's overdue.
  • New Clients can suggest a date straight from their portal, with an alternative, a contact name and any notes about access. No account needed, same as the rest of the portal.
  • New 🔔 Notifications in the main app, showing requests as they come in with a count on the button. Accept a date and that client's next visit is rescheduled to it automatically; decline with an optional note back.
  • New Clients with a request waiting are marked with a ✏️ in the calendar, in both month and agenda views.
  • New Once you've accepted, the client's portal shows the booked date rather than the overdue warning.

Accepting a date reschedules the visit the same way as moving it by hand — your test records are never altered.

v1.41.0Import Anything
Bring in any spreadsheet, not just a tester export
  • New Excel files can now be imported — .xlsx, .xls and .xlsm, alongside CSV and tester .DB files.
  • New A column matching step for files that aren't PATKeeper exports. PATKeeper reads your headings, works out which of its fields each column belongs to, and shows you the match alongside real sample data from your own file so you can see it's lined up correctly before importing.
  • New Anything it can't place is left unmatched rather than guessed at, and you can set any column by hand — or leave columns out entirely. Two columns can't be pointed at the same field by mistake.
  • New If your spreadsheet has no client column — common when a file covers one site — you can name the client once for the whole import.
  • Change Files that already look like a PATKeeper export skip the matching step and import exactly as before. Imported rows still go through the usual duplicate check.
v1.40.0Buy It Outright
You can now buy the licence, with everything you've spent taken off
  • New Buy the five-year licence directly from Billing & Credits. Whatever you've already paid — subscription months and credit packs alike — comes off the price, and you only pay the difference.
  • Change Payment history is now recorded in full, so licence progress can be worked out reliably.
  • New If what you've already spent covers the full price, the licence is simply granted — you're not asked to pay anything further.
  • New Refunded payments are deducted from what you've accrued.
v1.39.0Own It Outright
What you spend counts towards owning PATKeeper
  • New Credit packs come off the price of a licence. Billing & Credits shows how much of the £500 five-year licence your pack purchases have already covered, and how much is left. Spend £40 on credit packs and the licence costs you £460.
  • New Credits you've already used still count. It's based on what you've spent on packs, not on credit sitting unused — so nothing is wasted by actually using them.

Refunded payments are deducted. Buying a licence doesn't accrue towards another one.

v1.38.0Report QR Codes
Printed reports link back to the live records
  • New Reports now carry a QR code on the cover, along with the web address beneath it. Scanning it opens that client's portal, so a printed report in a folder still leads back to the current records rather than becoming a snapshot that goes stale.

The QR only appears for clients who already have a share link. Generating a report never creates one — that stays your decision.

v1.37.0No More Hanging
Notes save in the background instead of freezing the screen
  • Fix Saving a note with a photo appeared to hang. The upload and save were blocking the whole window with no indication anything was happening. Both now show a small progress panel — what's uploading, how far along — and you can dismiss it and carry on while it finishes.
  • Fix The same freeze when adding a Note for Next Import is fixed the same way, and the form clears immediately so you can add the next one straight away.
  • New Notes now record who wrote them, ready for accounts with more than one technician.
  • Change 📅 Calendar is now its own button rather than being buried in a menu, and is named Calendar instead of Retests Due.
  • Change "Reschedule to" now starts on the job's current date rather than empty.
  • Change Clearer labels: Add Manual Test Record, Test Result in the filters, and Inventory / Description View.
  • Change The light/dark switch is now a plain labelled button, matching the rest of the toolbar.
v1.36.0Drag to Reschedule
Drag a job to a new date
  • New Drag a job onto any day in the month view to move it there. The day you're hovering over is highlighted as you go, and dropping it asks whether the job should stay the same number of days before anything changes.
  • New Change job length from the client menu, without moving the start date — useful when a job turned out to take longer than last time.

Dragging needs a mouse. On a phone, use the client menu and Reschedule instead.

v1.35.2Move Dialog
Moving a visit now does what you asked it to
  • Fix Asking for a 2-day job produced a 1-day one. The number was being treated as a gap between the first and last day rather than a count of days on site. Ask for 2 days and you get 2 days.
  • Fix The move dialog no longer hides the calendar — it now floats over it, so you can still see what you're moving things around.
  • Change PATKeeper works out how long the job took last time — counting the days actually spent on site — and offers that as the default, with a plain confirmation of the dates you're moving to before anything changes.
  • Change Removed the prompt about moving other visits. Consecutive days are already treated as one visit, so it no longer applied.
v1.35.1Visits, Not Days
A job spread over several days is one visit again
  • Fix Testing a site over consecutive days was being treated as separate jobs — three days on site produced three bars in the calendar, each needing to be moved separately. Consecutive test days (including runs either side of a weekend) are now recognised as a single visit, shown as one bar, and moved as one.
  • Fix The date range now opens on "All time" instead of showing the blank Custom state every time you open a client.
v1.35.0Smarter Rescheduling
Moving a visit keeps the shape of the job
  • Change Rescheduling now shifts dates rather than flattening them. Assets due across three days stay across three days — they no longer all land on one date because you moved the visit.
  • New You're asked how long the job will take. Moving a visit shows how many assets are involved and how many days they currently span, and lets you change it — set 3 days and they spread evenly across three, set 0 and they all fall on one day.
  • New Clients tested across several days are handled properly. If a client's assets came from more than one visit, you're asked whether to move just that visit or all of them together — moving them together shifts each by the same amount, so the gaps between visits stay as they were.
  • New Swiping between months on a phone now follows your finger, with the next month sliding in as the current one moves off, instead of jumping straight to it.
v1.34.1Reschedule Fix
Moving a visit now moves all of it
  • Fix Rescheduling only moved part of a batch. Assets were being grouped against the client's most recent test date rather than the date they were actually tested on, so anything tested on a different day kept its original due date. A reschedule now moves the whole visit, and each entry shows which visit it belongs to.
  • Fix The ✕ in Retests Due no longer sits over the Year / Month / Agenda buttons.
  • Change Quick range now starts on "All time" rather than a blank custom range.
  • Change Your client sort order is remembered instead of resetting to A–Z every time you open PATKeeper.
v1.34.0Rescheduling
Move a visit without touching the test records
  • Change Clicking a client in the calendar now opens a short menu instead of a wall of asset rows — view the client, list the assets if you actually want them, or move when they're next due.
  • New Delay a visit by any number of days, weeks or months. The delay counts from the current due date, not from today, so putting something back a month means exactly that.
  • New Reschedule to a specific date when you already know when you're going. Either way the whole visit moves together, and it can be undone at any time to go back to the original date.
  • Fix The ✕ no longer sits on top of the Close button in Retests Due — the redundant Close button has been removed.

Rescheduling never alters your test data. Due dates are still worked out from the last test and the retest interval; a moved visit is recorded separately and can be undone.

v1.33.1Calendar Tweaks
Close it like everything else, and jump straight to a client
  • Fix Retests Due now has the usual ✕ in the corner like every other window, rather than only a Close button.
  • New Open a client directly from the calendar. Agenda rows have an Open client button, and when you click a batch or a day that belongs to a single client, the panel offers to open them — so you can go from "who's due" to working on them in one step.
v1.33.0Notes & Mobile Menus
You choose which saved notes get attached — and menus behave on a phone
  • Fix Saved notes were silently failing to attach. Matching required the asset number to be written identically, so "0135" and "135", or a stray space off the tester, meant nothing attached and nothing told you. Matching now ignores case, spacing and leading zeros, and also considers tests that came in as duplicates rather than only brand-new ones.
  • New Notes are no longer attached automatically. After an import, any saved notes matching what you brought in are listed for review — tick the ones you want, edit the text before it's applied, and rotate photos that came in sideways. Anything you don't attach stays saved for next time.
  • Change Menus open as a drawer from the bottom on phones. As dropdowns they were running off the edge of the screen, shunting the button sideways and dimming the page.
  • Change The client switcher on phones now sits under the client name instead of floating over your data.
  • Change "Custom" has been removed from the Quick range list — editing either date puts you into a custom range anyway, so it never needed to be something you picked.
v1.32.1Readability Fix
The Add Photo buttons are legible again
  • Fix The Add Photo and Change Photo buttons — in Asset Details, the Technician's Helper and Note for Next Import — were picking up form-label styling and rendering as small grey uppercase text on the button colour, which was hard to read. They now look like every other button.
v1.32.0Sorting & Layout
Sort your clients, scan from the search box, and a tidier phone view
  • New Sort the client list by name A–Z or Z–A, most or fewest assets, most recently tested, longest since tested, or most failures. Clients with no tests yet always sort last on the date options, since there's no date to rank them by.
  • New A camera button sits beside the search box for scanning an asset barcode, rather than being buried in the filters.
  • Change Asset View / Inventory View has moved down next to the table, where the data it affects actually is, instead of sitting among the filters.
  • Change Available Numbers now lives only in Technician's Tools and works without a client open — it has its own client picker, defaulting to whichever client you're viewing.
  • Change Drag-and-drop file areas are hidden on phones, where dragging a file isn't possible. Import from the Data menu instead.
v1.31.2Header Fix
The fixed header no longer sits on top of your data
  • Fix The header was covering the top of the client list and table instead of sitting above them. Content now clears it properly, and the spacing adjusts automatically when the menu bar wraps onto two rows on narrower screens.
v1.31.1Fixed Header & Notes
The menu bar stays put, and Note for Next Import got a lot more useful
  • Fix Clicking a client in the sidebar now actually switches client. It was calling the wrong thing internally and doing nothing at all.
  • Change The header stays fixed at the top of the screen as you scroll, with the client list and your data sitting underneath it.
  • New An obvious "All clients" button at the top of the sidebar to get back to the full client view. The old Switch Client button has been retired, since the sidebar does the job better.
  • New Note for Next Import now shows which client the note is for, and lets you change it — so you can leave a note for any client without opening them first.
  • New Scan a barcode straight into the Asset ID field instead of typing the number.
  • New The asset's description appears as you type its number, along with its location, when it was last tested and how many tests are on record — so you can see immediately whether you've got the right asset, or whether it's one PATKeeper hasn't seen yet.
  • Change Note for Next Import now lives only in Technician's Tools, rather than appearing in two places.
v1.31.0Client Switching
Switch between clients without going back to the list
  • New A client list now sits down the left once you're working in a client, showing every client with their record count and the current one highlighted. Switching is one click instead of a trip back to the client grid.
  • New Collapse it to a narrow strip of initials when you want the room for your data — the app remembers which way you left it.
  • New On phones it works differently. A sidebar would swallow a phone screen, so instead there's a bar along the bottom showing the client you're in; tap it and the list slides up as a sheet within thumb reach, with a search box for accounts with a lot of clients.
  • New Search the client list directly from the sidebar or sheet, and jump back to the full client grid from the bottom of either.
v1.30.1Loading & Layout
You can see what's happening while it loads
  • Change The startup spinner is now a real progress bar. It fills as each part of your account arrives and names what's just loaded — including how many test records were found — so a slow load reads as progress rather than a hang.
  • Change The app now fills the width of your screen instead of stopping at a fixed width, so large monitors show far more of the table at once. Margins still scale down sensibly on smaller screens.
  • Fix If one part of your account fails to load, the rest still loads and the failure is shown rather than leaving the screen stuck.
v1.30.0Tidying Up
Export across clients, a tools menu, and clearer date ranges
  • Fix The export wizard now offers every client on your account, whatever you currently have filtered or selected. Exporting two clients at once no longer means clearing your filters first.
  • New 🔧 Technician's Tools menu, gathering Note for Next Import, Available Numbers and Scan Asset in one place instead of spread across the interface.
  • New ℹ️ About menu with What's New, the Privacy Policy and the version number.
  • Change Quick range: "Custom" and "All time" are now separate options — they were one entry doing two different things. All time explicitly clears the dates. Today and Last calendar year have been added.
  • Change The retest interval and the calendar tickbox are now grouped together under a Retest calendar heading in Edit Client, rather than sitting loose among the address fields.
  • Change Removed the record count line beneath the PATKeeper name.
v1.29.6Calendar on Mobile
The calendar now works properly on a phone
  • Fix Year view no longer runs off the side of the screen. Long client names were forcing the tiles wider than the phone, cutting off the right-hand column. Tiles now fit the screen and drop to a single column on narrow phones.
  • Fix Day numbers and asset counts no longer overlap in month view, where they were printing on top of each other as things like "2830". The count now sits below the date, and the whole grid tightens up on small screens.
  • New Swipe left or right in Year or Month view to move forward or back a year or a month. Vertical scrolling is unaffected — only a clearly sideways swipe changes the view.
v1.29.5Agenda View
The agenda now lists clients, not thousands of assets
  • Change Agenda is now one row per client per month, showing the client, how many assets are due and the date range they fall across. A month with two visits reads as two rows instead of six hundred.
  • New Click any client to expand it and see every asset behind that number, with the same detail as before. Overdue clients are flagged with a count and colour-coded, and each month heading now totals both clients and assets.
v1.29.4Year View Fix
Month tiles now lay out properly
  • Fix The month name, totals and client list in Year view were running together on a single line instead of stacking. Tiles now lay out correctly, with the client list anchored to the bottom so every month lines up.
v1.29.3Year View
Each month now tells you who you're visiting, not just how much is due
  • Change Month tiles now headline the number of clients due that month, with the total asset count alongside — a month is really a list of visits, so the number of clients is the more useful figure to lead with.
  • New Each tile lists the clients themselves with their asset counts, biggest first, so you can see at a glance that March is one large site rather than nine small ones. Clients with overdue assets have their count highlighted, and where more than five clients fall in a month the remainder are summarised.
v1.29.2Calendar Batches
Batches now read as jobs, not as hundreds of individual assets
  • Change The month view now draws each batch as a single bar reading [Client], [number] assets, instead of listing assets individually. When a batch's assets fall due across several days, the bar spans those days — so a visit reads as one job rather than as a wall of separate entries.
  • New Bars that carry over from the previous week, or continue into the next, are marked at the edge so it's clear the run isn't finished.
  • New Click a bar to see every asset in that batch, or click the day itself for everything due that day regardless of client.
  • Fix Days with large numbers of assets due no longer overflow the calendar cell with unreadable entries.
v1.29.1Calendar Refinements
Batch sizes in the calendar, and clients you can leave out of it
  • New Every entry in the retest calendar now shows the client in full, along with how many assets were in their last batch and when that batch was tested — so you can see at a glance whether a due date means a quick visit or a full day on site.
  • New Show this client in the retest calendar — a tickbox on each client, on by default. Untick it for dormant or one-off clients you don't schedule, and they drop out of every calendar view. Any clients you've hidden are listed at the bottom of the calendar so they can't be forgotten about.
v1.29.0Retest Calendar
See what's due, when — and never find out too late
  • New 📅 Retests Due, under the Data menu. Every asset you hold is placed on a calendar according to when it next needs retesting, worked out from its most recent test.
  • New Three ways to look at it. Year shows all twelve months at a glance with a count against each, and flags months containing overdue work. Month is a full calendar grid — click any day to see exactly what's due on it. Agenda is a running list, month by month, with anything overdue pulled to the top.
  • New A retest interval on each client. Clients differ — one site may be on twelve months where another is on three — so you can now set an interval per client in New Client and Edit Client. It overrides whatever interval is recorded against the individual assets, and each entry in the calendar shows which of the two it used.
  • New Overdue, due-within-30-days and scheduled are colour-coded throughout, and every list shows how long until an asset falls due — or how long it's been overdue.
  • New Filter the whole calendar to a single client, and see a count of any assets that have no retest interval set at all, so they don't quietly go missing.
v1.28.0Billing & Credits
A clearer picture of what Pro actually gets you
  • New Billing & Credits now compares Free and Pro side by side — monthly credits, how long credits stay valid, top-up packs and support, with the cost per test record worked out for you. The figures come from your actual plan settings rather than being written into the page.
  • Fix Top-up packs no longer offer a purchase that can't complete. Packs are a Pro feature, but the Free plan was showing working Buy buttons that would have failed at the checkout. They're now clearly marked as Pro, with a direct upgrade instead.
  • Change Removed the separate "Welcome Import Credits" figure. Welcome credits are ordinary credits now, so they're already counted in your main balance — showing them twice was misleading.
v1.27.0Export Wizard
Pick exactly what goes in an export — and modals scroll properly on phones
  • New Export wizard. CSV and .DB exports now open a wizard instead of a fixed summary. Keep everything in your current filters or selection, or tick individual clients and locations — with a record count beside each — to narrow the export without touching your filters.
  • New Only the latest test for each asset. One tick exports the current state of the register rather than the full test history. The running total, asset count, date range and filename all update live as you change the scope.
  • Fix Modals now scroll correctly on phones. Long popups — Asset Details in particular — were sized against the full screen height rather than the visible area, so the bottom of the panel (including the Technician's Helper) sat underneath the browser's address bar with no way to reach it. Every modal now measures against the visible viewport and scrolls properly.
  • Fix The .DB export's warning about which test groups carry verified limit data now recalculates as you change the export scope, instead of describing the records you started with.
v1.26.0Welcome Credits
Your first month's credits now arrive with your account
  • Fix Welcome credits are now granted on sign-up. New accounts are meant to get 100,000 credits for their first month, to bring existing test data across without it counting against a monthly allowance. That allocation was configured but never actually issued, so new accounts started with nothing. It now arrives automatically with the account.
  • Fix Welcome credits are now spendable. They were being issued into a separate pool that imports couldn't draw from — so the balance showed, but nothing could use it. They're ordinary credits now, and are always spent first, before your monthly or topped-up credits.
  • Fix Several security improvements to how account and credit data is protected.

Credits are still tracked only — imports record what they would have cost, but nothing is charged or blocked.

v1.25.0Billing & Credits
Full customer-facing billing page
  • New Settings → "💳 Billing & Credits" — current plan status, renewal/cancellation date, Test Credit balance broken down by monthly vs. purchased, next expiry, Welcome Import Credits remaining, credit packs with effective price-per-credit, and recent activity.
  • New Subscribe to Pro, buy a credit pack, or open Stripe's Customer Portal — all three wired to the real Edge Functions built earlier, verified against a real balance query showing the actual 500 credits already on this account.
v1.24.0Credits (tracking only)
Imports now record what they'd cost, without affecting anything yet
  • New Every import now quietly records how many credits it would have used, while the credit system is being built out. Nothing about the import itself changes — it always proceeds regardless of the result, and any failure in the tracking call is only ever logged, never shown or allowed to interrupt a real import.

Not enforced yet, by design — this is purely observational until the billing system is ready to go live.

v1.23.0Technician's Helper
Persistent tips per asset — e.g. where to get the best earth bond connection
  • New Asset Details now has a "🔧 Technician's Helper" section — a note and/or photo attached permanently to that specific asset, shown every time it comes up. Unlike a Note for Next Import, this never gets consumed — it's a standing tip, not a one-off.
  • New A small 🔧 icon now shows next to the Asset ID in the main table whenever a helper exists, with the note as a hover tooltip — visible at a glance without opening the asset.
  • New Renaming an asset's ID correctly carries its helper along with it, rather than leaving it stranded under the old ID.
v1.22.0Note for Next Import
Capture a note or photo for an asset before its test data even exists
  • New "🔦 Note for Next Import" (next to Scan Asset) lets you jot a note or attach a photo against an asset ID — e.g. "fuse replaced" — while it's still on your mind, even though no test has been imported for it yet. It doesn't create a test record on its own; it just waits.
  • New The next time a test for that same asset gets imported (any client/location, CSV or .db), the waiting note and/or photo is automatically merged into it — filling in Notes and the photo only if the imported test doesn't already have them, never overwriting real device data.
  • New If the same asset gets multiple new tests in one import, each waiting note is matched to a different one rather than the same note being applied twice.
v1.21.0Beta / Stable channel
In-app groundwork for running a separate beta build
  • New Report & Certificate Settings now has fields for a Stable site URL and a Beta site URL. Once both are set, the Settings footer shows which channel you're currently on (Stable/Beta badge) and a "Switch to..." link to the other one.
  • New A single line near the top of the file (APP_CHANNEL) marks which channel a given copy of this file is — flip it to 'beta' before deploying a build to a separate beta URL.

This is the in-app half of the feature — it doesn't host anything or decide what's "stable" on its own. You'd still deploy two actual copies of this file to two URLs yourself, and choose when to promote a beta build to the stable one; this just gives the app a way to know which is which and link between them.

v1.20.1.DB export
A partial export now includes every test group, not just ones it directly touches
  • Fix Exporting a filtered subset (one client, a date range, etc.) only created TestGroup entries for groups actually referenced by that subset — any group the export didn't happen to touch was silently missing, even with real captured data for it elsewhere in the account. Now every group the account has ever seen is included regardless of what's actually being exported.
v1.20.0Client Portal
Client-facing view now shows translated descriptions too
  • New The public client portal now shows the same translated descriptions as the main app, wherever they're used — the shared-data function was extended to also send your Abbreviations dictionary, since the portal is a separate, unauthenticated view that couldn't otherwise see it. Search there now matches translated text too, not just the raw original.
v1.19.1Abbreviations
Three refinements to the add/edit flow
  • Fix Typing an abbreviation that already has a translation was auto-filling Full text and correctly enabling Save — but landing on already-saved data isn't itself a change worth saving. Save now stays disabled in that case, and only enables once something's genuinely edited from there.
  • New Changing or clearing the Abbreviation field now clears Full text too, rather than leaving a stale translation from whatever was previously typed sitting there.
  • New Full text now has its own live suggestions too, drawn from your existing translations — helps catch cases where the same underlying item might otherwise get worded slightly differently across a few abbreviations.
v1.19.0Abbreviations
Detects an existing translation as you type, and a clearer arrow between the fields
  • New Type or select a raw description that already has a translation, and the Full text field auto-fills with it — the button relabels to "Save" and a note explains this will update the existing entry rather than create a duplicate. Clear the field or type something new and it reverts to "Add" automatically.
  • New Added a → between the two fields, making the "translates from this, into this" relationship clearer at a glance.
v1.18.3Abbreviations
Live suggestions now search every untranslated description, not just the top 15
  • Fix The autocomplete under the Abbreviation field was searching the same capped, top-15 list shown in "Common descriptions" below — so typing something further down the frequency list (or used only once) found nothing. Now searches the full set of untranslated descriptions; the capped list below stays as a quick-pick shortlist, unaffected.
v1.18.2Abbreviations
Save/Add buttons now stay disabled until there's actually something to save
  • New Both the quick popup (from Asset Details) and the full Abbreviations modal now grey out their Save/Add button until you've genuinely typed or changed something — consistent with every other Save button in the app.
  • Fix Clicking a suggestion (either the live autocomplete or "+ Add translation") fills the field in directly rather than through typing, which doesn't trigger the browser's normal change detection on its own — accounted for so the button correctly enables the moment a suggestion is picked, not just when typing manually.
v1.18.1Abbreviations
Fixed the Settings menu button not opening at all, and streamlined the Asset Details flow
  • Fix Opening Abbreviations from Settings did nothing at all — a classic mistake where the button handler was wired directly to the modal function, so the click event itself got passed in as if it were a description to look up, crashing silently before anything could show. Fixed by explicitly discarding the event instead of passing it through.
  • Changed The 🔤 Abbreviation button in Asset Details now opens a small, focused popup — just that asset's description and a single field for its translation — rather than the full management modal. Saving returns straight back to Asset Details instead of leaving you in the abbreviations list.
v1.18.0Abbreviations
Fixed overlapping fields, a new report setting, and quick access from Asset Details
  • Fix The Add/Edit form's two text fields could visually overlap in narrower views — caused by a site-wide minimum input width fighting against the form's layout. Both fields now shrink properly to fit.
  • New Report & Certificate Settings has a new option: "Show the originally recorded description alongside a translated one" — off by default, since most reports won't need it. Certificates always show the translated version; ticking this also notes the original raw text next to it.
  • New Asset Details has a "🔤 Abbreviation" button right next to the Description field — jumps straight to editing that description's translation if one already exists, or pre-fills a new one ready to fill in if it doesn't.
v1.17.2Abbreviations
Three real bugs, fixed
  • Fix The Edit form's buttons weren't sized consistently and could push the modal into horizontal scrolling — "Save" now stays a single line at the same height as everything else, and the row wraps properly instead of overflowing.
  • Fix Inventory View now groups assets by their translated description, not the original raw text — so "13IEC", "13 IEC", and "13a iec" (all translating to the same thing) now correctly merge into one group instead of three separate ones.
  • Fix Search was only checking the raw stored description, not the translated version — so searching "15A" wouldn't find "153M" once it translates to "3M 15A Cable". Now checks both, so a search matches whichever form — raw or translated — you actually typed.
v1.17.1Abbreviations
Editing, collapsible sections, and live suggestions while typing
  • New Each abbreviation now has an Edit button alongside Remove, rather than needing to delete and re-add to change one.
  • New "Your abbreviations" and "Common descriptions with no translation yet" are now collapsible sections, so the list doesn't force scrolling to reach the Close button once it grows.
  • New Typing in the Abbreviation field now shows matching untranslated descriptions live underneath, narrowing as you type — click one to fill it in rather than needing to open the suggestions list separately to find it.
v1.17.0Abbreviations, Reports placement, tidier notes
Three usability improvements
  • New Abbreviations dictionary — Settings → 🔤 Abbreviations lets you define translations like "134W" → "13A 4Way Extension Lead", applied across every client. Lists show the translated version; the raw text is never changed, still shown when you open the asset directly, and is exactly what gets exported. Includes a suggestions list showing your most common untranslated descriptions, ranked by how often they appear, so you don't have to think of them all from memory.
  • Changed The Reports dropdown moved from the very top of the page down to sit between the stats cards and the import drop zone — closer to the data it actually acts on, rather than a reach to the top of the screen every time.
  • Changed Notes and repair codes from the tester (often ALL CAPS on the device) now display in normal sentence case everywhere they're shown — tables, certificates, summary reports. Only applied for display; the raw text is untouched underneath and unaffected on export.
v1.16.2Scan Asset
Fixed the scanner getting stuck if camera permission is denied
  • Fix If the camera never actually started (permission denied, or no camera available), clicking Cancel could fail to close the modal at all — a known quirk of the scanner library, which can throw when told to stop a camera that was never running, and nothing here was catching that. Now only attempts to stop the scanner if it genuinely started, and can't block the Cancel button from working regardless of what the library does.
v1.16.1Certificates
Fixed the footer disclaimer referencing a retest interval that might not be shown
  • Fix The footer text always said "does not certify ongoing fitness for use beyond the stated retest interval" — even on certificates where retest info is switched off in Report & Certificate Settings, so there's no "stated" interval to refer to. Now reworded automatically to match whichever setting is actually in effect for that certificate.
v1.16.0Visual Inspection
Now shows which specific item actually failed, not just "Checked" across the board
  • Fix The device records exactly which visual inspection item failed (Case, Plug, Lead, Switch, Socket, Environment, Suitability, or Other) as a bitmask in a field this app was never reading — confirmed by checking real failed visual tests in genuine device files, where it carries real, non-zero data. Every failed visual inspection was showing all 8 items as "Checked" with no way to tell which one was actually the problem. Now decoded on import and correctly shown per-item on the certificate, and encoded back out correctly on export too.

⚠️ The order the 8 items map to their bits was inferred from the order already used on the certificate table, not confirmed against official documentation — round-trips correctly either way, but worth checking one test you remember the specifics of to confirm the right item is actually being named.

v1.15.2Certificates
Fixed "Ω" showing up as "©" in measurement readings
  • Fix The PDF library's default font doesn't support the Ω (ohm) character used in raw device measurement text — it was silently substituting a different glyph instead of failing cleanly, which is why it showed up as "©". Replaced with "ohms" before it ever reaches the PDF, fixed everywhere at once since every measurement field (Earth Bond, Insulation, Leakage, RCD, etc.) already goes through the same shared text-safety helper.
v1.15.1Summary Report
Failed Assets table now always shows a reason
  • Changed The Notes column on the Failed Assets table used to sit blank if no written note was entered. It now falls back to naming which specific test(s) actually failed — e.g. "Earth Bond", "Insulation" — the same reasoning already used on certificates, just as short labels rather than full sentences to suit a table.
v1.15.0Clean Slate
Delete all client and test data, with proper safeguards
  • New Settings → "🗑️ Delete All Data (Clean Slate)" permanently removes every client and test record — including logos, share links, saved documents, attached photos, and group specification data. Three separate confirmations: real counts shown up front, typing "DELETE ALL" to proceed, and one final explicit check before anything happens.
  • New Cleans up thoroughly, not just the visible data — storage files (saved PDFs, test photos) are removed too, not left behind as orphaned files nobody can see or reclaim.

Deliberately scoped to client and test data only — company details and report/certificate settings are your own app configuration, not "client data," and are left untouched.

v1.14.0Duplicate detection
Every record now hard-records its own raw time, permanently, at creation
  • Fix Stopped interpreting time for identity entirely. Every record — however it enters the app (.db import, CSV import, manual entry, a correction made in Edit Record) — now gets a raw timestamp assigned exactly once, from whatever the source actually said, and never recomputed or reinterpreted afterward. Export always writes that same stored value back out, never a freshly-derived one. Identity compares that hard-recorded value directly.
  • Fix Existing records that predate this (which is most of an older account) get one assigned automatically on next load, locked in from whatever they currently show — a one-time, permanent assignment, not an ongoing correction.

One boundary worth knowing plainly: a record whose stored time was already wrong before this fix existed keeps that wrong value locked in — there's no way to recover the true original after the fact. That specific record could still show as a duplicate if compared against a genuinely fresh pull of the exact same old test straight from the device. Re-importing PATKeeper's own data, or anything going forward, doesn't have this problem.

v1.13.0Duplicate detection
Identity is date-only now — every attempt to involve time broke on real data
  • Fix The actual, decisive problem, found by checking a real re-import: a meaningful share of this account's already-stored data has a time value baked in from before the BST conversion bug was fixed, and there's no reliable way to tell, after the fact, which stored records were affected and which were always correct. That means exact-time matching could never be trustworthy against this account's existing data, no matter how identity was computed on the way in — which is why the raw-timestamp approach, and the export-marker refinement of it, kept breaking on real files. Removed entirely. Identity is now asset + serial + date + client, with no time component at all — the BST bug only ever shifted the hour, never the day, for the overwhelming majority of tests, so date alone is far more robust against data that predates the fix.

Known, accepted trade-off: two genuine tests of the same asset on the same day (e.g. a fail, fix, and retest) will now be treated as one. Given the choice between that narrow edge case and the mass duplication this was actually causing, this is the right side to land on.

v1.12.4.DB export
Moved the export marker somewhere the tester can't see it at all
  • Changed v1.12.3's export marker lived in CurrentParameters — a table the tester actively reads for other things, so a reasonable question was whether an extra unrecognized entry there was truly safe. It now lives in its own dedicated table with no counterpart in the tester's schema, so there's no code path in the tester's firmware that could ever query it — not just believed harmless, genuinely invisible to it.
v1.12.3Duplicate detection
Genuine device timestamps trusted again — but only when actually genuine
  • New Every .db export is now marked as having come from PATKeeper. On import, a file carrying that mark is treated cautiously (date+time identity, as in v1.12.2) since some of its timestamps may not be genuine device originals — but a file with no such mark has definitely never passed through PATKeeper's export, so its timestamps are trusted as real device values again, immune to any future change in how time gets displayed.

⚠️ This only helps files exported from now on — a file already downloaded before this update has no way to carry the new mark, so it'll still be treated as fully genuine and could reproduce the same issue if re-imported. If you want to verify this fix, export a fresh copy first and test with that, rather than re-using an older exported file.

v1.12.2Duplicate detection
Fixed re-importing PATKeeper's own exports creating mass duplicates
  • Fix v1.11.3's "raw device timestamp" identity broke on real data: most accounts have older records with no genuine device-original timestamp, and PATKeeper's own export has to compute *something* to put in that field regardless. Re-importing that export then treated PATKeeper's own recomputed value as an untouchable original, permanently mismatching it against what's already stored — exactly what caused thousands of false "new" records on a real re-import. Identity is now based on date and time again (read consistently by the same fixed, stable logic every time) rather than a timestamp that isn't always genuinely original. Confirmed directly against a real account export before shipping this, rather than reasoning about it in the abstract.
v1.12.1Export
Both CSV and DB export now confirm before doing anything
  • New Clicking Export CSV or Export DB now shows a summary first — test count, asset and client count, date range, and the filename it'll save as — rather than exporting immediately. DB export's existing "some groups have no verified limits" warning is now part of this same summary instead of a separate modal.
v1.12.0Import cutoff date
Exclude old records from a re-import entirely, by date
  • New Importing now offers an optional cutoff date before showing the full preview — set it and everything dated before that cutoff is excluded outright, rather than just being flagged as a duplicate. Useful when re-importing a file that's a mix of data already in your account and newer tests added since (e.g. a .db that started life as an export from this app, then had more tests added on the tester itself).
v1.11.4Startup
Fixed the app hanging forever on "Loading your clients"
  • Fix The record-ID migration added in v1.11.3 ran before the client list was shown, with no error handling and no progress feedback — on an account with a lot of records, the full re-sync it triggers could take real time, and if anything went wrong there was nothing to show for it except a loading spinner that never went away. It now runs after the app is already usable, wrapped so a failure can never block anything else, with a toast instead of nothing while it works.

Sorry — this was a genuine mistake, putting a heavy, unprotected background task directly in the startup path. Please reload; the app should show your client list immediately now, with the cleanup happening quietly afterward.

v1.11.3Duplicate detection
Fixed a regression from v1.11.1 that could create duplicates on re-import
  • Fix v1.11.1's timezone fix changed how test time gets displayed from a .db file — correctly, but it also meant a test already imported before that fix would compute a slightly different identity than the same test re-imported after it, since identity was built from the displayed (interpreted) time rather than the raw source value. A test's identity is now based on asset, serial number, the device's raw untouched timestamp, and client — not the human-readable time derived from it — so identity stays stable regardless of how display logic is interpreted, while two genuinely different tests on the same day (e.g. a fail, fix, and retest) still correctly count as two separate tests, not one.
  • Fix Automatically cleans up any duplicates the earlier bug created — on first load after this update, existing records are checked against the corrected identity rule, and anything that collapses onto the same test gets deduplicated and re-synced, with a confirmation of how many were removed.

Sorry for the trouble here — v1.11.1 fixed a real display bug but introduced a worse one in the process. This should self-resolve automatically without needing to manually delete anything via Import History. Records with no raw device timestamp (CSV import, manual entry) fall back to their entered date/time as before, since those were never affected by this issue in the first place.

v1.11.2Import Preview
Now leads with how many will actually be imported
  • Changed The top summary, and every client and location row underneath it, now leads with the number of genuinely new test records that'll be imported — the total-found and skipped-duplicate counts are still there, but as supporting detail rather than the headline figure.
v1.11.1.DB import/export
Fixed test times showing an hour later than actual during BST
  • Fix The tester's own DateTime values appear to store wall-clock time directly rather than a true UTC timestamp. Reading them back using the browser's local time (which reapplies the UK's BST offset on top of a value that shouldn't need it) added a spurious extra hour whenever BST was in effect. Both directions — reading a device's .db file, and writing one back out — now read/write those values at face value, with no seasonal shift.

Verified the fix direction against a real DateTime value from T280726.DB — confirmed which reading matched what you reported as correct.

v1.11.0Save button clarity
Save Changes buttons now grey out until something's actually changed
  • New Report & Certificate Settings, Company Details, Edit Record, Edit Client, and Asset Details all now disable their Save button until you've genuinely changed something — greyed out and unclickable on open, enabling the moment you edit a field, upload a logo/photo, or pick a different location.
  • Fix Picking a location from Asset Details' dropdown wasn't registering as a change at all (it set the field directly without firing a normal input event) — fixed as part of this, so it's now correctly detected everywhere that matters, not just for the Save button.
v1.10.1Description change detection
Now states the date of the change everywhere it appears
  • Changed The main table's ⚠️ badge and the import preview's mismatch list both now state the date the description change happened, not just the before/after text — matching what Asset Details already showed.
v1.10.0Description change detection
Flags when an asset ID's description has changed — could mean a reused sticker
  • New If an asset's description changes at any point across its test history, that's now flagged clearly wherever the history matters most: a ⚠️ badge next to the description in the main table, a full warning with every change listed in Asset Details, and a heads-up in the import preview before anything's even brought in.
  • New The reasoning is explicit rather than silent: a description change can be an ordinary correction, but it's also exactly what you'd see if a numbered sticker got moved onto a different physical item — so it's surfaced for a human decision, not auto-resolved either way.
v1.9.4Import History
Toned down the progress display during batch deletion
  • Fix The first phase of deleting a batch (checking which records exist remotely) was showing a raw, rapidly-climbing number against a fake percentage — the real total isn't known until that check finishes, so the number didn't mean anything useful. Replaced with a calm status message; the actual "N of M" count now only appears once real numbers are known, during the deletion itself.
v1.9.3Import History
Real progress feedback when deleting an import batch
  • New Deleting an import batch now shows an actual progress bar with a running count ("Checking existing records…", then "Removing records… N of M") instead of freezing with no feedback until it's done. The underlying work was already happening in chunks — it just wasn't being shown.
v1.9.2Available Numbers
Fixed "0001" and "000001" being silently treated as the same ID
  • Fix Numbers were parsed as plain integers, so leading zeros were stripped and different padding conventions collapsed into one — "0001" and "000001" both became "1" and were merged together. Digit-width is now part of what defines a series, so differently-padded numbers are tracked separately, and every displayed number keeps its original zero-padding rather than losing it.
v1.9.1Available Numbers
Now recognises prefixes too, not just plain numbers
  • New Available Numbers now splits asset IDs by their prefix (e.g. "BB200189" and "BMT001266" are tracked as separate series) and shows available/used ranges for each one independently, alongside plain numbers with no prefix at all.

IDs that don't cleanly end in a run of digits (e.g. "213351-708", "BMT000092A") still aren't included — they don't belong to a simple sequential series this kind of check makes sense for.

v1.9.0Available Numbers
See which asset numbers are free to use for new equipment
  • New "🔢 Available Numbers" on a client's page shows exactly which plain-numbered asset ID ranges are already in use, and which ranges are free — e.g. "4000 – 4180 (181 numbers)" available, alongside what's occupied, so picking a number for new equipment doesn't risk clashing with an existing tag.

Only considers asset IDs that are plain numbers (e.g. "4021") — IDs with letters (e.g. "BB200189") follow their own separate scheme and aren't part of this.

v1.8.1.DB export
Full visibility before export, and defensive validation on capture
  • New Exporting now shows exactly which test groups have real verified limit data and which don't, before anything is written — no more silently mixing verified and unverified groups in the same file without knowing which is which.
  • Fix Capture now skips any specification row with a missing test type or limit value, rather than storing something incomplete that could produce an invalid row later.

Also confirmed: specs captured from multiple different .db imports over time correctly accumulate rather than overwrite each other — importing a new file only updates the groups it actually contains data for.

v1.8.0.DB export
Test group limits now round-trip from real data — never guessed
  • New Importing a .db file exported by a genuine PAT tester now also captures its real IndividualTestSpecification data (the exact limit, duration, subtype, and repetition per test type for each group) — previously only the pass/fail limit value was kept, and the rest silently discarded.
  • Fix Exporting now writes those real captured values back for any group they exist for, instead of leaving the table empty. A group with no captured data (never imported from a genuine source file) still gets nothing written — no reconstruction, no guessing, only real data that's actually been seen.

Verified directly against a real PAT420 export before shipping this — the capture query was run against an actual device file and its output checked against the file's real contents.

v1.7.2.DB export
Reverted v1.7.1's test group limits — caused the physical tester to hang
  • Fix The IndividualTestSpecification rows added in v1.7.1 caused a real PAT tester to hang when starting a test. Reverted immediately rather than guess at a second attempt — a device hanging is a far worse outcome than the missing-limits issue that change was meant to fix. That table is empty again, back to the behaviour before v1.7.1.

The Duration/Repetition/Subtype values used for those rows were reasoned out from the schema and other tables, not verified against real hardware or a known-good exported file — that's what went wrong. Properly fixing this needs a genuine reference to work from, e.g. the IndividualTestSpecification contents of a .db file exported directly by the tester itself, or documentation of the expected values. Everything else from v1.7.0/v1.7.1 (asset/group deduplication, the VA limit field) is unaffected and stays in place.

v1.7.1.DB export
Found the real cause: test group limits were never written at all
  • Fix The table that tells a PAT tester what limit to apply per test type for a given group (IndividualTestSpecification) was being created in every exported file but never had a single row written into it — so the tester had nothing to read and silently fell back to its own built-in defaults. Now populated from the limits already present on the imported test data, scanning every row of a group (not just whichever one happens to create it) so a limit that's missing on one test but present on another within the same group is still picked up.
  • Fix The Load (VA) test's limit was hardcoded to 0 on every individual result too, despite the field being tracked elsewhere — now correctly uses the actual recorded VA passband.
v1.7.0PDF import removed, DB export fixed
Rolled back PDF import; fixed a real duplication bug in .DB export
  • Changed PDF report import has been removed entirely — asset ID/description wrapping, page-footer noise, and inconsistent column layouts across different reports made it more fragile than it's worth. CSV and .DB import are unaffected. Import History stays, and continues tracking every CSV/.DB import as an undoable batch.
  • Fix .DB export: an asset's test group was being treated as part of what makes it a distinct asset, rather than a property recorded on it. If the same physical asset's class/group was ever recorded even slightly differently across different tests (common when data's been imported from more than one source over time), it was silently split into multiple duplicate assets in the exported file, each with fragmented test history.
  • Fix Same underlying issue for test groups themselves — a group was being identified by four fields at once, three of which are only ever populated for records that came from a genuine source database. Anything entered by hand or imported from CSV has those blank, which was splitting the same conceptual group (e.g. "Class 1 Earthed") into several duplicate TestGroup rows. Now identified by description alone, which is always populated.
v1.6.0PDF import
Individual test readings now extracted too, not just pass/fail
  • New PDF import now reads Visual, Polarity, Earth Continuity, Insulation, Load, and Leakage for each test, not just the overall pass/fail — so imported certificates carry the same detail as ones entered directly in the app.
  • Changed Reads each column adaptively rather than with one rigid pattern, since this report's own format wasn't fully consistent between rows (a result letter followed by a number in most cases, but a bare number with no letter in others) — handled per-column instead of assuming one fixed shape for the whole row.

⚠️ This part is newer and less proven than the rest of PDF import — worth deliberately checking a few imported assets' readings against the original PDF before trusting them for certificates going out to clients.

v1.5.7PDF import
Wrapped asset IDs now reconstructed properly, not just contained
  • Fix The last known open issue: rows whose asset ID wraps onto its own line (e.g. "4A02", "KC1Q") were importing with a slightly wrong ID, since the wrapped part was being discarded. It's now held onto and rejoined with the row that follows, so the full original ID (e.g. "LOC009ASB4D4A02") is reconstructed correctly instead of losing a piece of it.

No specific known bugs currently outstanding for PDF import — still worth treating as experimental for report layouts not yet seen, per the general note on v1.5.0.

v1.5.6PDF import
Fixed wrapped serial numbers hijacking hundreds of rows
  • Fix Previously flagged as a rare, minor edge case — turned out to be much bigger. Long asset IDs/serial numbers that wrap onto their own line (e.g. "4A02", "KC1Q") were being treated as brand-new locations, silently reattributing everything that followed until the next genuine header. Short, spaceless fragments like these are no longer treated as locations at all — the current (correct) one is left in place instead.

Small remaining trade-off: the handful of rows whose asset ID genuinely wraps onto two lines will still import with a slightly incomplete ID (e.g. the first word of the description gets read as the ID instead). Contained to those specific rows only — no longer corrupts anything else.

v1.5.5PDF import
Fixed a column-header fragment eating over 1,000 tests into one fake location
  • Fix This report's table header wraps across several separate lines rather than one, and "Leakage (mA)" specifically wasn't on the noise list — so it was being read as a real (and constantly repeating) location, silently absorbing every row that followed it on page after page. All the header line fragments are now filtered, plus a general rule for any similar measurement-unit column header (mA, kVA, Ohms, MOhms, etc.) in case others turn up.
v1.5.4PDF import
Fixed page footers being wrongly read as new locations
  • Fix "Page X of Y" and "Printed: [date]" footer text was slipping past the noise filter and getting treated as a brand-new location every time a real location's data spanned a page break — splitting that location's tests across two entries instead of keeping them together. Now checked with whitespace stripped out entirely, so it can't be missed by a spacing quirk in how the PDF's text was laid out.

Known remaining edge case: a small number of very long asset IDs (e.g. laptop serial numbers) appear to wrap across two lines in some PDFs, which can create a short-lived stray "location" for a couple of tests. Minor and rare, but not fixed yet.

v1.5.3PDF import
Better line ordering, and a diagnostic that actually shows the data rows
  • Fix Text fragments within a reconstructed line weren't guaranteed to be in left-to-right order — sorted by horizontal position now, since PDF.js doesn't promise reading order for table layouts.
  • Fix The "no rows matched" diagnostic previously only showed the first 60 lines of the document, which is always cover-page and client-details boilerplate — it never actually showed what a data row looked like. Now specifically surfaces lines containing PASS/FAIL so the real problem is visible.
v1.5.2PDF import
Fixed a real bug causing "no importable rows" on every PDF
  • Fix The text extraction step was flattening every row on a page into one giant blob of text with no line breaks between them, so nothing could ever match. Now reconstructs actual lines using each fragment's position on the page.
  • New If a PDF still matches nothing, you now get a diagnostic view showing exactly what was extracted, instead of a dead-end message — needed since this feature can't be tested against every possible report layout in advance.
v1.5.1Import History
A safety net for undoing an import — especially the new PDF one
  • New Settings → "🕘 Import History" lists every import as a batch, by date and time, showing how many tests came in and across which clients.
  • New Tick one or more batches and delete them in one go — a clean undo for an import that went wrong, without having to hunt down individual records by hand.
  • Changed Every import (CSV, .DB, or PDF) now tags its records with a batch ID behind the scenes so this history can be built — imports made before this version won't appear in the list, since they were never tagged.
v1.5.0PDF report import (experimental)
Import directly from a PAT report PDF, not just CSV/.DB
  • New Drop a PDF PAT report in alongside CSV/.DB files and PATKeeper will read asset ID, description, location, date, and pass/fail straight out of the document text.
  • New Since a PDF can't reliably tell us which client it belongs to, you're asked to confirm the client name for each PDF straight after it's read — before anything is shown in the import preview.
  • Changed Deliberately does not attempt to import individual electrical readings (earth continuity, insulation, etc.) from PDFs — the column layout for those varies even within a single report, so guessing at them risked silently importing wrong readings. Asset identity and pass/fail history import reliably; detailed readings don't, from PDF sources only.

⚠️ This is a first version built from one example report and hasn't been tested against real-world PDF variations yet — worth trying carefully and reporting back anything that parses incorrectly.

v1.4.1Light & dark logos
Now working in the client portal too
  • New The client portal now picks the right logo variant for its own light/dark toggle too, closing the gap left in v1.4.0 — updates instantly if a client switches theme while looking at their own page.
v1.4.0Light & dark logo variants
Your logo (and every client's) can now have a version for each background
  • New Company Details and Edit Client both now accept two logo uploads — one for light backgrounds, one for dark. Only have one? Upload it once and it's used everywhere, same as before.
  • New The correct variant is chosen automatically: dark-background logos on certificate headers (which are always a dark band), light-background logos on cover pages and summary reports (always white), and in the app itself it follows whichever theme — light or dark — you're currently using, switching instantly if you toggle it.
  • Fix Renaming a client used to only carry their legacy logo across, silently losing anything else on their profile — fixed to carry everything.
v1.3.0Photos, Room, and polish
Photo evidence, clearer views, and several requested refinements
  • New Attach a photo to any test record (Edit Record → Photo) — stored securely per account, separate from your synced data so ordinary edits stay fast.
  • New A new "Certificates — with Photos" report alongside the standard one, which embeds each asset's photo. The standard Certificates and Summary Report stay lean and photo-free, so routine paperwork never balloons in size.
  • New "Room" is now shown in the main data list (both views) and in the Summary Report and Failed Assets tables — previously only captured, never displayed.
  • New Client tiles on the select-client page now show that client's logo, or their initials (e.g. "TFT" for Tobacco Factory Theatre) if they don't have one.
  • Changed The Asset View / Inventory View switch now shows both labels at once, with the active one highlighted — no more guessing what you're switching to.
  • Changed Replaced the redundant "Clients" stat (always 1, since only one client is ever shown) with a genuinely useful count of unique assets.
  • Changed Filters now collapse into a drawer on mobile, behind a "🔍 Filters" toggle, instead of always taking up screen space.
v1.2.2Date filtering
Fixed a timezone bug excluding tests from the day you searched for
  • Fix Date filters (From/To, in both the main app and the client portal) were parsed as UTC midnight while test dates are stored as local midnight — in any timezone ahead of UTC (the UK included, whenever BST is in effect), this could exclude tests from the exact day you were searching for. Both now use the same local-time convention.
v1.2.1Smarter date filtering
"Last test batch" now works in the client portal too
  • New The client portal now has the same "📍 Last test batch (auto-detected)" quick-range option as the main app — it looks at the actual spread of test dates and automatically finds the most recent testing round, rather than relying on a fixed number of days.
v1.2.0Smarter browsing
Fail explanations everywhere, a proper view switch, and date detection
  • New The client portal's asset detail popup now explains why a test failed in plain English, the same as certificates already do — not just a red "Fail" badge with no context.
  • Changed Asset View / Inventory View is now a proper toggle switch, matching the light/dark mode control, instead of a button that changed its own label.
  • New "Last test batch" — a smart quick-range option that looks at a client's actual test dates and automatically finds their most recent round of testing, rather than you having to guess or work it out by hand.
v1.1.2Inventory View
Renamed the default view for clarity
  • Changed The toggle now reads "Asset View" and "Inventory View" rather than "Test View" — clearer about what each one actually shows.
v1.1.1Inventory View
Tests nested under assets, not just assets under descriptions
  • New Each asset inside a description group can now expand to show its own individual tests, matching the same drill-down already available in Test View.
v1.1.0Inventory View
A new way to browse by description, not just by asset
  • New "Inventory View" toggle on a client's page — groups every asset by its description instead of listing them individually, with a count of how many assets share that description.
  • New Expand any description to see the individual assets underneath, each showing its own location, latest result, and test count.
v1.0.2Asset Details
Fixed the Location dropdown
  • Fix Replaced the browser's native (inconsistent-looking) location suggestions with a proper custom dropdown that shows every location for that client, narrows as you type, and includes a clear hint that typing a new name creates a new location.
v1.0.1Asset Details
Editing an asset's location
  • New Asset Details now has a Location field — pick from that client's existing locations in a dropdown, or just type straight in to create a new one on the spot.
v1.0.0Stability & performance
The first release we're calling stable
  • Fix Fixed a bug where the app would occasionally jump back to the client-selection screen unprompted — caused by background session-refresh events being treated as a fresh sign-in and forcing a reset.
  • Fix Saving no longer re-uploads your entire dataset on every single change. Editing one client, moving a test, or uploading a logo now only syncs the records actually affected — previously any save re-synced everything, which is what was causing long pauses on accounts with a lot of data.
  • Fix Uploading a new client logo no longer touches that client's test records at all — it's a separate, much smaller update now.
  • Changed The four things loaded on startup (records, company details, report settings, client logos) now load in parallel instead of one after another, and there's a proper loading indicator on first load instead of an empty-looking page.
  • Changed Certificates and reports now refer to the formal standard name — In-Service Inspection & Testing of Electrical Equipment (PAT) — and the retest field is labelled as a risk-assessed interval rather than a fixed "frequency", in line with the 5th Edition IET Code of Practice.
  • New Version numbers and this changelog.
v0.7.0Client Portal, round two
Making the portal genuinely useful day to day
  • New The client portal now has the same filters as the main app — search, location, result, and quick date ranges.
  • New Click into any asset in the portal to see the actual readings behind a pass or fail — the same detail that's on a certificate, browsable by test date.
  • New Light/dark mode and pagination (100 assets per page) added to the portal, so a large client's data stays fast to load.
  • Changed Saved reports & certificates moved out of a permanently-visible section and into a "View Reports & Certificates" button, keeping the page tidier.
  • Fix Fixed the storage bucket and lookup function needed for saved documents to actually work, plus a modal close button that wasn't styled correctly.
v0.6.0Client Portal
Clients can now see their own data — no login required
  • New Generate a shareable link per client from their page — anyone with the link can view that client's assets and test results, with no account or password needed.
  • New Save any generated certificate or summary report straight to a client's portal with one click.
  • New A "Saved Reports" viewer in the main app to see and manage everything shared with a given client.
  • Changed Export filenames now reflect the client and date range of the actual data (e.g. Riverside_Theatre_2024-01-05_to_2024-06-30.pdf) instead of a generic timestamp.
v0.5.0Import overhaul
Importing data got a lot more trustworthy
  • New Drag-and-drop is now scoped to two clearly-marked boxes (on the client list and inside a client's page) instead of working invisibly anywhere on the page.
  • New An import preview shows exactly what's been found — broken down by client and location — before anything is actually imported, with duplicate tests already detected and unticked automatically.
  • New Live status per client as an import actually runs, rather than a modal that just closes with no feedback.
  • Fix Fixed a serious bug where saving or deleting more than 1,000 records could silently fail (or worse, delete records it shouldn't have) due to an unpaginated database query — now fully paginated and safe at any dataset size.
v0.4.0Asset-grouped history
One row per asset, not one row per test
  • New The main list now groups tests by asset with an expandable arrow into every past result, instead of listing every individual test as its own row.
  • New Right-click menus on assets and individual tests for quick actions — edit, certify, delete, view history.
  • New "New Client" flow — onboard a client before they've had a single test.
  • Changed "View Test History" now filters and expands the main list instead of opening a separate modal; the old asset-list modal was removed as redundant.
  • Changed The redundant "Client" column was removed from the table since only one client is ever shown at a time.
v0.3.0Client-first workspace
One client at a time, never mixed together
  • Changed Reworked the whole app around picking a client first — no more filtering across every client's records at once.
  • New A client's details and logo now live on their own page with a one-click edit, replacing a separate "Manage Clients" popup.
  • New Delete/move actions moved out of a dropdown into a contextual bar that only appears when records are actually selected.
  • Changed Removed the "Clear All Data" option entirely — too easy to trigger by accident with no way back.
v0.2.0Rebrand & certificates
Renamed to PATKeeper, and paperwork that looks the part
  • Changed Renamed from PAT Test Manager to PATKeeper, with a new keyhole logo mark used consistently across the app, the website, and every document it produces.
  • New Certificates now explain why something failed in plain English, in a clearly marked box, instead of just showing a red "Fail" badge.
  • Fix Client logos now keep their correct aspect ratio and no longer overlap with company contact details in the certificate header.
  • Fix Fixed cramped spacing at the top of summary reports.
  • New A consistent close button, Escape key, and click-outside-to-close added across every popup in the app.
  • New Full landing page redesign showcasing every major feature with real recreations of the actual interface.
v0.1.0The original build
PAT Test Manager — where it all started
  • Import CSV exports and .DB (SQLite) database files from PAT testers, including Seaward/Apollo-style exports, with automatic duplicate detection.
  • Generate branded certificates and summary reports as PDFs, with company and client logos.
  • A full data table with search, filtering, sorting, and manual test entry.
  • Cloud accounts via Supabase, with each company's data kept private and separate from every other company's.
  • Google, Microsoft, and Apple sign-in options, a 14-day free trial, and Stripe-based subscription billing.
  • The original marketing/landing page and privacy policy.