Skip to content

Releases: thierryc/beztrace

Beztrace 0.2.0 — compatible master matching

Choose a tag to compare

@thierryc thierryc released this 12 Oct 23:03

Beztrace 0.2.0 adds standalone matching for two glyph masters: two images, an outline plus an image, or two outlines. Use a file-based job to receive compatible editable paths, measured deviations, source provenance and a visual interpolation review.

The reference stays exact by default. Shared subdivision, retracing and additional nodes require explicit configuration; smart comparison uses the same tolerance and node budgets for every route. Incompatible topology, crossings, ambiguous correspondence and exhausted limits produce structured refusals.

Download the universal ZIP to run without installing, or use the signed PKG to install the standalone command. Both support Apple Silicon and Intel on macOS 13 or later. The ZIP includes schemas, owned R/Y examples, a runnable example script and local review evidence.

./beztrace/run-example.sh Y-images-smart /tmp/beztrace-example
./beztrace/bin/beztrace match-pair JOB.json --output-directory NEW_RESULTS --json-errors

Open the resulting index.html, review corresponding nodes and intermediate weights, and consume recommended.master-set.json.

The distribution passes Developer ID signature, Apple notarization, performance, memory, sanitizer and isolated installed-package checks. Local optimized tests pass on native Apple Silicon and Intel under Rosetta; all 100 frozen tracing fixtures and 18 matching examples agree across those architectures. Earlier native Intel evidence covers the identical production code and is identified separately in qualification-receipt.json. All new checks run locally; GitHub Actions are disabled.

SHA256SUMS, release-manifest.json, qualification-receipt.json and source/binary SPDX SBOMs identify the distributed bytes. The installer was tested in a disposable macOS 14.6.1 VM, including exact binary readback, JSON/SVG tracing and byte-identical installed R/Y examples.

Configuration guide · Local checks

Native font application and the Glyphs companion remain separate. The released companion requires its supported 0.1.1 engine; use this ZIP independently to retain that installation. No native HOI, applied-font or Undo/Redo claims are made by this standalone release.

Beztrace 0.2.0-dev.1 — standalone master matching preview

Choose a tag to compare

@thierryc thierryc released this 12 Oct 18:30
v0.2.0-dev.1

This unsigned development preview adds standalone compatible matching for two images, an outline plus an image, or two outlines. Keep the reference exact by default; shared changes and retracing require explicit permission and budgets in the job.

Download beztrace-0.2.0-dev.1-macos-universal.zip, verify SHA256SUMS, then extract and run an example from its folder:

./run-example.sh Y-images-smart /tmp/beztrace-Y-images
./run-example.sh R-mixed-direct /tmp/beztrace-R-mixed
./run-example.sh R-outlines-smart /tmp/beztrace-R-outlines

For your own inputs, copy an example job and run:

./bin/beztrace match-pair JOB.json --output-directory RESULTS --json-errors

Open RESULTS/index.html to review corresponding nodes and intermediate weights. recommended.master-set.json contains the matched outlines; comparison.json records measurements, source hashes and refused alternatives. Choose a new output folder for each run.

The package includes all versioned schemas, 18 controlled R/Y jobs and their proofs, licenses, SPDX SBOMs and exact source/build provenance. No Python, Glyphs or third-party runtime tool is required. Private font artwork is excluded.

Validation: 161 optimized local arm64 tests (zero failures, one intentional maintenance skip), 46 focused x86_64/Rosetta tests, and 46 fresh focused tests from the committed source passed. All 18 controlled pair jobs produced byte-identical files with the exact packaged arm64 and x86_64 binaries. Clean-directory examples and output-collision protection passed. All 18 native arm64/Intel CI cases are also byte-identical, and match the packaged-binary outputs. Comparison receipts are included as separate release assets. All eight exact-source CI jobs passed, including both full native suites (161 tests each, zero failures, two expected skips).

