Building Fuderu: Why I Decided to Make My Own Brush Engine
Most side projects begin with a simple idea.
Mine began with a dangerous thought:
"How hard can a paint brush be?"
A few months later I found myself reading brush engine papers, studying how digital painting software handles pressure, spacing, interpolation, and wondering why a single line drawn on a canvas can require hundreds of tiny calculations.
That's how Fuderu was born.
The Goal
I wanted a lightweight drawing engine that could work anywhere a browser canvas exists.
Not a complete painting application.
Not a giant framework.
Just a focused brush engine that developers could use to build creative tools, sketching apps, whiteboards, experiments, and anything in between.
The First Surprise
Drawing a line is easy.
Drawing a good line is not.
The first versions of Fuderu connected points directly from the mouse position. Technically it worked.
Visually it looked terrible.
The lines felt shaky, uneven, and robotic.
That led me into smoothing algorithms, interpolation, Bézier curves, adaptive spacing, and pressure handling. Suddenly a simple brush stroke wasn't a single action anymore—it was a pipeline.
The Rabbit Hole
Every time I thought I was finished, I discovered another problem.
- Pressure looked wrong.
- Spacing felt inconsistent.
- Rotation behaved strangely.
- Image brushes needed recoloring.
- Undo stacks consumed more memory than expected.
- Flow wasn't behaving like artists expected.
The funny thing about graphics programming is that users immediately notice when something feels wrong, even if they can't explain why.
So the goal shifted from:
"Make it work."
to
"Make it feel right."
Learning from the Giants
Recently I've been spending time studying projects like MyPaint and other open-source painting tools.
Those projects have years of research behind them, and reading their source code is both inspiring and slightly terrifying.
You quickly realize that what looks like a simple brush often hides an enormous amount of engineering.
The good news is that every feature I study gives me new ideas for Fuderu.
The bad news is that my roadmap keeps growing.
What's Next?
Right now the focus is stability and brush quality.
I want the core engine to be reliable before chasing more advanced features.
Future work includes:
- Better flow behavior
- More expressive brush presets
- Improved pressure simulation
- Performance optimizations
- Experiments with worker rendering and WASM
One step at a time.
Final Thoughts
Fuderu started as a learning project.
It still is.
Every bug, feature, and late-night debugging session teaches me something new about graphics programming and software design.
And honestly, that's my favorite part.
If you're curious about the project, you can check it out below.
Links
Project repository Documentation NPM PackageIf you've ever looked at a paint brush and thought "I could build that"... be careful.
That's exactly how this started.