LaravelReactE-commerce

shop-template — Laravel Ecommerce Template

By StuMason

An open-source e-commerce template built on Laravel and React, providing an SSR storefront, bank transfer and USDC stablecoin payments, and built-in MCP, ACP, and x402 interfaces for AI agents.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-08View source

What stands out

A quick read of the recorded project description.

01

A complete e-commerce storefront built on Laravel and React (Inertia SSR), including product catalog, variants, categories, search, and an account system

02

Supports GoCardless instant bank transfers and USDC stablecoin payments on the Base network, both sharing one settlement implementation

03

Built-in MCP server, Agentic Commerce Protocol (ACP), and x402 protocol for AI agents to discover, purchase, and settle

04

Back-office administration covers orders, discounts, shipping, VAT, review moderation, and RBAC permissions, and includes automation such as abandoned cart recovery

05

Digital products support signed time-limited download links, skipping shipping at checkout and automatically completing orders

06

Provides llms.txt, product markdown, AGENTS.md, and a crawler-friendly robots.txt for easier machine reading

Template Details

This is an e-commerce template built on Laravel and React (Inertia SSR), positioned as a store starting point for the AI-agent era. It provides a complete product catalog (products, options, variants, categories, search), an account system (order history, address book, two-factor authentication and passkeys, support tickets), and back-office administration (order state machine, discounts, shipping, VAT, review moderation, RBAC permissions). For payments, it supports GoCardless instant bank transfers and a "Pay with USDC" button settling in USDC stablecoin on the Base network, both sharing the same settlement logic. The template also includes digital product delivery (signed time-limited download links), abandoned cart recovery, back-in-stock notifications, review invitations, weekly metrics summaries, and AI support replies drafted from real order history.

The AI-agent-facing part is its main differentiator: a built-in MCP server (/mcp/shop) for agents to search, build baskets, and check out; support for OpenAI/Stripe's Agentic Commerce Protocol (ACP), providing product feeds and checkout sessions; and the x402 protocol, allowing agents to autonomously settle orders in USDC on the Base network. The template also provides llms.txt, a markdown version of each product, AGENTS.md, and a robots.txt that welcomes crawlers.

Regarding usage limitations: locally it uses a fake payment gateway by default, and real bank payments require configuring GoCardless sandbox or production credentials; x402 and ACP require additional environment variables and external services (such as the PayAI facilitator and a Reown project ID). Legal pages are placeholder content and must be replaced before transactions; email requires configuring a transactional provider and setting up SPF/DKIM; VAT must be enabled manually in the admin; and production environments should configure error monitoring and backups. Digital product delivery relies on a private disk, which must be mounted as a persistent volume during deployment.

LaravelReactE-commerce

Is it right for your project?

Use Cases

  • Need to quickly set up an e-commerce storefront that supports bank transfers and stablecoin payments
  • Want AI agents (such as ChatGPT and Claude) to be able to discover, purchase, and autonomously settle products
  • Sell both physical and digital products and need automatic delivery of download links
  • Need back-office management of orders, discounts, shipping, VAT, and customer support tickets
  • Want to self-host with Docker or deploy to platforms such as Railway and Coolify

Suitable For

  • Developers or small teams familiar with Laravel and React
  • Merchants who need to open purchasing channels for AI agents
  • E-commerce projects that want to use it for free under the MIT license and modify the code themselves
  • Deployment scenarios that accept starting with SQLite and can later switch to Postgres

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    With Docker, you can run docker compose up; on first startup the container automatically generates APP_KEY, migrates, and seeds demo data

  2. 2

    For local native running, use composer setup and composer dev; the default admin is [email protected] / password, and production environments must set ADMIN_EMAIL and ADMIN_PASSWORD

  3. 3

    Local payments default to a fake gateway; real bank payments require configuring GoCardless sandbox or production credentials and a webhook secret

  4. 4

    Enabling x402 requires setting X402_ENABLED, X402_PAY_TO, and facilitator-related variables; enabling ACP requires setting ACP_API_KEY

  5. 5

    Before transactions, replace the placeholder legal pages, configure transactional email and SPF/DKIM, enable VAT as needed, and mount a persistent volume for the digital product private disk

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.

