BETAPro is not billed during beta. Lock in the price and we will honor it at launch.Freeze this price

Changelog

Stay up to date with the latest changes in our product.

2026-03-24 v3.1.1

2026-03-24 v3.1.1

Fixes and improvements

  • Checkout return after payment: After Stripe checkout, users are redirected to /checkout-return, which polls listPurchases until an active plan appears (avoiding a race with webhook processing). The pricing table passes organizationId in the return URL when applicable. If confirmation does not arrive within the timeout, users are sent to /choose-plan. Added checkoutReturn copy in English, German, Spanish, and French.

2026-03-23 v3.1.0

2026-03-23 v3.1.0

Tooling

  • Lint and format stack: Replaced Biome with Oxlint and Oxfmt for faster linting and formatting across the monorepo.
  • Workspace layout: Consolidated Oxlint/Oxfmt dependencies at the repository root (pnpm catalog) and removed redundant per-package Biome configs; lockfile and many source files were updated to match the new rules and formatter output.

2026-03-18 v3.0.3

2026-03-18 v3.0.3

Added

  • Persist last active organization: A new lastActiveOrganizationId field is stored on the user record whenever the active organization changes. On next sign-in, the session is automatically restored to that organization via a better-auth databaseHook, so users no longer land on a default/empty organization after logging back in.

2026-03-09 v3.0.2

2026-03-09 v3.0.2

Fixes and improvements

  • Tailwind Typography: Added @tailwindcss/typography plugin to the marketing app so prose and prose-invert classes render styled content correctly (blog posts, legal pages, changelogs)
  • Page spacing: Normalized top padding across marketing pages (blog list, blog post, changelog, contact, legal) from pt-24 pb-16 to py-16 for consistent vertical rhythm
  • Image hostname: Added picsum.photos to the allowed remote image hostnames in next.config.ts for blog placeholder images

2026-03-08 v3.0.1

2026-03-08 v3.0.1

Fixes and improvements

  • Single `useTranslations()` per component: Removed redundant useTranslations() hooks (e.g. tSignup, tLogin, tSettings, tPricing, tActions, tAria, tAvatar, tOrgSettings) across marketing and SaaS components. Components now use a single t for all translation keys.
  • Color mode labels: Marketing and SaaS ColorModeToggle now use the full key path common.colorMode.${option.value} for option labels.
  • Organization and settings keys: ChangeOrganizationNameForm now uses organizations.settings.changeName.notifications.success / error and settings.save via the shared t; other organization and settings forms (delete org, logo, change email/name/password, two-factor) use the single t for their copy.
  • List purchases enrichment: listPurchases (packages/api) now returns each purchase with resolved planId and planPrice from the payments helper, so clients receive plan data without extra lookups.
  • Purchase helper: createPurchasesHelper and getActivePlanFromPurchases in packages/payments now accept a ResolvedPurchase type (with optional planId and planPrice) and use resolvePurchasePlan / resolvePurchasePlanId to avoid duplicate provider price resolution when purchases are already enriched.
  • SaaS NavBar: Nav link list uses flex-nowrap, overflow-x-auto, and responsive md:overflow-visible md:flex-wrap so links scroll horizontally on small screens and wrap on larger ones; sidebar layout keeps md:flex-nowrap for the vertical nav.

2026-03-08 v3.0.0

2026-03-08 v3.0.0

