Inspiration

Planning my friend's event in Indonesia, I watched them juggle Google Forms for RSVPs, a WhatsApp group for coordination, bank transfers for angpao (with no way to track who sent what), a separate photo-sharing app, and Canva for the invitation. Five tools, five links, zero connection between them. Guests were confused, the couple was stressed, and half the angpao went unthanked because they couldn't track it.

That's when it clicked: Southeast Asian events have unique needs — digital red packets, wallet passes for WhatsApp-first guests, shared photo albums — and nobody was solving all of them in one place. Surat was born from that frustration.

What it does

Surat gives every event a single shareable link. Guests tap it from WhatsApp and can RSVP, send a digital angpao, browse and download photos, and save the event to their phone calendar — all without downloading an app or creating an account.

Hosts get a dashboard to track everything: RSVPs with dietary notes, angpao received with thank-you tracking, a shared photo gallery, and a photographer marketplace where they can browse, book, and pay professionals directly.

How we built it

We used Kiro's spec-driven development workflow to go from a PRD to working code. The spec system helped us break down a complex multi-role platform (guests, hosts, photographers, admins) into clear requirements, then generate implementation tasks we could work through systematically.

Stack: Next.js 14 (App Router), TypeScript, Tailwind CSS, Prisma + PostgreSQL (Supabase), Stripe (4 checkout flows + webhooks), Resend (7 email templates), Sharp (image processing), and Supabase Auth with role-based middleware.

The entire app: landing page, auth, event microsites, three role-based dashboards, a photographer marketplace with a full booking state machine, Stripe payments, and email notifications, was built with Kiro handling the implementation while we focused on product decisions.

Challenges we ran into

Multi-role complexity: The app serves four distinct user types (guest, host, photographer, admin) with different permissions, dashboards, and flows. Getting the middleware and role-gating right without breaking public event pages took careful planning.

Photographer marketplace state machine: The booking flow (request → accept → pay → deliver → approve → review) touches Stripe webhooks, email notifications, and multiple database tables. Keeping it reliable with idempotent webhook handling was tricky.

Backwards-compatible migrations: Deploying schema changes to production while keeping the app functional required wrapping new queries in try/catch fallbacks (a pattern we hadn't anticipated needing).

Accomplishments that we're proud of

Full Stripe payment infrastructure — four separate checkout flows (event plans, angpao, photo unlocks, photographer bookings) all processing through a single idempotent webhook handler with proper error recovery and email notifications.

Zero-friction guest experience — a guest can RSVP, send money, and download photos without ever creating an account or downloading anything. The entire interaction takes under 2 minutes from a WhatsApp link tap.

Photographer marketplace with a complete booking state machine — request, accept, pay, deliver, approve, review. Hosts pay upfront, photographers get 93%, and the platform handles the escrow logic through Stripe.

Consent-based photographer invitations — we identified a real UX problem mid-build (hosts "assigning" photographers without consent) and redesigned the flow with pending invitations that photographers accept from their dashboard.

Seven transactional email templates — every meaningful interaction (RSVP, angpao, photo unlock, photographer invite, booking request, booking accepted) triggers a branded notification so nobody misses anything.

Production-ready in one week — a landing page, auth system, three role-based dashboards, a public event microsite, a marketplace, Stripe payments, and email notifications — all coherent, all typed, all deployed to Vercel with a real Supabase database behind it.

What we learned

Kiro's spec-driven approach works exceptionally well for complex, multi-actor applications. Instead of building ad-hoc and hoping features fit together, the structured requirements → design → tasks workflow meant every feature was coherent from day one. The agent handled the implementation grunt work while we focused on UX decisions and product tradeoffs.

What's next for SURAT

-Live Stripe Connect for photographer payouts -WhatsApp API integration for RSVP reminders -Multi-language support (Bahasa Indonesia, Chinese) -AI-powered photo curation for galleries -Event templates for instant setup

Built With

+ 35 more
Share this project:

Updates