Closes the named rev-202 next-sprint candidate (v1 parity gap on /pricing) + ships two more templates from the rev-201 named radar wave (cheesemongers + bookbinders) bringing the cluster to seventy-five named verticals + adds the per-plan permalink share affordance on /pricing matching the rev-101/125/174/175 share-permalink vocabulary at the per-plan axis. Connecting thread: every rev-203 change makes an existing primitive load-bearing on a new place. (a) New shared src/lib/pricing-plans.ts module is the load-bearing primitive — the /pricing page, the landing-page in-page pricing block (since rev 22), the new /api/v1/pricing endpoint, AND the rev-202 /llms-full.txt AI-discoverability surface all read from one source so a price change updates four surfaces in one edit. Until rev 203 the landing-page pricing block and the rev-202 /pricing page carried hand-coded duplicates that drifted; rev 203 closes that. (b) GET /api/v1/pricing — closes the protocol-bound parity gap on the rev-202 /pricing marketing surface. Returns every plan (slug + name + price + priceUsd + priceSuffix + description + featured + features + caps + per-plan share URL) plus the rev-202 competitor-comparison block (Notion / HubSpot / per-token) plus an aggregate summary block (planCount + startingPriceUsd + featuredPlanSlug + positioning notes). No auth — public marketing surface (same model as /api/v1/badge.svg, /api/v1/integrations, /api/v1/onboarding-templates). Cache-control public, max-age=300, s-maxage=1800. The public marketing v1 cluster reaches its seventh axis: planned (rev 98) + most-requested (rev 98) + shipped (rev 100) + brand voice (rev 102) + industry-fit (rev 172) + channels (rev 202) + pricing (rev 203). (c) Per-plan permalink share chips on every plan card on /pricing — every card now wears a one-tap 'Copy link' chip producing loopdesk.space/pricing#plan-pro style URLs, with a hash-listener that smooth-scrolls + 2.4s flash-highlights the matching plan card on arrival. Mirrors the rev-101 changelog permalink + rev-125 roadmap permalink + rev-174 per-rev changelog detail permalink + rev-175 per-template detail permalink vocabulary at the per-plan axis. (d) Two more onboarding templates — small independent cheesemongers (affinage cycle discipline + named-producer continuity + shrinkage discipline at 3% per-category threshold + pairing expertise as the load-bearing customer trust signal) and independent bookbinders / paper conservators (named-substrate + adhesive discipline on conservation-grade quotes + chain-of-custody on every customer piece + rush-job hygiene with named deadline + conservation-grade supplier continuity adjacent to the rev-201 framing/mat-board axis) — bringing the templates cluster to 75 named verticals. The OpenAPI 3.1 spec types the new /pricing endpoint with full request/response schemas + the rev-172 listing endpoint count copy bumps 73 → 75 in lockstep — the cadence pattern from rev 78 onward reaches its 111th unbroken rev with rev 203. PRD + ROADMAP + CLAUDE.md updated (rev 203)
Shared src/lib/pricing-plans.ts module — closes the price-list drift between the /pricing page + landing page + v1 surfaceUntil rev 203 the rev-202 /pricing page carried inline copies of the three plan cards (Free / Pro / Team with prices, features, hard caps, CTA labels) and the landing-page in-page pricing block (since rev 22) carried a separate hand-coded inline copy of the same plans with slightly different feature wording. A real price change had to land in two places + the landing-page block visibly drifted from the canonical /pricing page over time (the rev-22 block named '90-day memory' on the Pro card while the rev-202 page named '90-day memory retention'; small drifts that compound across two months of revs). Rev 203 closes that with a shared module that exports PRICING_PLANS + PRICING_COMPETITORS + a getPricingPlan(slug) helper. Each plan carries a stable slug (free / pro / team) which is also the rev-203 permalink anchor. Both /pricing and the landing block now read from the same array. The new /api/v1/pricing endpoint reads the same module. The rev-202 /llms-full.txt AI-discoverability surface reads the same module so AI agents indexing the site never see drift between the human-readable + protocol-bound + AI-discoverable views. Mirrors the rev-37 src/lib/changelog-releases.ts + rev-97 src/lib/roadmap-items.ts + rev-202 src/lib/integrations.ts shared-module pattern at the pricing axis.
GET /api/v1/pricing — closes the protocol-bound parity gap on the rev-202 /pricing marketing surfaceNew bearer-less GET endpoint returns every plan tier with slug + name + price (display + numeric priceUsd) + priceSuffix + description + featured boolean + features array + caps block (sources + memory + interval) + canonical per-plan share URL (loopdesk.space/pricing#plan-<slug>). Response also carries an aggregate summary block (planCount + startingPriceUsd + featuredPlanSlug + positioning notes: 'No per-cycle credits', 'No metered AI tokens', 'No overage bills', 'Daily cost cap on every tier'). Plus the rev-202 competitor-comparison block (Notion Custom Agents per-cycle credits, HubSpot Breeze outcome-based, per-token billing) projected on every response so MCP hosts rendering 'Loop Desk vs Notion' don't have to scrape the rev-202 page. Pure derived state from the rev-203 shared pricing module. No schema cost, no migration, no new query — pure code primitive. The public marketing v1 cluster reaches its seventh axis. Strategic significance: until rev 203 an MCP host wanting to answer 'what does Loop Desk cost?' programmatically had to scrape the SSR'd HTML at /pricing. Rev 203 closes that. The MCP server's pricing-axis tooling now has nothing left to design.
Per-plan permalink share chips on /pricing — mirrors rev-101/125/174/175 share-permalink vocabulary at the per-plan axisEvery plan card on the rev-202 /pricing page now carries a one-tap 'Copy link' chip beside the plan name. Tap to copy loopdesk.space/pricing#plan-free / plan-pro / plan-team to the clipboard with a 1.6s 'Copied' success state. New PricingPlanPermalink client component handles the clipboard write (with execCommand fallback for non-secure contexts, mirroring the rev-42/43/101/125/126/128/133/174/175 chip-copy pattern), updates window.history.replaceState so back/forward navigation re-fires the highlight, and binds a hashchange listener that smooth-scrolls + applies a 2.4s ld-plan-card-flash brand-color glow animation when the URL hash matches a plan slug on first load. Pure client-side affordance — no schema. Strategic significance: closes the share-affordance loop on the rev-202 /pricing primitive at the per-plan axis. Procurement reviewers sharing a specific plan card with a stakeholder ('here's the Pro tier — see the 90-day memory retention') now have a one-tap copy that lands the recipient directly on the matching card. Pairs with the rev-202 dedicated /pricing URL as the share-affordance pair: canonical URL (rev 202) + per-row anchor (rev 203). The lowest-friction expression of 'this scope is meant to be shared' at the per-plan axis. Mirrors the same pattern shipped across the changelog (rev 101 per-rev), roadmap (rev 125 per-item + rev 126 per-phase), per-template detail (rev 175), and per-rev changelog detail (rev 174). The public-marketing share-affordance vocabulary now reaches its sixth surface.
Two more onboarding templates — small independent cheesemongers + independent bookbinders / paper conservatorsCloses the rev-201 named radar at two more underserved owner-led specialty segments. Small independent cheesemongers (owner-led cheesemongers + cheese shops with affinage + producer relationships — 4 high-importance memory entries: affinage cycle discipline with every named wheel carrying a maturity log (arrival date + expected sell-by window + weekly maturity check on rind + paste + rotation), named-producer continuity on the 20% of revenue from named producers + affineurs with quarterly touchpoint + secondary supplier already qualified, shrinkage discipline with 3% weekly threshold per category triggering root-cause review on two consecutive weeks crossing threshold, pairing expertise as the load-bearing customer trust signal with in-house pairing card refreshed quarterly + 1 sample mid-week affinage signal on an overripe washed-rind shipment). Independent bookbinders / paper conservators (owner-led bookbinders + paper conservators + archival-paper specialists — 4 high-importance memory entries: named-substrate + adhesive discipline with cotton-rag for archival rebinds + PVA neutral-pH for general repair + wheat-starch paste for conservation rebacking + never animal hide-glue on a photographic piece + sub-policy on customer-flagged archival + sentimental + pre-1900 pieces treated as conservation-grade regardless of quote tier, chain-of-custody on every customer piece with condition report + photographs at intake + bench-handoff trail signed at every stop, rush-job hygiene with named deadline + rush-fee + substitution-risk-disclosure + on-time-confidence rating on every <14-day quote, conservation-grade supplier continuity with quarterly review on every supplier crossing 5% trailing-12-month material spend + second-source review on any supplier above 5% quality-rejection or 2-week lead-time miss + 1 sample mid-rebind customer signal on a wedding album with handed-in damage discovered mid-disassembly). Two new OnboardingTemplateKey enum values (cheesemonger in hospitality-food, bookbinder in manufacturing-specialty) extend the rev-19 enum without migration. The templates cluster is now seventy-five named verticals deep. Strategic significance: closes the named rev-201 radar wave at two more underserved owner-led segments where named-relationship discipline (affineurs on the cheese side, conservation-grade suppliers on the binder side) is the load-bearing differentiator against generic chain operators.
Start free — there are no metered credits to run out.