v0.2.0 stable · macOS 13+

From bitmap
to Bézier.

Beztrace — /ˈbɛz.treɪs/

Trace clean glyphs and symbols into economical cubic outlines—deterministically, locally, and ready for real design work.

Universal Apple Silicon + Intel binary. Apache-2.0 OR MIT.

glyph-ampersand 1024 × 1024
Raster ampersand source Raster Path
100/100reviewed traces accepted
62/62reference glyphs passing
< 1 secsingle-shot CLI p95 gate
2 archesarm64 + x86_64

Real output, no mockups

Trace examples

Every example below was captured with beztrace 0.1.0 from a reviewed 1024 × 1024 fixture. Stable 0.1.1 reproduces the same accepted corpus geometry. Switch between source pixels and baked SVG geometry with discreet nodes and handles.

Raster source for uppercase A Traced SVG with nodes and handles for uppercase A
Glyph

Uppercase A

Raster source for ampersand Traced SVG with nodes and handles for ampersand
Glyph · generated

Ampersand

Raster source for lowercase g Traced SVG with nodes and handles for lowercase g
Glyph

Lowercase g

Raster source for uppercase Q Traced SVG with nodes and handles for uppercase Q
Glyph

Uppercase Q

Raster source for at sign Traced SVG with nodes and handles for at sign
Glyph · generated

At sign

Raster source for heart symbol Traced SVG with nodes and handles for heart symbol
Symbol

Heart

Raster source for location pin Traced SVG with nodes and handles for location pin
Symbol · generated

Location pin

Raster source for gear symbol Traced SVG with nodes and handles for gear symbol
Symbol

Gear

A type-aware tracing pipeline

Structure before polish.

beztrace does more than simplify an edge. It plans typographic structure, fits constrained cubics, refines against the raster, then validates every contour before serialization.

  1. 01

    Prepare

    Decode PNG or JPEG, resolve alpha and threshold, normalize coverage.

  2. 02

    Structure

    Find subpixel contours, corners, straights, extrema, and inflections.

  3. 03

    Fit

    Build economical lines and constrained cubic Bézier sections.

  4. 04

    Refine & clean

    Measure raster loss, polish handles, simplify redundant geometry, and preserve corners and meaningful small curves. Remove specks with an explicit minimum contour area.

  5. 05

    Validate

    Check winding, closure, intersections, handle reach, and determinism.

One outline, two useful formats

Neutral geometry in. Design-tool paths out.

Y-up JSON is the authoritative machine contract for future Glyphs MCP integration. SVG defaults to baked, transform-free coordinates that import upright in Sketch, Illustrator, Figma, and other design tools.

  • Versioned JSON schema v1
  • pathDataVersion 2
  • Explicit line, curve, and off-curve nodes
  • No Glyphs runtime dependency
Terminal
$ beztrace trace glyph.png \
  --format json --output glyph.json

// glyph.json
{
  "schemaVersion": 1,
  "pathDataVersion": 2,
  "metadataPolicy": "preserve",
  "paths": [
    { "closed": true, "nodes": […] }
  ]
}

0.2.0 · Signed standalone release

Two weights. Compatible paths.

Provide two images of the same glyph at different weights—or an existing Regular outline and a Bold image—run matching, and review the outlines and intermediate weights before importing them into your font editor.

Two images

Trace both weights together to produce two outlines with corresponding contours and nodes.

An outline and an image

Keep your finished Regular master exact and trace a Bold image to its existing structure.

Two outlines

Keep the reference exact while aligning and refitting the second master, or explicitly permit shared changes within your point limits.

Compare the routes

Smart mode compares applicable matching and retracing routes within the same tolerance and point budget. Review fidelity, correspondence and intermediate shapes; artistic judgment stays with you.

Choose your sources. Review the pair.

The release includes ready-to-run R and Y examples. Copy an example job, choose your source files and image placement, then run the standalone matching command.

Open the result’s index.html to inspect numbered nodes and intermediate weights. The matched-master JSON contains the outlines; the comparison report records measurements and any refused alternatives.

Get the matching release

Simple workflow and configuration
Master matching · Terminal
# Run a bundled two-image example
$ ./run-example.sh Y-images-smart /tmp/Y-pair

# Match your own two sources
$ ./bin/beztrace match-pair JOB.json \
  --output-directory RESULTS --json-errors

# Open RESULTS/index.html to review the pair

Standalone release: universal standalone engine for macOS 13+, with no Glyphs or Python runtime requirement. Default tolerance is 1 unit per 1000 UPM; a vector reference stays exact unless shared changes are explicitly allowed. The universal executable and installer are Developer ID signed and Apple-notarized. Native matching UI, smooth-join repair and font application remain separate. The released Glyphs companion requires its supported v0.1.1 engine; use the standalone ZIP when retaining that shared installation.

Optional Glyphs 4 companion

Trace where you draw.

Beztrace for Glyphs adds a native Path → Beztrace… panel for tracing a placed PNG or JPEG directly into editable paths. It uses the standalone beztrace engine and its versioned neutral JSON contract, so the tracing core remains independent of Glyphs.

Download companion & setup

Ready for the command line

Install. Trace. Keep designing.

The notarized package installs a universal binary and exposes beztrace at /usr/local/bin/beztrace.

Using the released Glyphs companion? Keep its supported v0.1.1 engine and run 0.2.0 from the standalone ZIP.

Signed release qualification receipt · Builds and tests run locally.

sudo installer -pkg beztrace-0.2.0.pkg -target /