VeclineCompare

Measured, never asserted. Including the row we lose.

Every number here came out of one command, and you can run it too.

The figures below were produced by npm run compare in the Vecline library repo. Each tool’s SVG is rendered back to pixels with the same renderer and scored with the same metrics, on the same ground — so nothing on this page depends on Vecline’s own view of quality. The harness was written to be able to embarrass us, and on one axis it does.

The corpus is public Kodak photographs at 480 px plus synthetic fixtures generated inside the script itself, so the whole thing reproduces without licensing anyone’s images. The engine is MIT: clone it, run the script, and check every claim on this page against your own output.

Harness
npm run compare
Renderer
one, shared by every tool
Corpus
Kodak 480px + synthetic
Engine licence
MIT · re-runnable

The measured numbers

Higher PSNR and SSIM are better; lower ΔE₀₀ is better.

PSNR with 1.0000 SSIM and 0.000 ΔE₀₀ is not a rounding artefact — it means the vector re-rasterises bit-exact against the source. SSIM is structural similarity (1.0000 is identical), PSNR is peak signal-to-noise in decibels, and ΔE₀₀ is mean perceptual colour difference (0.000 is no difference at all).

potrace is bilevel by design

potrace traces black and white. Its colour rows below use posterize, a bolt-on multi-level mode that is not what the tool was built for. Reporting those numbers without saying so would be a rigged fight, so it is said here, in the same size type as the results.

The bilevel row is apples to apples: that is the case potrace was designed for, and it is measured against Vecline directly.

On flat art, “lossless” means lossless

On line art and flat colour art, Vecline’s lossless mode returns provably bit-exact vector geometry — real paths and fills, not an embedded bitmap smuggled inside an SVG wrapper. The ∞ / 1.0000 / 0.000 rows are the measurement of exactly that.

It is worth being clear about what this is: a category the other tools do not offer at all, not a margin of victory on a shared axis.

Vectorizer.AI is not measured in these tables. It is a paid, cloud-only service, so it could not be run inside the same harness on the same corpus. We will not print a figure we did not measure, and we will not estimate one. Its rows say not measured, and they will keep saying that until someone runs it through the same script.

Synthetic fixtures

Synthetic fixtures: size, PSNR, SSIM and mean Delta E 2000 for potrace, imagetracerjs and Vecline
Tool Size PSNR SSIM Mean ΔE₀₀
Bilevel line art the case potrace was built for
potrace 1.5 KB24.67 dB0.95110.702
imagetracerjs 1.7 KB19.75 dB0.86071.667
Veclinebit-exact 1.4 KB (best) (best) 1.0000 (best) 0.000 (best)
Vectorizer.AI not measured — paid cloud service, cannot be run in this harness
Flat colour art potrace row uses posterize
potrace posterize 1.9 KB14.61 dB0.801021.302
imagetracerjs 1.6 KB (best) 26.56 dB0.93630.662
Veclinebit-exact 1.8 KB (best) 1.0000 (best) 0.000 (best)
Vectorizer.AI not measured — paid cloud service, cannot be run in this harness
Photo synthetic · gradient plus noise
potrace posterize 11.5 KB (best) 13.19 dB0.602423.911
imagetracerjs 11.8 KB26.85 dB0.71435.623
Vecline 19.0 KB 31.12 dB (best) 0.7750 (best) 2.940 (best)
Vectorizer.AI not measured — paid cloud service, cannot be run in this harness

Magenta, underlined = best in that column for that fixture. = bit-exact re-rasterisation.

Real photographs · the Kodak set at 480 px

