Skip to content

Add machine-made Heddle 0.1: Swiss display grotesk, variable wght and wdth - #4

Merged
ricardofrantz merged 4 commits into
mainfrom
shuttle/v0.1
Oct 27, 2026
Merged

ricardofrantz merged 4 commits into
mainfrom
shuttle/v0.1

Conversation

@ricardofrantz

@ricardofrantz ricardofrantz commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Adds machine-made Heddle 0.1, the third family. It is a Swiss display grotesk built from the approved sketch. Its integration mirrors Weft.

Renamed from "Shuttle" before the release, because "Shuttle" (Volcano Type) and "Shuttleblock" (Fort Foundry) clash. No typeface named Heddle was found (see heddle/BRIEF.md).

What is in it

  • heddle/loom/: a Python port of the sketch engine (heddle/reference/heddle-sketch-0.1.js). It uses four primitives: rect, superellipse ring (n = 2.6), parallelogram and V.
    • A cut ring is built from pieces. Each piece is an outer and an inner superellipse arc between the cut levels, one cubic per quarter.
    • A cut works on one ring only and never erases another primitive.
  • 12 point-compatible masters: wght 100, 400, 700, 900 × wdth 70, 100, 140.
  • Variable font MachineMadeHeddle[wdth,wght].ttf (107 KB, WOFF2 49 KB). It keeps the overlaps and sets the overlap flags.
  • 11 static TTFs (about 20 KB each): 9 weights at width 100, Compressed Bold and Extended Bold. Static WOFF2 for Regular and Bold.
  • The statics come from the masters by the same interpolation as the variable font. Overlaps are removed with pathops, and the build checks every union against a nonzero fill.
  • 197 glyphs, 184 code points:
    • printable ASCII;
    • the Latin-1 letters, with accents as components;
    • ß Æ æ Ø ø Ð ð Þ þ Œ œ Ÿ ı;
    • quotes, guillemets, … • · ¡ ¿ € ₹ © ® ° —;
    • the no-break space.
      Figures are tabular. & is redrawn.
  • Class kerning for display use.
  • STAT names the 9 weights and 5 widths (Compressed 70, Condensed 85, Normal 100, Wide 120, Extended 140). fvar has 13 named instances. Only 18 of the 45 width + weight names fit in 32 characters, so the other combinations stay unnamed.
  • 334 tests, proofs (proofs/heddle/), a comparison of the sketch with the font, and a drift report.
  • .github/workflows/heddle.yml: tests, build, byte check, interpolatable, drift report, Fontspector, proofs.
  • release.yml gets a heddle job for heddle-v* tags (push and manual run). package_release.sh packs Heddle.
  • Site: a Heddle page (playground with weight and width, width rows, weight rows, glyph map), a home card, a download section and a nav link.
  • Root README, STATUS, CHANGELOG and LICENSING list Heddle.

Checks (local, 2026-10-27)

  • pytest: 334 passed. One test runs the sketch engine in node and compares advances at all 12 masters.
  • The build is byte-reproducible. A rebuild with Python 3.14 (the CI version) gives the same bytes as the committed fonts.
  • fonttools varLib.interpolatable is clean on the designspace, the master UFOs and the variable font.
  • Fontspector 1.9.0, universal profile: 0 FAIL, 0 ERROR. Accepted WARNs:
    • contour_count and mandatory_avar_table on the variable font;
    • PostScript names longer than 27 characters on 3 statics.
  • The site builds and its checks pass. No console errors, no failed requests, no horizontal scroll at 360 px.

Review

  • Proofs:
    • proofs/heddle/heddle-sketch-vs-font-charset.png
    • heddle-sketch-vs-font-pangram.png
    • heddle-designspace.png
    • heddle-width-ladder.png
    • heddle-accents.png
    • heddle-kerning.png
  • Deviations from the sketch, with reasons, are in heddle/STATUS.md:
    • side cuts instead of erased rectangles;
    • curves are cubics, not 96-point polygons;
    • tabular figure width is linear between masters;
    • the K arm no longer pokes out left of the stem at heavy weights;
    • short width names, so names fit in 32 characters.
  • Interpolation drift: the median is 0. The worst is J at wght 900, wdth 85, where 11 % of its ink moves. The cause is the sketch's width floor W >= 2.3 S (proofs/heddle/drift.json).
  • CI for Heddle has not run on GitHub yet. This PR is its first run.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UHtj1XPp34FFs8LVpY1PRF

