Hidden GemLive demoVerified builder

Ditto

Automate design personalization, dynamic data mapping, and bulk generation so repetitive edits become a thing of the past.

Project screenshot

About this project

Guided write-up

What I built & why

I built Ditto, a bulk design personalization platform that transforms a single design into hundreds of personalized outputs using structured data. It evolved from an internal certificate generation tool I originally created for our family business (EasyCert). After a year of real-world usage and user feedback, I realized the underlying problem wasn't certificate generation, it was the repetitive task of personalizing the same design over and over. That insight led to rethinking the product from the ground up.

The problem

Ditto eliminates repetitive design personalization by combining a finished design with structured data to generate personalized outputs at scale. Instead of manually editing names, serial numbers, roles, or other fields one by one, users can define dynamic variables once and generate hundreds of versions automatically.

It is designed for organizations, event hosts, training providers, designers, marketing teams, HR departments, and anyone who frequently personalizes visual assets for multiple recipients.

What I owned

I owned the project end-to-end, including product strategy, UX design, frontend architecture, implementation, and deployment. I was responsible for defining the product direction, designing the user workflow, building the editor with Next.js, React, Tailwind CSS, and Fabric.js, implementing client-side processing, and evolving the product from EasyCert into Ditto based on real-world feedback.

Technical & product decisions

One of the biggest product decisions was shifting the platform from a certificate generator to a bulk design personalization tool. Instead of building certificate-specific functionality, I redesigned the architecture around generic dynamic variables so any structured data could drive personalized outputs.

Technically, I chose a local-first, client-side architecture, allowing users to process designs and data directly in the browser without uploading sensitive information to a server. This reduced infrastructure complexity while improving privacy, responsiveness, and accessibility.

Hardest challenge

The biggest challenge was designing a system that could remain flexible without becoming complicated. Early versions were tightly coupled to certificate-specific concepts like name placeholders, making it difficult to support broader use cases.

To solve this, I redesigned the data model around generic dynamic variables and separated the editor from the underlying personalization engine. This allowed any column from a CSV or Excel file to become a reusable field, making the platform extensible while keeping the editing experience intuitive.

Result & impact

The project evolved from a niche internal utility into a broader platform with applications far beyond certificates. It established a scalable architecture capable of supporting multiple personalization workflows while remaining simple enough for non-technical users.

More importantly, I learned that successful products are defined by the underlying problem they solve, not by their initial implementation. By listening to user feedback and challenging my original assumptions, I transformed a certificate generator into a platform built around a much more universal workflow: turning one design into many personalized versions.

Who else worked on it

Greatest appreciation to Julienne Andrea Panes and Lloyd Andrei Pawaon for testing this project end-to-end.

More from Louis

Also built

View profile
pickd.
Featured ProjectLive demo

pickd.

Louis Miguel PawaonWeb Applications
Today I'm Grateful For (TIGF)
Hidden GemLive demo

Today I'm Grateful For (TIGF)

Louis Miguel PawaonWeb Applications