尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A self-serve e-invitation platform: customers pick a plan, pay with ABA PayWay (KHQR / ABA Mobile / cards), receive an access code, design their invitation in a live editor, and share a link — one for everyone or a personal link per guest.
src/lib/plans.ts)src/templates/index.ts)/i/{slug}?g={token}), opened tracking, RSVP + wishes, CSV export/admin — orders, revenue, access codes, manual confirm, promo codesRename the brand in src/config/site.ts and the logo in src/components/site/Logo.tsx.
Invitation row = { templateId, plan, data (JSON) }
│ │ │
src/templates ──────────┘ │ └── validated by invitationDataSchema (src/lib/invitation.ts)
theme colours, fonts, cover art, │
opening animation, particles, └── src/lib/plans.ts → feature flags & limits
section order
▼
<InvitationRenderer> (src/components/invitation) renders sections from src/components/invitation/sections.tsx
— the same component powers the public page, the editor's live preview and the landing-page phone mockup.
Add a template: add an object to TEMPLATES in src/templates/index.ts (pick cover, opening, particles, sections, theme colours). For new cover art, add an SVG component in src/components/invitation/art.tsx.
Add an event type / plan: add it to EventType + PLANS in src/lib/plans.ts, to EVENT_TYPES and emptyInvitation() in src/lib/invitation.ts, and list it in a template's eventTypes.
/create?plan=… Step 1 → POST /api/orders — server validates, prices the plan (+ promo) and creates a PENDING order with a unique tran_id.POST /api/payway/purchase returns fields signed with HMAC-SHA512 (src/lib/payway.ts); the browser posts them to PayWay's hosted checkout.POST /api/payway/callback (return_url). The payload is not trusted — we call PayWay's check-transaction-2 and compare the amount before marking the order PAID (idempotent)./create/status polls GET /api/orders/{id}/status (which also re-checks PayWay), then shows the access code and signs the buyer into the editor./api/cron/expire-orders) re-checks stale pending orders and expires the rest.⚠️ Before going live, compare
PURCHASE_HASH_ORDERinsrc/lib/payway.tswith the API docs PayWay sends you with your merchant account, and test end-to-end in the sandbox.
Without PayWay keys, local development uses a simulated payment (PAYWAY_MOCK=1); this is disabled in production.
pnpm install
docker run -d --name invitely-db -e POSTGRES_USER=invitely -e POSTGRES_PASSWORD=invitely -e POSTGRES_DB=invitely -p 5544:5432 postgres:16-alpine
cp .env.example .env # then edit secrets
pnpm prisma migrate dev
pnpm db:seed # 4 demo invitations + promo WELCOME10
pnpm dev # http://localhost:3000 · demo: /i/demo · admin: /admin
pnpm test
To receive real PayWay sandbox callbacks locally, expose the app with a tunnel (cloudflared tunnel --url http://localhost:3000) and set APP_URL to the tunnel URL.
DATABASE_URL (pooled) and DIRECT_URL (direct).BLOB_READ_WRITE_TOKEN).APP_URL (your https domain), SESSION_SECRET, ADMIN_PASSWORD, CRON_SECRET, PAYWAY_BASE_URL, PAYWAY_MERCHANT_ID, PAYWAY_API_KEY, optional TELEGRAM_BOT_TOKEN, TELEGRAM_ADMIN_CHAT_ID.vercel link then vercel --prod (or import the GitHub repo in Vercel).DATABASE_URL=… DIRECT_URL=… pnpm prisma migrate deploy && pnpm db:seed.PAYWAY_BASE_URL to https://checkout.payway.com.kh with your production keys.src/config/site.ts)src/app/terms, src/app/privacy)SESSION_SECRET, ADMIN_PASSWORD, CRON_SECRETThe GitHub repo Earbunsong/invitely is connected to the Vercel project invitely:
main → Vercel builds and deploys to https://invitely-eta.vercel.app automatically (~1 min).pnpm prisma migrate dev --name <change> locally, then apply to Neon with
prisma migrate deploy using the production URLs before (or right after) pushing.