Kodak photographs: size, PSNR, SSIM and mean Delta E 2000 for potrace posterize, imagetracerjs and Vecline
Tool Size PSNR SSIM Mean ΔE₀₀
Portrait skin, soft transitions
potrace posterize 729.4 KB (best) 18.51 dB0.689718.030
imagetracerjs 1620.5 KB25.47 dB0.70935.957
Vecline 1337.9 KB 34.80 dB (best) 0.9140 (best) 2.663 (best)
Vectorizer.AI not measured — paid cloud service, cannot be run in this harness
Lighthouse large smooth sky
potrace posterize 860.0 KB (best) 20.76 dB0.767110.909
imagetracerjs 2010.2 KB24.58 dB0.74654.900
Vecline 1742.7 KB 36.26 dB (best) 0.9453 (best) 2.575 (best)
Vectorizer.AI not measured — paid cloud service, cannot be run in this harness
Parrots fine detail, saturated colour
potrace posterize 197.1 KB (best) 17.09 dB0.715217.566
imagetracerjs 300.8 KB25.81 dB0.76156.317
Vecline 309.5 KB 31.18 dB (best) 0.8460 (best) 3.686 (best)
Vectorizer.AI not measured — paid cloud service, cannot be run in this harness

Smaller is not the same as better. potrace posterize wins the size column on every photograph, and it wins it by discarding colour — the same rows carry the worst PSNR, SSIM and ΔE₀₀ in the table (ΔE₀₀ of 10.9 to 23.9 is a difference you can see without measuring). Size is only meaningful read alongside the three fidelity columns, which is why all four are printed together and none of them is printed alone.

The library’s own README carries a wider version of this table that also measures vtracer, the strongest open-source colour tracer, which leads Vecline on the synthetic-photo fixture. It is linked, not hidden: see the full comparison.

Vecline vs Vectorizer.AI, axis by axis

Vectorizer.AI is paid, cloud-hosted and closed source. Twelve axes, and it takes one of them.

The row we lose Start here, not at the bottom

On hard photographic and complex art, Vectorizer.AI is likely better.

It runs proprietary neural networks that infer the shapes a human meant to draw — separating an object from a busy background, closing a line a scanner broke, guessing intent where the pixels are ambiguous. Vecline does none of that. It is deterministic and classical: quantise, contour, fit curves, measure. On a difficult photograph or dense illustration, inference is a real advantage, and we are not going to pretend otherwise.

We took that trade knowingly. A model that infers is a model that can be silently retrained, so the same file put through it next year can come back different. Determinism means the same input gives the same output forever — auditable, diffable, safe to put in a build pipeline. It also means the engine can run entirely on your machine, with no upload, no account and no dependency on a company continuing to exist. Every measured row above is a consequence of the same choice, and so is this one.

A comparison page that wins every row is not a comparison, it is an advertisement. This is the row we lose; it is why the other eleven are worth reading.

Vecline compared with Vectorizer.AI across twelve axes
Axis Vecline Vectorizer.AI Better
Tracing quality on hard photographic and complex art Deterministic and classical — no shape inference Proprietary neural networks that infer intended shapes Vectorizer.AI
Price Free and unlimited Paid, per image Vecline
Privacy Converts in your browser — the image is never uploaded Image is uploaded to the cloud Vecline
Offline Works fully offline Requires a connection Vecline
Account None Required Vecline
Openness Engine is MIT open source Closed Vecline
Reproducibility Deterministic — same input, same output, forever Silently versioned model Vecline
Measured quality SSIM, PSNR and ΔE₀₀ reported for every conversion None reported Vecline
Provable lossless mode Yes — bit-exact vector geometry on flat art None Vecline
Maker output Centerline, G-code and DXF for laser, CNC and plotter No G-code, no centerline Vecline
Documents PDF and Office → images or vector, in the same tool None Vecline
Automation CLI, npm library, MCP server for AI agents, GitHub Action, Vite plugin REST API Vecline

Every row above describes what each tool offers, not how well it scores — because Vectorizer.AI’s quality was not measured here. It is paid and cloud-only, so it could not go through the same harness as potrace, imagetracerjs and Vecline. That is why the quality row says “likely better” and carries no number: an honest likely beats a fabricated decimal.

Check it yourself — that is the whole point

Nothing on this page asks for trust. The engine is MIT licensed, the harness is scripts/compare.mjs in the repo, the corpus is public, and npm run compare regenerates every figure above on your own machine. If a number here does not survive that, it is a bug in the page and we want to know.

And the studio does the same thing per conversion: SSIM, PSNR and ΔE₀₀ on every single output, measured against your source, in your browser, with the file never leaving your device.