Limits: this is not a qualified stable release. Developer ID signing, notarization and installation gates remain pending. Smooth joins still need visual/native review; sampled interpolation checks do not establish continuous or native HOI acceptance. Optional routes may refuse even when another route succeeds. Tolerance and node limits are not relaxed. Native matching UI and font application are separate work.

Stable engine 0.1.1 and the released Glyphs companion remain unchanged. Do not substitute this preview for the stable engine used by that companion.

Beztrace 0.1.1

Choose a tag to compare

@thierryc thierryc released this 05 Oct 14:47
v0.1.1

beztrace 0.1.1 is the stable macOS tracing engine for clean raster glyphs and symbols.

This release preserves small closed contours and their meaningful curvature,
prevents unsafe handle rounding, and keeps valid no-grid geometry when Grid
snapping would collapse or self-intersect a contour. Closed output has at least
three on-curve nodes. JSON schema v1, pathDataVersion 2 and the public Swift API
remain compatible with 0.1.0.

Supports macOS 13+ on Apple Silicon and Intel. The universal executable and
installer are Developer ID signed and Apple notarized.

Download the PKG and SHA256SUMS, verify checksums, then install:

shasum -a 256 -c SHA256SUMS
pkgutil --check-signature beztrace-0.1.1.pkg
xcrun stapler validate beztrace-0.1.1.pkg
sudo installer -pkg beztrace-0.1.1.pkg -target /
beztrace --version

For portable use, extract the universal ZIP and run beztrace/bin/beztrace.
Source and binary SPDX SBOMs and the source-bound release manifest accompany
the distribution.

The optional Glyphs companion remains separately qualified development software
and is not included. Source build 12 accepts engine 0.1.1; older installed builds
require a supported earlier engine or a separate companion upgrade.

Release verification

Source tag commit: 9737f21fabfda0dc9e6728bd34df2f83380238e9. Engine code and schemas match qualified source 7e43a0b48fec0634e9393f9f33d2d5cc260ced39. Later changes add installer product identity and bind CLI tests to their own build rather than preserved development artifacts. The rebuilt stable engine also includes the minimum-node cleanup follow-up beyond the older packaged dev.4.

SHA-256 values (including the checksum file):

75546a8530e0bf6f2ef4a849b298312522f21a4c6cf4c5a706c2f1448a4b8682  beztrace-0.1.1-macos-universal.zip
560d72540ab1013c444105ac45abea1780229145de4e174e7cfd0072d9a81975  beztrace-0.1.1.pkg
a89ef12ba5040affec821905a7aa1e812783271af3adb8528e241b3bb0272a5e  beztrace-0.1.1-source.spdx.json
11060d00031c34a1fbc7d2f636615698c43ae804b4413f1075198cfe46202a31  beztrace-0.1.1-binary.spdx.json
7a189d1c6a79fe8cb2bcec3473a865b215cd736e55fdb46d2cdd9ee9371d6a3e  release-manifest.json
b28b7c271c95accf3d07cb0edca38ca17ef1775737bde850745738178411fbf5  SHA256SUMS

Executable SHA-256: 3695e8fa41e941a21003052add1b65aea758fb8cd72addfd037288a94265e0cf. Developer ID team N9U29A4T8J; arm64 and x86_64 both declare minimum macOS 13.0.

Apple notarization: ZIP 141a2161-d343-47a2-99be-faf7246555f0, PKG 0810249c-3565-43d3-881a-16a47413f679; both accepted. PKG stapled, Gatekeeper accepted and exact installed standalone JSON/SVG workflow verified. Installer title, welcome and completion identify Beztrace 0.1.1.

Beztrace for Glyphs 0.1.0 (build 15)

Choose a tag to compare

@thierryc thierryc released this 05 Oct 21:51

Beztrace for Glyphs 0.1.0/build 15 is the independently signed and Apple-notarized native Glyphs companion. It uses the separately installed stable Beztrace 0.1.1 engine, which remains unchanged.

