
CEO & Co-founder of Visivo
Visivo v2.3.1 and v2.3.2: Smaller Static Bundles
Visivo v2.3.2 cuts visivo dist bundles almost in half, adds a CDN option for hosts that cannot compress, writes smaller parquet, and ships a full PyPI package.

Visivo v2.3.2 makes the static bundle that visivo dist builds much smaller, and gives you a way to keep its download small on hosts that serve files as stored. It is a focused patch release: two changes, both aimed at teams that publish dashboards as static files.
The v2.3.2 release shipped on November 6, 2026. It carries the changes tagged earlier the same day as v2.3.1. v2.3.1 was never published to PyPI, so v2.3.2 is the version to install. Both cover everything merged since v2.3.0.
One DuckDB-WASM build instead of two
A visivo dist bundle is the real viewer running on pre-computed data, with DuckDB-WASM doing the querying in the browser. Until now the viewer shipped two builds of DuckDB-WASM: the exception-handling (EH) build and an older MVP fallback. A browser only ever downloads one of them, and every browser that can run the rest of the viewer can run the EH build. So v2.3.2 ships the EH build only.
The difference is easy to see on disk. We built the bundled EV Sales sample with both releases:
visivo init --example ev-sales
visivo run
visivo dist
The dist/ folder came to 89 MB with v2.3.0 and 49 MB with v2.3.2. The data is the same; the 41 MB MVP wasm file is gone. The Python package shrinks for the same reason: the v2.3.2 wheel on PyPI is 28.0 MB, down from 46.9 MB for v2.3.0.
What a browser downloads stays the same size, because it only ever fetched the EH build. If you want a smaller download too, read the next section.
Load DuckDB-WASM from a CDN with --duckdb-from-cdn
After this change, the largest file in a bundle is the 36 MB DuckDB-WASM engine. A host that compresses (Netlify, Cloudflare Pages, nginx with gzip) sends far fewer bytes than that. A host that serves files exactly as stored, such as a plain object storage bucket, sends all 36 MB to every new visitor.
visivo dist --duckdb-from-cdn is for that case:
visivo dist --duckdb-from-cdn
The bundle then loads the same EH build from jsDelivr, pinned to the exact @duckdb/duckdb-wasm version the viewer was built with. jsDelivr serves the wasm brotli-compressed, at 7.1 MB on the wire instead of 35.9 MB. Browsers do not start a worker from another origin, so the page starts it from a same-origin blob that imports the CDN worker.
Two things to know before you turn it on:
- The visitor's browser needs to reach
cdn.jsdelivr.net. On a locked-down internal network, leave the flag off. - The flag changes where the page loads the engine from. The wasm file is still copied into
dist/, so the folder on disk stays the same size.
We built the EV Sales sample with the flag, served it from a plain static server, and the dashboard rendered with the engine fetched from jsDelivr and no console errors.
Smaller data files
visivo run writes parquet for fast local reads. A static bundle is downloaded by every visitor, so visivo dist now writes each parquet file once more with ZSTD level 9 and one large row group, and ships whichever version is smaller. On a 150,000 row NYC taxi model in our test projects, that took the file from 2.57 MB to 2.14 MB. A file that DuckDB cannot rewrite ships unchanged, so this never makes a bundle worse.
You do not need to change anything to get this. Run visivo dist as before.
The static distribution guide covers hosting a bundle, and the CLI and DevOps page covers how visivo dist fits into a deploy pipeline.
A complete package on PyPI
v2.3.0 reached PyPI as a wheel only. Its source distribution was rejected for being over PyPI's size limit, because the build picked up files from outside the visivo package. v2.3.2 builds the source distribution from the package alone (27.3 MB) and publishes it next to the wheel. The release workflow now checks the package size before it tags or publishes anything, so an oversize package stops the release instead of reaching PyPI half done.
If your install pulls from source, for example with pip install --no-binary visivo, it works again with v2.3.2.
Upgrade notes
Browsers without WebAssembly exception handling can no longer open a Visivo dashboard. That is Chrome and Edge before 95, Firefox before 100, and Safari before 15.2. Such a browser used to fall back to the MVP build. It now shows this message at the top of the page instead of loading charts:
This browser cannot run DuckDB-WASM, which Visivo uses to query data in the page. Open it in a current version of Chrome, Edge, Firefox or Safari.
Install. To install this release:
curl -fsSL https://visivo.sh | bash -s -- --version 2.3.2
# or
pip install visivo==2.3.2
New to Visivo? The getting-started guide takes you from install to a dashboard, and the examples page shows finished projects. The full changelog since v2.3.0 lists every change.
Previously in Visivo
The v2.3.0 recap covered one-click sample dashboards, an agent that checks its build and screenshots its work, and one set of save rules for every writer. v2.3.2 makes what you publish from those projects lighter to host.