尚未检测到更新。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.