Skip to content

zig: build on Zig 0.17 - #13

Merged
foxnne merged 4 commits into
mainfrom
zig-0.17
Oct 18, 2026
Merged

foxnne merged 4 commits into
mainfrom
zig-0.17

Conversation

@foxnne

@foxnne foxnne commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Part of fizzyedit/plans#5 (plans/ZIG_0_17_PLAN.md, step 3). This moves the example to Zig 0.17. It lands right after fizzy's switch PR, zig/0.17 → main. Until then, fizzy's CI builds this branch, zig-0.17, against each zig/0.17 PR (scripts/check-examples.sh), so the "Example repos" check on those PRs is this branch's test.

Merge order:

  1. fizzy's switch PR merges.
  2. This PR merges, and its sibling in fizzyedit/example-app does too.
  3. A one-line fizzy PR points check-examples.sh back at main.

Its fizzy pin moves to the 0.17 SDK at the release.

🤖 Generated with Claude Code

minimum_zig_version is 0.17.0, and `b.args` is now
`run.addPassthruArgs()`. Built by fizzy's check-examples.sh against
fizzy's zig/0.17 branch, which swaps every fizzy and SDK pin for its
own tree; the pins here move when fizzy's 0.17 SDK is released.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
foxnne and others added 2 commits October 17, 2026 20:11
The template's workflows build with the Zig its build.zig.zon asks for.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@foxnne foxnne mentioned this pull request Oct 18, 2026
3 of 4 tasks
foxnne added a commit to fizzyedit/fizzy that referenced this pull request Oct 18, 2026
Part of fizzyedit/plans#5 (`plans/ZIG_0_17_PLAN.md`, step 2): fizzy, its
backend and its bundled plugins move to Zig 0.17. Every piece was
reviewed as its own PR into `zig/0.17`, and this PR lands that branch.
`main` is already merged in (through #555), so it carries no conflicts.

## What changes

**The move to 0.17** (`minimum_zig_version = "0.17.0"` everywhere), as
reviewed in:
- #437: the switch, scaffolded with marked stand-ins
- #438: the build's custom steps become helper programs
- #448: release packaging on 0.17, with Velopack 1.2.161 (+ #452's zon
arenas)
- #488: settings and command schemas read 0.17's `@typeInfo`, with a
test that the SDK fingerprint hashes the same facts as on 0.16
- #489: per-pointer capture through `captureMouseGet`
- #494: the Windows traps in `docs/PITFALLS.md`
- #496: `blitData` without an `extern struct` `@bitCast`
- #498: `fizzy.plugin.installBeside`, for a plugin's helper program
- #505: the 0.16 inflate workaround goes; the docs say 0.17
- #561: review fixes. A settings payload with pointers is a compile
error, and build reads go through `b.root`.
- #573: the plugin install helper compiles once, in Debug
- the catch-ups with `main` (#486, #503, #558, #574, and the last merge
here), each with `scripts/zig-0.17/rewrite.sh` re-run. That script is
deleted in the last commit.

Most of the diff is mechanical: `zig fmt`'s upgrades (`@backingInt`,
`std.lang`, …) and one-answer renames. The hand migrations are the build
(configure/make split, no custom steps), the zon arenas, `@typeInfo`,
translate-c for `@cImport`, and the `@bitCast` audit. A high-effort
review of the whole `main`…`zig/0.17` diff found five things; the three
correctness ones are fixed in #561, and one efficiency one in #573.

**Also on the branch, merged there by the maintainer:** the windowing
work.
- #480–#483: plain dvui apps on macOS
- #492, #501, #504, #510: OS windows for floating windows, full screen,
pointer routing
- #546: window materials

**Forks:** dvui-dev at its `zig-0.17` head `1b29a16`, which carries
fizzy-dev's patches on upstream's 0.17 `main`, including #540, #544 and
#563's dvui commits. Also assetpack, md4zig, sdl_zig and zig-objc on
their `zig-0.17` branches, and velopack-zig `3d553b7` (tagged
`fizzy-zig0.17`).

## Measured

macOS arm64, under load from other sessions, each step alternated
between the two. 0.16 is `main` #509; 0.17 is `zig/0.17` with #561.

