Sell in a snap — the fastest way for creators to sell digital products online.
Selling digital products shouldn't require complex e-commerce platforms. For creators:
- Existing platforms charge high fees and require approval
- Setting up Stripe payments is complex
- File delivery needs secure handling
- Analytics should be simple and actionable
SellSnap fills the gap — a lightweight platform that gets you selling in minutes.
SellSnap is a lightweight platform that lets creators upload a digital file, set a price, and start selling within minutes through a simple product page and shareable link.
Architecture:
Browser → React SPA → Fastify API → Prisma ORM → PostgreSQL
↓
Stripe Checkout
- Creator accounts — sign up, manage products, view sales analytics
- Product creation — title, description, price, cover image, file upload
- Shareable product pages —
/p/:slugwith buy button - Creator profiles —
/:creatorSluglisting all published products - Stripe payments — hosted checkout with webhook confirmation
- Secure file delivery — signed download tokens with 24h expiration
- Basic analytics — views, purchases, revenue per product
| Layer | Stack |
|---|---|
| Backend | Node.js, Fastify, TypeScript |
| Frontend | React, Vite, Tailwind CSS, TypeScript |
| Database | PostgreSQL, Prisma ORM |
| Auth | better-auth (email/password) |
| Payments | Stripe Checkout |
| Storage | Local filesystem (S3/R2 later) |
| Monorepo | pnpm workspaces |
- Node.js 20+
- pnpm 9+
- PostgreSQL
# Install dependencies
pnpm install
# Set up environment variables
cp .env.example .env
# Edit .env with your database credentials
# Run database migrations
pnpm db:migrate
# Or: just prisma-migrate add_initial_schema
# Start development servers
pnpm dev
# Or: just dev# Show available commands
just
# Install dependencies
just install
# Run dev servers
just dev
# Quality checks
just lint
just format
just typecheck
just test
# Build
just build-web
# Database commands
just prisma-migrate <name> # Create and run migration
just prisma-push # Push schema to database| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string |
BETTER_AUTH_SECRET |
Yes | Secret for auth session encryption (min 32 chars) |
STRIPE_SECRET_KEY |
Yes | Stripe API secret key |
STRIPE_WEBHOOK_SECRET |
Yes | Stripe webhook secret for signature verification |
FRONTEND_URL |
Yes | Frontend URL for auth redirects (e.g., http://localhost:5173) |
STRIPE_WEBHOOK_SECRET |
Yes | Stripe webhook signing secret |
SellSnap handles payments and file downloads.
- Always set a strong
BETTER_AUTH_SECRET. - Always use HTTPS in production.
- Keep Stripe webhook secrets secure.
- File download tokens expire after 24 hours.
- Stripe webhooks verify payment before granting access.
sellsnap/
├── apps/
│ ├── web/ # React (Vite) frontend
│ └── server/ # Fastify API server
├── packages/
│ └── db/ # Prisma schema & client
├── .github/workflows # CI/CD workflows
└── justfile # Task runner commands
| Workflow | Trigger | Purpose |
|---|---|---|
test.yml |
Push to main/develop, PRs | Type check, lint, and unit tests |
build.yml |
Push to main/develop, PRs | Build web app and server |
e2e.yml |
Push to main/develop, PRs | End-to-end tests with Playwright |
# Install Playwright browsers
pnpm exec playwright install
# Run E2E tests
just e2e
# Run with UI
just e2e-uiContributions are welcome. Please read our contributing guidelines before submitting PRs.
This project is licensed under the MIT License - see the LICENSE file for details.
👤 Dung Huynh
- Website: https://productsway.com
- Twitter: @jellydn
- GitHub: @jellydn
Give a ⭐️ if this project helped you!