Web: size-optimised wasm profile (27.0 → 18.1 MB); bump to 0.3.1 (#109)

The 0.3.0 web release failed packaging/web/package.sh's 24 MiB gate: the wasm grew from
22.2 MB (0.2.0) to 27.0 MB once the plugin sandbox (wasmi + wasmparser, #101) and the
collaboration crates (#103-#105) joined the browser build, which still used the desktop
`release` profile (opt-level 3, thin LTO, 4 codegen units).

- Cargo.toml: new `web-release` profile (inherits release; opt-level "s", fat LTO, one codegen
  unit, no debug info, stripped). opt-level "z" measured 16.9 MB; "s" keeps render speed.
- apps/figcraft-web/index.html: build with that profile, and pass the wasm features rustc emits
  (bulk memory etc.) to wasm-opt, which otherwise rejects the size-optimised module.
- Version 0.3.0 -> 0.3.1. docs/releasing.md: the web profile and size history.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Thomas 2026-10-10 21:05:23 -04:00 committed by GitHub
parent a2bf43927f
commit f9b1b7fb15
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 41 additions and 22 deletions

40
Cargo.lock generated
View File

@ -1396,7 +1396,7 @@ checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693"
[[package]]
name = "figcraft"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"arboard",
"eframe",
@ -1417,7 +1417,7 @@ dependencies = [
[[package]]
name = "figcraft-cli"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-doc",
"figcraft-engine",
@ -1431,7 +1431,7 @@ dependencies = [
[[package]]
name = "figcraft-collab"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"base64 0.22.1",
"figcraft-color",
@ -1446,7 +1446,7 @@ dependencies = [
[[package]]
name = "figcraft-collab-net"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"base64 0.22.1",
"figcraft-collab",
@ -1461,7 +1461,7 @@ dependencies = [
[[package]]
name = "figcraft-color"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"kurbo",
"serde",
@ -1470,7 +1470,7 @@ dependencies = [
[[package]]
name = "figcraft-doc"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-color",
"figcraft-geom",
@ -1482,7 +1482,7 @@ dependencies = [
[[package]]
name = "figcraft-engine"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"base64 0.22.1",
"figcraft-collab",
@ -1507,7 +1507,7 @@ dependencies = [
[[package]]
name = "figcraft-format"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-doc",
"image",
@ -1519,7 +1519,7 @@ dependencies = [
[[package]]
name = "figcraft-geom"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"kurbo",
"serde",
@ -1527,7 +1527,7 @@ dependencies = [
[[package]]
name = "figcraft-layout"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-doc",
"figcraft-geom",
@ -1535,7 +1535,7 @@ dependencies = [
[[package]]
name = "figcraft-mcp"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"base64 0.22.1",
"figcraft-collab-net",
@ -1551,7 +1551,7 @@ dependencies = [
[[package]]
name = "figcraft-pathops"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-doc",
"figcraft-geom",
@ -1560,7 +1560,7 @@ dependencies = [
[[package]]
name = "figcraft-pdf"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-color",
"figcraft-doc",
@ -1577,7 +1577,7 @@ dependencies = [
[[package]]
name = "figcraft-plugin"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"serde",
"serde_json",
@ -1588,7 +1588,7 @@ dependencies = [
[[package]]
name = "figcraft-render"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"crc32fast",
"figcraft-color",
@ -1604,7 +1604,7 @@ dependencies = [
[[package]]
name = "figcraft-svg"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"base64 0.22.1",
"figcraft-color",
@ -1618,7 +1618,7 @@ dependencies = [
[[package]]
name = "figcraft-text"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-doc",
"figcraft-geom",
@ -1630,7 +1630,7 @@ dependencies = [
[[package]]
name = "figcraft-ui-egui"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"base64 0.22.1",
"egui",
@ -1651,7 +1651,7 @@ dependencies = [
[[package]]
name = "figcraft-web"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"eframe",
"egui",
@ -5631,7 +5631,7 @@ checksum = "9440ea3e5aeabb0ac63af70daf835274065238cdd0cec83418f417eae38bacee"
[[package]]
name = "xtask"
version = "0.3.0"
version = "0.3.1"
dependencies = [
"figcraft-color",
"figcraft-doc",

View File

@ -6,7 +6,7 @@ exclude = ["plugins"]
# default-members = ["crates/*", "apps/figcraft", "apps/figcraft-cli", "xtask"]
[workspace.package]
version = "0.3.0"
version = "0.3.1"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
@ -96,3 +96,15 @@ opt-level = 1
[profile.release]
lto = "thin"
codegen-units = 4
# The browser build only (apps/figcraft-web/index.html: data-cargo-profile). Optimised for size:
# packaging/web/package.sh fails a .wasm over 24 MiB (Cloudflare's per-file cap is 25 MiB).
# wasm32-unknown-unknown always aborts on panic, so panic = "abort" changes nothing there.
[profile.web-release]
inherits = "release"
opt-level = "s"
lto = "fat"
codegen-units = 1
debug = false
strip = true
panic = "abort"

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>FigCraft</title>
<link data-trunk rel="rust" data-bin="figcraft-web" data-wasm-opt="z" data-weak-refs />
<link data-trunk rel="rust" data-bin="figcraft-web" data-cargo-profile="web-release" data-wasm-opt="z" data-wasm-opt-params="--enable-bulk-memory --enable-bulk-memory-opt --enable-nontrapping-float-to-int --enable-sign-ext --enable-reference-types --enable-multivalue" data-weak-refs />
<style>
html, body { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; background: #f5f5f5; }
#figcraft_canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }

View File

@ -150,6 +150,13 @@ tar -xzf figcraft-<v>-freebsd-x86_64.tar.gz --strip-components 1 -C /usr/local
with sample `_headers`/`.htaccess` and the hosting guide. The app uses WebGPU with a WebGL2
fallback; `?webgl` forces WebGL2. 0.1.0: wasm 17.7 MiB raw, 6.7 MiB gzip, 4.4 MiB Brotli.
The wasm is built with the size-optimised `web-release` Cargo profile (`opt-level = "s"`, fat
LTO, one codegen unit; `data-cargo-profile` in `apps/figcraft-web/index.html`) and then
`wasm-opt -Oz`, which needs the wasm features rustc emits by default passed explicitly
(`data-wasm-opt-params`). Sizes: 0.2.0 21.1 MiB and 0.3.0 25.8 MiB (failed the gate; the plugin
interpreter and collaboration code landed) with the desktop `release` profile; 0.3.1 17.2 MiB
with `web-release`. The desktop builds keep `release`.
## Secrets
All signing secrets are **`release`-environment secrets** (deployment branches: `release` only),