This release fixes first-click Trace rejection caused by Glyphs' lazy image initialization, prevents reuse of preceding-build PythonCache, preserves saved PyObjC numeric preferences, and makes About refer to the manifest for signing and qualification status.

Qualification passes on macOS 14.6.1 arm64, Glyphs 4.1.1/build 4108, official Python 3.14.6: 114 companion tests with real stable-engine corpus integration; native live settings, invalid values, cancellation, stale targets, glyph/master/document switching, recovery failures, placement, zero-width Trace/Done/Undo/Redo, foreground/background PNG/JPEG, native image move/resize and Undo/Redo, transformed crop/DPI/EXIF/alpha alignment, and exact install/update/rollback/remove/reinstall. See the attached qualification report for scope and evidence. Intel native testing is untested and explicitly owner-waived; both universal loader slices are signature-verified. Other declared minimum host combinations were not individually tested.

Exact companion source. Developer ID Team N9U29A4T8J. Independent Apple submission 66043b20-bb3a-40b9-bce2-ebcb790d93eb: Accepted. ZIP has no stapled ticket; online notarization verification was tested. Engine signing/notarization does not qualify this plugin.

Download the signed companion ZIP and validate it with the attached manifest and checksums. Keep the external stable engine installed, quit Glyphs before manually placing Beztrace.glyphsPlugin under Glyphs 4 Application Support Plugins, then relaunch. This release includes no automatic installer and bundles no engine. Historical source/bundle documentation reflects preparation; the external manifest and qualification report record final signed qualification.

ZIP SHA-256: 8df74372d7c003802067f4b6ac64b5fcd4fb8c489b8b121016c816798cc0dcad.

This independent companion release is not marked as the repository's latest engine release. Stable v0.1.1 and earlier assets are preserved.

Beztrace Glyphs 0.1.0 · build 14 (development)

Choose a tag to compare

@thierryc thierryc released this 05 Oct 20:39

Fixes saved trace settings reverting to defaults when reopening the Glyphs panel. Build14 normalizes PyObjC numeric wrappers at the native preferences boundary while retaining strict input validation. It includes the lazy-image first-Trace correction and a distinct deterministic build timestamp to invalidate external PythonCache after upgrades.

Unsigned development prerelease; full native qualification remains pending. Intel testing is deferred. This plugin is not Developer ID signed or notarized; engine0.1.1 signing/notarization does not qualify it. The standalone stable engine0.1.1 remains unchanged and is not included. No automatic installation.

Validated:114 companion tests with stable-engine corpus integration; reproducible archives and complete package verification; AppKit controls; exact installed/loaded build14 identity on macOS14.6.1 arm64, Glyphs4.1.1/build4108, official Python3.14.6; native saved-settings reopen/Reset, invalid numeric boundaries, safety cases; fresh zero-width mouse Trace/Done and exact native menu Undo/Redo. See attached qualification report for scope and remaining gates.

Source: 7ad4e20c0c84a4e579a2b0524d67e1733933dafd. Plugin0.1.0/build14, universal SDK loader, macOS13+, Glyphs4.1/build4107+, host Python3.9+. Select the separately installed stable engine0.1.1. Install/update requires deliberate user action and a Glyphs relaunch. Verify SHA256SUMS before extracting.

ZIP SHA256: b72c46ab042490091c0c3178aefb72a8fab7d474f0d40f7a78a2119184e01ab0.

beztrace 0.1.1-dev.1 · Glyphs companion build 6

Choose a tag to compare

@thierryc thierryc released this 28 Sep 23:43

Development prerelease

This release contains beztrace engine 0.1.1-dev.1 and the independently versioned Beztrace for Glyphs 0.1.0 build 6.

These are development builds without Developer ID signing or Apple notarization. Full installed-plugin UI qualification remains pending. The signed 0.1.0 release remains the latest stable release. This prerelease does not replace its artifacts or automatically update an installed engine.

