Skip to content
All work

Illustrative demo data

Torn-paper collage on a wide navy paper strip: two blank envelopes, one wax-sealed, and an RSVP card struck through in pen, beside three phones showing the first screen of an Invita theme: Copertina’s magazine cover, Jardin’s garden wedding and Étoile’s night sky.Torn-paper collage on a wide navy paper strip: two blank envelopes, one wax-sealed, and an RSVP card struck through in pen, beside three phones showing the first screen of an Invita theme: Copertina’s magazine cover, Jardin’s garden wedding and Étoile’s night sky.

Case study

One link, every detail, one RSVP button

Paper invitations get lost, and guests still ask the host what time, where and what to wear. I designed and built Invita: mobile-first invitations where one link holds every detail, and guests RSVP without signing in.

Torn-paper collage on a wide navy paper strip: two blank envelopes, one wax-sealed, and an RSVP card struck through in pen, beside three phones showing the first screen of an Invita theme: Copertina’s magazine cover, Jardin’s garden wedding and Étoile’s night sky.Torn-paper collage on a wide navy paper strip: two blank envelopes, one wax-sealed, and an RSVP card struck through in pen, beside three phones showing the first screen of an Invita theme: Copertina’s magazine cover, Jardin’s garden wedding and Étoile’s night sky.
Illustrative demo data
Product
Invita, my own product
Type
Digital invitations, mobile-first
Role
Solo, from the first sketch to production
Timeline
Jul 2026 – present
Scope
Product and theme design, full-stack build, cloud, photo pipeline, RSVP, host panel
Stack
Next.js, TypeScript, Firebase, Cloudflare R2, Vercel; GSAP on the sample invitations
Internals
Server-rendered guest pages, Firestore behind server routes, Cloudflare R2 photo storage, Vercel
Status
Live, In active development
Challenge
Paper invitations are printed and delivered one by one, nobody knows whether they arrived, and they can’t hold everything a guest needs to know. So guests keep asking, and the host counts RSVPs by hand.
Approach
A mobile-first page per event that answers the questions and takes the replies. I built it for my daughter’s birthday, then grew it into a platform of designed themes.
Outcome
About 80 guests, 30+ RSVPs, and the follow-up questions stopped. Today: 11 themes, 33 palettes, RSVP without sign-in, and sample invitations that show their opening image in under a second on desktop (note 1).

Note 1: Sample invitations, Lighthouse desktop emulation: opening image in 0.6–0.9 s, score 99–100. On an emulated mid-range phone over slow 4G: first content within about 2½ s, opening image in roughly 2½–5½ s depending on theme, no measurable layout shift.

The trouble with paper

A paper invitation is a lot of work before anyone reads it. It has to be designed, printed, addressed, then handed out or mailed, one guest at a time. Then the worrying starts: did it arrive, did it get lost, did it get damaged on the way?

And a card holds only so much. So the questions come anyway: what time, where, what to wear, what to bring. Replies come back by text, by call or in passing, and the host keeps count by hand.

A: On paper, and with Invita

On paper, and with Invita
TopicOn paperWith Invita
SendingOn paperPrinted, addressed, then handed out or mailed, one by oneWith InvitaOne link, copied or shared
ArrivalOn paperNo way to know it arrivedWith InvitaNothing to lose or damage on the way
DetailsOn paperOnly what fits on a cardWith InvitaEvery detail, from the program to the dress code
QuestionsOn paperThe same questions, from guest after guestWith InvitaAnswered on the invitation, before anyone asks
RepliesOn paperBy text, by call or in passingWith InvitaOne RSVP button, with a deadline
CountingOn paperKept by handWith InvitaThe headcount, dietary needs and notes in the host panel
ChangesOn paperA reprint, or another round of messagesWith InvitaRepublish: the same link, every RSVP kept

My daughter’s birthday

The idea goes back to SDGKU in 2023, as one of my capstone ideas. It came back to me while I was planning a big birthday party for my daughter. Tracking RSVPs by hand was something I wasn’t willing to do, so I built her a digital invitation.

There was one link for the whole party. The replies came back through it, and the follow-up questions stopped.

Guests loved it, and said it was nothing like the invitations they usually get.

“I didn’t have to worry about ‘did this person receive their invitation?’”

The party

  • About 80guests, one shared link
  • 30+RSVPs through one button

From one invitation to a platform

That invitation was a one-off, made for one party, and the platform grew from it. Both carry the name Invita, after a foreign word for a gathering.

A host picks one of 11 designed themes, five for weddings and six for debuts, the 18th-birthday celebration. Each theme has three palettes, and three artworks for each palette. The host adds the details and photos, then publishes one link.

I put the polish where guests look: every invitation should feel like a designed piece, not a form. The host panel stays plain, with only what a host needs.

B: Twelve sections, three themes

