diff --git a/.github/workflows/weft.yml b/.github/workflows/weft.yml index 23cd7a1..4704c0a 100644 --- a/.github/workflows/weft.yml +++ b/.github/workflows/weft.yml @@ -87,7 +87,7 @@ jobs: if: always() uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: - name: weft-0.1 + name: weft-0.2 path: | fonts/weft/ proofs/weft/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4275c00..729e51f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ Each family keeps its own changelog: Release tags: `weft-vX.Y.Z`, `sans-vX.Y.Z`, `heddle-vX.Y.Z`, `warp-vX.Y.Z`, `site-vX.Y.Z`. +## 2026-10-28: Weft 0.2 + +- machine-made Weft 0.2.0 (font version 0.200): look-alikes, Latin + Extended-A, combining marks, box drawing, arrows, hinted static TTF. + See `weft/CHANGELOG.md`. Site: the Weft download links point to + `weft-v0.2.0`. + ## 2026-10-27: Warp 0.1 - machine-made Warp 0.1.0 (font version 0.100): machine-made Warp diff --git a/STATUS.md b/STATUS.md index 4971a3e..ec21218 100644 --- a/STATUS.md +++ b/STATUS.md @@ -8,7 +8,7 @@ | Visibility | public after the 0.1 release (founder approved) | | Stage | released 0.1: machine-made Weft 0.1.0, machine-made Sans 0.1.0, specimen site 0.1.0, machine-made Heddle 0.1.0. machine-made Warp 0.1 built on branch `warp/v0.1` | | Gate now | Warp: Jac reviews the PR from `warp/v0.1`; the founder reviews the proofs; then the tags `warp-v0.1.0` and a new `site-v*` | -| Next task | Warp 0.2: the OpenType MATH table; Warp 0.3: the variable font (see `warp/STATUS.md`). Heddle 0.2 (see `heddle/STATUS.md`). Weft: polish (look-alikes l/1, I/1, O/0; heavy accented capitals), width axis, Thread style. Sans 0.2: redraw in the style of Weft and match Weft's x-height (see `sans/STATUS.md`). npm packages for both families. | +| Next task | Warp 0.2: the OpenType MATH table; Warp 0.3: the variable font (see `warp/STATUS.md`). Heddle 0.2 (see `heddle/STATUS.md`). Weft 0.2 is on branch `weft/v0.2` (see `weft/STATUS.md`); then the width axis and the Thread style. Sans 0.2: redraw in the style of Weft and match Weft's x-height (see `sans/STATUS.md`). npm packages for both families. | | Blocked by | none | | Last green CI | none yet (first runs are on the release PR). Local end-to-end run of all steps on 2026-10-26: green | | Owner model | to assign | @@ -102,9 +102,8 @@ Family notes: `weft/STATUS.md`, `sans/STATUS.md`, runners can differ (for example ttfautohint for the Sans static TTF). If the Sans byte check fails on the runner, the workflow says so; the fallback is the structural check `sans/scripts/compare_builds.py`. -- **Weft look-alikes.** OCR confuses l and I with 1, and O with 0, more - than in DejaVu Sans Mono (CER 0.12 against 0.075). The gate stops a - regression; it does not prove parity. +- **Weft look-alikes.** Fixed in Weft 0.2 (branch `weft/v0.2`): OCR + CER 0.07 to 0.08 against 0.0875 for DejaVu Sans Mono. - **Line height with accented capitals.** Both families use an ascender of 906. Accented capitals go above it (Sans Á at about 1000). Win metrics cover all ink, so nothing clips, but tight line spacing can diff --git a/fonts/weft/otf/MachineMadeWeft-Black.otf b/fonts/weft/otf/MachineMadeWeft-Black.otf index 1dd3b14..4f687d8 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-Black.otf and b/fonts/weft/otf/MachineMadeWeft-Black.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-Bold.otf b/fonts/weft/otf/MachineMadeWeft-Bold.otf index bafba33..052b3d1 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-Bold.otf and b/fonts/weft/otf/MachineMadeWeft-Bold.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-ExtraBold.otf b/fonts/weft/otf/MachineMadeWeft-ExtraBold.otf index b558f3b..7917951 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-ExtraBold.otf and b/fonts/weft/otf/MachineMadeWeft-ExtraBold.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-ExtraLight.otf b/fonts/weft/otf/MachineMadeWeft-ExtraLight.otf index 6307721..6172db2 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-ExtraLight.otf and b/fonts/weft/otf/MachineMadeWeft-ExtraLight.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-Light.otf b/fonts/weft/otf/MachineMadeWeft-Light.otf index efa27df..6e21abe 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-Light.otf and b/fonts/weft/otf/MachineMadeWeft-Light.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-Medium.otf b/fonts/weft/otf/MachineMadeWeft-Medium.otf index 750a58f..d49c8a9 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-Medium.otf and b/fonts/weft/otf/MachineMadeWeft-Medium.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-Regular.otf b/fonts/weft/otf/MachineMadeWeft-Regular.otf index 95d08f2..769a980 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-Regular.otf and b/fonts/weft/otf/MachineMadeWeft-Regular.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-SemiBold.otf b/fonts/weft/otf/MachineMadeWeft-SemiBold.otf index 4574fb0..72b6c70 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-SemiBold.otf and b/fonts/weft/otf/MachineMadeWeft-SemiBold.otf differ diff --git a/fonts/weft/otf/MachineMadeWeft-Thin.otf b/fonts/weft/otf/MachineMadeWeft-Thin.otf index 88bfa8d..dde9c28 100644 Binary files a/fonts/weft/otf/MachineMadeWeft-Thin.otf and b/fonts/weft/otf/MachineMadeWeft-Thin.otf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-Black.ttf b/fonts/weft/ttf/MachineMadeWeft-Black.ttf index 63808d2..41fd256 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-Black.ttf and b/fonts/weft/ttf/MachineMadeWeft-Black.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-Bold.ttf b/fonts/weft/ttf/MachineMadeWeft-Bold.ttf index a0ed331..f6445bc 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-Bold.ttf and b/fonts/weft/ttf/MachineMadeWeft-Bold.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-ExtraBold.ttf b/fonts/weft/ttf/MachineMadeWeft-ExtraBold.ttf index 83b1e03..39edcd6 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-ExtraBold.ttf and b/fonts/weft/ttf/MachineMadeWeft-ExtraBold.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-ExtraLight.ttf b/fonts/weft/ttf/MachineMadeWeft-ExtraLight.ttf index 7d452e9..11bc2f8 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-ExtraLight.ttf and b/fonts/weft/ttf/MachineMadeWeft-ExtraLight.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-Light.ttf b/fonts/weft/ttf/MachineMadeWeft-Light.ttf index cdadaa3..5ff1c5c 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-Light.ttf and b/fonts/weft/ttf/MachineMadeWeft-Light.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-Medium.ttf b/fonts/weft/ttf/MachineMadeWeft-Medium.ttf index 8a2dff8..39ea7d7 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-Medium.ttf and b/fonts/weft/ttf/MachineMadeWeft-Medium.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-Regular.ttf b/fonts/weft/ttf/MachineMadeWeft-Regular.ttf index e088e85..aac6ac5 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-Regular.ttf and b/fonts/weft/ttf/MachineMadeWeft-Regular.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-SemiBold.ttf b/fonts/weft/ttf/MachineMadeWeft-SemiBold.ttf index baab647..8de8545 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-SemiBold.ttf and b/fonts/weft/ttf/MachineMadeWeft-SemiBold.ttf differ diff --git a/fonts/weft/ttf/MachineMadeWeft-Thin.ttf b/fonts/weft/ttf/MachineMadeWeft-Thin.ttf index 2a2ef02..7506803 100644 Binary files a/fonts/weft/ttf/MachineMadeWeft-Thin.ttf and b/fonts/weft/ttf/MachineMadeWeft-Thin.ttf differ diff --git a/fonts/weft/variable/MachineMadeWeft[FRAG,wght].ttf b/fonts/weft/variable/MachineMadeWeft[FRAG,wght].ttf index 41e302e..8ee73cb 100644 Binary files a/fonts/weft/variable/MachineMadeWeft[FRAG,wght].ttf and b/fonts/weft/variable/MachineMadeWeft[FRAG,wght].ttf differ diff --git a/fonts/weft/webfonts/MachineMadeWeft-Bold.woff2 b/fonts/weft/webfonts/MachineMadeWeft-Bold.woff2 index 2b20c93..240c79d 100644 Binary files a/fonts/weft/webfonts/MachineMadeWeft-Bold.woff2 and b/fonts/weft/webfonts/MachineMadeWeft-Bold.woff2 differ diff --git a/fonts/weft/webfonts/MachineMadeWeft-Regular.woff2 b/fonts/weft/webfonts/MachineMadeWeft-Regular.woff2 index 4168a4b..6ec4396 100644 Binary files a/fonts/weft/webfonts/MachineMadeWeft-Regular.woff2 and b/fonts/weft/webfonts/MachineMadeWeft-Regular.woff2 differ diff --git a/fonts/weft/webfonts/MachineMadeWeft[FRAG,wght].woff2 b/fonts/weft/webfonts/MachineMadeWeft[FRAG,wght].woff2 index 06665e1..b32fe74 100644 Binary files a/fonts/weft/webfonts/MachineMadeWeft[FRAG,wght].woff2 and b/fonts/weft/webfonts/MachineMadeWeft[FRAG,wght].woff2 differ diff --git a/proofs/weft/readability.json b/proofs/weft/readability.json index 224f83e..15cabc1 100644 --- a/proofs/weft/readability.json +++ b/proofs/weft/readability.json @@ -8,7 +8,7 @@ 24 ], "upscale": 3, - "lookalike_text": "5mlg8 I8clO 0dcZr 98nrI Ol0Bg l8n|5\n1l|n| mcr5g S29rn 8OI95 c91Sl 99l9S\nn209r 01ZS2 1mS52 B1|m5 d92IO |9B9Z\nIIr82 mcSB8 In555 1I0gB mcBc| lr|SZ\n2ZlrI d25Id 2ZdO0 l9I0r 92|2| Ignl5\nS0I|5 g5ln0 S0nlg 5lIcZ Bm8mS 90g1B\nlgm|8 S5S19 |9ng5 8d|nB BgBSl 9g88d\nI9gl2 O|08r ||9Ol O2ZB0 nlrdr 051dl", + "lookalike_text": "5mlg8 Iq8cl O0dcZ rq98n rIOl0 Bglq8\nn|5q1 l|n|m cr5gS 29rn8 OI95c 91Sl9\nq9l9S n209r 01ZS2 1mS52 B1|m5 qd92I\nOq|9B 9ZIIr 82mcS B8qIn 5551I 0gBmc\nBqc|l r|SZ2 ZlrId 25Id2 ZdO0l 9Iq0r\n92|2| Ignql 5S0I| 5g5ln 0S0nl g5lIc\nZBmq8 mS90g 1Blgm |8S5S 19|9n g58d|\nnBBgB Sl9g8 8dI9g ql2O| 08r|| 9OlO2", "weft": { "font": "machine-made Weft (variable, wght 400)", "paragraph": { @@ -16,70 +16,90 @@ "cer_by_px": { "16": 0.0034, "20": 0.0, + "24": 0.0069 + }, + "cer_mean": 0.0034 + }, + "FRAG 8": { + "cer_by_px": { + "16": 0.0, + "20": 0.0, "24": 0.0034 }, - "cer_mean": 0.0023 + "cer_mean": 0.0011 }, "FRAG 15": { "cer_by_px": { "16": 0.0034, "20": 0.0, - "24": 0.0 + "24": 0.0034 }, - "cer_mean": 0.0011 + "cer_mean": 0.0023 }, "FRAG 50": { "cer_by_px": { - "16": 0.0552, - "20": 0.0207, - "24": 0.031 + "16": 0.0517, + "20": 0.0138, + "24": 0.0138 }, - "cer_mean": 0.0356 + "cer_mean": 0.0264 }, "FRAG 100": { "cer_by_px": { - "16": 0.3621, + "16": 0.3793, "20": 0.4172, - "24": 0.4552 + "24": 0.6241 }, - "cer_mean": 0.4115 + "cer_mean": 0.4735 } }, "lookalikes": { "FRAG 0": { "cer_by_px": { - "20": 0.1417, - "24": 0.1167, - "32": 0.1125 + "20": 0.0833, + "24": 0.0625, + "32": 0.0667 + }, + "cer": 0.0708, + "confusions": { + "other": 11, + "O->0": 5, + "I->1": 5, + "l->1": 4, + "0->O": 4, + "I->l": 1 + } + }, + "FRAG 8": { + "cer_by_px": { + "20": 0.0875, + "24": 0.075, + "32": 0.075 }, - "cer": 0.1236, + "cer": 0.0792, "confusions": { - "O->0": 11, - "l->1": 11, - "0->O": 10, - "I->1": 8, - "other": 4, - "l->I": 3, - "5->S": 1, - "|->l": 1 + "other": 12, + "l->1": 8, + "O->0": 6, + "I->1": 5, + "0->O": 4, + "I->l": 1 } }, "FRAG 15": { "cer_by_px": { - "20": 0.1542, - "24": 0.1292, - "32": 0.1083 + "20": 0.0833, + "24": 0.0708, + "32": 0.0792 }, - "cer": 0.1306, + "cer": 0.0778, "confusions": { - "l->1": 16, - "O->0": 12, - "0->O": 11, - "I->1": 10, - "other": 6, - "l->I": 3, - "|->1": 1, - "1->l": 1 + "other": 9, + "l->1": 7, + "O->0": 6, + "I->1": 4, + "0->O": 3, + "I->l": 1 } } } @@ -99,17 +119,19 @@ "lookalikes": { "static": { "cer_by_px": { - "20": 0.0833, - "24": 0.0667, - "32": 0.075 + "20": 0.0917, + "24": 0.0875, + "32": 0.0833 }, - "cer": 0.075, + "cer": 0.0875, "confusions": { "0->O": 19, - "O->0": 12, - "l->1": 8, - "I->1": 4, + "O->0": 9, + "l->1": 6, + "q->g": 3, + "I->1": 3, "1->l": 1, + "I->l": 1, "other": 1 } } @@ -117,51 +139,79 @@ }, "gate": { "margin": 0.02, - "lookalike_margin": 0.06, + "lookalike_margin": 0.0, "frag15_margin": 0.02, "reference_paragraph_cer": 0.0046, - "reference_lookalike_cer": 0.075, + "reference_lookalike_cer": 0.0875, "checks": [ { "frag": 0, "test": "paragraph", - "cer": 0.0023, + "cer": 0.0034, "limit": 0.0246, "pass": true }, { "frag": 0, "test": "lookalikes", - "cer": 0.1236, - "limit": 0.135, + "cer": 0.0708, + "limit": 0.0875, "pass": true }, { - "frag": 15, + "frag": 8, "test": "paragraph", "cer": 0.0011, "limit": 0.0246, "pass": true }, { - "frag": 15, + "frag": 8, "test": "lookalikes", - "cer": 0.1306, - "limit": 0.135, + "cer": 0.0792, + "limit": 0.0875, + "pass": true + }, + { + "frag": 15, + "test": "paragraph", + "cer": 0.0023, + "limit": 0.0246, "pass": true }, { "frag": 15, + "test": "lookalikes", + "cer": 0.0778, + "limit": 0.0875, + "pass": true + }, + { + "frag": 8, "test": "paragraph vs FRAG 0", "cer": 0.0011, - "limit": 0.0223, + "limit": 0.0234, + "pass": true + }, + { + "frag": 8, + "test": "lookalikes vs FRAG 0", + "cer": 0.0792, + "limit": 0.0908, + "pass": true + }, + { + "frag": 15, + "test": "paragraph vs FRAG 0", + "cer": 0.0023, + "limit": 0.0234, "pass": true }, { "frag": 15, "test": "lookalikes vs FRAG 0", - "cer": 0.1306, - "limit": 0.1436, + "cer": 0.0778, + "limit": 0.0908, "pass": true } ], diff --git a/proofs/weft/weft-accents.png b/proofs/weft/weft-accents.png new file mode 100644 index 0000000..6fcd108 Binary files /dev/null and b/proofs/weft/weft-accents.png differ diff --git a/proofs/weft/weft-before-after-black.png b/proofs/weft/weft-before-after-black.png new file mode 100644 index 0000000..7a092b3 Binary files /dev/null and b/proofs/weft/weft-before-after-black.png differ diff --git a/proofs/weft/weft-before-after-lookalikes.png b/proofs/weft/weft-before-after-lookalikes.png new file mode 100644 index 0000000..7f207f6 Binary files /dev/null and b/proofs/weft/weft-before-after-lookalikes.png differ diff --git a/proofs/weft/weft-body-text.png b/proofs/weft/weft-body-text.png index f8dc06b..1da06f7 100644 Binary files a/proofs/weft/weft-body-text.png and b/proofs/weft/weft-body-text.png differ diff --git a/proofs/weft/weft-charset.png b/proofs/weft/weft-charset.png index 976f09e..e9dd4a9 100644 Binary files a/proofs/weft/weft-charset.png and b/proofs/weft/weft-charset.png differ diff --git a/proofs/weft/weft-code.png b/proofs/weft/weft-code.png new file mode 100644 index 0000000..91bc01d Binary files /dev/null and b/proofs/weft/weft-code.png differ diff --git a/proofs/weft/weft-designspace.png b/proofs/weft/weft-designspace.png new file mode 100644 index 0000000..a1578b2 Binary files /dev/null and b/proofs/weft/weft-designspace.png differ diff --git a/proofs/weft/weft-frag-waterfall.png b/proofs/weft/weft-frag-waterfall.png index 9e54774..1fce9dc 100644 Binary files a/proofs/weft/weft-frag-waterfall.png and b/proofs/weft/weft-frag-waterfall.png differ diff --git a/proofs/weft/weft-lookalikes.png b/proofs/weft/weft-lookalikes.png index 4cc2dc3..8e79ee0 100644 Binary files a/proofs/weft/weft-lookalikes.png and b/proofs/weft/weft-lookalikes.png differ diff --git a/proofs/weft/weft-sketch-compare.png b/proofs/weft/weft-sketch-compare.png new file mode 100644 index 0000000..76ad11a Binary files /dev/null and b/proofs/weft/weft-sketch-compare.png differ diff --git a/proofs/weft/weft-weight-waterfall.png b/proofs/weft/weft-weight-waterfall.png index 46f262d..6e1c46b 100644 Binary files a/proofs/weft/weft-weight-waterfall.png and b/proofs/weft/weft-weight-waterfall.png differ diff --git a/site/build.py b/site/build.py index a65e6a7..0b84e41 100644 --- a/site/build.py +++ b/site/build.py @@ -48,7 +48,7 @@ REPO_URL = "https://github.com/machine-made/type" ORG_URL = "https://github.com/machine-made" RELEASES = { - "weft": REPO_URL + "/releases/tag/weft-v0.1.0", + "weft": REPO_URL + "/releases/tag/weft-v0.2.0", "sans": REPO_URL + "/releases/tag/sans-v0.1.0", "heddle": REPO_URL + "/releases/tag/heddle-v0.1.0", "warp": REPO_URL + "/releases/tag/warp-v0.1.0", diff --git a/site/pages/download/index.html b/site/pages/download/index.html index da30d61..5385c85 100644 --- a/site/pages/download/index.html +++ b/site/pages/download/index.html @@ -15,9 +15,9 @@

Download and install

Monospace

-

machine-made Weft 0.1

+

machine-made Weft 0.2

-

Download Weft 0.1 from GitHub

+

Download Weft 0.2 from GitHub

On your computer

Unzip the release. On macOS, open the TTF files and select Install. On Windows, right-click the files and select Install. On Linux, copy them to ~/.local/share/fonts and run fc-cache.

On the web

diff --git a/site/pages/weft/index.html b/site/pages/weft/index.html index 84f688a..669aba5 100644 --- a/site/pages/weft/index.html +++ b/site/pages/weft/index.html @@ -1,6 +1,6 @@