A calm, trusted marketplace for digital products and services, built with SvelteKit and deployed on Vercel.
- Framework: SvelteKit 2 (Svelte 5) + TypeScript
- Hosting: Vercel (
@sveltejs/adapter-vercel, Node serverless runtime) - Database: PostgreSQL via Prisma (Vercel Postgres)
- Object storage: Vercel Blob (
@vercel/blob) - Auth: JWT sessions, Argon2 password hashing, TOTP 2FA, SVG captcha
- Payments: NOWPayments (crypto top-ups → account balance)
- Notifications: Telegram Bot API
- Styling: TailwindCSS
- User registration, login, logout, 2FA, recovery codes
- Account dashboard & balance management (top-ups, history)
- Multi-vendor catalog: Download, License, and Service product types (no physical goods)
- Cart & instant order fulfilment
- Seller dashboard (products, payouts, analytics)
- Admin panel (users, deposits, payouts, settings, Telegram config)
| Type | Stock model | Delivery |
|---|---|---|
DOWNLOAD |
Unlimited | Full content delivered to every buyer |
SERVICE |
Unlimited | Instructions / booking / contact details delivered |
LICENSE |
One line per buyer | Next available line delivered; stock decrements |
pnpm install
cp .env.example .env # fill in values (see below)
pnpm prisma migrate dev
pnpm devApp runs at http://localhost:5173.
See .env.example. Key ones:
| Variable | Purpose |
|---|---|
DATABASE_URL |
Postgres connection (auto-set by Vercel Postgres) |
BLOB_READ_WRITE_TOKEN |
Vercel Blob token (auto-set by Vercel Blob) |
JWT_SECRET |
Session/captcha signing secret |
NOWPAYMENTS_API_KEY |
NOWPayments API key |
NOWPAYMENTS_IPN_SECRET |
NOWPayments IPN/webhook HMAC secret |
PAYMENT_CALLBACK_URL |
https://<domain>/api/payment/ipn |
TELEGRAM_BOT_TOKEN |
Telegram bot token |
TELEGRAM_ADMIN_CHAT_ID |
Channel/group ID for notifications |
TELEGRAM_ADMIN_GROUP_ID |
Channel/group ID for notifications |
NOWPayments setup: in the NOWPayments dashboard, set the IPN callback URL to
https://<your-domain>/api/payment/ipn and use the same IPN secret here.
Telegram setup: the bot must be an admin of the target channel/group to post.
The Sereni mark lives at src/lib/logo.svg. To regenerate all favicon / app-icon sizes:
pnpm faviconsTo use a custom brand image instead, drop a licensed, un-watermarked PNG at
static/brand-source.png and re-run pnpm favicons.
vercel link(scope: koyagroup, project: sereni)- Attach a Postgres store and a Blob store to the project (auto-injects
DATABASE_URLandBLOB_READ_WRITE_TOKEN). - Set the remaining env vars (
JWT_SECRET, NOWPayments, Telegram). pnpm prisma migrate deployagainst the production database.vercel --prodand attach the domainolesereni.site.