GitHub

What changed.

Taken from the repository history. There are no version numbers yet; the project ships from main.

Archive vs delete, and an admin speed pass

Destructive actions got honest defaults, and the admin stopped paying for round-trips it didn't need.

  • removed

    Trash was removed. Delete is permanent, Archive hides a record and can be undone, and the confirm dialog defaults to the safe option.

  • added

    Archive, Unarchive, and Delete across the server-driven admin modules, with the archived queue reachable by query parameter instead of a shallow-broken filter facet.

  • changed

    Roughly ninety uncached per-page admin queries are now cached, the sidebar streams, storefront hydration runs in parallel, and the JSON-LD double fetch is gone.

  • changed

    Recharts and TipTap load lazily, the mutation path defers its audit write, and each admin action reads the principal once instead of twice.

  • fixed

    Magic-link login no longer lands on a stale render — cache invalidation can't throw during render.

Type drift killed at the compiler

Admin reads now derive their types from the queries that produce them, so a column rename fails the build instead of the page.

  • changed

    List and detail row types are derived from validated query args rather than hand-written casts that quietly drifted.

  • added

    Every admin CRUD include is guarded with `satisfies Prisma.<Model>DefaultArgs`.

  • changed

    A failed read raises an error instead of returning an empty page that looks like no data.

  • fixed

    Referral resolution failures are logged rather than swallowed.

Release readiness

Public API, permissions, and vocabulary cleaned up ahead of wider use.

  • fixed

    Public API corrections and naming consistency across modules.

  • changed

    Activity taxonomy completeness and permission alignment — every logged module is filterable.

  • fixed

    Messages migration finished and attribution URL matching corrected.

Phantom fields can no longer compile

Schema fields with no column behind them are now a compile error, with a ratchet so coverage cannot slip.

  • added

    Compile-time phantom-field guard across thirty-two schemas, plus a dead-column register and a ratchet so coverage can't slip.

  • fixed

    Two silent-drop write bugs found by the new guard.

  • changed

    Domain events ride one internal async substrate instead of several ad-hoc paths.

  • added

    Customer invitations: accept on signup, a real decline flow, and the orphaned-referral case fixed.

A page is its rows; one translation table

Two long-running abstractions collapsed, and the checkout money path got a single-pass quote.

  • removed

    Element, page templates, and PageLayout folded away — a storefront page is now just its rows.

  • changed

    Three per-entity translation tables became one polymorphic Translation model.

  • changed

    BaseCRUD adopted across twelve modules, which surfaced and fixed a channel phantom-field write bug.

  • fixed

    Checkout quotes in a single pass, fixing sale double-subtraction and loyalty dropped at charge time; cart display prices now use the same channel basis checkout charges.

Payments, SEO, and email correctness

Provider boundaries tightened and several reporting surfaces told the truth again.

  • changed

    Webhook verification moved behind the PaymentProvider boundary, and manual capture is guarded.

  • added

    New SEO audit checks, sitemap images, an empty-collection filter, and Product brand in structured data.

  • fixed

    Marketing email stops on permanent bounces and complaints, not on temporary ones.

  • added

    The links table surfaces attributed revenue, clicks, and conversions; integrations surface OAuth token expiry with reason-first sync errors.