Major architectural changes and breaking updates

  • App split: The former apps/web application has been split into dedicated apps/marketing and apps/saas Next.js apps
  • Route changes: Marketing routes and SaaS auth/app routes moved into new App Router layouts and path groups
  • Config scoping: Marketing and SaaS now use app-local config.ts, types.ts, and i18n request/config helpers instead of sharing apps/web config
  • Payments model: Billing now uses plan-based configuration and provider priceId values instead of client-facing productId
  • Purchase schema: Purchase records were renamed from productId to priceId across Prisma, Drizzle, and generated Zod schemas
  • i18n split: Translations are now split by scope (marketing, saas, mail, shared) and loaded through a new getMessagesForLocale helper
  • Translation key updates: Marketing and SaaS UI copy now uses full-length translation keys consistently across forms, nav, pricing, settings, admin, and auth flows
  • API removals: The contact and newsletter API routers were removed from packages/api
  • Mail changes: Newsletter signup email/template support was removed and mail rendering now resolves scoped translations from @repo/i18n
  • UI moves: Several SaaS-specific UI primitives were moved out of @repo/ui into apps/saas/modules/shared
  • Workspace tooling: The workspace now relies on a pnpm catalog for shared dependency versions
  • New apps: Added standalone apps/marketing and apps/saas applications with their own package.json, next.config.ts, tsconfig.json, global styles, robots, layouts, config, and Playwright setup
  • Marketing app: Public pages now live in apps/marketing, including home, blog index and post routes, changelog, contact, legal pages, sitemap generation, locale switching, and refreshed home-page sections
  • SaaS app: Protected application routes now live in apps/saas, with separate authenticated and unauthenticated layouts, account dashboards, organization settings, onboarding, auth pages, and API routes
  • Removed: Deleted the old combined apps/web app and its shared layouts, proxy, sitemap, and duplicated feature modules
  • Scoped translations: Split locale files into packages/i18n/translations/{locale}/marketing.json, saas.json, mail.json, and shared.json
  • New locales: Added Spanish (es) and French (fr) alongside English and German
  • Typed config: Added typed i18n config/interfaces and exported config, Locale, and scoped message types from @repo/i18n
  • Message loading: Added getMessagesForLocale(locale, scope) with shared-message merging and default-locale fallback behavior
  • Key normalization: Updated marketing and SaaS components to use explicit full-length translation keys instead of shorter or ambiguous key paths
  • App wiring: Marketing and SaaS now each own their locale request/update helpers and locale-aware providers
  • Plan-based checkout: createCheckoutLink now accepts planId, type, and optional interval, then resolves provider price IDs server-side
  • Payments config: Replaced productId pricing config with typed plan definitions, priceId fields, requireActiveSubscription, and reusable plan lookup helpers
  • Purchase queries: listPurchases now accepts an optional input object by default, simplifying direct server/client calls
  • Database schema: Renamed purchase productId to priceId in Prisma and generated validation output
  • Auth updates: Better Auth now uses the SaaS base URL, raises the minimum password length to 8, reserves chatbot as an organization slug, and updates invitation redirects to /login and /signup
  • Removed API endpoints: Deleted the contact and newsletter oRPC modules from packages/api
  • Mail package refactor: Moved mail helpers into packages/mail/lib, added scoped mail translation loading, and removed the newsletter signup template/export
  • Marketing forms: Marketing contact/newsletter flows were refactored along with the new app split rather than continuing to rely on the removed shared API modules
  • SaaS UI ownership: Moved password input, settings list/item, page header, and related shared components into the SaaS app to avoid over-generalizing them in @repo/ui
  • Workspace cleanup: Added pnpm catalog version management and refreshed package wiring across apps and packages

2026-03-05 v2.0.6

2026-03-05 v2.0.6

Refactoring

  • Server-side oRPC: Introduced a server-only oRPC client that calls the API router directly (no HTTP) during SSR. Added @orpc/server (1.13.6) to apps/web, new orpc.server.ts that sets globalThis.$orpcClient via createRouterClient(router, ...), and instrumentation.ts plus root layout import so the server client is registered before use.
  • orpc-client: Client now throws on the server ("RPCLink is not allowed on the server side") and uses window.location.origin for the RPC URL; exports orpcClient as globalThis.$orpcClient ?? createORPCClient(link) so server code uses the direct router client.
  • API: packages/api now exports router; payments.listPurchases procedure returns the purchases array directly instead of { purchases }.
  • Payments: Removed getPurchases and apps/web/modules/saas/payments/lib/server.ts. Account and organization billing pages and choose-plan page now call orpcClient.payments.listPurchases() directly; removed attemptAsync (es-toolkit) in favor of direct await. usePurchases hook updated to use data ?? [] to match the new procedure return shape.

2026-03-05 v2.0.5

2026-03-05 v2.0.5

Fixes

  • Payments / organizations: When redirecting unsubscribed users to the choose-plan page, organizationId is now only passed to the payments list when organizations are enabled and billing is attached to the organization (billingAttachedTo === "organization"). Previously, organizationId was passed whenever organizations were enabled, which could incorrectly scope or look up purchases by organization when billing was configured at the user level and cause a redirect loop.

2026-03-02 v2.0.4

