npx webqa-platform audit <url>Detectie en controles in één commando, met een JSON- en HTML-rapport.
De webauditlabs CLI draait Chromium op uw machine en schrijft gestructureerde bevindingen met screenshots. Geen account, geen API-sleutel. Dezelfde engine en hetzelfde resultaatformaat vormen de basis van webauditlabs Cloud.
$ npx webqa-platform audit http://localhost:5173Onbewerkte CLI-uitvoer van de Nordhaus-demowinkel (Nederlands, Engels, Duits) met vijf ingebouwde fouten. Gemaakt met website/scripts/capture-demo.mjs.
$ webqa run webqa.json --allow-private webqa issues found: 6 finding(s) on 6 page(s) warning http [all] /en/ 1 resource failed to load. warning clipping [all] /de/ The a "In den Warenkorb legen" does not fit; its text is cut off. warning overflow [mobile] /de/ 1 control sticks out of the viewport and is partly unreachable. error overflow [mobile] /de/ The page is 213px wider than the 390px viewport and scrolls sideways. warning links [all] /nl/contact.html 1 link on this "nl" page leads to locale "en". error lang [all] /en/products.html The page declares lang="nl" but belongs to locale "en". Evidence: .webqa/runs/2026-10-24T14-28-38-216Z
Bewijs: /de/ · mobiel 390pxVeertien regelgebaseerde controles (toetsenbord is optioneel) met vaste identifiers (check/code). Dezelfde identifiers worden gebruikt door de CLI, webauditlabs Cloud, de REST API en MCP.
| Gebied | Regels |
|---|---|
| Runtime en netwerk | http/http_statushttp/resource_failedhttp/api_failedhttp/console_errorhttp/third_party_failed |
| Links | links/link_deadlinks/link_server_errorlinks/link_redirect_looplinks/link_redirectslinks/anchor_brokenlinks/link_emptylinks/link_wrong_locale |
| Talen en vertalingen | lang/lang_missinglang/lang_mismatchlang/translation_missinglang/hreflang_wrong_localelang/hreflang_brokenlang/hreflang_redirectlang/hreflang_not_reciprocal |
| Layout | overflow/horizontal_overflowoverflow/control_offscreenclipping/text_clipped |
| Media | media/image_brokenmedia/image_not_loadedmedia/image_alt_missing |
| Inhoud | content/placeholder_textcontent/template_leakcontent/heading_emptycontent/content_empty |
| Formulieren | forms/field_unlabeledforms/button_unnamedforms/link_button_no_hrefforms/form_insecure_actionforms/form_offsite_action |
| SEO | seo/title_missingseo/title_too_longseo/meta_description_missingseo/canonical_missingseo/canonical_offsiteseo/canonical_wrong_localeseo/heading_level_skippedseo/noindexseo/canonical_target_brokenseo/canonical_target_redirectsseo/structured_data_invalidseo/og_image_missingseo/og_image_brokenseo/robots_missingseo/robots_blocks_pageseo/robots_no_sitemapseo/soft_404seo/favicon_missingseo/sitemap_url_brokenseo/sitemap_url_redirectsseo/sitemap_url_noindexseo/sitemap_url_canonical_elsewhere |
| Toegankelijkheid | a11y/a11y_<axe rule> (ernstig en kritiek, axe-core) |
| Consistentie | consistency/price_mismatchconsistency/date_expiredconsistency/duplicate_text |
| Privacy | privacy/tracker_before_consentprivacy/tracker_after_rejectprivacy/tracker_without_bannerprivacy/consent_no_reject |
| Beveiliging | security/mixed_contentsecurity/http_not_redirectedsecurity/tls_expiringsecurity/hsts_missingsecurity/security_headers_missing |
| Toetsenbord (standaard uit) | keyboard/focus_not_visiblekeyboard/focus_hidden_elementkeyboard/focus_trapkeyboard/skip_link_missing |
| Runtime en netwerk | http/http_statushttp/resource_failedhttp/api_failedhttp/console_error |
| Links | links/link_deadlinks/link_server_errorlinks/link_redirect_looplinks/link_redirectslinks/anchor_brokenlinks/link_emptylinks/link_wrong_localelinks/contact_link_invalid |
| Talen en vertalingen | lang/lang_missinglang/lang_mismatchlang/translation_missinglang/hreflang_wrong_localelang/hreflang_brokenlang/hreflang_redirectlang/hreflang_not_reciprocallang/untranslated_ui_text |
| Layout | overflow/horizontal_overflowoverflow/control_offscreenoverflow/element_overlapoverflow/text_too_smallclipping/text_clipped |
| Media | media/image_brokenmedia/image_not_loadedmedia/image_alt_missing |
| Inhoud | content/placeholder_textcontent/template_leakcontent/heading_emptycontent/content_emptycontent/copyright_outdated |
| Formulieren | forms/field_unlabeledforms/button_unnamedforms/link_button_no_hrefforms/form_insecure_actionforms/form_offsite_actionforms/autocomplete_missingforms/input_type_mismatch |
| SEO | seo/title_missingseo/title_too_longseo/meta_description_missingseo/canonical_missingseo/canonical_offsiteseo/canonical_wrong_localeseo/heading_level_skippedseo/noindex |
| Toegankelijkheid | a11y/a11y_<axe rule> (ernstig en kritiek, axe-core) |
| Consistentie | consistency/price_mismatchconsistency/date_expiredconsistency/duplicate_textconsistency/contact_mismatch |
| AI-stap (--ai, optioneel) | Onvertaalde tekst en uitleg in gewone taal, gemarkeerd ter controle |
npx webqa-platform audit <url>Detectie en controles in één commando, met een JSON- en HTML-rapport.
webqa init <url>Detecteert taalversies via hreflang, het taalkeuzemenu of <html lang> en schrijft een aanpasbaar webqa.json.
webqa run <spec | url>Legt pagina’s vast op elke ingestelde viewport (standaard desktop en mobiel), voert de controles uit en schrijft result.json en screenshots naar .webqa/runs/.
--jsonSchrijft result.json naar stdout in plaats van de samenvatting, voor scripts en agents.
--checks a,bVoert alleen de genoemde controles uit, bijvoorbeeld --checks links,seo.
--aiVoegt de optionele AI-stap toe: onvertaalde tekst en uitleg in gewone taal, binnen een tokenbudget.
--allow-privateStaat localhost en privénetwerkadressen toe, voor lokale en stagingsites.
--mode remote-cdpGebruikt uw eigen browser-endpoint via het Chrome DevTools Protocol.
webqa mcpStart de lokale MCP-server voor Claude Code, Cursor en andere MCP-clients.
webqa login · project link · --syncVerbindt met webauditlabs Cloud en uploadt een bestaand lokaal resultaat.
local | Chromium op uw machine. Geen account. | |
remote-cdp | Uw eigen compatibele browser-endpoint. Geen account. | |
cloud | Beheerde browsers via de webauditlabs-backend. Inloggegevens van de browserprovider verlaten de backend nooit. |
Elke run schrijft een resultaatbestand dat valideert tegen het gepubliceerde v1-schema, een screenshot van elke volledige pagina per viewport en een geannoteerde kopie voor pagina’s met bevindingen. Hetzelfde bevindingenformaat wordt gebruikt door de cloud, de API en MCP.
.webqa/runs/2026-10-24T14-28-38-216Z/ ├── result.json # result.v1 ├── p03-desktop.png ├── p03-mobile.png ├── p03-mobile.annotated.png # problem elements outlined └── …
{
"id": "f4",
"check": "overflow",
"code": "horizontal_overflow",
"severity": "error",
"url": "http://127.0.0.1:8090/de/",
"locale": "de",
"viewport": "mobile",
"message": "The page is 213px wider than the 390px viewport and scrolls sideways.",
"provenance": "deterministic",
"evidence": {
"expected": "390px",
"actual": "603px",
"elements": [
{
"tag": "div",
"selector": "body > section.hero:nth-of-type(1) > div.wrap > div",
"rect": {
"x": 18,
"y": 599,
"width": 585,
"height": 415
},
"text": "HERBSTKOLLEKTION 2026 Handgemacht für jeden Tag Keramik, Leuchten und Textilien aus kleinen Werkstätten in Skandinavien "
},
{
"tag": "img",
"selector": "body > section.hero:nth-of-type(1) > div.wrap > img",
"rect": {
"x": 18,
"y": 132,
"width": 585,
"height": 439
}
}
]
}
}Agents hebben een deterministische manier nodig om hun werk te controleren: audit draaien, gestructureerde bevindingen lezen, oplossen en opnieuw draaien.
Geversioneerde JSON met regel, ernst, pagina, viewport, elementen en pad naar de screenshot.
Exitcode 0 betekent dat er geen bevindingen meer zijn; 1 betekent dat er nog problemen zijn.
webqa mcp via stdio voor Claude Code, Cursor en andere MCP-clients. Geen account.
Cloudprojecten, runs en bevindingen voor agents en scripts, in elk cloudabonnement.
{
"mcpServers": {
"webqa": { "command": "npx", "args": ["webqa-platform", "mcp"] }
}
}Optioneel. Synchronisatie uploadt result.json en de screenshots van een run die u al heeft gedaan naar een gekoppeld cloudproject. De run wordt opgeslagen met uitvoermodus local.
webqa auditDraait lokaal in Chromium.
result.jsonBevindingen en screenshots op schijf.
webqa audit --syncUploadt het bestaande resultaat.
webauditlabs CloudHistorie, inbox en teamtoegang.
webqa init schrijft een webqa.json voor versiebeheer: talen, pagina’s of een sitemap met paginalimiet, viewports, controles en timeouts.
{
"version": 1,
"name": "www.example.nl",
"locales": [
{ "code": "nl", "url": "https://www.example.nl/nl/" },
{ "code": "de", "url": "https://www.example.nl/de/" }
],
"pages": { "sitemap": "https://www.example.nl/sitemap.xml", "maxPages": 50 },
"viewports": [{ "name": "mobile", "width": 390, "height": 844 }],
"checks": ["http", "lang", "overflow", "links", "clipping"],
"timeouts": { "pageMs": 30000, "runMs": 600000 }
}Exitcodes maken onderscheid tussen siteproblemen en tool- of runtimefouten.
| 0 | passed | Geen bevindingen |
| 1 | issues_found | Een of meer bevindingen |
| 2 | invalid input | Ongeldige configuratie of argumenten |
| 3 | execution_error | Tool- of browserfout, geen siteprobleem |
| 4 | timed_out | Run heeft de tijdslimiet overschreden |
Laat een build falen bij bevindingen en bewaar de runmap als build-artifact.
# .github/workflows/webqa.yml
- run: npx playwright install --with-deps chromium
- run: npx webqa-platform audit https://staging.example.com --json > webqa-result.json
- uses: actions/upload-artifact@v4
if: failure()
with:
name: webqa-evidence
path: .webqa/runs/