1<!DOCTYPE html> 2<html lang="en-US" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>Getting started | Piwi Dashboard</title> 7 8 <meta name="generator" content="VitePress v1.6.4"> 9 <link rel="preload stylesheet" href="/assets/style.D5sjg5vO.css" as="style"> 10 <link rel="preload stylesheet" href="/vp-icons.css" as="style"> 11 12
12<script type="module" src="/assets/app.C1giG8wF.js"></script>
12 13 <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin=""> 14 <link rel="modulepreload" href="/assets/chunks/theme.C-yqJg84.js"> 15 <link rel="modulepreload" href="/assets/chunks/framework.sV-XtlWr.js"> 16 <link rel="modulepreload" href="/assets/guide_getting-started.md.F4E5sOtZ.lean.js"> 17 <link rel="icon" href="/favicon.ico" sizes="16x16 32x32 48x48"> 18 <link rel="icon" type="image/svg+xml" href="/logo.svg"> 19 <link rel="apple-touch-icon" href="/apple-touch-icon.png"> 20 <meta property="og:type" content="website"> 21 <meta property="og:site_name" content="Piwi Dashboard"> 22 <meta property="og:image" content="https://piwitests.dev/og-image.png"> 23 <meta property="og:image:width" content="1200"> 24 <meta property="og:image:height" content="630"> 25 <meta name="twitter:card" content="summary_large_image"> 26
26<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
26 27
27<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
27 28 <link rel="canonical" href="https://piwitests.dev/guide/getting-started.html"> 29 <meta property="og:url" content="https://piwitests.dev/guide/getting-started.html"> 30 <meta property="og:title" content="Getting started | Piwi Dashboard"> 31 <meta property="og:description" content="Piwi Dashboard is a self-hosted server plus a Playwright reporter that keeps every test run. Run the dashboard, connect your suite with one command, and open your first run in three steps."> 32 <meta name="description" content="Piwi Dashboard is a self-hosted server plus a Playwright reporter that keeps every test run. Run the dashboard, connect your suite with one command, and open your first run in three steps."> 33 </head> 34 <body> 35 <div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!----><span data-v-9f43907a>Piwi Dashboard</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/guide/getting-started.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Guide</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/features/ui-overview.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Features</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/operate/deployment.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Self-hosting</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/reference/features.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Reference</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/blog/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Blog</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://piwitests.dev/demo/" target="_blank" rel="noreferrer" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Demo</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/PiwiTests/platform" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a>
35<!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/PiwiTests/platform" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 has-active" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Get started</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/getting-started.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Getting started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/first-failure.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Your first failure, explained</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/concepts.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Core concepts</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Set up</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/reporter.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Reporter</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/capture-fixtures.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Capture fixtures</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/ci.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>CI & sharding</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/source-control.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Source control</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/ai-provider.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>AI provider</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/backend-logs.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Backend instrumentation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/importing-runs.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Import past runs</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>About Piwi</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/what-piwi-does.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>What Piwi does</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/comparison.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Why Piwi?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/privacy.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Privacy & data flow</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/guide/license.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>License</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>On this page</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _guide_getting-started external-link-icon-enabled" data-v-e6f2a212><div>
35<h1 id="getting-started" tabindex="-1">Getting started <a class="header-anchor" href="#getting-started" aria-label="Permalink to "Getting started"">â</a></h1><p>Piwi is a <strong>server plus a Playwright reporter</strong>. The reporter runs inside <code>npx playwright test</code> and sends the results to the server, which keeps every run with its traces and renders the dashboard. Three steps set up both. New to the vocabulary (<em>run</em>, <em>test case</em>, <em>execution</em>, <em>cluster</em>)? <a href="./concepts.html">Core concepts</a> defines each term the dashboard uses.</p><h2 id="_1-run-the-dashboard" tabindex="-1">1. Run the dashboard <a class="header-anchor" href="#_1-run-the-dashboard" aria-label="Permalink to "1. Run the dashboard"">â</a></h2><p>The dashboard is one Node process. Pick the way to run it that fits:</p><table tabindex="0"><thead><tr><th>Path</th><th>Best for</th><th>Needs</th></tr></thead><tbody><tr><td><a href="/features/desktop.html">Desktop app</a></td><td>One developer running Playwright locally</td><td>Nothing; the runtime is bundled. Windows x64, Apple-silicon macOS and Linux x86-64; the installers are not signed yet</td></tr><tr><td>Docker <em>(below)</em></td><td>A shared instance for a team, or anything long-lived</td><td>Docker; about 300 MB RAM, 1 vCPU, <code>linux/amd64</code> or <code>linux/arm64</code></td></tr><tr><td><a href="/operate/deployment.html#npm-npx-quick-local-run"><code>npx @piwitests/server</code></a></td><td>A quick local run</td><td>Node.js 22 or later</td></tr><tr><td><a href="/operate/deployment.html#one-click-deploy">One-click deploy</a></td><td>A shared instance with no server of your own</td><td>An account on the host</td></tr></tbody></table><p>With Docker:</p><div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-ahbLd" id="tab-XoUkRDy" checked><label data-title="Linux / macOS" for="tab-XoUkRDy">Linux / macOS</label><input type="radio" name="group-ahbLd" id="tab-FaqwAae"><label data-title="Windows (PowerShell)" for="tab-FaqwAae">Windows (PowerShell)</label></div><div class="blocks"><div class="language-sh vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> phenx/piwitests-server:latest</span></span> 36<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .data</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> && </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> chown</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -R</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 1001:1001</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .data</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # the container runs as non-root UID 1001</span></span> 37<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 3000:3000</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -v</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">pwd</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/.data:/app/.data</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> phenx/piwitests-server:latest</span></span></code></pre></div><div class="language-ps1 vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ps1</span>
37<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">docker pull phenx</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">piwitests</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">server:latest</span></span> 38<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">docker run </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">p </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">v ${PWD}</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.data:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">app</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.data phenx</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">piwitests</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">server:latest</span></span></code></pre></div></div></div><p>The dashboard answers at <code>http://localhost:3000</code>. On Linux hosts the container runs as the non-root UID 1001, which is why the snippet creates <code>.data</code> with the right owner; see <a href="/operate/deployment.html#permission-issues-with-volumes">Permission issues with volumes</a> if the container cannot write to it. <a href="/operate/deployment.html">Deployment</a> covers Docker Compose, PostgreSQL and Kubernetes.</p><p>With the desktop app, keep it running: a reporter with no server configured finds it by itself. Its URL and access token, for when you need them, are on its <strong>Setup</strong> page under <strong>Send results to this app</strong>.</p><p>Your test project is unaffected by these requirements: Node 22 is the dashboard's requirement, not your suite's. Want to look around first? The <a href="https://piwitests.dev/demo/" target="_blank" rel="noreferrer">live demo</a> runs in your browser on seeded data.</p><h2 id="_2-connect-your-suite" tabindex="-1">2. Connect your suite <a class="header-anchor" href="#_2-connect-your-suite" aria-label="Permalink to "2. Connect your suite"">â</a></h2><h3 id="fast-path-one-command" tabindex="-1">Fast path: one command <a class="header-anchor" href="#fast-path-one-command" aria-label="Permalink to "Fast path: one command"">â</a></h3><p>From your Playwright project, one command installs the reporter, wraps your <code>playwright.config</code>, creates the <a href="./capture-fixtures.html">capture fixtures</a> file and records the connection in <code>.env.example</code>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @piwitests/reporter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> init</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --server-url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> http://localhost:3000</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --project</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-project</span></span></code></pre></div><p>Every step is idempotent, so it is safe to re-run. When <code>init</code> finds a config shape it will not rewrite, or a fixtures file that already exists, it reports that step as <code>manual</code> with the exact change to make instead of touching the file. Pass <code>--dry-run</code> to preview, or <code>--json</code> for a machine-readable plan that a coding agent can follow to finish the manual steps. <code>init</code> also adds the <a href="/features/agent-skills.html">Piwi agent skills</a> to the project. See <code>npx @piwitests/reporter init --help</code>
38 for all options.</p><blockquote><p>The package is <code>@piwitests/reporter</code> and its command is <code>piwi</code>. Invoke it through the package name, <code>npx @piwitests/reporter <command></code>, so npx resolves this package: <code>npx piwi</code> would fetch an unrelated <code>piwi</code> package from npm. Once the reporter is a dependency of your project, <code>npx piwi <command></code> works too.</p></blockquote><p>If authentication is on, pass an <a href="/operate/api-keys.html">API key</a> as <code>PIWI_API_KEY</code>. To wire the reporter in by hand, or to send one run without editing your config, see <a href="./reporter.html">Reporter</a>.</p><h2 id="_3-run-your-tests" tabindex="-1">3. Run your tests <a class="header-anchor" href="#_3-run-your-tests" aria-label="Permalink to "3. Run your tests"">â</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> playwright</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test</span></span></code></pre></div><p>The run streams into the dashboard while it executes, and the reporter prints a <code>View run:</code> link at the end. Open it.</p><p>In CI nothing Piwi-specific is needed: the same reporter runs inside <code>npx playwright test</code>, pointed at your instance with <code>PIWI_DASHBOARD_URL</code> and <code>PIWI_API_KEY</code>. <a href="./ci.html">CI & sharding</a> has the pipeline examples.</p><h2 id="your-first-failure" tabindex="-1">Your first failure <a class="header-anchor" href="#your-first-failure" aria-label="Permalink to "Your first failure"">â</a></h2><p>When a test fails, its execution page opens on what happened, the most likely cause and the next step, with the trace, screenshots and logs underneath. <a href="./first-failure.html">Your first failure, explained</a> walks through one failing test from its headline to its evidence.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to "Related"">â</a></h2><ul><li><a href="./concepts.html">Core concepts</a>: the vocabulary the dashboard and these docs use</li><li><a href="./reporter.html">Reporter</a>: manual setup, options, streaming and authentication</li><li><a href="./capture-fixtures.html">Capture fixtures</a>: what the fixtures file adds</li><li><a href="/operate/capabilities.html">Choose what you use</a>: turn off the capabilities you do not need</li><li><a href="/operate/deployment.html">Deployment</a>: running the dashboard for a team</li></ul></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><div class="edit-info" data-v-1bcd8184><div class="edit-link" data-v-1bcd8184><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/PiwiTests/platform/edit/main/apps/docs/guide/getting-started.md" target="_blank" rel="noreferrer" data-v-1bcd8184><!--[--><span class="vpi-square-pen edit-link-icon" data-v-1bcd8184></span> Edit this page on GitHub<!--]--></a></div><div class="last-updated" data-v-1bcd8184><p class="VPLastUpdated" data-v-1bcd8184 data-v-1bb0c8a8>Updated at: <time datetime="2026-10-09T10:30:31.000Z" data-v-1bb0c8a8></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><!----></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/guide/first-failure.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Next page</span><span class="title" data-v-1bcd8184>Your first failure, explained</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>Fair source, released under the <a href="/guide/license">FSL-1.1-MIT license</a>; the reporter and integrations are MIT. Zero telemetry â Piwi never phones home.<br>Piwi Dashboard is not affiliated with, endorsed by, or connected to Microsoft Corporation. Playwright is a trademark of Microsoft.</p><p class="copyright" data-v-566314d4>Copyright © 2025-present Fabien Ménager</p></div></footer><!--[--><!--]--></div></div> 39
39<script>window.__VP_HASH_MAP__=JSON.parse("{\"blog_how-piwi-was-built.md\":\"DzHBC-Ab\",\"blog_index.md\":\"4kAr08rM\",\"features_agent-skills.md\":\"DDrjfZtw\",\"features_ai-diagnosis.md\":\"CIJRmfms\",\"features_ai-steps.md\":\"C3JtCY6h\",\"features_analytics.md\":\"B-oUbZXa\",\"features_auto-heal.md\":\"C5x_tTkL\",\"features_branches.md\":\"BPI8SOsi\",\"features_bug-reports.md\":\"zEHusHD8\",\"features_code-reach.md\":\"DBS43Flc\",\"features_cpu-memory-disk.md\":\"BUIvPOb1\",\"features_dashboards.md\":\"D-QqF7p-\",\"features_desktop.md\":\"B9lwzqxA\",\"features_devtools.md\":\"vleMFIzX\",\"features_editor-breakpoints.md\":\"SiuqJAET\",\"features_editor-connection.md\":\"BgEHB_bE\",\"features_editor-recording.md\":\"CdICpGzL\",\"features_editor-runs.md\":\"CXSMywHO\",\"features_editors.md\":\"CjtU5IbI\",\"features_environment-incidents.md\":\"DIZzzzQQ\",\"features_evidence.md\":\"BrNhGROz\",\"features_extension-connection.md\":\"D4mUHs_B\",\"features_extension.md\":\"BJPZxA0i\",\"features_failure-clusters.md\":\"C1CmRmBU\",\"features_fix-plans.md\":\"DCJKfjwg\",\"features_flake-lab.md\":\"BpVeBXwW\",\"features_flaky-tests.md\":\"CsqcWFzO\",\"features_ide-integration.md\":\"BKEek9iL\",\"features_issue-automation.md\":\"DGeHCnPe\",\"features_issue-tracking.md\":\"BcYnZY36\",\"features_locator-healing.md\":\"B1Rl4cR1\",\"features_locator-usage.md\":\"CPyFa3Ea\",\"features_mcp.md\":\"XXLjZ5lF\",\"features_notifications.md\":\"yI1bRK3V\",\"features_offline-export.md\":\"T7XWY--l\",\"features_pr-feedback.md\":\"BxangJaW\",\"features_preflight.md\":\"fwgz2YYB\",\"features_probes.md\":\"B6ovzo1M\",\"features_quality-reports.md\":\"BznH1VQy\",\"features_replay-a-bug-report.md\":\"Ib7yqAer\",\"features_report-a-bug.md\":\"CZaMqYjz\",\"features_resource-leaks.md\":\"kmtGPHzv\",\"features_run-changes.md\":\"DQLrk-s_\",\"features_scenario-gaps.md\":\"C8FzoEbG\",\"features_share-links.md\":\"D7I6Jw6k\",\"features_slow-tests.md\":\"CH1n5q6V\",\"features_test-functions.md\":\"C5xlsPbY\",\"features_test-selection.md\":\"DlyNxZf1\",\"features_tested-elements.md\":\"DMrnUdI0\",\"features_timeline-markers.md\":\"Bmi3GLrI\",\"features_ui-overview.md\":\"Bqqv-z6E\",\"features_uncovered-changes.md\":\"C7t0--ig\",\"guide_ai-provider.md\":\"C-1ES3EY\",\"guide_backend-logs.md\":\"BqeiFzgI\",\"guide_capture-fixtures.md\":\"DDR4ThMP\",\"guide_ci.md\":\"BJnlOj9s\",\"guide_comparison.md\":\"CRs9tobf\",\"guide_concepts.md\":\"DML1_L21\",\"guide_first-failure.md\":\"vvyzP_HI\",\"guide_getting-started.md\":\"F4E5sOtZ\",\"guide_importing-runs.md\":\"WqME3kL6\",\"guide_license.md\":\"Dqvqnrxn\",\"guide_privacy.md\":\"C1i7Ivwl\",\"guide_reporter.md\":\"QWEnuQnV\",\"guide_source-control.md\":\"DYxvog2k\",\"guide_what-piwi-does.md\":\"7z_bxUsS\",\"index.md\":\"D7MeQnK3\",\"operate_api-keys.md\":\"BqfpB_pO\",\"operate_authentication.md\":\"gY_-1hwp\",\"operate_backup-restore.md\":\"DqAvF4sH\",\"operate_capabilities.md\":\"R2WZTLdz\",\"operate_database.md\":\"3J5EG-vO\",\"operate_deployment.md\":\"xBvVJeTU\",\"operate_integrations.md\":\"Da9YdCkG\",\"operate_localization.md\":\"CA1IN2aa\",\"operate_metrics.md\":\"Cn5n2D-f\",\"operate_one-click-deploy.md\":\"BpsVzvCJ\",\"operate_production-checklist.md\":\"BB6hHEKu\",\"operate_project-access.md\":\"COpHUSZu\",\"operate_storage.md\":\"DBjsnKDR\",\"operate_tracing.md\":\"BmEMu0Z2\",\"operate_upgrading.md\":\"uvzHdhwJ\",\"recipes_broken-locator.md\":\"DpQNVS6U\",\"recipes_faster-suite.md\":\"BvQOTV-X\",\"recipes_flaky-cleanup.md\":\"B_qIQ6xX\",\"recipes_mass-failure.md\":\"Dg6zWYA9\",\"recipes_regression-or-flaky.md\":\"BOg6Pf3y\",\"reference_analytics-widgets.md\":\"_FHf0Xid\",\"reference_bug-report-file.md\":\"ByfYUBuH\",\"reference_cli.md\":\"BEgv93RN\",\"reference_clues.md\":\"DIX5wpAZ\",\"reference_configuration.md\":\"CcNV5mRB\",\"reference_configuration_generator.md\":\"DDZJ1aTs\",\"reference_features.md\":\"CfQzSHO0\",\"reference_gap-detectors.md\":\"BBTMyXqC\",\"reference_keyboard-shortcuts.md\":\"CWjvLoA6\",\"reference_locator-stability.md\":\"BVnqZype\",\"reference_mcp-tools.md\":\"B9Zi_RIY\",\"reference_metrics.md\":\"DGOVfdm_\",\"reference_notification-events.md\":\"Cf7EtStn\",\"reference_reporter-options.md\":\"B7eokTlh\",\"reference_steps-format.md\":\"CbgN9a21\",\"reference_test-metadata.md\":\"CYv1Gxap\",\"reference_test-search.md\":\"DlatqbDA\",\"reference_whats-new.md\":\"C5eERRde\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Piwi Dashboard\",\"description\":\"CI throws away every report it makes. Piwi keeps them â then groups the failures by root cause, scores the flaky tests, and finds the locator you should have used. Self-hosted, zero telemetry.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"outline\":\"deep\",\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Guide\",\"link\":\"/guide/getting-started\",\"activeMatch\":\"/guide/\"},{\"text\":\"Features\",\"link\":\"/features/ui-overview\",\"activeMatch\":\"/(features|recipes)/\"},{\"text\":\"Self-hosting\",\"link\":\"/operate/deployment\",\"activeMatch\":\"/operate/\"},{\"text\":\"Reference\",\"link\":\"/reference/features\",\"activeMatch\":\"/reference/\"},{\"text\":\"Blog\",\"link\":\"/blog/\"},{\"text\":\"Demo\",\"link\":\"https://piwitests.dev/demo/\"}],\"sidebar\":{\"/guide/\":[{\"text\":\"Get started\",\"items\":[{\"text\":\"Getting started\",\"link\":\"/guide/getting-started\"},{\"text\":\"Your first failure, explained\",\"link\":\"/guide/first-failure\"},{\"text\":\"Core concepts\",\"link\":\"/guide/concepts\"}]},{\"text\":\"Set up\",\"items\":[{\"text\":\"Reporter\",\"link\":\"/guide/reporter\"},{\"text\":\"Capture fixtures\",\"link\":\"/guide/capture-fixtures\"},{\"text\":\"CI & sharding\",\"link\":\"/guide/ci\"},{\"text\":\"Source control\",\"link\":\"/guide/source-control\"},{\"text\":\"AI provider\",\"link\":\"/guide/ai-provider\"},{\"text\":\"Backend instrumentation\",\"link\":\"/guide/backend-logs\"},{\"text\":\"Import past runs\",\"link\":\"/guide/importing-runs\"}]},{\"text\":\"About Piwi\",\"items\":[{\"text\":\"What Piwi does\",\"link\":\"/guide/what-piwi-does\"},{\"text\":\"Why Piwi?\",\"link\":\"/guide/comparison\"},{\"text\":\"Privacy & data flow\",\"link\":\"/guide/privacy\"},{\"text\":\"License\",\"link\":\"/guide/license\"}]}],\"/features/\":[{\"text\":\"Keep the history\",\"collapsed\":false,\"items\":[{\"text\":\"UI overview\",\"link\":\"/features/ui-overview\"},{\"text\":\"Branches\",\"link\":\"/features/branches\"},{\"text\":\"What changed in a run\",\"link\":\"/features/run-changes\"},{\"text\":\"Offline export\",\"link\":\"/features/offline-export\"},{\"text\":\"Share links\",\"link\":\"/features/share-links\"}]},{\"text\":\"Explain the failures\",\"collapsed\":false,\"items\":[{\"text\":\"Regression or flake?\",\"link\":\"/recipes/regression-or-flaky\"}
39,{\"text\":\"Triage a run gone red\",\"link\":\"/recipes/mass-failure\"},{\"text\":\"Cut costly flakiness\",\"link\":\"/recipes/flaky-cleanup\"},{\"text\":\"Cut the time it costs\",\"link\":\"/recipes/faster-suite\"},{\"text\":\"Failure evidence\",\"link\":\"/features/evidence\"},{\"text\":\"Failure clusters & the inbox\",\"link\":\"/features/failure-clusters\"},{\"text\":\"Environment incidents\",\"link\":\"/features/environment-incidents\"},{\"text\":\"Flaky tests & quarantine\",\"link\":\"/features/flaky-tests\"},{\"text\":\"Flake Lab\",\"link\":\"/features/flake-lab\"},{\"text\":\"Slow tests & wasted time\",\"link\":\"/features/slow-tests\"},{\"text\":\"Resource leaks\",\"link\":\"/features/resource-leaks\"},{\"text\":\"CPU, memory & disk\",\"link\":\"/features/cpu-memory-disk\"},{\"text\":\"AI diagnosis\",\"link\":\"/features/ai-diagnosis\"}]},{\"text\":\"Hand back a fix\",\"collapsed\":false,\"items\":[{\"text\":\"Fix a broken locator\",\"link\":\"/recipes/broken-locator\"},{\"text\":\"Locator healing\",\"link\":\"/features/locator-healing\"},{\"text\":\"Who uses a locator\",\"link\":\"/features/locator-usage\"},{\"text\":\"Locator preflight\",\"link\":\"/features/preflight\"},{\"text\":\"Fix plans, reproduce & bisect\",\"link\":\"/features/fix-plans\"},{\"text\":\"Auto-heal PRs\",\"link\":\"/features/auto-heal\"},{\"text\":\"Issue tracking (Jira)\",\"link\":\"/features/issue-tracking\"},{\"text\":\"Issue automation\",\"link\":\"/features/issue-automation\"},{\"text\":\"Pull-request feedback & re-run\",\"link\":\"/features/pr-feedback\"},{\"text\":\"Test selections\",\"link\":\"/features/test-selection\"},{\"text\":\"AI steps\",\"link\":\"/features/ai-steps\"}]},{\"text\":\"Find what your tests miss\",\"collapsed\":false,\"items\":[{\"text\":\"Scenario gaps & the Test Map\",\"link\":\"/features/scenario-gaps\"},{\"text\":\"Uncovered changes in pull requests\",\"link\":\"/features/uncovered-changes\"},{\"text\":\"Code reach\",\"link\":\"/features/code-reach\"},{\"text\":\"Probes\",\"link\":\"/features/probes\"}]},{\"text\":\"Trends and reports\",\"collapsed\":false,\"items\":[{\"text\":\"Analytics\",\"link\":\"/features/analytics\"},{\"text\":\"Dashboards\",\"link\":\"/features/dashboards\"},{\"text\":\"Quality reports\",\"link\":\"/features/quality-reports\"},{\"text\":\"Timeline markers\",\"link\":\"/features/timeline-markers\"},{\"text\":\"Notifications & alerts\",\"link\":\"/features/notifications\"}]},{\"text\":\"Use it from elsewhere\",\"collapsed\":false,\"items\":[{\"text\":\"MCP server\",\"link\":\"/features/mcp\"},{\"text\":\"Agent skills\",\"link\":\"/features/agent-skills\"},{\"text\":\"Desktop app\",\"link\":\"/features/desktop\"},{\"text\":\"Browser extension\",\"link\":\"/features/extension\"},{\"text\":\"Extension connection\",\"link\":\"/features/extension-connection\"},{\"text\":\"Tested elements\",\"link\":\"/features/tested-elements\"},{\"text\":\"Report a bug\",\"link\":\"/features/report-a-bug\"},{\"text\":\"Replay a bug report\",\"link\":\"/features/replay-a-bug-report\"},{\"text\":\"Bug reports\",\"link\":\"/features/bug-reports\"},{\"text\":\"Developer tools\",\"link\":\"/features/devtools\"},{\"text\":\"Test functions catalog\",\"link\":\"/features/test-functions\"},{\"text\":\"Open in IDE\",\"link\":\"/features/ide-integration\"},{\"text\":\"Editor extensions\",\"link\":\"/features/editors\"},{\"text\":\"Runs from the editor\",\"link\":\"/features/editor-runs\"},{\"text\":\"Breakpoints in the browser\",\"link\":\"/features/editor-breakpoints\"},{\"text\":\"Record tests from the editor\",\"link\":\"/features/editor-recording\"},{\"text\":\"Editor connection\",\"link\":\"/features/editor-connection\"}]}],\"/recipes/\":[{\"text\":\"Keep the history\",\"collapsed\":false,\"items\":[{\"text\":\"UI overview\",\"link\":\"/features/ui-overview\"},{\"text\":\"Branches\",\"link\":\"/features/branches\"},{\"text\":\"What changed in a run\",\"link\":\"/features/run-changes\"},{\"text\":\"Offline export\",\"link\":\"/features/offline-export\"},{\"text\":\"Share links\",\"link\":\"/features/share-links\"}]},{\"text\":\"Explain the failures\",\"collapsed\":false,\"items\":[{\"text\":\"Regression or flake?\",\"link\":\"/recipes/regression-or-flaky\"}
39,{\"text\":\"Triage a run gone red\",\"link\":\"/recipes/mass-failure\"},{\"text\":\"Cut costly flakiness\",\"link\":\"/recipes/flaky-cleanup\"},{\"text\":\"Cut the time it costs\",\"link\":\"/recipes/faster-suite\"},{\"text\":\"Failure evidence\",\"link\":\"/features/evidence\"},{\"text\":\"Failure clusters & the inbox\",\"link\":\"/features/failure-clusters\"},{\"text\":\"Environment incidents\",\"link\":\"/features/environment-incidents\"},{\"text\":\"Flaky tests & quarantine\",\"link\":\"/features/flaky-tests\"},{\"text\":\"Flake Lab\",\"link\":\"/features/flake-lab\"},{\"text\":\"Slow tests & wasted time\",\"link\":\"/features/slow-tests\"},{\"text\":\"Resource leaks\",\"link\":\"/features/resource-leaks\"},{\"text\":\"CPU, memory & disk\",\"link\":\"/features/cpu-memory-disk\"},{\"text\":\"AI diagnosis\",\"link\":\"/features/ai-diagnosis\"}]},{\"text\":\"Hand back a fix\",\"collapsed\":false,\"items\":[{\"text\":\"Fix a broken locator\",\"link\":\"/recipes/broken-locator\"},{\"text\":\"Locator healing\",\"link\":\"/features/locator-healing\"},{\"text\":\"Who uses a locator\",\"link\":\"/features/locator-usage\"},{\"text\":\"Locator preflight\",\"link\":\"/features/preflight\"},{\"text\":\"Fix plans, reproduce & bisect\",\"link\":\"/features/fix-plans\"},{\"text\":\"Auto-heal PRs\",\"link\":\"/features/auto-heal\"},{\"text\":\"Issue tracking (Jira)\",\"link\":\"/features/issue-tracking\"},{\"text\":\"Issue automation\",\"link\":\"/features/issue-automation\"},{\"text\":\"Pull-request feedback & re-run\",\"link\":\"/features/pr-feedback\"},{\"text\":\"Test selections\",\"link\":\"/features/test-selection\"},{\"text\":\"AI steps\",\"link\":\"/features/ai-steps\"}]},{\"text\":\"Find what your tests miss\",\"collapsed\":false,\"items\":[{\"text\":\"Scenario gaps & the Test Map\",\"link\":\"/features/scenario-gaps\"},{\"text\":\"Uncovered changes in pull requests\",\"link\":\"/features/uncovered-changes\"},{\"text\":\"Code reach\",\"link\":\"/features/code-reach\"},{\"text\":\"Probes\",\"link\":\"/features/probes\"}]},{\"text\":\"Trends and reports\",\"collapsed\":false,\"items\":[{\"text\":\"Analytics\",\"link\":\"/features/analytics\"},{\"text\":\"Dashboards\",\"link\":\"/features/dashboards\"},{\"text\":\"Quality reports\",\"link\":\"/features/quality-reports\"},{\"text\":\"Timeline markers\",\"link\":\"/features/timeline-markers\"},{\"text\":\"Notifications & alerts\",\"link\":\"/features/notifications\"}]},{\"text\":\"Use it from elsewhere\",\"collapsed\":false,\"items\":[{\"text\":\"MCP server\",\"link\":\"/features/mcp\"},{\"text\":\"Agent skills\",\"link\":\"/features/agent-skills\"},{\"text\":\"Desktop app\",\"link\":\"/features/desktop\"},{\"text\":\"Browser extension\",\"link\":\"/features/extension\"},{\"text\":\"Extension connection\",\"link\":\"/features/extension-connection\"},{\"text\":\"Tested elements\",\"link\":\"/features/tested-elements\"},{\"text\":\"Report a bug\",\"link\":\"/features/report-a-bug\"},{\"text\":\"Replay a bug report\",\"link\":\"/features/replay-a-bug-report\"},{\"text\":\"Bug reports\",\"link\":\"/features/bug-reports\"},{\"text\":\"Developer tools\",\"link\":\"/features/devtools\"},{\"text\":\"Test functions catalog\",\"link\":\"/features/test-functions\"},{\"text\":\"Open in IDE\",\"link\":\"/features/ide-integration\"},{\"text\":\"Editor extensions\",\"link\":\"/features/editors\"},{\"text\":\"Runs from the editor\",\"link\":\"/features/editor-runs\"},{\"text\":\"Breakpoints in the browser\",\"link\":\"/features/editor-breakpoints\"},{\"text\":\"Record tests from the editor\",\"link\":\"/features/editor-recording\"},{\"text\":\"Editor connection\",\"link\":\"/features/editor-connection\"}]}],\"/operate/\":[{\"text\":\"Install\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/operate/deployment\"},{\"text\":\"One-click deploy\",\"link\":\"/operate/one-click-deploy\"},{\"text\":\"Production checklist\",\"link\":\"/operate/production-checklist\"}]},{\"text\":\"Configure\",\"items\":[{\"text\":\"Authentication\",\"link\":\"/operate/authentication\"},{\"text\":\"Access, roles and groups\",\"link\":\"/operate/project-access\"},{\"text\":\"API keys\",\"link\":\"/operate/api-keys\"},{\"text\":\"Localization\",\"link\":\"/operate/localization\"},{\"text\":\"Choose what you use\",\"link\":\"/operate/capabilities\"},{\"text\":\"Integrations\",\"link\":\"/operate/integrations\"},{\"text\":\"Configuration reference\",\"link\":\"/reference/configuration\"},{\"text\":\"Configuration generator\",\"link\":\"/reference/configuration/generator\"}]},{\"text\":\"Data\",\"items\":[{\"text\":\"Database\",\"link\":\"/operate/database\"},{\"text\":\"Storage & retention\",\"link\":\"/operate/storage\"},{\"text\":\"Backup & restore\",\"link\":\"/operate/backup-restore\"},{\"text\":\"Metrics and rollup export\",\"link\":\"/operate/metrics\"},{\"text\":\"Tracing with OpenTelemetry\",\"link\":\"/operate/tracing\"}]},{\"text\":\"Upgrade\",\"items\":[{\"text\":\"Upgrading\",\"link\":\"/operate/upgrading\"}]}],\"/reference/\":[{\"text\":\"Reference\",\"items\":[{\"text\":\"All features\",\"link\":\"/reference/features\"},{\"text\":\"What's new\",\"link\":\"/reference/whats-new\"},{\"text\":\"Configuration reference\",\"link\":\"/reference/configuration\"},{\"text\":\"Configuration generator\",\"link\":\"/reference/configuration/generator\"},{\"text\":\"Reporter options\",\"link\":\"/reference/reporter-options\"},{\"text\":\"Test metadata\",\"link\":\"/reference/test-metadata\"},{\"text\":\"Test search\",\"link\":\"/reference/test-search\"},{\"text\":\"Clue rules\",\"link\":\"/reference/clues\"},{\"text\":\"Locator stability rules\",\"link\":\"/reference/locator-stability\"},{\"text\":\"Piwi CLI\",\"link\":\"/reference/cli\"},{\"text\":\"Steps file format\",\"link\":\"/reference/steps-format\"},{\"text\":\"Bug report file format\",\"link\":\"/reference/bug-report-file\"},{\"text\":\"MCP tools\",\"link\":\"/reference/mcp-tools\"},{\"text\":\"Analytics widgets\",\"link\":\"/reference/analytics-widgets\"},{\"text\":\"Metrics\",\"link\":\"/reference/metrics\"},{\"text\":\"Gap detectors & exposure\",\"link\":\"/reference/gap-detectors\"},{\"text\":\"Notification events & webhooks\",\"link\":\"/reference/notification-events\"},{\"text\":\"Keyboard shortcuts\",\"link\":\"/reference/keyboard-shortcuts\"},{\"text\":\"API docs (interactive)\",\"link\":\"https://piwitests.dev/demo/docs\"}]}]},\"editLink\":{\"pattern\":\"https://github.com/PiwiTests/platform/edit/main/apps/docs/:path\",\"text\":\"Edit this page on GitHub\"},\"lastUpdated\":{\"text\":\"Updated at\",\"formatOptions\":{\"dateStyle\":\"full\",\"timeStyle\":\"medium\"}},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/PiwiTests/platform\"}
39],\"externalLinkIcon\":true,\"footer\":{\"message\":\"Fair source, released under the <a href=\\\"/guide/license\\\">FSL-1.1-MIT license</a>; the reporter and integrations are MIT. Zero telemetry â Piwi never phones home.<br>Piwi Dashboard is not affiliated with, endorsed by, or connected to Microsoft Corporation. Playwright is a trademark of Microsoft.\",\"copyright\":\"Copyright © 2025-present Fabien Ménager\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
39 40 41
41<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"9dce12e79a28406fac574a6bd1e39f03","r":1,"spa":2}' crossorigin="anonymous"></script>
41 42</body> 43</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.