Skip to content

[Open Source Story] We couldn’t afford Canva, so we built an open-source online design tool using LeaferJS

2026-04-09 · Gzm Design Team

Preface

Hello everyone, we are the development team of Gzm Design.

In our daily work, we have long relied on various online design tools to create posters, event visuals, and marketing materials. These tools are mature in functionality, but as usage deepened, several issues gradually became apparent:

  • Costs continue to increase with usage scale
  • No private deployment option, making systems and data uncontrollable
  • Difficult to customize according to business requirements

These issues become even more prominent when we need to reuse existing design assets (such as PSD files).

Based on these real-world needs, we began to think about a more concrete question:

Can we build a controllable, extensible, and truly usable design tool in the browser?

Gzm Design was born in this context. It is an open-source online design tool built with Vue3 and LeaferJS, supporting PSD import, drag-and-drop editing, and AI image composition capabilities.

Why are existing solutions not sufficient?

Before starting implementation, we conducted a systematic analysis of existing solutions. The problems mainly fall into two categories.

Commercial tools

Online design tools represented by Canva and others are already very mature in both functionality and user experience, but for developers and small to medium teams, there are still some limitations:

  • High long-term subscription costs
  • No private deployment, making data and systems uncontrollable
  • Limited extensibility, difficult to deeply customize

As business complexity grows, these limitations become real obstacles.

Open-source solutions

Compared with commercial tools, open-source solutions offer better controllability, but still have gaps in key capabilities:

  • Lack of PSD file parsing and reconstruction support
  • Insufficient rendering performance in multi-layer, high-complexity scenarios
  • Editing experience hard to match professional design tools

This leads to a direct consequence: existing design assets are difficult to reuse, and Web-based design tools are hard to truly productionize.

Why choose LeaferJS?

We previously evaluated several engines, including Fabric.js. After trying multiple options, we ultimately chose LeaferJS as the underlying rendering engine. The core reason is that it achieves a relatively balanced state across several key dimensions.

Performance

Poster design typically involves a large number of layers, images, and effect overlays, which places high demands on rendering performance.

LeaferJS performs stably in this regard:

  • Supports large-scale graphic rendering
  • Maintains smooth interaction even in high-density layer scenarios

This enables it to support design-tool-level use cases.

Developer experience

Compared to traditional Canvas operations, LeaferJS provides a higher-level abstraction:

  • Clean API, closer to UI development thinking
  • Strong TypeScript support
  • Built-in automatic layout capabilities (Flow), reducing complexity in interactive implementations

In actual development, it significantly reduces the burden of low-level drawing logic.

Ecosystem potential

As a rapidly evolving open-source project, LeaferJS has strong community activity and relatively fast response speed.

During development, some of our customization requests were addressed in time (we bothered the author quite a bit during development haha~), which is a plus for long-term project evolution.

Implementation approach

To make the design tool truly usable, we split the overall implementation into three layers: rendering, compatibility, and interaction.

Rendering layer: building stable graphics capabilities

At the bottom layer, we used LeaferJS to build the rendering system and implement the core capabilities required for the design tool:

  • Layer organization and management
  • Vector graphic editing
  • Filter effects and blending modes
  • Efficient rendering of multiple elements

In complex poster scenarios, this layer is mainly responsible for performance and stability.

Compatibility layer: PSD to canvas object conversion

To solve the problem of asset reuse, we focused on implementing PSD parsing and mapping:

  • Parse layer structure and style information from PSD files
  • Convert them into Leafer-recognizable graphic objects
  • Preserve original hierarchy and visual appearance

The goal of this process is very clear:

Allow PSD files to be directly editable once imported into the system

This reduces reliance on traditional design software.

Interaction layer: turning capabilities into features

On the top layer, we built a component-based interaction system using Vue3 + Vite + TypeScript, encapsulating underlying capabilities into usable features:

  • Drag-and-drop and selection operations
  • Canvas zooming and viewport control
  • Layer property editing (position, rotation, styles, etc.)
  • Component-based encapsulation of common editing behaviors

This approach ensures both development efficiency and future extensibility.

Final result

After the overall solution was implemented, Gzm Design met expectations in both performance and user experience.

Performance

  • High-resolution poster loading time reduced to seconds
  • Canvas frame rate remains stable around 60 FPS in multi-layer scenarios

It meets the smoothness requirements of daily design workflows.

User experience

  • Supports direct PSD import and editing
  • Editing, previewing, and exporting can all be done in the browser

The entire workflow has been simplified from multi-tool collaboration to a single unified environment.

Real-world usage

Currently, Gzm Design is already used in multiple scenarios:

  • E-commerce and event poster design
  • QR code and marketing material generation
  • Rapid template-based content creation

At the same time, as an open-source project, it is also used by many Leafer developers for secondary development, becoming a widely appreciated graphics editing foundation framework.

Conclusion

The implementation of Gzm Design is not about “reinventing design tools”, but rather a pragmatic engineering effort:

  • Migrating existing design assets to the Web environment
  • Balancing performance and complexity
  • Achieving core requirements in a lightweight way

LeaferJS plays the role of foundational support, making this process feasible.

Open-source repository: https://github.com/LvHuaiSheng/gzm-design

Website: http://gzm-design-doc.guozimi.cn

Released under the MIT License.