Every Invita theme reads the same twelve section types, and each brings its own layout, fonts and art. Switch themes and palettes, or show, hide and reorder sections.

Theme

Copertina turns the invitation into a fashion magazine, with the celebrant on the cover. Every section becomes a page, numbered in whatever order the host sets.

Palette

Three Invita themes, Copertina, Jardin and Étoile, each shown with fictional details.

  1. 01 · Hero
  2. 02 · Event details
  3. 03 · Story
  4. 04 · Program
  5. 05 · Venue and travel
  6. 06 · Entourage
  7. 07 · Dress code
  8. 08 · Gallery
  9. 09 · Gifts
  10. 10 · FAQ
  11. 11 · RSVP
  12. 12 · Closing
Copertina DebutCopertina turns the invitation into a fashion magazine, with the celebrant on the cover. Every section becomes a page, numbered in whatever order the host sets.Illustrative demo data
  1. 01 · Hero
  2. 02 · Event details
  3. 03 · Story
  4. 04 · Program
  5. 05 · Venue and travel
  6. 06 · Entourage
  7. 07 · Dress code
  8. 08 · Gallery
  9. 09 · Gifts
  10. 10 · FAQ
  11. 11 · RSVP
  12. 12 · Closing
Jardin WeddingJardin, the first theme I built, is a romantic garden: a monogram at the top, and a sprig ornament framing the opening and the close.Illustrative demo data
  1. 01 · Hero
  2. 02 · Event details
  3. 03 · Story
  4. 04 · Program
  5. 05 · Venue and travel
  6. 06 · Entourage
  7. 07 · Dress code
  8. 08 · Gallery
  9. 09 · Gifts
  10. 10 · FAQ
  11. 11 · RSVP
  12. 12 · Closing
Étoile DebutÉtoile is a painted night sky. The date sits in an orbit, and in the sample, the RSVP asks for a place in the celebrant’s constellation.Illustrative demo data

Sections

  1. HeroAlways first
  2. Event detailsAlways shown
  3. Story
  4. Program
  5. Venue and travel
  6. Entourage
  7. Dress code
  8. Gallery
  9. Gifts
  10. FAQ
  11. RSVPAlways shown
  12. Closing

A host picks the theme when creating an event. The palette, artwork and sections can change later, and republishing keeps the same link.

A preview of three Invita themes with fictional details. Choose a theme and a palette, then show, hide or reorder sections. The preview updates as you go, and your section choices stay when you switch themes.

C: Copertina: the magazine

View largerInvita’s Copertina theme on a wide screen: the magazine cover beside an “Inside this issue” contents card that lists the invitation’s sections as numbered pages.
On a wide screen, the “Inside this issue” contents card doubles as the section menu.Illustrative demo data
View largerInvita’s Copertina theme on a phone: a magazine-cover debut invitation with a portrait and the party details.
The cover: a masthead, a cover photo, cover lines and an “RSVP inside” link, over a flat-lay artwork.Illustrative demo data
View largerCopertina’s Q&A page on a phone, headed “Everything you wanted to ask.”: guest questions set like a magazine interview, each opening to its answer, under the page number.
The FAQ, written as a magazine Q&A. The page number comes from the section’s place in the order.Illustrative demo data

How the magazine works

  • Each section is a magazine page: Editor’s letter, The look, Q&A, Reply card
  • Page numbers are CSS counters, so they stay right in any order
  • Long names get one of four size tiers, so they wrap instead of shrinking
  • Type sizes follow the container, not the screen
  • Playfair Display, with Archivo’s width axis for the stretched small headings

D: Jardin: the garden

View largerInvita’s Jardin theme on a phone: a garden wedding invitation with the couple’s portrait above their names.
The opening: the couple’s portrait above their names, framed by a sprig ornament that a palette’s artwork can replace.Illustrative demo data
View largerJardin’s dress code section on a phone, headed “Garden formal.”: five color swatches, then a note on what to wear.
The dress code section: color swatches, what to wear and a few tips, so nobody has to ask.Illustrative demo data
View largerJardin’s opening on a phone in the Rosée palette: the couple’s portrait above their names on a pale blush page, a rose “Kindly RSVP” button and a pink rose sprig.
The same opening in the Rosée palette. The colors and the artwork change together.Illustrative demo data

What makes it Jardin

  • Botanical and romantic, built from the shared section components
  • A monogram header, and a skip link to the RSVP for keyboard users
  • Cormorant Garamond with its italics, set with Manrope
  • Three palettes, Oliva, Rosée and Azur, each with three artworks

E: Étoile: the night sky

