Your visitors already see the bugs. Now you will too.
Paste one line into your template. A quiet button appears on the page: the visitor clicks it, circles what is broken and writes a single sentence. You get a card with a full-page screenshot, JavaScript errors, failed requests, browser, screen size and the last clicks that led there. After that it is an ordinary board: statuses, assignees, comments, notifications.
That button in the corner is the widget itself. Click it: Asklid collects reports about Asklid the same way it will collect yours.
“Nothing works” is not a bug report
Between the visitor who hit the bug and the developer who has to reproduce it there are usually three emails, a phone photo of a screen and a browser nobody on the team has. Half of those reports die on “cannot reproduce”. Asklid removes the middle: the report is written on the very page that broke, and it takes that page along — together with whatever the console was complaining about at that moment.
Three steps, and none of them are yours
Click a step to see what happens.
Report a bug
The tag is in. A button appeared in the corner — nothing else on the site changed.
Send
Frame taken, private bits blurred, sentence written. Sending is one button.
New
In progress
Done
The request is on the board. Everything needed to reproduce it is already inside.
A screenshot that shows the page they were on
The frame is not drawn by the visitor’s browser but by our server: the widget sends the page markup and styles, and a real Chrome on our side renders the picture. So the frame holds the whole page, including what was below the fold, and holds it the way the person saw it — fonts, shadows and images included, not a pale copy. The site’s layout never shifts by a pixel: nobody touches the page.
The whole page, not the visible part of the window
Fonts, shadows, backgrounds and images intact
Private details blurred before sending
Markup over the frame
Try it — it works right here.
Console, network and steps — without asking “what were you doing?”
The widget records from the first paint, so by the time the button is clicked everything is already gathered: JavaScript errors and warnings, requests that answered with an error or never answered at all, browser, version, screen size and the visitor’s last actions. Field values and request bodies are never recorded — the widget sits on other people’s sites with other people’s personal data, and that is not a place to take chances.
A full-page screenshot with the visitor’s markup.
error · Uncaught TypeError: cart.items is undefined
at checkout.js:214
warn · preload of /fonts/inter.woff2 was not used
Errors and warnings in order, with the place in the code.
500 POST /api/cart/confirm
timeout GET /api/prices?id=8841
200 GET /api/user
Requests that answered with an error or never answered.
Chrome 141 · Windows 11
1280 × 720 · dpr 1.5
/checkout?step=payment
Browser, system, screen size, page address.
The form fits your process, not ours
You decide what can be written about at all: bug, idea, question — you switch on the types you need, and the chosen one changes the hint in the field. Title and email can each be required, optional or hidden entirely: where a report is one sentence, a separate title field only gets in the way, and the card lives perfectly well without one. Up to six screenshots go with a single request, and the picture does not have to be drawn by the widget — it can simply be pasted from the clipboard.
Request types: bug, idea, question
Title and email — required, optional or hidden
Up to six screenshots per request
Screenshots pasted from the clipboard, not only drawn
The widget looks like part of your site
The button sits in any of eight spots — four corners and four edge centres — and comes in four shapes: icon only, text only, icon with text, or a narrow tab hugging an edge. Colour, radius, size, offset from the edge, an icon from the set or your own, a light or dark panel, every line of the form — all of it is set in the cabinet, and the preview changes as you go, with nothing to deploy. The widget lives in a shadow root: your styles cannot reach it and its styles cannot reach your layout. Twelve languages ship in the box and the widget picks the one the page is written in; a missing language is translated with one button.
Build the button
Report a problem
This is how the button will sit on your site.
This is a small part of it. The cabinet configures the widget in full — there are far more ways to place and dress it.
A board instead of a mail thread
Requests land on a kanban: four columns, drag and drop, assignees, priorities, comments. There is a table for people who think in tables and a feed for people who just read top to bottom — plus a summary page, “Reports”, showing what came in lately and from which projects. Filters are remembered: set them once, come back and find the same view. You can have several projects, each with its own widget and token.
Pick a card up and move it to another column. A finger works too.
New
Cart empties after payment
bugChrome 141
Menu will not scroll on iPhone
bugiOS 18
In progress
Form rejects a perfectly good phone number
taskFirefox 133
In review
Done
Workspaces, team and roles
A workspace is a separate set of projects with its own team: your own work, a client’s, a sandbox. They switch with one move in the menu, and a person’s subscription covers every workspace they own. There are four roles — from “reads” to “owns” — and next to the team you see the people who wrote to you: not members, but the ones whose requests came in from the site.
You can see who wrote it
If the visitor is already signed in to your site, the site can sign their identity with a secret key — and the card shows a name and an email you can trust instead of “anonymous”. The signature is verified on our side and cannot be forged from the page. Nobody signed in? The widget simply asks for an email, and that is fine too.
Notifications where you already sit
A new request goes to Telegram, to email, to your webhook or as a row in a Google Sheet — a separate set per project. A channel can be told to stay quiet about reports whose author it could not identify, so the on-call person is not woken by their own smoke test.
TelegramEmailWebhookGoogle Sheet
API and CLI: an agent reads and closes the requests
Everything the cabinet can do the REST API can do: create, search, edit, move across the board. Keys are issued and revoked in the cabinet, each with its own abilities and its own projects. We run on this ourselves — the Asklid board lives in Asklid, and the same agent that writes the code moves the cards.
The widget token only works on your domains — a key lifted off the page buys nothing.
The site’s language is detected for you: we walk the sitemap and see what it is written in.
Widget texts translate into any language with one button, not line by line by hand.
API keys are issued with abilities, an expiry and a project list, and revoked in one click.
A channel can be told to stay quiet about your own smoke tests.
Reports export as a row into a Google Sheet, for people who count everything in a sheet.
The “Powered by” badge comes off on any paid plan.
The cabinet speaks Russian and English, and every screen has a dark theme.
One line to install, one button to check
Copy the tag from the cabinet and paste it into your site. Then press “Check”: we open your page with a real browser and tell you whether the widget was found. If it was not, we say where to look for the reason instead of just “error”.
The widget is on the sitechecked just now
We open your page with a real browser, not a plain request: an app that draws itself with script would look empty otherwise.
Pricing
Start free and see the widget work on your own site. Paid plans grow by projects and people — reports themselves are never rationed.
The tag loads asynchronously and the core weighs about 15 KB gzipped. The heavy half is pulled in only once a visitor actually clicks the button. Before that click the widget makes no request to us at all.
Will it fight our styles?
No. The widget lives in a shadow root: page styles cannot reach it and its styles cannot reach the page. It does not move your layout during capture either — we do not repaint the page, we send it as it is.
We are a single-page app, everything is drawn by script
That is the point. The widget captures what is in the browser right now — after every render, route change and lazy load. That is exactly why the frame is built from the page markup rather than by fetching your URL: the URL would return an empty shell.
Where does the data go?
Into your workspace here and nowhere else. Field values and request bodies are never collected. The form tells the person plainly what will be sent along with the report, before they press “Send”.
Who can send reports?
Any visitor — that is what the widget is for. If you want only your own people to see the button, render the tag for signed-in users: it is inserted by script as easily as into the template.
Do I have to pay?
No. The free plan gives one workspace, one project, three people and a monthly ceiling on reports; the API stays closed on it. Any paid plan opens the API, takes the badge off the widget and stops counting reports.
Five minutes to the first report
Create a workspace, copy the tag, paste it into your site. Nothing else is needed from you.