# NoShop **Open-source headless commerce for Replit.** Fork it, configure secrets, and have a production-ready store running in minutes. Live demo: [naturologie.com](https://naturologie.com) Repo: [git.wellspr.ing/WellBuilder/notshop-bundle](https://git.wellspr.ing/WellBuilder/notshop-bundle) --- ## Features - **Full storefront** — product grid, product detail, cart drawer, checkout - **Authorize.net** — primary payment gateway via Accept.js (PCI-compliant tokenized nonces) - **Stripe** — optional secondary gateway (env-var toggle) - **Magic-link auth** — passwordless customer sign-in via Resend email - **Account dashboard** — order history with tracking - **Discount codes** — percentage or fixed, usage limits, expiry - **Admin panel** — orders, products, customers, discounts with full CRUD - **PostgreSQL + Drizzle ORM** — type-safe schema, one-command migrations - **React 18 + Vite** — instant HMR in dev, single bundle in production - **TypeScript** — end-to-end type safety --- ## Quick start on Replit 1. Fork this repo on [git.wellspr.ing](https://git.wellspr.ing/WellBuilder/notshop-bundle) 2. Import the fork into Replit (Import from Git) 3. Add [required secrets](#required-secrets) in **Replit → Secrets** 4. Run the dev workflow — it auto-runs `npm run dev` 5. Push your schema: `npm run db:push` 6. Seed first admin: `npm run db:seed` 7. Visit `/admin` and log in --- ## Required secrets | Secret | Description | |--------|-------------| | `DATABASE_URL` | PostgreSQL connection string | | `SESSION_SECRET` | Long random string for session signing | | `AUTHORIZE_NET_API_LOGIN_ID` | Authorize.net API login ID | | `AUTHORIZE_NET_TRANSACTION_KEY` | Authorize.net transaction key | | `AUTHORIZE_NET_PUBLIC_CLIENT_KEY` | Authorize.net public client key (Accept.js) | | `AUTHORIZE_NET_SANDBOX` | `true` for sandbox, `false` for live | | `RESEND_API_KEY` | [Resend](https://resend.com) API key for magic-link emails | | `STORE_NAME` | Display name of your store | | `STORE_EMAIL_FROM` | From-address for transactional emails | ## Optional secrets (Stripe) | Secret | Description | |--------|-------------| | `STRIPE_SECRET_KEY` | Stripe secret key — enables Stripe at checkout | | `STRIPE_PUBLISHABLE_KEY` | Stripe publishable key (exposed to frontend) | > When `STRIPE_SECRET_KEY` is set, customers see a "Stripe" payment option alongside the Authorize.net card form. --- ## Project structure ``` notshop-bundle/ ├── client/src/ │ ├── pages/ # Storefront pages (shop, product, cart, checkout, account) │ ├── pages/admin/ # Admin panel (dashboard, orders, products, customers, discounts) │ ├── components/layout/ # Header, Footer, CartDrawer │ ├── hooks/ # use-cart, use-toast │ ├── lib/ # queryClient + apiRequest │ └── index.css # Tailwind + CSS variables (customize theme here) ├── server/ │ ├── routes.ts # All API endpoints │ ├── db.ts # Drizzle + pg pool │ ├── auth.ts # Magic-link auth │ ├── payments/ │ │ ├── authorizenet.ts # Accept.js nonce charge, vault, refund │ │ └── stripe.ts # Stripe payment intent │ └── email.ts # Resend email helpers ├── shared/ │ └── schema.ts # Drizzle schema (single source of truth) ├── scripts/ │ └── seed-admin.ts # Create first admin user ├── .env.example # Copy to .env and fill in values └── CONFIGURE.md # Customization guide ``` --- ## Contributing Submit PRs to [WellBuilder/notshop-bundle](https://git.wellspr.ing/WellBuilder/notshop-bundle). License: MIT