2026-03-02 v2.0.4

Dependency updates

  • @orpc packages: Upgraded from 1.13.2 to 1.13.6 across the monorepo
  • apps/web: Updated @orpc/client to 1.13.6
  • packages/api: Updated @orpc/client, @orpc/json-schema, @orpc/openapi, @orpc/server, and @orpc/zod to 1.13.6

2026-02-05 v2.0.3

2026-02-05 v2.0.3

Radix UI dependency consolidation

  • Major dependency update: Migrated from individual @radix-ui/react-* packages to unified radix-ui package (v1.4.3)
  • Consolidated dependencies: Replaced 13 separate Radix UI packages with a single radix-ui package
  • Updated all UI components to use new unified package imports:
  • Replaced Radix icons: Migrated from @radix-ui/react-icons to Lucide icons
  • Features component: Replaced MobileIcon from Radix with SmartphoneIcon from Lucide
  • Select component: Replaced CheckIcon from Radix with Lucide's CheckIcon
  • Removed @radix-ui/react-icons dependency
  • UI package: Updated packages/ui/package.json to use unified radix-ui package
  • Web app: Updated apps/web/package.json to use unified radix-ui package
  • Dependencies: Reduced from 13 separate Radix packages to 1 unified package
  • Simplified dependency management with single package
  • Reduced bundle size and faster install times
  • Consistent versioning across all Radix UI components
  • Easier maintenance and updates

2026-02-05 v2.0.2

2026-02-05 v2.0.2

AI Chat refactoring and UI improvements

  • Major refactoring: Simplified AI chat feature to streaming-only interface, removing chat persistence
  • Removed: Chat storage and CRUD operations (create, list, find, update, delete, add-message procedures)
  • Removed: AiChat database model from all schemas (Prisma, Drizzle MySQL/PostgreSQL/SQLite)
  • Removed: Database queries for AI chats (ai-chats.ts files)
  • Simplified: AI router now only exposes a single stream endpoint for real-time AI responses
  • Refactored: AiChat component to use streaming without persistence, using @ai-sdk/react's useChat hook
  • Simplified: Chatbot pages removed prefetching logic for chat lists and individual chats
  • New: stream-message procedure that streams AI responses without storing conversations
  • Any code using orpcClient.ai.chats.* endpoints will need to be updated
  • Database migrations will need to drop the ai_chat table if it exists
  • Chat history persistence is no longer available - conversations are session-only
  • NavBar: Added conditional bottom border when scrolled (border-b when !isTop)
  • Button component: Removed icon opacity styling ([&>svg]:opacity-60) for better icon visibility
  • Global styles: Added consistent Lucide icon stroke-width (1.75) for improved icon rendering

2026-02-05 v2.0.1

2026-02-05 v2.0.1

UI component enhancements and design improvements

  • Major enhancement: Complete redesign of the toast component with custom styling and improved UX
  • Added custom Toast component with support for different types (success, error, info, warning, loading, default)
  • Added automatic icons for each toast type using Lucide icons
  • Added helper functions: toastSuccess, toastError, toastInfo, toastWarning, toastLoading
  • Added toastPromise function for handling async operations with loading/success/error states
  • Improved visual design with type-specific border colors and icons
  • Added support for action and cancel buttons in toasts
  • All form components updated to use the new toast API
  • Redesigned: Changed from dropdown menu to a modern segmented control/toggle button style
  • Added smooth sliding indicator animation for active state
  • Replaced dropdown menu with inline toggle buttons for better UX
  • Added tooltips for each color mode option (System, Light, Dark)
  • Improved accessibility with proper ARIA labels and pressed states
  • Added translations for color mode labels (common.colorMode.system, common.colorMode.light, common.colorMode.dark)
  • Updated icon from HardDriveIcon to MonitorCogIcon for system mode
  • Simplified: Removed inline color mode selection submenu from user menu
  • Color mode toggle now uses the standalone ColorModeToggle component
  • Cleaner menu structure with better separation of concerns
  • Select component: Updated border radius from rounded-md to rounded-lg for consistency with design system
  • SettingsItem component: Increased left column width from 280px to 320px for better content spacing
  • Theme colors: Updated muted background color from #1d1e1e to #191b1b for improved contrast
  • Updated all SaaS form components to use the new toast API:

Page 6 of 9