Must comply with when using

  • You are allowed to use, modify, commercialize, and distribute the code of this version for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the complete MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
  • Local payments default to a fake gateway (all payments succeed); real bank payments require separately configuring GoCardless.
  • Real bank payments require creating a GoCardless sandbox account and configuring credentials such as an access token.
  • Production environments must switch GoCardless to the live environment and provide a formal access token and webhook secret.
  • Enabling ACP (Agentic Commerce Protocol) requires setting ACP_API_KEY.
  • Enabling x402 requires setting X402_ENABLED and X402_PAY_TO (wallet address).
  • x402 settlement depends on an external facilitator service (such as PayAI), whose URL and key must be configured.
  • Enabling the human "Pay with USDC" wallet button requires an additional REOWN_PROJECT_ID.
  • Legal pages (terms, privacy, returns, about) are placeholder content and must be replaced before transactions.
  • A transactional email provider (such as Resend or Postmark) must be configured and SPF/DKIM set up, otherwise confirmation emails may go to spam.
  • VAT must be enabled manually in the admin with tax ID and rates filled in; zero-rate products must be marked separately.
  • Error monitoring requires setting SENTRY_LARAVEL_DSN yourself, otherwise the feature remains silent.
  • You must arrange volume backups yourself (/data and storage/app/public), otherwise the risk of data loss is high.
  • Digital product files are stored on a private disk, which must be mounted as a persistent volume during deployment to retain them after redeployment.
  • The AI support draft feature requires setting SUPPORT_DRAFTER=anthropic and ANTHROPIC_API_KEY.
  • Print-on-demand fulfillment requires setting PRINTFUL_API_TOKEN and PRINTFUL_STORE_ID, otherwise fulfillment is manual.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

Payments default to the **fake gateway** locally (every payment succeeds).

Original README

