Fujimod
Try your camera firmware in the browser and build Fujimod SD boot files.
Create an animated, bilingual (Khmer & English) e-invitation for your wedding, engagement, birthday or house warming. One link that works on every phone.
LifestyleTypeScript · CSSGitHub @EarbunsongOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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.