| | Zig 0.16 | Zig 0.17 |
|---|---|---|
| App, cold Debug build | 94.4 s | 78.6 s |
| App, warm no-op rebuild | 0.7 s | 0.4 s |
| `test-integration` (compile + run) | 108.9 s | 90.4 s |
| App, ReleaseFast build | 142.8 s | 131.5 s |
| Image plugin, cold standalone build | 11.6 s | 14.0 s (with #573) |
| Startup, Debug (median of 5) | 565 ms | 466 ms |
| Startup, ReleaseFast (median of 5) | 175 ms | 177 ms |
| Text, ReleaseFast, µs/frame: idle / mid / scroll / typing | 305 / 424
/ 435 / 403 | 240 / 306 / 286 / 290 |
| Markdown, ReleaseFast, 4 docs, median of 5, µs/frame: idle top / mid /
scroll / resize | 1177 / 1735 / 2104 / 1319 | 1270 / 1699 / 1833 / 1192
|

The one slowdown is markdown idle at the top of a document, +8%. The
rest of the plugin build's gap is dvui's own translate-c on 0.17.

## The plan's gate

- **ZLS:** no 0.17 release yet (latest 0.16.0). zigtools/zls#3270 is on
ZLS's master. Completions across `fizzy_sdk` from a plugin are not
checked.
- **Minimum OS:** 0.17 needs Darwin 15+ (OS X 10.11); fizzy's macOS
minimum is 11.0, so no change. Windows 10+ and Linux 5.10+ are not
stated by fizzy.
- **Debug leak reports:** still print (`DebugAllocator`, deprecated,
unchanged). The move to `SafeAllocator` is a follow-up with its own
Debug frame-time check.
- **Velopack:** packaging proven by a test release on macOS (signed and
notarized), Windows and Linux. An update in place was not tested.
- **Every target builds:** in CI. Windows and Linux were not run by hand
on the VMs.

## SDK impact

- [x] Fingerprint moved (`0x5f9c818a6972efd4`, recorded in
`sdk/src/version.zig`); `sdk_version` untouched. `sdk: release 0.2.30`
follows this at once. Plugins need Zig 0.17 to build against it: there's
no overlap window.
- Plugin authors see `minimum_zig_version = "0.17.0"` and
`fizzy.plugin.installBeside`. A settings payload holding pointers other
than a string is now a compile error. `docs/PLUGINS.md` says 0.17.0.

## Right after this merges

1. fizzyedit/example-app#8 and fizzyedit/example-plugin#13 merge. Then a
one-line PR points `scripts/check-examples.sh` back at `main` (it pins
the examples' `zig-0.17` branches until then, so `main`'s CI is never
red).
2. `sdk: release 0.2.30`.
3. The store plugins' 0.17 PRs repin and release: fizzyedit/pixi#51,
zig#15, atlas#16, drive#13, ghostty#14, agent#23, chat#16.

## Verified

- [x] macOS (arm64, Zig 0.17.0), on this tree:
  - `scripts/check-fmt.sh`
  - `zig build`: 71/71
  - `zig build test`: 109/109 steps, 637/638 (1 skipped)
  - `zig build check-tests-reached`: 998 tests in 122 files
  - `zig build check-web`: 42/42
  - `zig build test-sdk-version`: 35/35
  - `zig build test-integration`: 78/78 steps, 608/608
- [x] All seven store plugins built against `zig/0.17`'s `sdk/` and
loaded together in a 0.17 fizzy (Debug, sandbox profile).
- [ ] Windows, Linux, the example repos: CI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@foxnne foxnne mentioned this pull request Oct 18, 2026
2 of 6 tasks
foxnne added a commit to fizzyedit/fizzy that referenced this pull request Oct 18, 2026
## What changes

`sdk_version` goes from 0.2.29 to 0.2.30. Merging this tags
`sdk-v0.2.30` and publishes its tarball.

**Why now:** this is the first SDK on Zig 0.17 (#575,
`plans/ZIG_0_17_PLAN.md` step 2), and the plan has the release follow
the switch at once. A 0.17 fizzy refuses every plugin built against
0.2.29, and fizzyed.it/testapp is built from `main`, so the store
plugins can't trail by days. Their 0.17 PRs are ready and only need this
tarball to repin.

## SDK impact

- [ ] None
- [ ] Core-only or additive: reaches plugins at the next SDK release
- [ ] Fingerprint moved: recorded in `sdk/src/version.zig`,
`sdk_version` untouched, PR labelled `sdk`
- [x] SDK release: bumps `sdk_version`, lists the `sdk` PRs since the
last `sdk-v*` tag

**`sdk` PRs since `sdk-v0.2.29`:**
- **#575: Zig 0.17.** Plugins need `minimum_zig_version = "0.17.0"` and
Zig 0.17 to build; there's no overlap window with 0.16. Also new:
  - `fizzy.plugin.installBeside`, for a helper program a plugin ships.
- A settings payload holding pointers other than a string is a compile
error.
  - The dev-install helper compiles once, in Debug.
- **#536:** a plugin can replace a command it names, and gets it back on
unload.
- **#538:** a command may answer in a later frame.
- **#540, #544:** dvui's front-to-back blocks (render order of floats,
glass and focus rings).
- **#563:** `dvui.pointerKind()` and `cursorSetPriority`; tabs show the
hand, and a tapped item is left unlit.

The fingerprint is `0x5f9c818a6972efd4`.

## Verified

- [x] macOS (arm64, Zig 0.17.0):
- On this head, `zig build test-sdk-version` passes, and
`scripts/pack-sdk.sh` packs `fizzy-sdk-v0.2.30.tar.gz`.
- All seven store plugins build against this `sdk/` by path with no
further changes: pixi, zig, atlas, drive, ghostty, agent and chat (their
0.17 PRs below). All seven loaded together in a 0.17 fizzy earlier on
the branch.
- [ ] Windows, Linux: CI.

## Follow-ups

