尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A robust, cross-platform platform for selling gift cards for USDT, Naira (NGN), or Cedi (GHS) — similar to giftcardstonaira.com / noones.com.
• Web app (Next.js, App Router) — server-rendered, SEO-friendly, mobile-responsive + installable PWA (works like an app on phones).
• REST API (Express + Prisma + PostgreSQL).
• Shared package with the rate-text parser and rate calculator used by both.
The same API powers any future native mobile client (React Native / Expo) — all business logic lives server-side.檢視完整 README ↗A robust, cross-platform platform for selling gift cards for USDT, Naira (NGN), or Cedi (GHS) — similar to giftcardstonaira.com / noones.com.
The same API powers any future native mobile client (React Native / Expo) — all business logic lives server-side.
/sell-lowes-gift-card).The pasted rate is NGN per 1 unit of the card's face currency (the SLOW rate). For a card of amount A:
| Payout | Formula |
|---|---|
| Naira (NGN) | A × rate × (1 − 20%) |
| USDT | A × rate × (1 − 30%) ÷ NGN_per_USDT |
| Cedi (GHS) | A × rate × (1 − 30%) ÷ NGN_per_GHS |
All percentages and exchange rates are admin-configurable in Admin → Rates & cards.
The parser (packages/shared/src/rateParser.ts) understands the sample format:
===【Apple/iTunes】SLOW ===, ● US (200-500 in 100s) = 1092, ● US code (...) = 935 (e-code), inline brands ●【Doordash】(100-500) = 712, country→currency mapping, and SLOW/FAST de-duplication.
| Layer | Tech |
|---|---|
| Web | Next.js 14, React 18, TypeScript, Tailwind CSS, PWA |
| API | Node 20, Express, TypeScript, Prisma ORM, Zod |
| DB | PostgreSQL 16 |
| Auth | JWT, bcrypt, email verification |
| Nodemailer (SMTP) — Mailpit for local dev | |
| Push | Web Push (VAPID) + service worker |
| Uploads | Multer (local disk; swap for S3 in prod) |
GiftCard4Sale/
├─ apps/
│ ├─ api/ # Express + Prisma backend
│ │ ├─ prisma/ # schema.prisma + seed.ts
│ │ └─ src/
│ │ ├─ routes/ # auth, cards, trades, me, withdrawals, referrals, notifications, landing, admin
│ │ ├─ services/ # email, push, notify, wallet, payout, rateConfig, rateImport
│ │ └─ lib/ # auth, http, upload
│ └─ web/ # Next.js frontend
│ └─ src/app/ # public pages, dashboard/*, admin/*
├─ packages/
│ └─ shared/ # rate parser + calculator + shared types
├─ scripts/ # import-fb-posts.mjs (+ sample data)
├─ docker-compose.yml # postgres + mailpit
└─ .env.example
DATABASE_URL (keep ?sslmode=require). No Docker needed — skip npm run db:up.npm run db:up (also starts Mailpit for catching dev emails).Using a hosted DB? You can also point
SMTP_*at a real email provider (or a free SMTP service), since Mailpit only runs with the local Docker setup.
# from the project root
cp .env.example .env
cp .env.example apps/api/.env # the API + Prisma CLI read this one
Create apps/web/.env.local for the web app's public vars:
NEXT_PUBLIC_API_URL=http://localhost:4000
NEXT_PUBLIC_SITE_URL=http://localhost:3000
(Optional) generate web-push keys and paste them into .env / apps/api/.env:
npx web-push generate-vapid-keys
npm install
npm run db:up
# Mailpit UI (see verification/notification emails): http://localhost:8025
npm run build:shared
npm run db:migrate # creates tables
npm run db:seed # admin user + sample rates + sample landing pages
The seed prints the admin credentials (defaults: [email protected] / ChangeMe123!).
Shortcut:
npm run setupruns install → build:shared → db:up → migrate → seed.
# in one terminal
npm run dev:api # http://localhost:4000
# in another terminal
npm run dev:web # http://localhost:3000
Or run both together: npm run dev.
Facebook profile pages require login and cannot be scraped automatically. The workflow is:
https://web.facebook.com/share/p/1HNn7qJMHc/), write a unique rewrite of the content.sell-lowes-gift-card → https://www.giftcard4sale.com/sell-lowes-gift-card/.scripts/fb-posts.sample.json).[email protected] ADMIN_PASSWORD=ChangeMe123! \
node scripts/import-fb-posts.mjs ./scripts/fb-posts.sample.json
You can also create/edit pages individually in Admin → Landing pages. Linking a page to a card type embeds the live rate calculator on that page.
Set NODE_ENV=production (the API refuses to start with a weak JWT_SECRET in prod).
Built-in, just add env values:
CORS_ORIGINS), and rate limiting (auth/trade/withdrawal endpoints) are already wired in.S3_BUCKET (+ S3_*) to store card images in S3 / Cloudflare R2 / Supabase instead of local disk — no code change. Leave blank for local disk in dev.SMTP_* for a real provider (presets for Resend/Brevo/SES/Postmark/Gmail are in .env.example). Verify your domain (SPF/DKIM/DMARC).VAPID_* (npx web-push generate-vapid-keys).PAYOUT_PROVIDER=paystack (or flutterwave) + the secret key. When an admin marks an NGN withdrawal PAID, the transfer is sent automatically; manual (default) just records it.robots.txt, sitemap.xml (auto-includes card + landing pages), canonical URLs, JSON-LD, and a PWA icon are included.Operational steps:
npm run prisma:deploy on deploy.NEXT_PUBLIC_API_URL / NEXT_PUBLIC_SITE_URL at the live URLs.trust proxy in production.Still to add for a money platform (not code-blocked here):
services/payoutProvider.ts) — currently manual.RateConfig (NGN/USDT, NGN/GHS).Decimal; wallet changes are written through a single ledger (WalletTransaction) inside DB transactions.| Script | Description |
|---|---|
npm run setup | install + build shared + start db + migrate + seed |
npm run dev | run API + web together |
npm run dev:api / npm run dev:web | run individually |
npm run db:up | start Postgres + Mailpit |
npm run db:migrate | apply Prisma migrations |
npm run db:seed | seed admin, rates, landing pages |