{
  "name": "qURL CLI behaviour test, 2026-10-18 run",
  "description": "A second run of the qURL behaviour test on the current CLI release, plus Vite 8, Next.js 16.4 and a streaming chat demo shared through real qURL links. The 2026-10-01 run in results.json is unchanged.",
  "license": "CC-BY-4.0",
  "publisher": "LayerV",
  "homepage": "https://layerv.ai/research/qurl-behaviour",
  "dateTested": "2026-10-18",
  "environment": {
    "cli": "qurl 3.5.0 (darwin/arm64), Homebrew",
    "service": "production (api.layerv.ai, qurl.link)",
    "resource": "An existing local route (http://127.0.0.1:4173) owned by a device identity created before this run. Each app under test listened on that port in turn.",
    "os": "macOS on Apple silicon",
    "browser": "headless Chromium (Playwright) on the publishing machine, so the recipient shared the publisher's public IP address",
    "node": "20.18.3 for the probe and chat demo; 22.14.0 for Vite and Next.js"
  },
  "checks": [
    {
      "id": "share-defaults",
      "check": "qurl share <CRID> on the existing resource",
      "result": "pass",
      "detail": "JSON output reported expires_in_seconds 86400 and single_use true."
    },
    {
      "id": "landing-host",
      "check": "Where the recipient lands",
      "result": "observed",
      "detail": "The browser went from qurl.link to https://r_<11 characters>.qurl.site/."
    },
    {
      "id": "websocket",
      "check": "WebSocket upgrade through the link (probe-server.js)",
      "result": "pass",
      "detail": "3 of 3 echo round trips completed over wss://."
    },
    {
      "id": "sse",
      "check": "Server-Sent Events through the link (probe-server.js)",
      "result": "pass",
      "detail": "Six events sent one second apart arrived 993 to 1,002 ms apart; none were batched."
    },
    {
      "id": "chunked",
      "check": "Chunked streaming response through the link (probe-server.js)",
      "result": "pass",
      "detail": "Five 1 KiB chunks sent one second apart arrived about one second apart."
    },
    {
      "id": "single-use",
      "check": "Open the same link a second time",
      "result": "pass",
      "detail": "The second open showed \"Access link invalid\": the link may have expired, been revoked, or already been used."
    },
    {
      "id": "request-headers",
      "check": "What the local app receives",
      "result": "observed",
      "detail": "Host and X-Forwarded-Host are c-<connector id>.qurl.site; requests also carry X-Forwarded-For, -Port, -Proto, -Server, X-Real-IP and X-Request-Id; browser POSTs send Origin https://r_<id>.qurl.site. No request carried a cookie."
    },
    {
      "id": "streaming-chat",
      "check": "Streamed chat reply (public/data/qurl-streaming-chat/server.js, fetch reading text/event-stream)",
      "result": "pass",
      "detail": "49 words sent 150 ms apart arrived 152 ms apart at the median, at most 204 ms, never two within 20 ms. Pressing Stop after 5 words aborted the request in the browser, and the local server logged the connection closing after 6 words sent."
    },
    {
      "id": "vite-allowed-hosts",
      "check": "Vite 8.3.4 dev server (vite --host 127.0.0.1) through the link",
      "result": "fail without config, pass with it",
      "detail": "Without configuration the recipient saw \"Blocked request. This host (\"c-<connector id>.qurl.site\") is not allowed.\" With server.allowedHosts ['.qurl.site'] the page loaded, the hot reload WebSocket connected over wss://r_<id>.qurl.site, and a source edit was applied in the remote browser as a hot update, without a page reload."
    },
    {
      "id": "nextjs-dev-origins",
      "check": "Next.js 16.4.2 dev server (next dev -H 127.0.0.1, Turbopack) through the link",
      "result": "fail without config, pass with it",
      "detail": "Without configuration next dev logged \"Blocked cross-origin request to Next.js dev resource /_next/hmr\" and edits never reached the remote browser. With allowedDevOrigins ['*.qurl.site'] hot reload worked, but a Server Action failed with \"Invalid Server Actions request\" (x-forwarded-host c-<id>.qurl.site does not match origin r_<id>.qurl.site). Adding experimental.serverActions.allowedOrigins ['*.qurl.site'] made the Server Action return 200, and a source edit was applied without a page reload."
    }
  ],
  "measurements": {
    "note": "One run on one network, with the recipient browser on the publishing machine. Published for transparency, not as a latency benchmark.",
    "sseArrivalMs": {
      "viaQurl": [1186, 2188, 3190, 4183, 5184, 6185]
    },
    "chunkArrivalMs": {
      "viaQurl": [1186, 2184, 3190, 4178, 5177]
    },
    "websocketEchoRoundTrips": 3,
    "chatWordGapMs": {
      "viaQurl": {
        "median": 152,
        "max": 204
      },
      "localhost": {
        "median": 151,
        "max": 153
      }
    }
  }
}