The loom ports the approved sketch engine to Python. It writes 12
point-compatible UFO masters (wght 100, 400, 700, 900 x wdth 70, 100,
140) and fontmake compiles the variable font and 11 statics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHtj1XPp34FFs8LVpY1PRF
- Check every static union against a nonzero fill; work around pathops
  failures (S spine) with a tiny jitter.
- Add a wght 700 master; zero-pad master names for interpolatable.
- New glyphs use linear widths, so the variable font matches the
  engine everywhere. Redraw & ß * ~ and the chevrons; K arm no longer
  pokes out left of the stem.
- Short width names (Compressed to Extended) and 13 named instances,
  so names fit in 32 characters (Fontspector).
- Tests, proof sheets, the sketch comparison and the drift report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHtj1XPp34FFs8LVpY1PRF
- shuttle/BRIEF.md (metrics, glyph set, axes, cuts, name check),
  STATUS.md, CHANGELOG.md, RELEASE-NOTES-0.1.md.
- .github/workflows/shuttle.yml: tests, build, byte check,
  interpolatable, drift report, Fontspector, proofs.
- release.yml: a shuttle job for shuttle-v* tags (push and manual run);
  package_release.sh packs Shuttle.
- Site: Shuttle page (playground with weight and width, width and
  weight rows, glyph map), home card, download section, nav link.
- Root README, STATUS, CHANGELOG and LICENSING list Shuttle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHtj1XPp34FFs8LVpY1PRF
@coderabbitai

coderabbitai Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Central YAML; Path: .coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 4b4adda5-4559-49eb-b680-5a018324f477

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@cubic-dev-ai

cubic-dev-ai Bot commented Oct 27, 2026

Copy link
Copy Markdown

This PR has 7,647 reviewable changed lines after ignored/generated files are excluded, above this repository's 5,000-changed-line automatic review limit.

Most of the diff comes from:

  • proofs/shuttle/drift.json (~2,077 changed lines)
  • shuttle/loom/glyphs.py (~1,424 changed lines)
  • shuttle/loom/build.py (~555 changed lines)
  • shuttle/reference/shuttle-sketch-0.1.html (~537 changed lines)
  • shuttle/loom/geom.py (~417 changed lines)

Comment @cubic-dev-ai review this to review it anyway. If the largest files are generated or fixture data, add them to your ignored files in review settings or reviews.ignore.files in cubic.yaml. Later automatic reviews cover only subsequent changes. Request a full review to revisit earlier changes. You can also raise this limit in review settings.

The founder renamed the family because of a clash with "Shuttle"
(Volcano Type, 2006) and "Shuttleblock" (Fort Foundry, 2024).

- shuttle/ -> heddle/ (package heddle/loom), fonts/heddle,
  proofs/heddle, heddle.yml, site/pages/heddle, site/assets/heddle.js,
  heddle/reference/heddle-sketch-0.1.* (content kept as approved).
- Family "machine-made Heddle", PostScript MachineMadeHeddle; name
  table, STAT, OFL header, release job on heddle-v* tags, packaging,
  site, root docs.
- New name check for Heddle in heddle/BRIEF.md: no typeface found.
- The sketch comparison reads the engine through module.exports.
- Rebuilt fonts and proofs (outlines unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHtj1XPp34FFs8LVpY1PRF
@ricardofrantz ricardofrantz changed the title Add machine-made Shuttle 0.1: Swiss display grotesk, variable wght and wdth Add machine-made Heddle 0.1: Swiss display grotesk, variable wght and wdth Oct 27, 2026
@ricardofrantz
ricardofrantz merged commit b65903e into main Oct 27, 2026
3 checks passed
@ricardofrantz
ricardofrantz deleted the shuttle/v0.1 branch October 27, 2026 13:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants