Web Applications

Ditto

Built by Louis Miguel Pawaon

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

  • Hidden Gem

    Editorial honor

  • Connected to GitHub

    Repository

  • Has live demo

    Live demo

  • Builder GitHub verified

    Verification

  • Builder email verified

    Verification

  • Builder website verified

    Verification

Project screenshot
Type
Personal
Category
Web Applications
Published
Jul 5, 2026
Updated
Jul 29, 2026

louispawaon/ditto

Built withNext.jsTailwind CSS
TopicsProductivity

About this project

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.