Brushfactory
The Problem: If you switch drawing apps, your brushes do not come with you. Every app stores them in its own binary format, none of which are documented, and the settings do not line up one to one. Most converters get around this by flattening the brush tip into a stamp. That throws away the pressure settings and the grain, which are the parts that matter most.
What It Is: Brushfactory reads a brush into a universal format and then writes real settings for the target app instead of faking them. It handles Photoshop, Procreate, Clip Studio Paint and Krita in any direction. It is live now, with three free conversions a month and a paid tier for unlimited use and batch conversion.
Four formats, none of them documented
Each app stores brushes differently and none of them publish a spec. Working out what each field does meant writing a file, opening it in the real app, and seeing what changed. I did that a lot. I also put the engine behind a small CLI so I could run conversions without going through the site, which made the testing much faster. MyPaint and Affinity are listed as upcoming on the site, but they are not wired up yet.
python main.py inspect some.brushset
python main.py convert some.abr --to kpp -o out/
python main.py batch packs/ --to sut -o bundle.zipThe hard part is feel, not settings
Copying the numbers across is the easy half. Two brushes can have the same size, spacing and opacity and still feel nothing alike, because each app interprets those numbers differently and because the grain and the pressure response carry most of the character. I was checking this by eye at first, but I could not stay consistent across four formats and a few hundred conversions, so I started measuring it instead.
Measuring drift instead of eyeballing it
I built a harness that takes a brush, converts it to every other format, reads each one back through the real codecs, and compares them to the source. It reports size, spacing, opacity, grain and dynamics for each format and flags anything that moved more than 2%. It also renders a sheet with the tip, the grain and a test stroke for every format, all drawn by the same renderer, so anything I can see in it is real mapping drift and not one app's brush engine looking different from another's.
cohesion_sheet.png tip, grain and a test stroke per format
cohesion_report.txt size / spacing / opacity / grain / dynamics
with a warning on anything >2% from source
<format>/ the converted files, ready to import and
feel-test on a real canvasSaying plainly what doesn't work
The home page carries a table of what carries over, marked either as exact or as matched as closely as the app allows, and behind it there is a longer fidelity report with the support status of each format and the limits written out. Wet media between Procreate and Clip Studio is approximated, tilt and speed dynamics only partly map onto Krita, and Clip Studio resamples textures over 1024 pixels. This probably costs me some conversions, since people can see the rough edges up front. I would rather do that than have someone find out after importing fifty brushes.
The rest of it
Accounts with a monthly quota, three free conversions a month before anyone has to pay, Stripe for the paid tier at $7.99 a month, email verification, per-IP rate limiting, and 75 tests that run before anything ships. Uploads are deleted from the server as soon as the conversion finishes. It is deployed on a DigitalOcean droplet. None of this is the interesting part of the project, but it all had to work before I was willing to put the site up.