Latr is free. There is a one-time $19 Pro licence, and it took three attempts to work out what it could honestly contain.
The two failed attempts, kept because they are the useful part
Round one sold sync, page thumbnails, bookmark import and weekday repeats. All four were already shipping free. Selling something a user already has is not a pricing page, it is a demotion.
Round two listed custom snooze durations, saved templates, bulk edit, pinning and unlimited history. All five shipped free within a fortnight, because each turned out to be the obvious completion of something free - and holding a feature back to protect a price is how a product stops improving.
The conclusion drawn at the time was: only sell things that need a server. That produced round three, which was worse than either. It sold reminders that fire with the browser closed, delivery to your phone, and sync across different browsers - three things Latr has no server capable of and, by its own architecture, never will. The pricing page was advertising a different product.
The constraint that settled it
Latr’s promise is that a reminder arrives. Everything follows from taking that literally:
A lapsed licence, or a licence check that cannot reach the network, must never cost anyone a notification.
That rules out selling delivery, reliability, capacity of anything that fires, sync, export or repeats. What is left is the two things that change how the product feels rather than whether it works - the theme engine and the sound engine - plus ceilings on organisational depth: one template, one saved view, one per-site rule, lifted by a licence. (Folders were capped too, until the library made one folder a demo of a bookmark manager; they are unlimited on every plan now.)
One rather than zero, deliberately. A feature nobody can try is a feature nobody can want, so the wall is met while doing something you already chose to do.
Tags are never capped, at any tier. A tag carries the accessible name behind a colour dot, so a limit there would put an accessibility affordance behind a paywall. The test suite asserts that, and separately asserts that no delivery-path setting ever appears in the limits table.
Where the check is allowed to live
This is the part that is actually load-bearing, and it is an architecture rule rather than a pricing one:
Pro behaviour is resolved where it is written, never where it is delivered.
The service worker - the thing that fires reminders - never asks may this install do X. It
executes what is already stored, exactly as it finds it. isPro() gates the surfaces that
write those values: the settings page, the composer.
Three consequences, and all three are the point.
A lapsed licence cannot lose a notification, because the worker has nothing to re-check. What was configured keeps working; the licence only stops you configuring more. Same as the sixth folder surviving a lapse - the ceiling declines, it never deletes.
A stored value is not a capability. A custom notification template is a string the worker formats. An escalation plan is two numbers it steps through. A snooze preset is an id it turns into a button. None of them mean “this install is Pro”, so none of them need a licence to be legible at delivery time.
The gate belongs beside the editor. If a control writes a Pro value, that control is hidden or disabled at the point of editing - never by discarding the value later, which is the failure mode where a field is drawn on a lapsed install and then silently drops what you typed.
The test suite asserts that the background worker never imports the licence helpers at all. It may import the re-validation scheduler, because re-checking a licence on the browser’s own schedule is not the same thing as gating on one.
The check is client-side, and that is a decision
Anyone who wants the theme editor for free can have it by editing a line, because an extension ships its own source and both stores forbid obfuscating it.
A backend that stopped them would cost the product its “no account, no server” promise, which is worth more than the licences it would recover. So there is one server route in the entire product, it answers whether a licence key is real and ours, and a free install never calls it.
That is not an oversight in the anti-piracy design. It is the anti-piracy design: the thing being protected is the positioning, not the revenue.