What we delivered
Recent updates and new features in plain English.
May 2026
- Fix
Correct RootPlan mode descriptions — walkthrough is not first-person
Shipped Correct RootPlan mode descriptions — walkthrough is not first-person.
- New
ContractTemplateManager + CRUD routes + ContractTemplateBuilderWidget (#4166c)
Adds the contract (tenancy agreement) template entity to TerraLedger — the final part of the #4166 billing/tenancy-setup cluster. A council customises a template once, then TerraLedger merges plot/tenant/billing data into the active template to generate agreements (for signature via RootSign).
- New
Bind ChargeCatalogueManager routes + ChargeCatalogueWidget (#4166b)
Shipped Bind ChargeCatalogueManager routes + ChargeCatalogueWidget (#4166b).
- New
Bind ClientBillingConfig route + BillingCycleSetupWidget (#4166a)
Shipped Bind ClientBillingConfig route + BillingCycleSetupWidget (#4166a).
- New
Add example dataset download CTA (#4167)
Shipped Add example dataset download CTA (#4167).
- Fix
Add snake_case fallbacks in entity managers for Vault-imported data
Shipped Add snake_case fallbacks in entity managers for Vault-imported data.
- New
Provision per-council account on claim approval
Shipped Provision per-council account on claim approval.
- New
Add /tenant-accounts and /recipes/attach route bindings
Shipped Add /tenant-accounts and /recipes/attach route bindings.
- Fix
Replace fake-email fallbacks with hard errors (#4168)
Shipped Replace fake-email fallbacks with hard errors (#4168).
- Fix
Unblock import validation gates
Unblocks the import validation gates after the Release-20260520 import-profile merge by tightening TypeScript types in the Vault and Collections import paths.
- Fix
Restore widget-manifest.json deleted in PR #4155
Shipped Restore widget-manifest.json deleted in PR #4155.
- Fix
Restore pnpm-lock.yaml deleted in PR #4155 — preprod builds broken
Shipped Restore pnpm-lock.yaml deleted in PR #4155 — preprod builds broken.
- New
Resolve imports through account mappings
Routes TerraLedger/allotment imports through account-scoped `schema.mapping` profiles stored in Collections, so council-specific Excel shapes map into canonical collection entities without hardcoded dogfood profiles.
- New
Charge catalogue with 8 calculation methods + Type 2 SCD pricing
Shipped Charge catalogue with 8 calculation methods + Type 2 SCD pricing.
- New
ImportProfileRegistry — shared import engine with TerraLedger + QueueSpark profiles
Shipped ImportProfileRegistry — shared import engine with TerraLedger + QueueSpark profiles.
- New
Add configurable import profile choices
Shipped Add configurable import profile choices.
- Fix
Enforce sandbox import simulation
Enforces TerraLedger/Vault sandbox import semantics so `simulate` validates real workbook data without persisting preview payloads, Collections rows, audit rows, or email side effects.
- New
Seeker → allotment full flow wiring (#4135)
Shipped Seeker → allotment full flow wiring (#4135).
- New
Migrate allotments.info pin credit from Stripe coupon to customer balance
Fixes a quiet revenue bug in the allotments.info pin → TerraLedger upgrade credit flow. The existing `duration: 'once'` coupon was consumed by the **first invoice only**, silently discarding unused credit. A 50-plot council with a £99 pin credit and £10/month TerraLedger usage lost £89 — 9 months of free service they were sold. Replaces Stripe coupons with Stripe customer balance transactions that auto-deplete across subsequent invoices until the credit is exhausted.
- New
Wire Metric 6 snowflake-metric calculation (#4135)
Replaces the hard-coded `null` for `rootplan_allotment_seeker_waitlist_rate` in `plotspark-intelligence`'s rootlytics route with a real cohort + funnel SQL calculation. IMPOSSIBLE_GOALS Metric 6 — the snowflake metric — is now measurable instead of permanently null.
- Fix
ROICalculatorWidget inverted error guard — calculator now renders
Shipped ROICalculatorWidget inverted error guard — calculator now renders.
- New
Wire TerraLedger plot metering — nightly snapshot + meter seed (#4109)
Wires the missing per-plot metering for the TerraLedger Community plan — nightly snapshot worker plus Stripe meter seed — so councils are billed against the configured `usageRates.plots.bands` ladder instead of stalling at the £10/mo floor.
- New
Competitive-displacement claim-evidence gate + 4 wired (#4063)
Adds Step 3 of #3956 — a sibling validator to the aha-schema gate that audits `competitiveAdvantage` claims and asserts each one can be backed by a test path, a docs citation, or a `TODO:#<issue>` placeholder. Wires 4 example recipes as proof and includes 7 vitest tests covering all rules.
- Fix
Bespoke P0 ahas for 7 launch-ready recipes, defer 8 scaffolds (#4055)
Replaces the auto-promoted placeholder P0 ahas (from #4054) with bespoke trigger+moment content for 7 launch-ready recipes, and marks 8 addon/scaffold/internal-page recipes as `status: planned + deferred: true` so they no longer require a `linkedTestOrSpec`.
- Fix
Prepend MRR-on-default-dashboard P0 aha for reachability (#4077)
Prepends a new P0 aha to rootlytics-recipe.json that ties directly to the gotchaMoment ('MRR ... all on one dashboard') and points at `intelligence/mrr-dashboard` — already on the default dashboard tab — so the reachability roll-up in release gate #3901 hits 4/4 instead of 3/4.
- Fix
Reword automatic cross-recipe context as on-demand
Rewords PlotSupport copy so the cross-recipe customer context claim accurately describes the mechanism (on-demand Collections query when an agent opens a ticket) rather than implying an event-driven push that does not exist.
- Fix
Make marketing shell social icons dts-safe
Shipped Make marketing shell social icons dts-safe.
- Fix
Enforce Communications allow-list in failed-job tile gate
Closes the only allow-list-enforcement gap found in the post-merge audit. Failed-job tile gate now declares COMMUNICATIONS_ALLOW_LIST + assertRecipientInAllowList() and routes the synthetic payload recipient through the guard. Matches the sibling-gate pattern (#3934 claim queue, #3935 cert queue, all TerraLedger gates, etc.). Vitest 24/24.
- Fix
Demand-MI gate strict-null guard
Closes the 1 new TS strict-null error surfaced by the PR #3922 code review. demand-mi-tile-proof-gate.ts:1002 needed an explicit guard before destructuring stats.topDemandAreas[0]. Runtime-safe, vitest still 20/20. Carries on the test-only nature of the gate file — no production code path changed.
- Fix
Widget install URL encoding, installed widget shape, booking customer ID schema, booking jobs startup
Shipped Widget install URL encoding, installed widget shape, booking customer ID schema, booking jobs startup.
- Fix
Remove deleted service refs from start/build/test scripts
Shipped Remove deleted service refs from start/build/test scripts.
- Fix
Wire columnMapping, auth header, and Excel format for CSV/Excel import
Shipped Wire columnMapping, auth header, and Excel format for CSV/Excel import.
- New
Load add-on widget catalog from recipe addon JSON files
Shipped Load add-on widget catalog from recipe addon JSON files.
- New
Add widget listing, categories, install and installed endpoints
Shipped Add widget listing, categories, install and installed endpoints.
- New
Wire WidgetMarketplace into DashboardHeader
Shipped Wire WidgetMarketplace into DashboardHeader.
- New
GCSE planner exam board cost reference and practical warnings
Shipped GCSE planner exam board cost reference and practical warnings.
- New
Agent identity, capabilities discovery, and reference agent
Shipped Agent identity, capabilities discovery, and reference agent.
- Fix
Correct RootScout widget endpoint paths in USP parity audit
Shipped Correct RootScout widget endpoint paths in USP parity audit.
- Fix
Correct rootscrum approval route in USP API parity audit
Shipped Correct rootscrum approval route in USP API parity audit.
- New
#3837 extend add-on catalog with content/marketing, analytics/gamification, project-management
Shipped #3837 extend add-on catalog with content/marketing, analytics/gamification, project-management.
- New
#3835 high-MRR launch proof gate
Shipped #3835 high-MRR launch proof gate.
- New
#3833 high-MRR launch proof gate
Shipped #3833 high-MRR launch proof gate.
- New
High-MRR USP release gate — lead to outreach outcome proof contract
Shipped High-MRR USP release gate — lead to outreach outcome proof contract.
- New
Widget Add-On Catalog — AI & Intelligence browse UI (#3827)
Shipped Widget Add-On Catalog — AI & Intelligence browse UI (#3827).
- New
High-MRR USP release gate — entitlement activation proof contract
Shipped High-MRR USP release gate — entitlement activation proof contract.
- New
High-MRR USP release gate — RTK session to field operation proof contract
Shipped High-MRR USP release gate — RTK session to field operation proof contract.
- New
High-MRR USP release gate — waitlist-offer lifecycle proof contract
Shipped High-MRR USP release gate — waitlist-offer lifecycle proof contract.
- New
Generic core/ProcessDiagramWidget with steps[] config (#3810)
Shipped Generic core/ProcessDiagramWidget with steps[] config (#3810).
- Fix
Resolve 37 pre-existing TypeScript strict-mode errors (#3816)
Shipped Resolve 37 pre-existing TypeScript strict-mode errors (#3816).
- New
Promote allotments-info, rootplan, rootlytics to implemented (#3805)
Shipped Promote allotments-info, rootplan, rootlytics to implemented (#3805).
- New
Stripe-to-MRR USP launch proof gate (#3806)
Shipped Stripe-to-MRR USP launch proof gate (#3806).
- New
Paid-season-plan USP launch proof gate (#3807)
Shipped Paid-season-plan USP launch proof gate (#3807).
- New
Allocation process diagram widget for admin waitlist view (#3803)
Shipped Allocation process diagram widget for admin waitlist view (#3803).
- New
Comms bounce/failure events trigger staff tasks (#3799)
Shipped Comms bounce/failure events trigger staff tasks (#3799).
- New
Staff hold/skip/override routes with mandatory audit reasons (#3798)
Shipped Staff hold/skip/override routes with mandatory audit reasons (#3798).
- New
Resource state machine, readiness gate, and offer lock (#3797)
Shipped Resource state machine, readiness gate, and offer lock (#3797).
- New
DB foundation for policy-driven waitlist workflow (#3796)
Lays the database and Collections schema foundation for the generic policy-driven waitlist offer workflow — the prerequisite that #3797 and #3798 depend on. Fixes #3796 Refs #3795
- Fix
Resolve extends inheritance in manifest generator
Shipped Resolve extends inheritance in manifest generator.
- New
Wire AI coaching + smart recommendation widgets into top-tier recipes
Shipped Wire AI coaching + smart recommendation widgets into top-tier recipes.
- New
Wire 6 remaining gamification widgets into rootplan recipe
Shipped Wire 6 remaining gamification widgets into rootplan recipe.
- New
Wire backlog-items + time-tracking widgets into rootscrum recipe
Shipped Wire backlog-items + time-tracking widgets into rootscrum recipe.
- New
Multi-window offer reminders, re-engagement template, live missions widget
Shipped Multi-window offer reminders, re-engagement template, live missions widget.
- New
Anonymous public booking + branding config + customer timezone
Adds anonymous public booking creation (no login required), per-workspace branding config, and customer timezone support to the public booking page. Fixes #3479
- New
Wire calendar sync into appointment lifecycle + availability
Wires the existing `schedulingService.syncToExternalCalendar()` into appointment create/cancel/reschedule and makes AvailabilityManager respect external calendar blocks. Fixes #3480
- New
Deposit/full payment toggle + tiered refund policy + slot release
Wires deposit-vs-full payment toggle, tiered cancellation refund policy, and slot release on checkout expiry into the booking payment flow. Fixes #3481
- New
Implement no-show fee charge + daily sweep cron
Replaces the \`handleNoShow()\` console.log stub with a real implementation that charges no-show fees and adds a daily sweep cron for stale confirmed appointments. Fixes #3485
- New
Wire RoutingManager auto-assignment into AppointmentManager
Connects the already-implemented \`RoutingManager\` to \`AppointmentManager.create()\` so bookings with no explicit staff member auto-assign via round-robin / least-busy / skill-weighted routing. Fixes #3484
- New
Wire rootplan plantings metering cron + snapshot job
Wires the already-implemented `UsageTrackingService.snapshotRootPlanPlantingsForAllAccounts()` into the billing cron scheduler so RootPlan planting usage is tracked for metered billing. Fixes #3773
- Fix
Skip auth tests when E2E credentials not configured
Shipped Skip auth tests when E2E credentials not configured.
- Fix
Revoke agent API keys via direct DB update
Shipped Revoke agent API keys via direct DB update.
- New
Complete RootLytics recipe marketing content
Shipped Complete recipe marketing content.
- New
Rebuild /verticals/restaurant as multi-recipe landing page
Shipped Rebuild /verticals/restaurant as multi-recipe landing page.
- New
Auto-generate 58 proxy route files from service-registry.json
Shipped Auto-generate 58 proxy route files from service-registry.json.
- New
AgentRateLimitWidget — per-agent rate limit dashboard
Shipped Add AgentRateLimitWidget — per-agent rate limit dashboard.
- Fix
Widget UX states — AvailabilityCalendarWidget and AudienceCalloutWidget
Shipped Add loading/error/empty UX states to AvailabilityCalendarWidget and AudienceCalloutWidget.
- New
MostLikedGardensWidget — monthly community garden rankings (#3220)
Shipped MostLikedGardensWidget — monthly community garden rankings (#3220).
- New
Photo journal widgets + recipe wiring (#3742)
Shipped Photo journal widgets + recipe wiring (#3742).
- New
PhotoVisibilityManager + public photo filter (#3740 #3741)
Shipped PhotoVisibilityManager + public photo filter (#3740 #3741).
- New
P2 quick wins — marketing content + remove as-any (#3732 #3733 #3734)
Shipped P2 quick wins — marketing content + remove as-any (#3732 #3733 #3734).
- New
Photo upload pipeline — schema, PhotoUploadManager, upload/delete routes (#3739)
Shipped Photo upload pipeline — schema, PhotoUploadManager, upload/delete routes (#3739).
- New
Real upvote aggregation and monthly garden rankings (#3220)
Shipped Real upvote aggregation and monthly garden rankings (#3220).
- New
Public garden timeline slider for vanity pages (#3218)
Shipped Public garden timeline slider for vanity pages (#3218).
- New
Alias system, booking registry gaps, NotificationCenter + 59 smoke tests (#3691/#3692/#3695/#3697/#3701/#3703/#2372)
Implements a widget alias system absorbing 22 missing recipe widget refs, fixes 3 booking registry gaps, adds the canonical `NotificationCenterWidget`, and delivers 59 widget smoke tests — resolving issues #3691, #3692, #3695, #3697, #3701, #3703, and #2372.
- New
Translate 9 settings pages to 7 languages (#1703)
Wires all 9 previously un-translated settings pages with `next-intl` `useTranslations`, adding 224 translation keys across 9 namespaces in 7 locale files (en, fr, de, pl, es, it, pt).
- New
LA council CNIS register portal (#2861)
Introduces the `homeschool-la` widget namespace with 3 widgets and a recipe for council officers managing the statutory Children Not in School (CNIS) register under the Children's Wellbeing and Schools Bill 2024–25.
- New
Recipe inheritance via `extends` — base templates for SaaS, land, school, booking (#2458)
Implements recipe inheritance via an `extends` field so child recipes deep-merge from 4 new base templates (SaaS, land management, school, booking), reducing per-recipe size by ~36% and cutting new recipe scaffold time from 3 days to under 2 hours.
- New
Embed read-only garden canvas for allotments.info (#3219)
Adds a read-only embeddable garden canvas at `/embed/rootplan/[gardenId]` for use on allotments.info featured garden pages, and adds an `embedMode` flag to `GardenShowcaseWidget` for chromeless inline embeds.
- New
Template versioning with update notifications
Implements workspace template versioning so users see an update badge when an official template has a newer version and can merge new widgets with a single click.
- New
Formalise composite service boundary, closes G-007 (ADR-0045)
Formalises the RootSchool composite service boundary (ADR-0045), closing audit gap G-007 from PR #3364 by creating a typed ownership manifest and a machine-readable `GET /api/rootschool/ownership` endpoint.
- Fix
Verify garden public status before serving public spatial layers (#3210)
Shipped Verify garden public status before serving public spatial layers (#3210).
- New
Whole-garden tracking — permanent plants, fruit trees, containers (#3212)
Shipped Whole-garden tracking — permanent plants, fruit trees, containers (#3212).
- New
Garden observations & journal CRUD (notes, photos, health, pest, harvest) (#3214)
Shipped Garden observations & journal CRUD (notes, photos, health, pest, harvest) (#3214).
- New
Support polygon boundary at garden creation — GeoJSON, derived dimensions (#3208)
Shipped Support polygon boundary at garden creation — GeoJSON, derived dimensions (#3208).
- Fix
Correct source value + require explicit consent for plot-history publishing (#3211)
Shipped Correct source value + require explicit consent for plot-history publishing (#3211).
- New
PlotSpark Sites — site builder CRUD + public renderer (#1608)
Shipped PlotSpark Sites — site builder CRUD + public renderer (#1608).
- New
Agent identity & scoped auth (#2833)
Shipped Agent identity & scoped auth (#2833).
- New
Add subject grant model and audit events for permissions
Extends the workspace permission grant model to be forward-compatible with group/role subjects, and adds structured audit logging for all permission lifecycle events. Fixes #3661
- Fix
RootCheck local gate, GitHub CI advisory, explicit loop flow
Updates the \`p0-p1-issue-loop\` skill to clarify the exact end-to-end loop and make RootCheck (local, \`localhost:4242\`) the primary code-review gate — GitHub Actions CI is explicitly advisory since credits are unavailable. Refs #3668
- New
Add p0-p1-issue-loop autonomous issue resolution skill
Adds the \`p0-p1-issue-loop\` Claude Code skill — a fully autonomous gated control loop for resolving P0/P1 GitHub issues into the active release branch without human intervention on each PR.
- New
Land P0/P1 launch agent batch
Lands the integrated P0/P1 agent batch across TerraLedger, Allotments.info, RootPlan, RootLytics, AI billing, recipe manifest/build gates, and high-MRR recipe workflow gates.
- Fix
Fallback when Railway private DB DNS fails
Shipped Fallback when Railway private DB DNS fails.
- New
Auto-seed platform agent profiles on startup
Shipped Auto-seed platform agent profiles on startup.
- New
Recipe completeness, widget skeleton loaders, and API key tests
Resolves four self-contained go-live items from the RootLytics epic (#3127): fixes a truncated aha moment media description in the recipe JSON, replaces spinner loading states with proper skeleton loaders in the two API key widgets, and adds an integration test suite + E2E smoke test for the RootLytics dashboard. Fixes #3127
- Fix
Wire CommunityForumWidget to real API, remove hardcoded mock posts
Extends the issue #3527 mock-surface hardening branch beyond the original social widget fix. The branch keeps the live API wiring for `CommunityForumWidget`, updates the recipe mock-surface inventory to match the merged RootFarm gates, and expands the Playwright release gate so stale inventory claims or unlabelled RootFarm mock widgets cannot slip back into release surfaces.
- Fix
Verify P0 widget gate — 0 failures, add audit reports
Closes the widget wiring gap audit for high-MRR recipes. All 39 P0 widgets across 10 recipes pass the gate (0 failures). Adds the missing workflow audit reports and refreshes the widget reference audit.
- Fix
Duplicate recipe tabs cleaned up
Recipe dashboards now collapse repeated generated tabs so RootSchool, RootPlan, and other workspaces show one tab per recipe workspace instead of long duplicate lists.
- Fix
Light and dark mode made consistent
The theme toggle is visible again and dashboard surfaces now use matching light or dark tokens instead of mixing a dark widget canvas with a pale page background.
- Improvement
Recipe and widget audit added
Added a script and report that list every widget referenced by recipe files, flag missing bundles or service routes, and classify event notifications as dashboard events delivered through webhooks.
- Improvement
Allotments workflow test plan documented
Audited Playwright coverage for every recipe and defined the critical allotments.info to QueueSpark to TerraLedger tests needed for waitlists, vanity pages, imports, offers, and webhooks.
- Fix
Duplicate recipe subscriptions blocked
Billing now returns one row per recipe, the My Recipes widget defensively deduplicates dirty data, and Studio recipe attachment now reuses an existing active recipe instead of inserting another duplicate.
- Fix
Database cleanup for duplicate subscriptions
Added migrations to deactivate duplicate Studio recipe attachments, cancel duplicate active billing subscriptions, and add unique indexes so the same active recipe cannot be subscribed twice.
- Improvement
Current release notes refreshed
The changelog now reflects the May 11 development build instead of leading with older February billing work.
February 2026
- New
Stripe checkout wired for first revenue
Checkout now resolves correct prices from Stripe via recipe-specific lookup keys. No more hardcoded fallback amounts — if a price isn't configured, checkout fails safely instead of charging the wrong amount.
- New
30-day free trials for B2B recipes
TerraLedger, RootSchool, and PlotSpark ERP now offer a 30-day free trial. Your card is collected at checkout but not charged until the trial ends. After 30 days, Stripe automatically starts your subscription.
- New
Trial-ending email 3 days before you're charged
You'll now receive an email 3 days before your free trial ends, telling you exactly what you'll be charged and how to cancel or manage your subscription.
- Improvement
Stripe price sync tool for recipe pricing
New script reads all recipe pricing tiers and creates matching Stripe Products and Prices. Idempotent, supports dry-run mode, and uses lookup keys so checkout always charges the right amount.
- Improvement
Pricing increased to reflect value delivered
Prices raised 50–100% across all recipes following our Chapter 9 pricing review. Low prices signalled instability to B2B buyers — the new prices position PlotSpark as a serious, sustainable platform.
- Improvement
B2B free tiers replaced with 30-day trials
10 B2B recipes (TerraLedger variants, RootSchool, PlotSpark ERP) no longer have permanent free tiers. Councils and schools now get 30 days of full access, then convert to the Starter plan. Consumer recipes like RootBooker and RootScrum keep their free tiers.
- Improvement
6-month grandfathering policy — no permanent grandfather pricing
When prices increase, existing customers keep their current rate for up to 6 months. After that, everyone moves to the new pricing. This keeps revenue sustainable and pricing fair.
- New
Invoice history and team management in Settings
New pages at /settings/invoices and /settings/team. View and download past invoices, and manage team members with role-based access.
- New
Webhook delivery logs for developers
The developer webhooks page now shows delivery history, retry counts, and response times. You can also send test events to debug your integration.
- Fix
Billing test suite fully green — 174 tests, 0 failures
Fixed all pre-existing test failures in the billing service. Resolved ESM import issues with nanoid v5, TypeScript errors in SAP accounting integration, and a syntax error in widget definitions.
- New
Careers and Data Marketplace onboarding enabled
The Careers and Data Marketplace recipes now have complete onboarding flows guiding new users through initial setup.
- Improvement
49 new tests across billing, RootTrade, and grandfathering
Added 34 tests for the grandfathering policy, 15 tests for RootTrade backtesting strategies, plus 20 tests for trial checkout and email templates.
- New
110 new widgets fill every gap across the platform
Added 110 missing widget components across 17 services. Every recipe now has all the widgets it references — no more placeholder gaps or blank panels.
- New
RootDate: AI-powered dating recipe launched
New dating recipe with AI-powered compatibility matching, double opt-in consent, profiles, a discovery feed, and full platform integration including notifications, gamification, and analytics.
- New
RootShift: shift scheduling recipe launched
Shift scheduling is now live — manage rotas, swap shifts, and track availability. Includes API endpoints, aha moments, and full recipe integration.
- New
ERP recipe with Odoo comparison
New ERP recipe for small businesses with a marketing page, domain configuration, E2E tests, and a detailed buildability assessment comparing PlotSpark to Odoo.
- New
25 new interactive map widgets
Added 25 layered map widgets across 5 recipes — interactive site maps, zone overlays, and spatial data views powered by the Layers service.
- Improvement
Featured recipes now in a carousel with category filters
The homepage recipe showcase is now a swipeable carousel instead of a wall of cards. Filter by category to find the recipe for your industry, or swipe through all 10. Shows 3 at a time on desktop, 2 on tablet, 1 on mobile.
- Improvement
Recipe count shown for social proof
The 'View All' button on the homepage now shows the total number of recipes available, so you can see the breadth of the platform at a glance.
- Improvement
Schedule a Call moved next to 'Ready to get started?'
The booking form now appears right below the 'How it works' section so you can schedule a call without scrolling to the bottom of the page.
- Fix
Less whitespace on marketing pages
Reduced the large gap at the top of marketing pages. The hero section is now more compact and banners no longer flash a spinner before disappearing.
- Fix
5,765 missing translations added across 7 languages
Filled in 5,765 missing translation keys across English, German, French, Polish, Spanish, Welsh, and Italian. Fixed broken JSON in German, French, and Polish locale files that was causing crashes.
- Fix
All tests passing — zero failures
Resolved all remaining test failures across dashboard, auth, internationalisation, widget, and service tests. The full test suite now passes cleanly.
- Fix
Type errors fixed across all services
Resolved TypeScript errors in terraledger, social-service, billing, plotspark-intelligence, and other services. Clean compilation across the entire platform.
- Fix
Booking calendar fixed on iPad
Fixed the calendar layout that was broken on iPad and improved the booking page layout for tablet-sized screens.
- Fix
Widget styles now render correctly everywhere
Fixed an issue where some widget styles weren't loading. Tailwind now scans widget source files so all styles are included in the build.
- Fix
Removed placeholder G2 badge
The 'Coming soon on G2' rating badge has been removed from the homepage until real reviews are collected.
- Fix
Redundant floating call-to-action removed
Disabled the floating 'Schedule a Call' button that was duplicating the inline booking form further up the page.
- New
Automated refunds when you cancel
Cancel a subscription and any eligible refund is now processed automatically through the rules engine. No manual intervention needed.
- New
Garden snapshots kept for 6 months
RootPlan now saves snapshots of your garden layout every time you change it, and keeps them for 6 months. You'll get a heads-up before old snapshots expire.
- New
Full German and EU legal compliance
Impressum, accessibility statement, DPA, cookie policy, privacy policy, and terms & conditions are now available in German. All legal pages include company registration details and comply with EU regulations including the European Accessibility Act.
- Improvement
14-day no-quibble refund guarantee
Our terms now include a 14-day cooling-off period with a simple withdrawal form, plus the German VSBG dispute resolution declaration.
- New
Aha moment screenshots on marketing pages
Recipe marketing pages now show screenshots and videos next to each aha moment, so you can see exactly what the product looks like before signing up.
- Fix
Stability and crash fixes
Fixed a crash that could happen when environment variables were missing, resolved a layout issue with the skip-to-content link, and upgraded next-intl to v4 for better internationalisation support.
- Improvement
Faster, cleaner builds
Eliminated Turbopack warnings, fixed 2,188 widget type errors, and resolved build issues across shared packages. The platform now builds cleanly with zero TypeScript errors.
- New
Plot transfers with configurable pricing
Councils can now set transfer fees when tenants swap or hand over plots. Pricing is fully configurable per site.
- Improvement
Marketing content across all recipes
Every recipe now has clear descriptions of the problems it solves, the value it delivers, and how it compares to alternatives. Helps you pick the right recipe for your needs.
- New
7-language support across all domains
All 9 domains now support English, German, French, Polish, Spanish, Welsh, and Italian. Your language preference is remembered between visits.
- Improvement
Better SEO with hreflang tags
All pages now include hreflang alternate links and a multilingual sitemap, so search engines show the right language version to the right audience.
- Improvement
47 TerraLedger widgets polished to production standard
Every TerraLedger widget now has skeleton loading, error recovery, empty states with clear next steps, toast notifications, and full keyboard accessibility.
- New
Self-service vanity domain setup
You can now set up your own branded domain (e.g., yourcouncil.allotments.info) from the Settings tab without contacting support.
- Improvement
Improved rent calculator
The allotment rent calculator now includes UK regional comparisons, concession rate support, rod/perch units, and auto-calculates based on your site details.
- New
Per-recipe video embeds
Each recipe can now have its own explainer video on its marketing page.
- New
Personalised email sender identity
Emails now come from your account's name and address, not a generic PlotSpark mailbox.
- New
6 gotcha moment widgets for the marketing funnel
Interactive calculators on marketing pages now link directly to the matching recipe, converting interest into signups.
- New
RootSchool, RootFaith, RootBooker, RootVibe, and RootSign complete
Five more recipes are now production-ready with full dashboards, onboarding flows, E2E tests, and widget test suites.
- New
TerraLedger dashboard with 26 widgets across 4 tabs
Council officers now have a full daily workflow dashboard: plots and tenants, finances, compliance, and communications all in one view.
- Improvement
RootPlan and RootLytics dashboards redesigned
RootPlan now has 2 tabs with 5 tested widgets. RootLytics has SaaS metrics tabs with full widget and E2E tests.
- Improvement
15 widgets now have empty states with clear next steps
When a widget has no data yet, it now tells you exactly what to do first instead of showing a blank screen.
- New
Guided onboarding for new users
First-time users now see a step-by-step onboarding wizard that creates their first site, garden, or queue as they go. No more staring at an empty dashboard.
- Improvement
Full user funnel tracking
We now track the complete journey from landing page through to paid conversion, helping us find and fix drop-off points.
- Improvement
Platform recipe config (for recipe builders)
Recipes can now declare optional platform config (AI Team, retention tools, Smart Inbox) so one implementation serves many recipes with recipe-specific context. No change to end-user UI.
- New
Billing wired end-to-end with Stripe
Subscription management, usage dashboards, and recipe checkout now work end-to-end. You can subscribe, see your usage, and upgrade plans from inside the app.
- New
Usage limits and upgrade prompts
Free-tier users now see their usage against limits (e.g., collections, map layers) with a clear prompt to upgrade when they need more.
- Improvement
Health monitoring and status dashboard
A production status dashboard with automated alerting so we know about issues before you do.
- New
2-year billing option and improved waitlist experience
You can now choose a 2-year billing period with locked pricing. Waitlist signups get clearer confirmation emails, and we've expanded E2E tests for critical user journeys (tenant-to-plot, recipe subscription, checkout).
January 2026
- Fix
Security hardening: httpOnly cookies
Authentication tokens moved from localStorage to httpOnly cookies, eliminating a class of XSS vulnerabilities. Your sessions are now more secure.
- Improvement
Structured logging across the platform
Replaced all console.log/error/warn calls with structured pino logging. Better diagnostics when things go wrong, and no accidental data leaks in browser consoles.
- Fix
33 widget TODOs resolved
Action handlers and API integrations that were stubbed out are now fully wired up across 33 widgets.
- New
Salon waitlist auto-fill on cancellation
When a salon booking is cancelled, the next person on the waitlist is automatically offered the slot.
- New
Feedback & Roadmap SaaS recipe
New recipe for collecting user feedback with voting, a public roadmap, and changelog. Dogfooding it ourselves.
- New
Bring Your Own Stripe Key (BYOK)
You can now connect your own Stripe account for direct payouts instead of using PlotSpark's shared payment processing.
- New
Role-based access control
Admins, officers, and members now see different features based on their role. Permissions are enforced across all recipes.
- Improvement
Accessibility improvements
ARIA labels, keyboard navigation, and focus indicators added across all core widgets. Working towards WCAG AA compliance.
- Improvement
CDN widget delivery architecture
Widgets are now pre-built and served from the CDN instead of being bundled with the main app. Build times dropped from 14+ minutes to under 4 minutes.
- New
TerraLedger launch preparation
Platform-wide RBAC, comprehensive launch checklist, and all TerraLedger domains enabled for production deployment.
- New
Onboarding flows for 8 Root* recipes
RootPlan, RootLytics, RootScout, RootScan, RootMarks, RootSchool, RootFaith, and RootBooker now guide you through setup when you first arrive.
- New
What we delivered: release notes are here
You can now see what we ship on a dedicated changelog page and in email updates.
- New
You can set a daily limit on bookings
Stops your calendar from being overbooked when you have a cap.
- Improvement
Build reliability and memory fixes
Pre-compiled recipe manifest cuts memory usage by 99.1%. Removed ignoreBuildErrors — all TypeScript errors must be resolved before deploy.
- Improvement
Free tier adjusted to 10 plots
The free plan for TerraLedger now includes up to 10 plots (previously 50), better reflecting the value of the platform.
- New
Core auth flows wired up
Password reset, profile updates, and billing management now work end-to-end from the UI.
- New
All 40 recipes finalised for MVP
Every recipe has complete pain points, value propositions, competitive advantages, bundle descriptions, dashboard layouts, and onboarding flows.
