Badge builder

Moving from a JSON configuration to a drag-and-drop editor, without changing a line of the data format.
Role
Design lead, prototype, architecture with the CTO
Period
March to September 2024
Team
The CTO, a designer and two developers
Outcome
A change that took 10 minutes in JSON now takes 2

Context

At Eventmaker, every attendee of a trade show or conference leaves with a badge. These badges are generated by badge-core, an in-house C++ engine that has produced millions of them. It's robust and fast, but it only reads one format: three JSON files (content, view, style).

Creating a badge therefore meant writing JSON. Clients couldn't do it themselves, project managers took a long time to learn it, and developers were regularly pulled in.

Before the builder: a badge's style is written in JSON, element by element

A first design in 2022

In 2022, the team's designer created a first builder under my supervision, modeled on our email and website builders. The design was approved, but it was never developed. Elements were positioned by typing X and Y coordinates, with no live preview.

The 2022 design: position, size and font are set in fields

The project was then put on hold. When it came back up in early 2024, prototyping in code no longer took weeks thanks to AI: for something as visual as a badge, I could show something that works rather than another mockup.

A coded prototype

In March 2024, I developed a prototype with Fabric.js, an open source canvas library that handles drag and drop, multiple selection and live preview. You could move, resize and align elements, and the canvas produced JSON.

The Fabric.js prototype from March 2024: move, resize, align

To check compatibility with what existed, I converted the three files of a real badge to the Fabric format. I presented it all in a pitch, raising the question I couldn't settle on my own: what to do with the rendering engine?

The rendering question

The CTO's answer refocused the problem. Converting the JSON wasn't the main difficulty; rendering was. badge-core produces a print-ready PDF, Fabric draws on a canvas. Replacing a proven engine with a canvas-to-PDF conversion carried risks: multiple pages, fonts, performance.

We ended up with an architecture sturdier than either of our initial proposals: badge-core for rendering, unchanged, Fabric.js for editing, and a converter between the two. The editor sticks to what the engine can print: no rotation at first, for example.

The data format stayed the same: existing badges kept working, and could be opened in the new editor.

A week later, a developer had validated the approach: text placed on the canvas showed up in the same spot in the PDF.

The same text in the canvas…
…and in the PDF generated by badge-core

From prototype to product

The same designer then made the interface mockups. We studied the leading editors, starting with Canva and Figma, to reuse the gestures users already know: alignment, snapping grid, keyboard shortcuts, history. To speed up development, I gathered open source Fabric.js examples and extensions that the team could adapt.

The new builder shipped in September 2024

Usage, two years later

The starting goal was client autonomy. Over five weeks in fall 2026:

  • 137 client users opened the builder, across 165 events, six times more than the internal team
  • 58% of the events where a client looks at their badges go through the builder

Over time, the trend is the same. According to analytics, the number of client users who open the builder each month nearly doubled from one September to the next, and it caught up with the old template form in October 2026:

Client users per month: badge builder and template form, April 2025 to October 2026020406080100120140Apr 25Jul 25Oct 25Jan 26Apr 26Jul 26Oct 26Template form, Apr 2025: 99 usersTemplate form, May 2025: 96 usersTemplate form, Jun 2025: 112 usersTemplate form, Jul 2025: 65 usersTemplate form, Aug 2025: 46 usersTemplate form, Sep 2025: 114 usersTemplate form, Oct 2025: 107 usersTemplate form, Nov 2025: 97 usersTemplate form, Dec 2025: 68 usersTemplate form, Jan 2026: 96 usersTemplate form, Feb 2026: 86 usersTemplate form, Mar 2026: 89 usersTemplate form, Apr 2026: 81 usersTemplate form, May 2026: 75 usersTemplate form, Jun 2026: 105 usersTemplate form, Jul 2026: 55 usersTemplate form, Aug 2026: 54 usersTemplate form, Sep 2026: 121 usersTemplate form, Oct 2026: 95 usersBadge builder, Apr 2025: 17 usersBadge builder, May 2025: 17 usersBadge builder, Jun 2025: 27 usersBadge builder, Jul 2025: 22 usersBadge builder, Aug 2025: 19 usersBadge builder, Sep 2025: 58 usersBadge builder, Oct 2025: 81 usersBadge builder, Nov 2025: 67 usersBadge builder, Dec 2025: 46 usersBadge builder, Jan 2026: 44 usersBadge builder, Feb 2026: 50 usersBadge builder, Mar 2026: 60 usersBadge builder, Apr 2026: 57 usersBadge builder, May 2026: 49 usersBadge builder, Jun 2026: 78 usersBadge builder, Jul 2026: 51 usersBadge builder, Aug 2026: 57 usersBadge builder, Sep 2026: 111 usersBadge builder, Oct 2026: 95 usersBadge builderTemplate form
━ Badge builder   ━ Template form
Client users (excluding the internal team) who open each tool during the month. Source: product analytics, April 2025 to October 2026.

JSON hasn't disappeared, though: the internal team still uses it for the most complex badges of large shows or festivals, which the builder can't produce yet. That's the limit we chose at the start, and the logical next step for the project.

What I learned

This project confirmed that a working prototype moves a discussion forward faster than a mockup: the debate went from "is it feasible?" to "how do we make it reliable?". And it was by openly laying out what I didn't know that we found the right architecture.

Team

  • Robin Monjo, CTO: badge-core and the rendering question
  • David Huveau and Elena Verona, builder development
  • Nadia Tefridj, builder design, from 2022 to the shipped version