View largerInvita’s Étoile theme on a phone: a night-sky debut invitation with a large gold 18.
The opening: a painted night sky, edge to edge, with its line “A night written in the stars”.Illustrative demo data
View largerÉtoile’s event details on a phone: the date set inside a thin circle, with the weekday, the day in large figures, the month and the year, and the time and venue listed below.
The details: the weekday, day, month and year set in an orbit, with the time and the venue below it.Illustrative demo data
View largerÉtoile’s RSVP section on a phone, headed “A place in my constellation”: the reply deadline, then a choice to attend or decline at the top of the form.
In the sample, the RSVP is headed “A place in my constellation”. The form underneath is the one every theme shares.Illustrative demo data

What makes it Étoile

  • Celestial: the age as a large motif, the date as an orbit
  • The story section opens with “A little of my universe”
  • The other sections use the shared debut layouts, styled for Étoile
  • Cormorant Infant with Jost; palettes Minuit, Brume and Aurore

F: A guest’s RSVP

View largerThe first screen of a Jardin wedding invitation on a phone: a monogram above the couple’s portrait and their names.
The first screen of a Jardin invitation: the couple’s portrait and names, under the monogram.Illustrative demo data
View largerJardin’s event details on a phone: the date, then the ceremony and the celebration with their times and venues, and an add-to-calendar link.
Event details with the date, both venues and an add-to-calendar link.Illustrative demo data
View largerJardin’s RSVP form on a phone, headed “A seat saved for you.”: the reply deadline, then a choice to accept or decline, then the name and email fields.
The RSVP form. The host sets the deadline, in the event’s time zone, and the most guests per reply.Illustrative demo data

Invita

Invita checks the reply and saves it once, even if the send is retried.

The confirmation. Behind it: a same-site check, a bot trap, a rate limit, then one transactional write.

Host

The reply appears in the host panel: who’s coming, the headcount, dietary needs and notes.

G: What it does today

Everything below runs in production. The host panel is a deliberately plain MVP. Open a group to see it.

For guests
  • One link per invitation, opened on a phone with no app and no account
  • Event details with the date, time and time zone, venue, directions and add to calendar
  • Up to nine optional sections: story, program, venue and travel, entourage, dress code, gallery, gifts, FAQ, closing
  • A photo gallery you can step through with the arrow keys; focus returns where it was
  • A gift registry in its own pop-up
  • A keyboard skip link to the RSVP, 44 px tap targets, and reduced motion respected
RSVP
  • Attending or declining, then name, email, party size, dietary needs and a message
  • Party size capped by the host, from 1 to 20 guests per reply
  • A deadline enforced in the event’s own time zone
  • A retried send never creates a second reply
  • A bot trap, rate limits and a same-site check on every reply
  • On an error, focus moves to the first field that needs fixing
Themes
  • 11 designed themes: five for weddings, six for debuts
  • Three palettes per theme, and three artworks for each palette, matched to both
  • Each theme brings its own layouts, fonts and art; hosts edit content, not CSS
  • Twelve section types shared by every theme: hero first, event details and RSVP always in
  • Each theme loads only its own fonts and styles
Photos
  • Uploaded straight from the browser to private Cloudflare R2 storage, through short-lived signed links
  • Orientation fixed, colors converted to sRGB, and EXIF and location data stripped
  • WebP copies in four sizes, up to 2,560 pixels on the long edge, never upscaled
  • A required alt text field and a crop focus for every photo
  • Up to 20 MB a photo and 60 photos an event; unused uploads cleaned up daily
Host panel (MVP)
  • Google sign-in for accounts I set up
  • A list of events with RSVP totals; create a wedding or a debut
  • An editor with a live preview: every field, the palette and artwork, section order and visibility
  • Drag-and-drop section order that also works from the keyboard
  • Saving in three stages: on the device, a cloud draft that catches conflicting edits, then publish
  • A link to copy or share, and a read-only table of every RSVP

Under the hood

Guest pages are rendered on the server from a published snapshot that never changes, then cached, and refreshed the moment a host republishes. Only the menu, the reveals, the RSVP form and the pop-ups are interactive. Published pages use a small built-in animation instead of GSAP, and each theme ships only its own fonts and styles.

The browser never touches the database. Its rules deny every client read and write, so every host request goes through a server route that checks the sign-in and the role. Guests need no account: the invitation’s random token is the key, and every reply is checked before one transactional write.

H: By the numbers

  • 11designed themes, for weddings and debuts
  • 33curated palettes, three for every theme
  • Under 1 sopening image on desktop, sample invitations (note 1)
  • 12section types, shared by every theme

Where it stands

“Built for one real celebration first.”

My daughter’s invitation did its job. Invita is live today, and in active development.

Host sign-in is closed: I set up each host account myself, and there’s no public sign-up.

Still doing something by hand?

Work with me

Tell me what you’re building and where it stands. I take on new products, rebuilds and long-term support. I’ll reply by email.

Start a project

Next in Work

Tally

Evidence-checked AI assistant

Research phase, Read the case study

See all work