# qURL CLI behaviour test

Results: [results.json](results.json) (2026-10-01, qurl 3.2.0) and
[results-2026-10-18.json](results-2026-10-18.json) (qurl 3.5.0, with Vite 8.3.4, Next.js 16.4.2 and
the [streaming chat demo](../qurl-streaming-chat/)). Probe app: [probe-server.js](probe-server.js).

The 2026-10-18 run used an existing resource: a local route on port 4173, with each app run on that port in turn.
The write-up is at https://layerv.ai/research/qurl-behaviour.

## What was tested

These are the claims our comparison pages make about the qURL CLI. Each one was run on
2026-10-01 against production with no LayerV account:

- link defaults
- single use
- WebSocket, Server-Sent Events and streaming
- how a session is admitted
- what the local app receives
- what happens after delete
- a Vite dev server

## Reproduce it

1. Download the CLI release for your platform from
   https://github.com/layervai/qurl-integrations/releases/latest and verify it against the
   release `checksums.txt`.
2. Use a fresh, owner-only state directory so the run doesn't touch an existing qURL setup:

   ```bash
   mkdir -p ~/.qurl-test/state ~/.qurl-test/run && chmod 700 ~/.qurl-test ~/.qurl-test/*
   export QURL_CONNECTOR_STATE_DIR=~/.qurl-test/state QURL_CONNECTOR_RUNTIME_DIR=~/.qurl-test/run
   ```

3. Start the probe app. It needs Node.js and nothing else, and writes `server.log` next to
   itself:

   ```bash
   node probe-server.js   # listens on 127.0.0.1:47613
   ```

4. Publish and share it:

   ```bash
   qurl publish http://127.0.0.1:47613 --foreground --quiet > crid &
   until [ -s crid ]; do sleep 1; done    # the CRID prints once serving
   qurl share "$(cat crid)" -o json        # note expires_in_seconds and single_use
   ```

5. Open the `qurl` value from that JSON in a browser. After about 9 seconds the page posts
   its results (WebSocket echoes, SSE arrival times, chunk arrival times) to `server.log`.
6. Open the same link again to check single use. Then run `qurl delete <CRID> --yes` and
   remove `~/.qurl-test`.

The probe's WebSocket frame handling is minimal: messages of up to 125 bytes, no
fragmentation. That is enough for the echo test and nothing more.
