Serving, CSP, and Offline Use
Published XY wheels contain the Python package, native core, and versioned JavaScript/WebGL client. Notebook display, standalone export, and the Reflex adapter do not load XY from a CDN.
Offline Environments
Once the required wheels are installed, normal chart construction, notebook display, native PNG, SVG, and standalone HTML export need no network access. Prepare compatible platform wheels in advance for an air-gapped installation; a source build still requires the Rust toolchain.
Chromium PNG export needs a supported browser installed locally, but does not fetch one. The default native PNG engine has no browser requirement.
Standalone HTML Policy
chart.to_html() creates one portable file containing its data, styles, and
render client. The document emits a defensive Content-Security-Policy that
blocks external connections, objects, forms, and base-URL changes. Density
refinement can start a worker from the bundled source, so the policy allows
worker-src blob:; it does not allow an external worker script.
Portable single-file output necessarily uses inline script and style blocks.
Its policy therefore includes script-src 'unsafe-inline' and
style-src 'unsafe-inline'. custom_css= is added to that inline author
stylesheet.
Reflex Deployment
A fixed xy.Chart passed directly as reflex_xy.chart(chart) compiles to local
static client and binary payload assets and works with reflex export. This is
the static tier.
For fixed data that still needs kernel round-trips, create
token = reflex_xy.inline(chart) at module scope and mount it with
reflex_xy.chart(token). That inline() token is live, as is an
@reflex_xy.figure var, so both require the Reflex backend and its existing
Socket.IO connection. The adapter does not create a second service or websocket
endpoint.
Account for the application's own script, style, worker, asset, and websocket directives when writing a host CSP. XY's lack of a CDN dependency does not make a live state-backed application backend-free.
Self-Contained Does Not Mean Live
A standalone HTML file remains interactive in its browser, but it is a
snapshot. It cannot call Python event handlers or receive future
chart.append(...) calls. Use a notebook widget or framework adapter when the
browser must communicate with a Python process.