{
 "test": "click to usable chat",
 "started": "2026-09-27T02:52:41.584Z",
 "finished": "2026-09-27T09:22:40.581Z",
 "runs": 5,
 "throttling": {
  "rttMs": 150,
  "throughputKbps": 1638.4,
  "requestLatencyMs": 562.5,
  "downloadThroughputKbps": 1474.5600000000002,
  "uploadThroughputKbps": 675,
  "cpuSlowdownMultiplier": 4
 },
 "env": {
  "chrome": "Chrome/153.0.8010.53",
  "playwright": "1.63.0",
  "lighthouse": "13.5.0",
  "bun": "1.4.2",
  "os": "darwin arm64"
 },
 "method": [
  "Headed Google Chrome, 1280x800, a fresh profile per run, site isolation off (--disable-site-isolation-trials, --disable-features=IsolateOrigins,site-per-process) so iframes from other sites share the page's process and its throttling.",
  "Cold: load the page, wait for the launcher, wait 15 s more (every widget has finished booting by then), switch on DevTools throttling with Lighthouse's mobile values (562.5 ms request latency, 1.47 Mbps down, 675 kbps up, 4x CPU slowdown), click the middle of the launcher with the mouse, poll every ~25 ms until the widget's first usable element is visible (widgets.ts: ready). Warm: after the cold run the chat is closed with a second click on the same spot, then a new tab in the same profile, same steps, with the widget's files in the HTTP cache. A widget that reopens its chat by itself in the new tab is recorded as such, without a time.",
  "Spookat, Tawk.to and Tidio on our test page (Spookat: the production launcher and panel from cdn.spookat.com; its socket goes to the lab's local mock, which answers at once). Crisp, Intercom, LiveChat and Chatwoot refuse our domain, so they were clicked on the vendor's own page, with that vendor's own configuration.",
  "kb and requests: what finished loading between the click and the widget being usable. Medians over the runs; runs with an error are listed and left out of the median."
 ],
 "results": {
  "spookat": {
   "measured": "2026-09-27T09:19:27.156Z",
   "note": "Spookat re-measured after #164 and #166 (launcher per style) and with Cloudflare NEL headers off",
   "widget": "Spookat",
   "where": "test page",
   "url": "http://localhost:5190/?w=spookat",
   "ready": "#spookat form.c input",
   "summary": {
    "coldMs": 799,
    "warmMs": 133,
    "coldKB": 16.7,
    "warmKB": 0,
    "okRuns": 5
   },
   "runs": [
    {
     "at": "2026-09-27T09:19:27.469Z",
     "cold": {
      "ms": 799,
      "requests": 2,
      "kb": 16.7
     },
     "warm": {
      "ms": 131,
      "requests": 3,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T09:20:06.117Z",
     "cold": {
      "ms": 795,
      "requests": 2,
      "kb": 16.7
     },
     "warm": {
      "ms": 149,
      "requests": 3,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T09:20:44.863Z",
     "cold": {
      "ms": 829,
      "requests": 2,
      "kb": 16.7
     },
     "warm": {
      "ms": 132,
      "requests": 3,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T09:21:23.619Z",
     "cold": {
      "ms": 799,
      "requests": 2,
      "kb": 16.7
     },
     "warm": {
      "ms": 134,
      "requests": 3,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T09:22:02.252Z",
     "cold": {
      "ms": 776,
      "requests": 2,
      "kb": 16.7
     },
     "warm": {
      "ms": 133,
      "requests": 3,
      "kb": 0
     }
    }
   ]
  },
  "tawk-to": {
   "widget": "Tawk.to",
   "where": "test page",
   "url": "http://localhost:5190/?w=tawk-to",
   "ready": "textarea.tawk-chatinput-editor",
   "summary": {
    "coldMs": 5095,
    "warmMs": 5092,
    "coldKB": 119.5,
    "warmKB": 2.1,
    "okRuns": 5
   },
   "runs": [
    {
     "at": "2026-09-27T02:56:04.341Z",
     "cold": {
      "ms": 5093,
      "requests": 13,
      "kb": 119.5
     },
     "warm": {
      "ms": 5094,
      "requests": 15,
      "kb": 2.1
     }
    },
    {
     "at": "2026-09-27T02:57:04.274Z",
     "cold": {
      "ms": 5095,
      "requests": 13,
      "kb": 119.5
     },
     "warm": {
      "ms": 5090,
      "requests": 15,
      "kb": 2.1
     }
    },
    {
     "at": "2026-09-27T02:58:03.281Z",
     "cold": {
      "ms": 5092,
      "requests": 13,
      "kb": 119.5
     },
     "warm": {
      "ms": 5092,
      "requests": 15,
      "kb": 2.1
     }
    },
    {
     "at": "2026-09-27T02:59:02.247Z",
     "cold": {
      "ms": 5115,
      "requests": 13,
      "kb": 119.2
     },
     "warm": {
      "ms": 5091,
      "requests": 15,
      "kb": 1.9
     }
    },
    {
     "at": "2026-09-27T03:00:05.605Z",
     "cold": {
      "ms": 5109,
      "requests": 13,
      "kb": 119.2
     },
     "warm": {
      "ms": 5092,
      "requests": 15,
      "kb": 1.9
     }
    }
   ]
  },
  "crisp": {
   "widget": "Crisp",
   "where": "vendor page",
   "url": "https://crisp.chat/en/",
   "ready": "textarea[name=message]",
   "summary": {
    "coldMs": 2597,
    "warmMs": 90,
    "coldKB": 125.2,
    "warmKB": 0,
    "okRuns": 5
   },
   "runs": [
    {
     "at": "2026-09-27T03:01:04.699Z",
     "cold": {
      "ms": 2611,
      "requests": 4,
      "kb": 125.2
     },
     "warm": {
      "ms": 91,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:02:04.194Z",
     "cold": {
      "ms": 2584,
      "requests": 4,
      "kb": 125.2
     },
     "warm": {
      "ms": 90,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:03:03.528Z",
     "cold": {
      "ms": 2580,
      "requests": 4,
      "kb": 125.2
     },
     "warm": {
      "ms": 89,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:04:02.978Z",
     "cold": {
      "ms": 2606,
      "requests": 4,
      "kb": 125.2
     },
     "warm": {
      "ms": 115,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:05:02.421Z",
     "cold": {
      "ms": 2597,
      "requests": 4,
      "kb": 125.2
     },
     "warm": {
      "ms": 73,
      "requests": 0,
      "kb": 0
     }
    }
   ]
  },
  "intercom": {
   "widget": "Intercom",
   "where": "vendor page",
   "url": "https://www.intercom.com/",
   "ready": ".messenger-rte-content, button:has-text(\"Send us a message\")",
   "summary": {
    "coldMs": 1641,
    "warmMs": 1670,
    "coldKB": 150.8,
    "warmKB": 122.4,
    "okRuns": 5
   },
   "runs": [
    {
     "at": "2026-09-27T03:06:01.602Z",
     "cold": {
      "ms": 1639,
      "requests": 13,
      "kb": 60.9
     },
     "warm": {
      "ms": 1925,
      "requests": 16,
      "kb": 122.4
     }
    },
    {
     "at": "2026-09-27T03:06:56.710Z",
     "cold": {
      "ms": 1632,
      "requests": 12,
      "kb": 31
     },
     "warm": {
      "ms": 1639,
      "requests": 17,
      "kb": 122.6
     }
    },
    {
     "at": "2026-09-27T03:07:52.358Z",
     "cold": {
      "ms": 1868,
      "requests": 14,
      "kb": 151
     },
     "warm": {
      "ms": 1682,
      "requests": 15,
      "kb": 32.2
     }
    },
    {
     "at": "2026-09-27T03:08:44.425Z",
     "cold": {
      "ms": 1665,
      "requests": 14,
      "kb": 150.9
     },
     "warm": {
      "ms": 1670,
      "requests": 16,
      "kb": 122.4
     }
    },
    {
     "at": "2026-09-27T03:09:39.721Z",
     "cold": {
      "ms": 1641,
      "requests": 14,
      "kb": 150.8
     },
     "warm": {
      "ms": 1648,
      "requests": 16,
      "kb": 122.3
     }
    }
   ]
  },
  "tidio": {
   "widget": "Tidio",
   "where": "test page",
   "url": "http://localhost:5190/?w=tidio",
   "ready": "button:has-text(\"Chat with us\"), textarea",
   "summary": {
    "coldMs": 1078,
    "warmMs": 1078,
    "coldKB": 0,
    "warmKB": 0,
    "okRuns": 5
   },
   "runs": [
    {
     "at": "2026-09-27T03:10:37.926Z",
     "cold": {
      "ms": 1081,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 1086,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:11:28.680Z",
     "cold": {
      "ms": 1078,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 1082,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:12:19.344Z",
     "cold": {
      "ms": 1073,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 1072,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:13:09.875Z",
     "cold": {
      "ms": 1085,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 1078,
      "requests": 0,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:14:00.722Z",
     "cold": {
      "ms": 1075,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 1071,
      "requests": 0,
      "kb": 0
     }
    }
   ]
  },
  "livechat": {
   "widget": "LiveChat",
   "where": "vendor page",
   "url": "https://www.livechat.com/",
   "ready": "textarea[aria-label=\"Write a message…\"], input[aria-label=\"Write a message…\"]",
   "summary": {
    "coldMs": null,
    "warmMs": null,
    "coldKB": null,
    "warmKB": null,
    "okRuns": 0
   },
   "runs": [
    {
     "at": "2026-09-27T03:14:51.405Z",
     "cold": {
      "error": "already open after load"
     },
     "warm": {
      "error": "already open after load"
     }
    },
    {
     "at": "2026-09-27T03:15:04.147Z",
     "cold": {
      "error": "already open after load"
     },
     "warm": {
      "error": "already open after load"
     }
    },
    {
     "at": "2026-09-27T03:15:16.432Z",
     "cold": {
      "error": "already open after load"
     },
     "warm": {
      "error": "already open after load"
     }
    },
    {
     "at": "2026-09-27T03:15:28.838Z",
     "cold": {
      "error": "already open after load"
     },
     "warm": {
      "error": "already open after load"
     }
    },
    {
     "at": "2026-09-27T03:15:41.722Z",
     "cold": {
      "error": "already open after load"
     },
     "warm": {
      "error": "already open after load"
     }
    }
   ]
  },
  "chatwoot": {
   "widget": "Chatwoot",
   "where": "vendor page",
   "url": "https://www.chatwoot.com/hc/user-guide/en",
   "ready": "button:has-text(\"Start Conversation\"), textarea",
   "summary": {
    "coldMs": 650,
    "warmMs": 525,
    "coldKB": 0,
    "warmKB": 0,
    "okRuns": 5
   },
   "runs": [
    {
     "at": "2026-09-27T03:15:54.060Z",
     "cold": {
      "ms": 650,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 524,
      "requests": 1,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:16:35.700Z",
     "cold": {
      "ms": 650,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 534,
      "requests": 1,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:17:17.333Z",
     "cold": {
      "ms": 664,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 525,
      "requests": 1,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:17:59.013Z",
     "cold": {
      "ms": 650,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 523,
      "requests": 1,
      "kb": 0
     }
    },
    {
     "at": "2026-09-27T03:18:40.959Z",
     "cold": {
      "ms": 651,
      "requests": 0,
      "kb": 0
     },
     "warm": {
      "ms": 525,
      "requests": 1,
      "kb": 0
     }
    }
   ]
  }
 },
 "partialRerun": [
  {
   "at": "2026-09-27T07:53:52.463Z",
   "only": "spookat"
  },
  {
   "at": "2026-09-27T09:19:27.156Z",
   "only": "spookat"
  }
 ],
 "widgets": [
  {
   "id": "spookat",
   "loader": "*cdn.spookat.com/s/*",
   "boots": true,
   "launcher": "#spookat button.L",
   "ready": "#spookat form.c input",
   "root": "#spookat",
   "name": "Spookat",
   "snippet": "<script src=\"https://cdn.spookat.com/s/site_live_0000000000000000.js\" data-api=\"{API}\" async></script>",
   "widgetUrls": "^cdn\\.spookat\\.com\\/"
  },
  {
   "id": "tawk-to",
   "loader": "*embed.tawk.to/*",
   "home": "https://www.tawk.to/",
   "boots": true,
   "launcher": "button.tawk-button-circle.tawk-button-large",
   "ready": "textarea.tawk-chatinput-editor",
   "root": "div.widget-visible, iframe[title=\"Chat widget\"]",
   "name": "Tawk.to",
   "snippet": "<script type=\"text/javascript\">\nvar Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();\n(function(){\nvar s1=document.createElement(\"script\"),s0=document.getElementsByTagName(\"script\")[0];\ns1.async=true;\ns1.src='https://embed.tawk.to/521727297ca1334016000005/18nms7gql';\ns1.charset='UTF-8';\ns1.setAttribute('crossorigin','*');\ns0.parentNode.insertBefore(s1,s0);\n})();\n</script>",
   "widgetUrls": "^(?!www\\.)[\\w-]+\\.tawk\\.to\\/"
  },
  {
   "id": "crisp",
   "loader": "*client.crisp.chat/l.js*",
   "home": "https://crisp.chat/en/",
   "boots": false,
   "launcher": "[aria-label=\"Open chat\"]",
   "ready": "textarea[name=message]",
   "root": "#crisp-chatbox, .crisp-client",
   "name": "Crisp",
   "snippet": "<script type=\"text/javascript\">window.$crisp=[];window.CRISP_WEBSITE_ID=\"-JzqEmX56venQuQw4YV8\";(function(){d=document;s=d.createElement(\"script\");s.src=\"https://client.crisp.chat/l.js\";s.async=1;d.getElementsByTagName(\"head\")[0].appendChild(s);})();</script>",
   "widgetUrls": "^(client|settings|image)\\.crisp\\.chat\\/|\\.relay(\\.rescue)?\\.crisp\\.chat\\/"
  },
  {
   "id": "intercom",
   "loader": "*widget.intercom.io/widget/*",
   "home": "https://www.intercom.com/",
   "boots": false,
   "launcher": ".intercom-launcher",
   "ready": ".messenger-rte-content, button:has-text(\"Send us a message\")",
   "root": ".intercom-lightweight-app, #intercom-container, iframe[name^=intercom]",
   "name": "Intercom",
   "snippet": "<script>\n  window.intercomSettings = {\n    api_base: \"https://api-iam.intercom.io\",\n    app_id: \"tx2p130c\",\n  };\n</script>\n<script>\n(function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/tx2p130c';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();\n</script>",
   "widgetUrls": "^([\\w-]+\\.)?intercom\\.io\\/|^js\\.intercomcdn\\.com\\/"
  },
  {
   "id": "tidio",
   "loader": "*code.tidio.co/*",
   "home": "https://www.tidio.com/",
   "boots": true,
   "launcher": "#button-body",
   "ready": "button:has-text(\"Chat with us\"), textarea",
   "close": "button[aria-label=Minimize]",
   "root": "#tidio-chat",
   "name": "Tidio",
   "snippet": "<script src=\"//code.tidio.co/w0i4b7fdeerfqqn4w8lwb7ahjasjnrmd.js\" async></script>\n<script>\n(function show(n) {\n  if (window.tidioChatApi) window.tidioChatApi.show();\n  if (!document.getElementById(\"tidio-chat-iframe\") && n < 120) setTimeout(show, 250, n + 1);\n})(0);\n</script>",
   "widgetUrls": "\\.tidio\\.co\\/"
  },
  {
   "id": "livechat",
   "loader": "*cdn.livechatinc.com/tracking.js*",
   "home": "https://www.livechat.com/",
   "boots": false,
   "launcher": "#chat-widget-minimized",
   "ready": "textarea[aria-label=\"Write a message…\"], input[aria-label=\"Write a message…\"]",
   "root": "#chat-widget-container",
   "name": "LiveChat",
   "snippet": "<script>\nwindow.__lc = window.__lc || {};\nwindow.__lc.license = 19196658;\n;(function(n,t,c){function i(n){return e._h?e._h.apply(null,n):e._q.push(n)}var e={_q:[],_h:null,_v:\"2.0\",on:function(){i([\"on\",c.call(arguments)])},once:function(){i([\"once\",c.call(arguments)])},off:function(){i([\"off\",c.call(arguments)])},get:function(){if(!e._h)throw new Error(\"[LiveChatWidget] You can't use getters before load.\");return i([\"get\",c.call(arguments)])},call:function(){i([\"call\",c.call(arguments)])},init:function(){var n=t.createElement(\"script\");n.async=!0,n.type=\"text/javascript\",n.src=\"https://cdn.livechatinc.com/tracking.js\",t.head.appendChild(n)}};!n.__lc.asyncInit&&e.init(),n.LiveChatWidget=n.LiveChatWidget||e}(window,document,[].slice))\n</script>",
   "widgetUrls": "\\.livechatinc\\.com\\/(?!partners\\/)"
  },
  {
   "id": "chatwoot",
   "loader": "*app.chatwoot.com/packs/js/sdk.js*",
   "home": "https://www.chatwoot.com/hc/user-guide/en",
   "boots": false,
   "launcher": "button.woot-widget-bubble",
   "ready": "button:has-text(\"Start Conversation\"), textarea",
   "root": ".woot-widget-holder, .woot--bubble-holder, button.woot-widget-bubble",
   "name": "Chatwoot",
   "snippet": "<script>\n  (function(d,t) {\n    var BASE_URL=\"https://app.chatwoot.com\";\n    var g=d.createElement(t),s=d.getElementsByTagName(t)[0];\n    g.src=BASE_URL+\"/packs/js/sdk.js\";\n    g.defer = true;\n    g.async = true;\n    s.parentNode.insertBefore(g,s);\n    g.onload=function(){\n      window.chatwootSDK.run({\n        websiteToken: '4cWzuf9i9jxN9tbnv8K9STKU',\n        baseUrl: BASE_URL\n      })\n    }\n  })(document,\"script\");\n</script>",
   "widgetUrls": "^app\\.chatwoot\\.com\\/(packs|widget|api\\/v1\\/widget|cable|hc\\/[^/]+\\/[^/]+\\/articles\\.json)",
   "widgetFrame": "^https:\\/\\/app\\.chatwoot\\.com\\/widget"
  }
 ]
}