- The repin automation opens `sdk: repin to fizzy SDK 0.2.30` PRs. The
store plugins' own 0.17 PRs carry the port and only need the pin moved:
  - fizzyedit/pixi#51, fizzyedit/zig#15, fizzyedit/atlas#16
- fizzyedit/drive#13, fizzyedit/ghostty#14, fizzyedit/agent#23,
fizzyedit/chat#16
I'll repin those branches to `sdk-v0.2.30` and close the bot's
duplicates.
- fizzyedit/example-plugin#13 repins to 0.2.30. Then
fizzyedit/example-app#8 pins it, `sdk-v0.2.30` and fizzy's switch
commit. Then `scripts/check-examples.sh` points back at `main`.
- fizzyedit/plugin-build-action's default `zig-version` is still 0.16.0;
every plugin passes its own.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The first SDK on Zig 0.17.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@foxnne
foxnne marked this pull request as ready for review October 18, 2026 22:59
@foxnne
foxnne merged commit 592a738 into main Oct 18, 2026
5 of 6 checks passed
@foxnne
foxnne deleted the zig-0.17 branch October 18, 2026 23:33
foxnne added a commit to fizzyedit/example-app that referenced this pull request Oct 18, 2026
fizzy pins its Zig 0.17 switch (fizzyedit/fizzy#575), fizzy_sdk and the shader plugin pin sdk-v0.2.30, hello pins example-plugin's main on 0.17 (fizzyedit/example-plugin#13), and the workflow builds with Zig 0.17.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
foxnne added a commit to fizzyedit/fizzy that referenced this pull request Oct 19, 2026
…#597)

Two fixes that keep every pull request's CI from passing on `main` right
now.

**1. `win32_titlebar.zig` is formatted.** #463 merged with
`backend/src/platform/win32_titlebar.zig` not formatted, so the Format
check (`scripts/check-fmt.sh`) fails on `main` and every pull request
since. Just `zig fmt`.

**2. An example repo is cloned from `main` once its `zig-0.17` branch
has landed.**
- `scripts/check-examples.sh` (the Example repos job) cloned both
example repos' `zig-0.17` branch, as a stopgap until their Zig 0.17 PRs
landed.
- example-plugin's landed (fizzyedit/example-plugin#13) and its branch
was deleted, so the clone failed every pull request: "Remote branch
zig-0.17 not found".
- Each repo is now cloned from its `zig-0.17` branch while it has one,
`main` once it doesn't. Today that's example-app → `zig-0.17`,
example-plugin → `main`.
- When example-app's lands too, `main` alone, in a PR of its own (the
`ZIG017` note says so).

## SDK impact

- [x] None

## Verified

- [x] `scripts/check-fmt.sh` passes; `zig build -Dtarget=x86_64-windows`
builds.
- [x] `bash -n scripts/check-examples.sh`; the branch choice run by hand
against GitHub: example-app → `zig-0.17`, example-plugin → `main`.
- [ ] The Example repos job on this PR.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
foxnne added a commit to fizzyedit/example-app that referenced this pull request Oct 19, 2026
* Zig 0.17

minimum_zig_version is 0.17.0, and `b.args` is now
`run.addPassthruArgs()`. Built by fizzy's check-examples.sh against
fizzy's zig/0.17 branch, which swaps every fizzy and SDK pin for its
own tree; the pins here move when fizzy's 0.17 SDK is released.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Build on fizzy's Zig 0.17 switch and SDK 0.2.30

fizzy pins its Zig 0.17 switch (fizzyedit/fizzy#575), fizzy_sdk and the shader plugin pin sdk-v0.2.30, hello pins example-plugin's main on 0.17 (fizzyedit/example-plugin#13), and the workflow builds with Zig 0.17.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
foxnne added a commit to fizzyedit/fizzy that referenced this pull request Oct 19, 2026
Part of fizzyedit/plans#5 (`plans/ZIG_0_17_PLAN.md`): the last step of
the Zig 0.17 switch. **Merge after fizzyedit/example-app#8.** Until that
lands, example-app's `main` is still 0.16, and this PR's "Example repos"
check builds `main`.

## What changes

- **`scripts/check-examples.sh` clones each example's default branch
again**, as it did before the move. #597 made it fall back to `main`
when an example's `zig-0.17` branch is gone; with both examples' 0.17
PRs landed (fizzyedit/example-plugin#13, and example-app#8 just before
this), the plain clone is all that's left.
- **The dvui-dev pin is tagged**, per `docs/DEPENDENCIES.md` rule 2
("tag, then pin"): `fizzy-sdk-0.2.30-7` → `1b29a16` on `zig-0.17`, what
SDK 0.2.30 pins. The pin's comment and `docs/DEPENDENCIES.md` say so.
The table names the `zig-0.17` branch, and the `zig/0.17` wording
becomes "since fizzy moved to Zig 0.17 (#575)".

## SDK impact

- [x] None.

## Verified

- [x] `scripts/check-fmt.sh` clean; `bash -n scripts/check-examples.sh`.
- [ ] The example repos at `main`: CI, once example-app#8 is in.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant