Reverse Engineering the Previously Open Source Expressive Animator without its Core Engine

Apr 9, 2024 · 5 min · open source , software , reverse engineering


Expressive Animator is a web based vector graphics animating software. The company currently developing it is Expressive. But previously it was maintained by Zindex Software. The Apache 2 licensed web app had transitioned to closed source after raising 300K in pre-seed funding round to follow a “more sustainable business model” they say. Their tech stack is Svelte for the UI, and a custom made canvas-engine by Zindex Software for the rendering and animations of the motion graphics part. This engine was open source too, licensed under Apache 2, but was close sourced later. Leaving only a shadowy page when searching about it. Expressive Animator has no trace left except on a fork that was made before the close source move. This is the start mark that flamed this journey. screenshot

Chapter 1: The discovery

In the middle of a day in Ramadan, hungry and thirsty because of fasting. I don’t know how I got this idea. I wondered if a vector editing software built with web tech was made, typical ideas of a front-dev. I opened my sourceror cookbook, GitHub, and started searching. I found this repository under this account with the username gqshell. The description of the repo has a link, that I clicked it. It opened and it redirected me to the current product page of Expressive Animator here. Examining the features section and the absolutely amazing UI screenshots I was stunned. Wanting to know more about the product I jumped to their blog, which is mainly a release changelog of their 2 products. In the middle of these posts was one post talking about the 300K pre-seed funding round. In the middle of reading it I got shocked. “This can’t be, close sourced, HOW?” I said. I just was looking at the source code. Later I discovered that repo is just a fork of the original one. What was left from it only a capture by in here.

Chapter 2: The Challenge

I was angry, fuelled, and felt cheated, this is not fair. I said I have to do something about this. I started skimming through the gqshell repo’s commits and code. The most up to date code in this fork is v0.1.0 while the current version of Expressive Animator is 3 releases after v0.3.0 they say on their blog. I assume they’re at v0.6.0 now (As of April 2024), given the pattern shown between each release. So this was nothing, I can’t do anything with this. Luckily this fork has 10 other forks, I examined them. They all were exactly the same, except this one. Initially it seemed like the others, but it had one additional branch the other 9 forks hadn’t. The v0.5.0 branch. I don’t know how it got their, but this means we made a substantial progress in our little quest. Given my assumption about the v0.6.0 current Expressive Animator we are only one release behind the closed source version. All great, but unfortunately the joy didn’t last long.

Chapter 3: The Engineless Machine

The code we have now is only the UI part. All the internal important parts related to vector graphics, editing, and animation is developed separately in the package@zindex/canvas-engine. It was open source under an Apache 2 license too, but got closed source later. There was no forks or archived copies this time. I got in touch with one of the core developers asking for the version of the package before it got close sourced. He responded negatively and how the package now is the intellectual property of the company. This was the end. I gave up.

2 days later I started looking at gqshell’s repo again. I noticed at the root there was a ./dist folder. I saw hope, I knew it, you know it where this thing is going. Projects as far as I know add their build folders to .gitignore to not be tracked with Git. But luckily this project didn’t. The folder contained as I assume the CSS and JavaScript bundles, minified and the sourcemap. Nothing interesting this was. But the gold mine and hope of this challenge was in previous commits. Following the commit history of this folder and its contents. At one time 2 files named canvas-engine.js and canvas-engine.min.js appeared. Thanks to the copy-engine command from package.json. This was the bundle of the package we were looking for. And here dears is the actual end of this challenge. The only thing that was left is link this script with the index.html at the root. I run it and fixed any errors and incompatibilities between the ahead of time UI and the outdated canvas-engine.js bundle.


I clicked refresh and the app was running, finally. screenshot

If you finished reading this, please drop us a comment if you have anything to say about the topic.


This blog post mentions “Expressive Animator,” owned by Expressive, formerly developed by Zindex Software. The inclusion of their product name and the first SVG image is for reference purposes only and does not imply endorsement or affiliation. Opinions expressed are mine alone.

Last updated: 4/9/2024, 4:39:40 PM