Release notes
Changelog
Site update, August 31, 2026 · One name for the $5 license
- The $5 license is called a Business License everywhere now. Eleven app pages called it a “Commercial License” and fourteen called it a “Business License”, for the identical thing at the identical price. Pingr’s pricing section, its checkout window, and its terms and privacy pages now all say Business License.
- Nothing about the license itself changed. Same $5, same one-time payment, same cover for one computer. A key you already hold still works, and there is nothing you need to do.
Site update, August 30, 2026 · Buy several apps in one order
- One payment, as many apps as you need. The commercial license window on this page could sell exactly one thing: Pingr. A team that also wanted two other twoplus11 apps paid three separate times, on three separate pages, and filed three separate receipts. That window now carries an Add another app control: search the catalog, set how many computers each app goes on, and pay once. Every app still gets its own license key, and they all arrive in the same email.
- Nothing changes if Pingr is all you want. The window opens exactly as it did, at the same price, with the same count of computers, and an order for a single app takes the route through checkout it always has. The extra controls appear only once the app list has loaded, so a slow or unreachable connection leaves the page as it was.
1.3.0 — August 29, 2026 · Pingr can start itself, a retention change asks first, and a pause stops filling itself in
- Pingr can start when you log in. Settings ▸ Startup, and it was the one setting the app most needed: Pingr copies each notification out of a store macOS clears the moment you dismiss it, so a Pingr that isn’t running archives nothing, and whatever you swipe away while it’s closed is gone for good. Until now the only way to have it there after a restart was to remember to open it. The switch reports what macOS actually did rather than what it was asked to do — macOS can accept the registration and still hold the item until you allow it under System Settings ▸ General ▸ Login Items, which looks identical to “on” and launches nothing, so Pingr says so and offers a button that opens the right panel. Turn it off in System Settings and the switch corrects itself the next time you come back to Pingr, instead of reporting a login item that no longer exists.
- A switch for whether an update installs itself. Settings ▸ Updates could turn the weekly check off, and that was the only control there was — so the choice was between letting Pingr fetch and install a new version on its own and never looking for one at all. Now the install is its own switch. Turn it off and the weekly check stays on, and Pingr goes back to telling you a new version exists and waiting for an answer.
- Shortening how long history is kept deleted months of it silently, and up to an hour after you asked. Moving “Keep history for” from 90 days to 1 week showed no dialog, no count and no confirmation; the deletion happened whenever the hourly prune next ran, so there was nothing to connect it to what you had clicked, and re-selecting 90 days brought nothing back. It is permanent — the archive overwrites the pages it frees, and Undo only ever holds a single manually deleted notification. It now asks first, names how many notifications are about to go, warns that one-time codes are among them, defaults to Cancel, and does the deletion while you are still looking at the reason for it. The two destructive controls beside it already worked this way.
- A pause quietly filled itself in when you resumed. Settings says, in all thirteen languages, that notifications arriving while capture is paused will not be archived. Resuming archived them anyway — every record macOS still held from the whole pause window, one-time codes included. Anyone who paused Pingr before a screen share and resumed afterwards had the intervening bank alerts and 2FA codes written to disk by the sentence they had acted on. Resuming now starts from the moment you resume. The pause also survives quitting: the cursor is written down when you switch capture back on, rather than only when the next notification happens to arrive.
- Excluding an app could leave its notifications in the archive. macOS records the same app under two spellings of its identifier — one lowercased, one as the app writes it — and exclusion deleted only the spelling of the row you excluded from. The rest stayed searchable and exportable, bodies and one-time codes included, while Settings listed the app as excluded. Exclusion is a privacy switch, so it now matches the way capture is blocked: every spelling, regardless of case.
- VoiceOver read one-time codes aloud even with “show the code in the menu” switched off. The printed menu item honoured the setting; the spoken one never had, so the one control that exists to keep a code off the screen was bypassed on the one output channel a whole room can hear. Both now obey it.
- Searching for anything with punctuation in it found nothing. An email address, a hyphenated order number, a time on the clock — “jane.doe@acme.com” was being turned into a single run of letters before it reached the index, which stores the pieces separately, so a phrase visibly on screen came back as “No matches”. Punctuation is treated as a word boundary now, which is what the index does.
- The one-time code was unreadable on the row Pingr selects for you. The little code pill takes its colour from what is underneath it, and the timeline selects the newest notification the moment it opens — so the code you came for was normally sitting on a filled selection, where it measured 1.08:1 against its background in light mode. It carries its own solid ground now, so it reads the same on every row, in both appearances, whatever accent colour you have chosen in System Settings.
- Two lines of coloured text failed contrast in light mode. “Full Disk Access granted” on the welcome screen (1.88:1) and “Capture paused — Resume” in the footer (1.95:1) took their system colour across the words as well as the icon. The colour now belongs to the icon, where it is decoration beside a sentence that already says the same thing.
- Escape did not close the Keyboard Shortcuts or License panels. Neither had a working escape route, and with Full Keyboard Access off — the macOS default — Tab does not reach their Close buttons either, so the panel that exists to teach you the keyboard was the one you could not leave with it.
- The Undo button turned up on toasts that had nothing to undo. Copying a notification within a few seconds of deleting one produced a “Copied notification text” message carrying an Undo button for the earlier delete, about a row it did not name — and each new message pushed the real undo window further out. The button now belongs to the message that announced the deletion, and the offer expires on its own clock.
- About claimed Pingr made no network connections at all. It said “Zero network connections — there is no server to upload to”, which was the only place in the app or on the site saying it in absolute terms, and it was not true: there is a weekly update check, and a business licence key is activated with us. Settings, the README and the site FAQ all described those already. About now says what actually happens, and the site’s FAQ and feature card name the licence check beside the update check.
- Numbers were grouped in the wrong language. Counts in the search field, the footer, the app filter and Diagnostics followed macOS’s language rather than the one picked inside Pingr, so a German Pingr on an English Mac wrote “1,284 Mitteilungen durchsuchen” where German writes “1.284”.
- “Auto — match macOS” stayed in English after a language change. It is the only row in the language picker that should change — the rest are the languages’ own names — and it was the only row that did not, until the next launch.
- The License panel’s seat count and its “free for personal use” sentence never translated. Both went through a lookup that reads the language the app launched in rather than the one the picker is showing.
- Opening Settings ran a database probe twice a minute, on the main thread. Diagnostics re-measured the notification store and counted the whole archive on every redraw, and the window redraws itself on a 30-second timer — hardest in exactly the degraded state the “Read method” row exists to report. It is sampled once now, off the main thread.
- The timeline briefly opened onto “Loading…” over an empty list, before it had been asked to load anything.
- Buy a commercial licence and the button went to a page that could not sell you one. It opened the shared business page, whose app list predates the current checkout and does not include Pingr — a picker that cannot pick it. It now opens Pingr’s own pricing section, which is where the price is maintained.
- A damaged archive’s rescue copy was missing the newest notifications. When Pingr cannot open its archive it moves the file aside and tells you where it kept it. It moved one file of a set of three, and the most recent notifications routinely live in one of the other two — so those were erased from the replacement and absent from the backup, while the message said the old file had been kept. The whole database travels together now.
1.2.0 — August 22, 2026 · A menu on every row, a code you can drag, and three buttons that were never translated
- Right-click a notification. The timeline is a list of things, and right-clicking a list of things is the first gesture a Mac user tries on one — Pingr answered it with nothing. Every row now offers Copy Code, Copy Text, Open the app it came from, Show Only that app, Exclude that app from Pingr… and Delete. Two of those had no way in from the timeline at all: narrowing to one app meant opening the filter menu and reading down a list as long as you have noisy apps, and silencing an app meant leaving the window for Settings — both of them questions you ask at a row, neither of them answerable there. Excluding still raises the same confirmation, naming the app and the number of notifications it is about to delete forever, and the timeline now says what happened rather than letting several hundred rows vanish in silence.
- Drag a notification out — or just its code. Drop a row into Notes, Mail, a chat box or any text field; drop the big code card straight into the field asking for it. A dragged row leads with its one-time code, so a login field gets the code and a document gets the whole notification. Copy already existed, but the clipboard is the one place this app is careful about overwriting: what is on it is often the password this code is the second half of.
- The three buttons under every notification had never been translated. “Copy Code”, “Copy Text” and “Open <app>” — the primary action bar, the thing you are aiming at when you open Pingr — rendered English in all thirteen languages, beside a Delete button that translated correctly. The tables were never the problem: all three phrases have been sitting translated since 1.0, and the Keyboard Shortcuts panel prints two of them in German on the same screen. The buttons took their titles through a type that discards a translation before it can happen.
- The detail pane read “Heute at 15:04:22”. A localized day, a localized clock, and an English preposition welded between them — on the exact line VoiceOver was already speaking in German, because the spoken version had always looked the sentence up properly. One header, two languages. “App”, “Thread” and “Category” in the strip below it were English in all thirteen too.
- Four more strings were English in all thirteen languages, and every coverage number said 100%. The schema row in Settings ▸ Diagnostics, the sentence under the retention picker explaining what gets deleted, and the numbered steps the Welcome screen reads to VoiceOver. Each one interpolates a number, which asks the translation tables for a differently-spelled key than the one the generator had written — so the entry was present, counted and correct-looking, and nothing in the app would ever ask for it.
- The action buttons dropped to bare icons at the default window size. “Copy Code” and “Copy Text” are the only real decision this pane asks you to make, and both became gray squares as soon as the fully-labelled row missed by a few points. There is a middle width now: “Open <app>” gives up its label first — it is the widest button and the most redundant, with the app’s name and icon already at the top of the pane — and the two Copy labels survive down to widths where nothing can.
- Choosing an app froze the window with nothing to show for it. Narrowing the timeline to one app rebuilds the whole list — every row torn down and the survivors regrouped under their day headings — and for as long as that took, the window sat there showing the previous app’s notifications underneath a filter control already reading the new app’s name. Picking an app looked like it had done nothing, right up until it suddenly had. There is a spinner over the list while it works now, and it is on screen before the work starts rather than after it finishes. The All and Codes chips, and Show Only from a row’s menu, go through the same path.
- A filter could name an app your archive no longer had. Exclude the app you are currently filtered to — or delete its last notification, or let retention prune it away — and the timeline went blank while the filter control went back to reading “All Apps” and the empty state offered to clear filters that appeared not to be set. Three parts of one window disagreeing at once, on the exact path Pingr invites you down. The filter steps back to All Apps now and shows you what is left.
1.1.0 — August 20, 2026 · Thirteen languages, undo for a delete, and announcements that arrive
- Thirteen languages, with a picker in Settings. English, German, Spanish, French, Italian, Japanese, Korean, Dutch, Polish, Portuguese (Brazil), Russian, Turkish and Simplified Chinese — chosen in Pingr rather than inherited from your Mac, and taking effect on the next redraw rather than the next launch. The two filter chips above the timeline and the search field’s placeholder — the largest and most prominent text in the window — had been rendering in English in every language, as had “Contains code…” on the rows people install Pingr for. So had the “Clear notification history?” dialog, including the count of what it was about to delete forever. All of it is translated now. CSV column names and JSON keys deliberately stay English, because they are a contract with whatever opens the file.
- A delete can be taken back. ⌘⌫ removed a notification permanently, in an archive whose entire premise is that macOS has already thrown its own copy away. The confirmation toast carries an Undo button now and stays up for six seconds rather than under two, and ⌘Z works from anywhere in the window. The notification comes back whole — its code, its thread, its category, and its original place in the timeline.
- Excluding an app asks first. Excluding one deletes every notification Pingr ever recorded from it, and it used to do that on a single click in a menu, with no dialog and no count. It names the app and the number of notifications about to go now, the way “Clear All History” one row below it always has — and it asks nothing when the app has no history to delete, so the dialog means something when it does appear.
- Every announcement raised from the menu bar was being thrown away. Pingr has no Dock icon and no window group, and its menu-bar menu is its primary surface — so “no window is open” is not an edge case here, it is the normal state, and the announcement code gave up whenever it was true. Pausing and resuming capture, the quick copy of the freshest code, and the auto-copy that is documented as deliberately never silent all announced into nothing, every time. The ones that did survive were the ones raised from an open window — precisely the ones a sighted user can already see.
- “Recheck” did nothing you could see. All three places that offer it threw away the answer, so in the overwhelmingly common case — access still off — the most-clicked button on both error screens produced no message, no announcement and no visible change at all. It says which answer it got now, and the still-denied answer is the one worth saying out loud: you have just done something in System Settings and need to know it did not take.
- When the archive would not open, everything you had ever archived vanished in silence. Pingr moves a corrupt archive aside and starts fresh, which is right — bricking the app would be worse — but it said nothing at all, and the old file sat in Application Support under a name nobody had a reason to look for. This app exists so the thing you lost is still there, which makes “it is all gone, and here is where the old copy went” the most important sentence it can say. It says it now, once, at launch, with the path.
- A JSON export that failed to serialize wrote an empty file and reported success. The one path that produced an empty file was also the path that claimed to have worked, and you found out by opening it later. It reports the failure now.
- ⌘W closes the timeline window, which had no keyboard way out at all: Pingr has no menu bar, so ⌘W was bound to nothing, and Escape belongs to the search field, which it clears. Escape also closes Settings, About and Welcome now.
- The arrow keys moved the selection but not the list. Pressing ↓ from the search field — the shortcut for browsing results without leaving your query — selected rows further and further down without ever scrolling to them, so past the first screenful the window looked like it was ignoring you.
- Fixed: the action buttons truncated to “Copy C…”, “Copy T…”, “Open M…” — not only at the smallest window size but at the default one, as soon as the divider was dragged left or the Full Disk Access banner appeared. They fall back to icons when there is no room for labels, with the full name still on hover and in VoiceOver.
- A code on the clipboard the moment it lands. Safari can fill in a one-time code from Messages; Chrome, Firefox and Edge cannot, and nothing can for a code that arrived by mail, from an authenticator app, or in a Slack message — which is most of what Pingr sees. Pingr can put it on the clipboard as it arrives. Off by default, because writing to the clipboard takes something you did not hand over; it fires once per code rather than on every check; and the menu says it happened, since an app that replaces what you copied without telling you gets blamed for losing something it never touched.
- Export what you are looking at — the current search, as CSV, JSON or Markdown. Not the whole archive: “everything Slack sent me last week” is a search Pingr can already run, and asking for it again in an export dialog would be a worse copy of the filters you just used. Notification text is hostile input, so a body starting with
=cannot arrive in a spreadsheet as a live formula. - Open the app a notification came from. Finding the thing you lost is usually the first half of the job. The button is absent for an app that has since been uninstalled, rather than present and dead.
- Pingr sold business licenses and had nowhere to type one. The key button in the footer opened the checkout page and did nothing else, so anyone who had already paid was shown the shop again. The purchase email has always said “open Pingr, choose License…, paste the key, click Activate” — none of those three things existed. The footer’s key now opens a License panel: paste the key, name the computer so it is recognizable in your seat list, and click Activate. Nothing about Pingr is locked behind it — personal use is free, forever, and every feature works without a key; entering one registers this Mac against the license you bought.
- Removing a license hands the seat back. “Remove License…” tells the server to release this computer’s activation before it forgets the key locally, so the seat is immediately free for another Mac — which is what the purchase email means by “move a seat between machines any time”. The name you gave this computer is kept, so re-entering a key later does not add a second entry for the same machine to your seat list.
- The License panel keeps working offline: an activation is re-checked once a day, and if the license server cannot be reached the license stands for 72 hours before Pingr quietly falls back to the free tier and says the server is unreachable. It never calls a key invalid on evidence it does not have. A key that was rejected is always re-checked rather than cached, so freeing a seat or renewing takes effect the moment you look, instead of up to a day later.
- The panel reads in all thirteen languages Pingr ships, and is keyboard- and VoiceOver-operable: Escape closes it, Return activates, and the reason a key was refused is announced rather than only drawn.
- The footer has its Updates button back. The shared twoplus11 footer is meant to read License → Updates → Help → Review → Tip in every app in the fleet, and Pingr’s was missing Updates entirely — so the only way to check for a new version by hand was the menu bar.
- The footer’s Shortcuts button, and something for it to open. The shared twoplus11 footer is meant to end License → Updates → Help → Review → Tip → Shortcuts in every app, and Pingr had neither the button nor a panel — so its keyboard shortcuts were discoverable only by hunting through the menu bar, and the ones bound to invisible buttons were not discoverable at all. Every chord in the new panel is one Pingr actually answers, it reads in all thirteen languages, and VoiceOver speaks “Command Q” rather than the glyphs.
Site update — August 19, 2026 · A checksum for the download
Website only; no change to the app.
- The download page now publishes the SHA-256 of the
Pingr.dmgit serves, so you can confirm the file you got is the file we put there. macOS already runs the check that matters — Pingr is signed with an Apple Developer ID and notarized by Apple, and a copy altered after we signed it will not open — but there was no way to check a download by hand, which is what anyone installing it on more than their own Mac tends to want. The checksum is on the download section under SHA-256 checksum, next to the one command that compares it with your copy. It is published as a plain file too, atPingr.dmg.sha256, in the formatshasum -creads.
Site update — August 17, 2026 · The other apps, after the sign-up
Website only; no change to the app.
- The list of the other twoplus11 Mac apps has moved to the bottom of the page, below the email sign-up rather than above it. It used to arrive while the page was still making its case for Pingr, so the last thing you read before being asked for your email was a wall of other apps. It sits at the end now — the page finishes on Pingr, and the list is there if you want to see what else there is.
Site update — August 17, 2026 · A new sample notification in the screenshot
Website only; no change to the app.
- The screenshot on the home page no longer shows a made-up bank payout. One of the sample notifications in the timeline was an email announcing a large deposit. It was invented filler for the picture, but it read as a real figure, so it has been replaced with a backup-finished notice.
- The description of the screenshot read by screen readers was updated to match.
- No change to the app.
Site update — August 14, 2026 · Headlines in one color
Website only; no change to the app.
- The headline no longer fades from one color into another across the letters. A gradient poured through text is the house style of every generated landing page on the web, and it was on the hero here, on the small uppercase label above each section, and on the license label in the purchase panel. The words are one solid color now — the accent this page already used everywhere else — so the headline finally matches the page under it.
- Gradients are kept where they belong — the buttons, the app tile and the rule above the support panel are untouched. It is only text that stopped fading.
- No change to the app.
Site update — August 12, 2026 · Readable buttons and small print
- The buttons in the header say what they say. The Tip and Download pills were drawing their label at 55% opacity over a colored fill, which measured as low as 1.6:1 against it — well under the 4.5:1 the accessibility guidelines ask for. Their labels are now solid, and the fill behind them is set a shade deeper so the text genuinely clears that bar.
- The Subscribe and Support buttons too. Their labels were colored for one end of a two-color gradient and disappeared into the other end. Both now use a single fill that the label is legible on all the way across.
- The newsletter note, the “More apps” caption and the version line under the download button were all set too faint to read comfortably; each is now above the AA threshold.
- Keyboard shortcut chips are legible against their own background.
- The screenshot viewer no longer makes every visit quietly re-download this page as if it were an image — a wasted request on each load.
- No change to the app.
Site update — August 11, 2026 · Clearer search results
- The description under this site in Google is no longer cut off. It ran past the length Google shows and broke mid-word; it now reads as a complete sentence.
- Sharing a link to the privacy, terms or changelog page now shows a proper preview card instead of a bare URL.
- The sitemap now reports when each page actually changed, so search engines re-check pages that have been updated instead of assuming they are stale.
- No change to the app.
1.0.0 — August 11, 2026 · Initial public release
First release. The notification history macOS never shipped — every notification copied into a durable, searchable, local archive before macOS discards it.
- Searchable notification archive — every notification macOS delivers is copied into a local SQLite archive before macOS discards it, with an FTS5 full-text index over app name, title, subtitle and body. The last search token is treated as a prefix, so results narrow while you type.
- One-time code detection — Pingr recognizes 2FA codes across about ten languages and surfaces them on a copy button, in the timeline and in the menu bar for a code that just arrived. Phone numbers, prices, times, dates, versions, years and URLs are explicitly excluded, because a wrong code costs a failed login and a missing one costs an extra ⌘+C.
- Timeline window — day-grouped history on the left, the full notification on the right, newest selected on open. Filter by All, Codes, or a single app.
- Per-app exclusions — excluded apps are never recorded, and excluding one also deletes everything Pingr already holds from it.
- Retention policy — keep history for 1 week, 30 days, 90 days, 1 year, or forever. Pruned hourly.
- Pause capture, persisted across relaunches.
- Full Disk Access onboarding that polls for the grant instead of asking you to report back, with the Quit & Reopen step macOS requires before a newly granted permission takes effect.
- Sub-second capture — a vnode source on the notification store's write-ahead log that re-arms across checkpoints, with a 15-second backstop poll.
- Losing Full Disk Access doesn't hide your history — recording stops and the app says so, but the archive you already have stays readable and searchable.
- Diagnostics in Settings: access state, the store's schema version against the one Pingr was verified on, read method, and index type.
- Updates itself — Pingr checks for new versions on its own and installs them in place, so you never have to come back here for a DMG. Use Check for Updates… in the menu bar to check whenever you like.
- Menu bar only, no Dock icon. Full VoiceOver labeling and a palette checked against WCAG 2.1 AA.
- Signed and notarized by Apple — macOS 14+, Apple Silicon & Intel, one universal build.
- Free for personal use forever, including updates; optional one-time $5-per-device commercial license for commercial use.
Known scope for 1.0: Pingr can only archive what arrives while it is running — macOS deletes a notification record the moment it is dismissed, so there is no earlier history to recover. Pingr also cannot ship on the Mac App Store: a sandboxed process cannot read another app's container under any entitlement, and that is the entire feature.