Changes

  • Preserve small closed contours that previously collapsed during smoothing or fitting and failed winding validation.
  • Compute contour winding from cubic geometry, including loops with only two cubic segments.
  • Add Path → Beztrace… in Glyphs, distinct from Glyphs' built-in Filter → Trace Image.
  • Trace the background image already placed on the canvas, respecting its size, crop, rotation and other affine transformations. The compact panel exposes Choose Image, Threshold, Invert and Trace/Cancel.
  • Keep automatic sizing in the versioned image-placement Python API for coding agents.
  • Require matching executable and JSON engine versions. JSON schema v1 and pathDataVersion 2 remain unchanged.

Downloads and use

  • beztrace-0.1.1-dev.1-macos-universal.zip: standalone engine for macOS 13+, arm64 and x86_64. Extract it and use bin/beztrace inside its versioned directory.
  • beztrace-glyphs-0.1.0-build6-macos-universal.zip: optional Glyphs 4 companion. Requires Glyphs 4.1 build 4107+, macOS 13+, and the host Glyphs Python/PyObjC runtime.

Verify downloaded assets against SHA256SUMS. Install the companion bundle in the actual Glyphs 4 Application Support Plugins directory, then relaunch Glyphs. In Path → Beztrace… → ⋯ → Choose Engine…, select the extracted 0.1.1-dev.1 executable. The choice applies to the current panel session. The normal default still points to the separately installed 0.1.0 engine, which retains the reported small-contour bug.

For tracing, place or choose a PNG/JPEG, resize it using Glyphs' native image controls, and click Trace. Existing outlines and the source image are preserved; insertion supports Undo. This release includes no installer package and performs no automatic replacement of the shared engine.

Verification and limits

  • GitHub CI passed on Apple Silicon and Intel: 89 optimized Swift tests, one intentional maintenance-only skip, zero failures. All six required checks passed.
  • 95 companion tests passed, including contract/version checks, stale targets, recovery, placement API and deterministic packaging.
  • All 100 accepted corpus images retain identical path geometry to released 0.1.0.
  • The reported image traces successfully to 48 contours; output is byte-identical on arm64 and x86_64/Rosetta. The private image is not distributed.
  • Disposable Glyphs 4.1/4107 native checks passed for image preparation, DPI/orientation/crop, affine placement, foreground/background paths, readback and Undo/Redo. No user font was modified.

The companion remains development-unqualified in its manifest until full visible UI qualification is completed. Automated and native backend checks do not establish that qualification. This is fitted vector output intended for further type design, not exact pixel reconstruction.

See docs/SMALL_CONTOUR_FIX.md, Companions/Glyphs/README.md, and Companions/Glyphs/AGENT_API.md in the tagged source for the detailed report and API instructions. Assets include source/binary SPDX SBOMs, manifests and checksums.

beztrace 0.1.0

Choose a tag to compare

@thierryc thierryc released this 28 Aug 01:55
v0.1.0

beztrace 0.1.0

The first standalone release of beztrace converts clean raster glyphs and
simple monochrome symbols into economical, editable cubic Bezier outlines.

Highlights:

  • Native Swift tracing pipeline for macOS 13 or later.
  • Universal arm64 and x86_64 executable.
  • Canonical Y-up JSON schema v1 with pathDataVersion 2.
  • Transform-free SVG output by default, plus a Y-up preserve mode.
  • Single-image, stream, inspection, and deterministic batch workflows.
  • Developer ID signing, Apple notarization, checksums, and SPDX 2.3 SBOMs.
  • Validated against the pinned img2bez reference and a reviewed 100-image
    glyph/symbol corpus.

The notarized PKG is the recommended installation method. Download the PKG and
SHA256SUMS, verify the hashes, install, then run:

beztrace --version

Glyphs.app and Glyphs MCP integration are not included in this release. The
versioned neutral JSON output is designed for a future companion adapter.