Addons
A unit of product functionality that spans the stack — a Drizzle table, the guarded server actions that operate on it, and the UI that drives them. One install lands a working feature in a base app; the app then runs its own migration, because a registry copies files and cannot reach your database.
account
The whole account lifecycle in one install: password reset, email verification, and the settings screen, over one set of guarded server actions. Install the surfaces individually if you only want part of it.
Install
pnpm dlx shadcn@latest add @arrecho/account -y --overwrite| Item | Ships |
|---|---|
| @arrecho/account-server | Password reset, email verification and account settings as guarded server actions over Better Auth, plus the mailer composition that finally gives the email templates a caller. |
| @arrecho/account-recovery-ui | The three screens someone who cannot sign in needs: request a reset link, choose a new password, and confirm an email address. Every state is a view that renders from props, so the flows are browsable without a database. |
| @arrecho/account-settings-ui | The signed-in user's own account screen: profile, password, email address, active sessions, and account deletion. Changing a password requires the current one and revokes every other session. |
| @arrecho/account | The whole account lifecycle in one install: password reset, email verification, and the settings screen, over one set of guarded server actions. Install the surfaces individually if you only want part of it. |
admin crud
Sortable, filterable, paginated admin data table with create/edit form dialog and delete confirmation. Every row of data and every mutation arrives as a prop, so the block works against any table.
Install
pnpm dlx shadcn@latest add @arrecho/admin-crud-ui -y --overwrite| Item | Ships |
|---|---|
| @arrecho/admin-crud-server | Drizzle schema fragment for a demo customers table plus the admin-guarded server actions that list, create, update, and delete its rows. |
| @arrecho/admin-crud-ui | Sortable, filterable, paginated admin data table with create/edit form dialog and delete confirmation. Every row of data and every mutation arrives as a prop, so the block works against any table. |
ecommerce
The whole storefront in one install: catalog, cart, and checkout over a shared Drizzle schema and server actions. Pulls all three surfaces; install them individually if you only want part of it.
Install
pnpm dlx shadcn@latest add @arrecho/ecommerce -y --overwrite| Item | Ships |
|---|---|
| @arrecho/ecommerce-server | The addon's server half: Drizzle schema for products, carts and orders, plus guarded catalog reads, cart mutations and a checkout that writes a pending order. Ships the shared domain types every surface speaks. |
| @arrecho/ecommerce-cart-ui | The cart surface: line items with live re-pricing, free-shipping progress, order summary, and a recommendation shelf. Installs the route and the view it renders. |
| @arrecho/ecommerce-storefront-ui | The shopping surfaces: homepage, product listing with server-side filtering and paging, and a product detail page with variant selection. Installs three routes and the views they render. |
| @arrecho/ecommerce-checkout-ui | Checkout and order confirmation. The form collects contact, address and delivery method, then places a pending order; the confirmation reads it back by token, so a guest can see their receipt without an account. |
| @arrecho/ecommerce | The whole storefront in one install: catalog, cart, and checkout over a shared Drizzle schema and server actions. Pulls all three surfaces; install them individually if you only want part of it. |
email
Transactional email: a provider-agnostic mailer, one transport per provider, and React Email templates. Swapping Lettermint for Resend is an import line. Ships no schema — nothing is recorded, and a send is a function call that either happened or did not.
Install
pnpm dlx shadcn@latest add @arrecho/email-lettermint -y --overwrite| Item | Ships |
|---|---|
| @arrecho/email-core | A provider-agnostic mailer: one validated message shape, a transport interface, and React Email rendering to html plus plain text. Install a transport alongside it — this half sends nothing on its own. |
| @arrecho/email-lettermint | Sends through Lettermint. Maps the SDK's fluent builder and minified error classes onto the mailer's transport interface, and constructs the builder per send because it is mutable and shared. |
| @arrecho/email-resend | Sends through Resend. Maps the SDK's { data, error } result and its error-code slugs onto the mailer's transport interface, passing rendered html and text rather than the react field. |
| @arrecho/email-templates | Five domain-neutral React Email templates — welcome, address verification, password reset, magic link, and a general-purpose notification — over one shared shell and palette. Table markup, inlined styles, and a real plain-text part. |
payments
Embedded Stripe Elements checkout: the payment form, the amount summary, and the page a customer lands on when a redirect-based method sends them back. Takes the client secret as a prop, so it renders in the catalog with no key and no network.
Install
pnpm dlx shadcn@latest add @arrecho/payments-ui -y --overwrite| Item | Ships |
|---|---|
| @arrecho/payments-core | A provider-agnostic payment seam over PaymentIntents: an amount built only from server-owned data, and the webhook route that verifies a signature, re-checks the money, and moves an order to paid exactly once. Install a driver alongside it — this half charges nothing on its own. |
| @arrecho/payments-stripe | Stripe driver over the PaymentIntents API, for an embedded Stripe Elements checkout. Never passes payment_method_types, so which methods you accept stays Dashboard configuration rather than code. |
| @arrecho/payments-ui | Embedded Stripe Elements checkout: the payment form, the amount summary, and the page a customer lands on when a redirect-based method sends them back. Takes the client secret as a prop, so it renders in the catalog with no key and no network. |
rate limit
A Postgres-backed fixed-window limiter and a withRateLimit() wrapper for Server Actions. Better Auth's own limiter only runs inside its HTTP handler, so an action calling auth.api.* directly is unthrottled without this.
Install
pnpm dlx shadcn@latest add @arrecho/rate-limit -y --overwrite| Item | Ships |
|---|---|
| @arrecho/rate-limit | A Postgres-backed fixed-window limiter and a withRateLimit() wrapper for Server Actions. Better Auth's own limiter only runs inside its HTTP handler, so an action calling auth.api.* directly is unthrottled without this. |
storage
Dropzone, per-file progress, file list and image picker. Every component takes the uploader as a prop, so the same components work against any driver and render in the catalog with no network.
Install
pnpm dlx shadcn@latest add @arrecho/storage-ui -y --overwrite| Item | Ships |
|---|---|
| @arrecho/storage-core | A provider-agnostic file store: the driver seam, server-derived object keys, an uploads table with a pending/committed lifecycle, and the route that authorizes a client-direct upload. Install a driver alongside it — this half stores nothing on its own. |
| @arrecho/storage-vercel-blob | Vercel Blob driver plus its browser uploader. Client uploads go straight to the store under a server-scoped token, so the 4.5 MB function body limit never applies. |
| @arrecho/storage-s3 | S3-compatible driver plus its browser uploader, covering S3, Cloudflare R2, MinIO and Backblaze from one implementation. Uploads go direct to the bucket under a presigned PUT that pins both content type and length. |
| @arrecho/storage-ui | Dropzone, per-file progress, file list and image picker. Every component takes the uploader as a prop, so the same components work against any driver and render in the catalog with no network. |
Installing an addon is two steps, not one
shadcn add writes the files; you then re-export the schema fragment from src/db/schema/index.ts and run pnpm db:generate && pnpm db:migrate. Each addon’s README names the fragment it shipped. Pass --overwrite — -y does not imply it, and without it a file collision silently abandons the rest of the install.