Sandstone routes all proxied network requests through a Wisp WebSocket server. Wisp is a lightweight multiplexing protocol that allows the in-browser libcurl.js runtime to open TCP and UDP connections by tunneling them over a single WebSocket connection. Without a reachable Wisp server,Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ading2210/sandstone/llms.txt
Use this file to discover all available pages before exploring further.
navigate_to() cannot fetch any remote pages.
Setting the Wisp server URL
Callsandstone.network.set_websocket(url) — or equivalently sandstone.libcurl.set_websocket(url) — before making any navigation calls. Both functions are aliases for the same underlying libcurl.js call.
wss://wisp.mercurywork.shop/ is available for testing and development. It is operated by the MercuryWorkshop team.
Detecting the right server at runtime
In the example application, Sandstone chooses between a local Wisp endpoint and the public server based on the currentlocation object. This pattern lets the same build work both in local development (where a server is running on the same host) and when deployed to a static hosting platform like Cloudflare Pages.
http: nor https: (for example, file:), there is no local server to connect to, so the code falls back to the public Wisp server.
Local Wisp server with the example backend
The example server (example/server.mjs) uses the @mercuryworkshop/wisp-js package to handle WebSocket upgrade requests and expose a local Wisp endpoint on the same port as the Express static file server.
ws://localhost:5001/).
The full Wisp protocol specification is available at github.com/MercuryWorkshop/wisp-protocol. The repository also lists several community-maintained server implementations.