94 lines
3.7 KiB
Markdown
94 lines
3.7 KiB
Markdown
# 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
|