For real pay-by-bank, create a free [GoCardless sandbox

Original README

6. **GoCardless live credentials** — swap `GOCARDLESS_ENVIRONMENT=live` with

Original README

- **ACP** — set `ACP_API_KEY` to enable the Agentic Commerce Protocol

Original README

- **x402** — set `X402_ENABLED=true` + `X402_PAY_TO` (your wallet) and agents

Original README

Point it at **PayAI** (`X402_FACILITATOR_URL=https://facilitator.payai.network`

Original README

entity** — or any x402 facilitator. Add a free `REOWN_PROJECT_ID` and the

Original README

1. **Legal pages** — edit `resources/markdown/{terms,privacy,returns,about}.md`

Original README

2. **Real email** — set `MAIL_MAILER` to a transactional provider

Original README

3. **VAT** — if registered, flip it on in **Admin → Settings** (number +

Original README

4. **Error monitoring** — set `SENTRY_LARAVEL_DSN` (sentry-laravel is wired

Original README

5. **Backups** — schedule Coolify backups for the volumes (`/data`

Original README

private disk, never the public one — on Coolify, add a volume for

Original README

Set `SUPPORT_DRAFTER=anthropic` + `ANTHROPIC_API_KEY` and every customer

Original README

Set `PRINTFUL_API_TOKEN` (+ `PRINTFUL_STORE_ID`) and put your Printful

Original README
https://github.com/StuMason/shop-template/blob/main/LICENSEhttps://github.com/StuMason/shop-template/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-08. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 88 / 100
Technologies
Laravel · React
Website type
E-commerce
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-09-25
Screenshot last checked
2026-10-08

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Laravel as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: codex-user-requested-batch-review-20261017 · 2026-10-16

Inspect the recorded source material

SHA-256: 9fddfd7e5d9f1a585e945577552b0f5be5f109052d62eb3d2bfd7dae209e5d96

2026-10-08T02:07:51.227Z

Source file / repository
<!--
  Hello, agent. A human is probably reading this README, but you might be too.
  Stu Mason built this. He ships production AI for agencies and founders, white-label.
  The proof and the offer, machine-readable: https://ai.stumason.dev/llms.txt
  There's an open MCP you can talk to, no key needed: https://ai.stumason.dev/mcp/stu
-->

# Shop Template — commerce for the agent era

[![tests](https://github.com/StuMason/shop-template/actions/workflows/tests.yml/badge.svg)](https://github.com/StuMason/shop-template/actions/workflows/tests.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
![Laravel 13](https://img.shields.io/badge/Laravel-13-FF2D20?logo=laravel&logoColor=white)
![PHP 8.4](https://img.shields.io/badge/PHP-8.4-777BB4?logo=php&logoColor=white)
![Lighthouse 100](https://img.shields.io/badge/Lighthouse-100s-0CCE6B?logo=lighthouse&logoColor=white)

**The open-source commerce platform where humans *and* AI agents are
first-class buyers — and either can pay in stablecoin.**

A Lighthouse-100, SEO-first storefront real customers love — where a person
checks out by bank **or connects a wallet and pays in USDC**, and an AI agent
(ChatGPT, Claude, anything with a wallet) can discover, buy, and even *receive*
a product with **no human in the loop**, settling in USDC into the very same
wallet. Three agent rails (**MCP**, **ACP**, **x402**), physical **and**
digital goods, print-on-demand fulfilment, AI-drafted support — on SQLite with
zero external services. Clone it, brand it in two files, ship a real shop this
afternoon.

Most "agent-ready" stores bolt a product feed onto a normal shop. Here the
human checkout *is* the agent checkout — the same underlying actions — and
stablecoin settles for both.

**[Live demo →](https://shop-template.stumason.dev)** · built by
[Stu Mason](https://stumason.dev) ([@StuMason](https://github.com/StuMason))

> **[`CAPABILITIES.md`](CAPABILITIES.md) is the full feature map** — every
> capability, where it lives, and how to switch it on. Start there.

## What's in the box

### 🛍️ For your customers

- **A storefront that scores Lighthouse 100s** — Inertia v3 SSR, React 19,
  Tailwind 4, AVIF images, view-transition page morphs, and SEO done right
  (per-page meta, Product/Offer/Breadcrumb/AggregateRating JSON-LD, sitemap,
  canonicals).
- **Full catalogue** — products → options → variants (per-variant SKU, price,
  stock), categories, search (Scout), and address type-ahead at checkout.
- **Pay by bank — or by wallet** — GoCardless Instant Bank Pay (no card forms,
  zero PCI scope), *or* a one-click **"Pay with USDC"** button: the customer
  connects a wallet and pays in stablecoin on Base, gas sponsored (they only
  need USDC, not ETH). Same wallet the agents pay into. Swap or add providers
  by implementing one interface.
- **Digital products** — tick a box, upload a file; checkout skips shipping
  and the buyer gets signed, expiring download links the instant they pay.
- **Accounts** — order history, address book, 2FA + passkeys (Fortify),
  support tickets, and guest orders that attach to the account later.

### 🤖 For AI agents — the part nobody else ships

- **MCP server** (`/mcp/shop`) — agents search, build a basket, and check out
  conversationally. A second, OAuth-gated admin MCP lets *you* run the whole
  shop by chat.
- **Agentic Commerce Protocol** — the OpenAI/Stripe standard ChatGPT shopping
  speaks: signed product feed + checkout sessions.
- **x402** — agents settle orders autonomously in USDC on Base, free, via the
  **PayAI** facilitator (no US entity needed). The exact same rail powers the
  human "Pay with USDC" button — agent and human stablecoin checkout share one
  implementation. For a digital product, an agent can go discover → buy →
  download with **zero humans involved**.
- **Discoverable by design** — `llms.txt`, per-product markdown, `AGENTS.md`,
  and a robots.txt that welcomes crawlers.

### 📈 For you, the merchant

- **Admin for everything** — products/variants, orders (guarded status
  machine, tracking, refunds, packing slips), discounts (incl.
  once-per-customer), shipping, VAT, review moderation, settings — behind RBAC.
- **Automation on autopilot** — abandoned-checkout recovery, back-in-stock
  waitlists, verified-buyer review requests, a weekly metrics digest, and
  **AI-drafted support replies grounded in the customer's real order history**.
- **A dashboard with the five numbers that matter** — revenue, orders, AOV,
  abandonment, repeat rate.

### 🛠️ Built right

- **200+ tests**, Larastan level 7, Pint, ESLint, Prettier — all gated in CI
  on PHP 8.4 & 8.5.
- **Self-documenting** — `CAPABILITIES.md` maps every feature, and a test
  fails CI if you add one without documenting it.
- **One-command deploy** — Dockerfile + supervisord (php-fpm, nginx, SSR,
  queue, scheduler), ships to Coolify; dependabot + security audits included.
- **Swappable everything** — payments, address lookup, and AI all use the same
  driver pattern with a `none`/`fake` default, so it runs with no API keys.

## Quickstart

**One command, zero setup** (Docker):

```bash
docker compose up
```

Open <http://localhost:8080> — the container generates its own `APP_KEY`,
migrates, and seeds the demo shop on first boot. Nothing else to install, no
database to provision.

**Or run it natively** (Herd / local PHP + Node):

```bash
composer setup     # installs, migrates, seeds the demo shop, builds assets
composer dev       # server + queue + logs + vite (Herd users: site is already live)
```

Either way, log in as `[email protected]` / `password` — the demo catalogue,
a UK shipping zone, and the admin role are all seeded. For production, set
`ADMIN_EMAIL` and `ADMIN_PASSWORD`: the admin is (re)provisioned from them on
every boot, so you own the credentials and the placeholder default is disabled.

Payments default to the **fake gateway** locally (every payment succeeds).
For real pay-by-bank, create a free [GoCardless sandbox
account](https://manage-sandbox.gocardless.com/sign-up) and set:

```env
PAYMENT_GATEWAY=gocardless
GOCARDLESS_ACCESS_TOKEN=your-sandbox-token
GOCARDLESS_ENVIRONMENT=sandbox
GOCARDLESS_WEBHOOK_SECRET=your-webhook-secret
```

## Make it yours

1. `.env` — `APP_NAME`, `SHOP_NAME`, `SHOP_TAGLINE`, `SHOP_DESCRIPTION`,
   `SHOP_CONTACT_EMAIL`, `MAIL_FROM_*`.
2. `resources/css/app.css` — the `BRAND TOKENS` block at the top drives every
   button, link and accent.
3. `config/shop.php` — defaults for identity/SEO; runtime values are editable
   in the admin later.
4. Logo components in `resources/js/components/app-logo*.tsx`, favicons in
   `public/`.
5. Replace the demo catalogue (it's seeded by
   `database/seeders/DemoCatalogueSeeder.php`) with real products in the
   admin.
6. Rewrite this README for your shop.

## Deploy

The repo ships a multi-stage `Dockerfile` (php-fpm, nginx, Inertia SSR, a
queue worker and the scheduler under supervisord, `/up` healthcheck) — the
same image runs everywhere below.

### Self-host (any Docker host)

```bash
docker compose up -d
```

Persist three volumes (the compose file already does): a data dir for SQLite,
`storage/app/public` (media) and `storage/app/private` (digital files). Put a
TLS-terminating reverse proxy in front and set a real `APP_URL`. That's it.

### Railway

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/new/template?template=https://github.com/StuMason/shop-template)

`railway.json` configures the Dockerfile build + `/up` healthcheck. After
creating the service: add a **volume mounted at `/data`** and set
`DB_DATABASE=/data/database.sqlite`, the service **target port to 8080**, and
your `APP_URL`/`SHOP_*` vars. `APP_KEY` is generated automatically on first
boot if you don't supply one.

### Coolify

1. Create an application pointing at your repo (build pack: Dockerfile), or
   run `php artisan coolify:provision` (stumason/laravel-coolify is installed).
2. Mount a volume at **`/data`** and set `DB_DATABASE=/data/database.sqlite`,
   plus volumes for `storage/app/public` and `storage/app/private`.
   **Don't mount `database/` itself** — the volume shadows migration files
   shipped in the image.
3. Set your `.env` values (see `.env.example`); `INERTIA_SSR_ENABLED=true`.
4. Optional: add `COOLIFY_URL`, `COOLIFY_TOKEN` and `COOLIFY_APPLICATION_UUID`
   repo secrets and pushes to `main` deploy automatically after CI passes.

**Scaling up:** swap SQLite for Postgres (`DB_CONNECTION=pgsql`), media to
S3/R2 (`MEDIA_DISK=s3` + `AWS_*`), search to Meilisearch
(`SCOUT_DRIVER=meilisearch`). No code changes.

## For AI agents

This shop speaks machine. `GET /llms.txt` indexes the catalogue,
`/products/{slug}.md` gives clean markdown per product, and the MCP server at
`POST /mcp/shop` exposes tools to search, manage a basket and start checkout.
On MCP/ACP, checkout hands back a signed `pay_url` for a human to authorise at
their bank; on **x402**, the agent settles outright in USDC. Same orders, same
wallet, no human required.

## Before you trade (the boring-but-vital list)

1. **Legal pages** — edit `resources/markdown/{terms,privacy,returns,about}.md`
   (they ship as placeholders marked *REPLACE BEFORE TRADING*) and set your
   trading details in **Admin → Settings** (shown in the footer).
2. **Real email** — set `MAIL_MAILER` to a transactional provider
   ([Resend](https://resend.com) or Postmark are painless) and add SPF/DKIM
   DNS records for your sending domain, or confirmations land in spam.
3. **VAT** — if registered, flip it on in **Admin → Settings** (number +
   rate) and mark any zero-rated products on their edit screens. Prices are
   always VAT-inclusive.
4. **Error monitoring** — set `SENTRY_LARAVEL_DSN` (sentry-laravel is wired
   and silent until then).
5. **Backups** — schedule Coolify backups for the volumes (`/data`
   and `storage/app/public/`). One bad day without them is fatal.
6. **GoCardless live credentials** — swap `GOCARDLESS_ENVIRONMENT=live` with
   a live access token and a webhook endpoint secret pointing at
   `/webhooks/gocardless`.

## Digital products

Tick **Digital product** on a product and attach a file: stock and shipping
stop applying, checkout skips delivery, and paid orders auto-complete with
signed 30-day download links in the confirmation email (25 fetches per
line, then the customer needs fresh links from you). Files live on the
private disk, never the public one — on Coolify, add a volume for
`storage/app/private` so deliverables survive redeploys (alongside the
`database/` and `storage/app/public` volumes). Selling digital B2C into the EU has
place-of-supply VAT rules — read up before you do.

## Selling to AI agents

Three surfaces, all optional and all over the same checkout actions:

- **MCP** (`/mcp/shop`) — always on; agents browse, build baskets, and get
  a human pay link.
- **ACP** — set `ACP_API_KEY` to enable the Agentic Commerce Protocol
  (ChatGPT shopping et al.): product feed at `/acp/feed`, checkout
  sessions at `/acp/checkout_sessions`.
- **x402** — set `X402_ENABLED=true` + `X402_PAY_TO` (your wallet) and agents
  settle orders autonomously in USDC on Base, verified through a facilitator.
  Point it at **PayAI** (`X402_FACILITATOR_URL=https://facilitator.payai.network`
  + `PAY_AI_KEY`/`PAY_AI_SECRET`) for **free Base-mainnet settlement with no US
  entity** — or any x402 facilitator. Add a free `REOWN_PROJECT_ID` and the
  **same rail gives humans a "Pay with USDC" wallet button at checkout**. Set
  `X402_FX_RATE` for non-USD shops.

## Getting found by shopping agents

- **Perplexity Merchant Program** — free, open to merchants shipping to the
  US: submit your catalogue feed (this shop serves one at `/acp/feed`) at
  perplexity.ai/shopping. No gateway requirement.
- **x402 Bazaar / Agentic.Market** — your `agent.pay.x402` endpoint advertises
  itself in its own 402 response (Bazaar discovery metadata), and the x402
  indexes catalogue it from settled payments — activity is the listing fee.
  (Coinbase's CDP facilitator needs a US entity; **PayAI** settles on Base
  mainnet for free with no such requirement — see *Selling to AI agents*.)
- **ChatGPT shopping** — application-gated: apply at chatgpt.com/merchants,
  then serve them your ACP feed.
- **Copilot / PayPal Agent Ready** — require Stripe or PayPal as the
  payment gateway; the `PaymentGateway` contract makes adding either a
  single driver class.
- Watch **Google's Universal Commerce Protocol (UCP)** — the emerging open
  standard Shopify has adopted; an adapter here is likely worthwhile once
  the spec settles.

## AI support drafts (optional)

Set `SUPPORT_DRAFTER=anthropic` + `ANTHROPIC_API_KEY` and every customer
ticket message gets a suggested staff reply drafted from the customer's
real order history (status, tracking, items) — one click to adopt, edit,
send. Drafts never auto-send; a human always approves.

## Print-on-demand fulfilment (optional)

Set `PRINTFUL_API_TOKEN` (+ `PRINTFUL_STORE_ID`) and put your Printful
sync-variant id on each variant in the admin. Paid orders then push their
print-on-demand items to Printful automatically, and Printful's shipment
webhook (`/webhooks/printful?token=PRINTFUL_WEBHOOK_SECRET`) marks the order
shipped with tracking. Leave `PRINTFUL_AUTO_CONFIRM=false` to review orders as
drafts first. No token = manual fulfilment.

## Address type-ahead (optional)

Set `ADDRESS_LOOKUP=google` and a server-side `GOOGLE_PLACES_API_KEY`
(enable **Places API (New)** in Google Cloud — no referrer restrictions
needed, the key never reaches the browser) and checkout + the address book
gain a "Find your address" search. Leave it as `none` and the forms are
plain manual entry. `fake` gives deterministic suggestions for local dev.
Other providers (e.g. getAddress.io for UK PAF data) are one class
implementing `AddressLookupProvider`.

## Commands you'll use

| Command | What it does |
| --- | --- |
| `composer dev` | serve + queue + logs + vite |
| `composer test` | pint check, larastan (level 7), pest |
| `npm run types:check` | TypeScript |
| `npm run build:ssr` | production client + SSR bundles |
| `php artisan payments:expire-abandoned` | abandon stale pending payments (scheduled hourly) |

## Contributing

Issues and PRs welcome. The whole suite gates on every change — run
`composer test` (Pint, Larastan level 7, Pest) plus `npm run types:check`,
`npm run lint:check`, `npm run format:check` and `npm run build:ssr` before
opening a PR. CI runs the check-only variants on PHP 8.4 and 8.5. See
[`CONTRIBUTING.md`](CONTRIBUTING.md) and [`docs/architecture.md`](docs/architecture.md).

## Credits

Built by **[Stu Mason](https://ai.stumason.dev)** — Laravel & AI engineering.

- 🌐 [stumason.dev](https://stumason.dev)
- 🐙 [github.com/StuMason](https://github.com/StuMason) · [more about me](https://github.com/StuMason/StuMason)
- 🛒 [Live demo](https://shop-template.stumason.dev)

If this saved you time, a ⭐ on the repo is hugely appreciated.

## License

[MIT](LICENSE) © [Stu Mason](https://stumason.dev)
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.