You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,15 +31,15 @@ That's it! Users can now click the bug button to submit feedback as GitHub Issue
31
31
32
32
> **Important:** Do not add `async` or `defer` to the script tag — the widget needs synchronous loading to read its configuration.
33
33
34
-
> **CSP note:** If your site uses a Content Security Policy, add `https://cdn.jsdelivr.net` to your `script-src` directive to enable screenshot capture.
34
+
> **CSP note:** If your site uses a Content Security Policy, add `https://bugdrop.neonwatty.workers.dev` to your `script-src` directive to enable the widget.
35
35
36
36
> **Branch protection:** BugDrop works with repos that have branch protection rules (required PRs, merge queues). Screenshots are stored on a dedicated `bugdrop-screenshots` branch that is auto-created on first use — no manual setup needed.
37
37
38
38
> **Security note:** BugDrop is not a spam or malware filtering service. Treat feedback and screenshots as unauthenticated user-generated content. Exclude `bugdrop-screenshots` from CI/deploy workflows, and self-host behind your own WAF/CAPTCHA/content controls for stricter environments.
39
39
40
40
## Features
41
41
42
-
- 🔒 **Privacy masking** — tag sensitive elements with `data-bugdrop-mask` and BugDrop covers them in the screenshot before it's submitted. Passwords and credit-card inputs are masked automatically.
42
+
- 🔒 **Privacy masking** — tag sensitive elements with `data-bugdrop-mask` and BugDrop visually covers them in supported screenshot modes before submission. Passwords and credit-card inputs are masked automatically.
43
43
44
44
## Widget Options
45
45
@@ -75,7 +75,7 @@ User clicks bug button → Widget captures screenshot → Worker authenticates v
75
75
```
76
76
77
77
1.**Widget** loads in a Shadow DOM (isolated from your page styles)
78
-
2.**Screenshot** captured client-side using html2canvas
78
+
2.**Screenshot** captured client-side using html-to-image
79
79
3.**Worker** (Cloudflare) exchanges GitHub App credentials for an installation token
80
80
4.**GitHub API** creates the issue with the screenshot stored in `.bugdrop/` on a dedicated `bugdrop-screenshots` branch (auto-created on first use)
Copy file name to clipboardExpand all lines: docs/website/configuration.mdx
+21-1Lines changed: 21 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -218,7 +218,27 @@ Control how screenshots are collected during the feedback flow.
218
218
-**`auto`** -- Automatically captures a full-page screenshot after the form is submitted, without showing the manual screenshot picker or redaction step.
219
219
-**`required`** -- Requires a screenshot before submission. Users can choose full page, element, or area, then annotate or redact before submitting.
220
220
221
-
Manual redaction is controlled by the person submitting feedback. Use developer-configured masking for fields that should never appear in screenshots, especially with automatic screenshots.
221
+
Manual redaction is controlled by the person submitting feedback. Use developer-configured masking for fields that should be visually covered in supported screenshot modes, especially with automatic screenshots. Auto mode warns users that a full-page screenshot will be attached, but it does not show the manual picker or annotation review step.
222
+
223
+
### Developer-configured screenshot masking
224
+
225
+
BugDrop can visually mask fields that your app marks as private before a screenshot is uploaded:
This is best-effort visual masking, not a data-loss-prevention or security boundary. BugDrop can only mask content it can measure in the page DOM. Unmarked sensitive information can still appear, and browser rendering limits can apply to canvas, image, video, iframe, SVG, shadow DOM, pseudo-element, and highly custom control content.
240
+
241
+
Selected-area screenshots are rendered to the selected dimensions and masks are translated into that crop, but the capture still runs client-side against the page DOM. Avoid screenshots entirely for pages where client-side screenshot rendering is unacceptable.
222
242
223
243
```html
224
244
<!-- Automatically attach a full-page screenshot -->
Copy file name to clipboardExpand all lines: docs/website/faq.mdx
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -42,9 +42,9 @@ Since BugDrop uses Shadow DOM for isolation, it does not conflict with any frame
42
42
43
43
### How does BugDrop handle screenshots?
44
44
45
-
BugDrop uses [html2canvas](https://html2canvas.hertzen.com/) to capture screenshots entirely on the client side. When a user clicks the screenshot button:
45
+
BugDrop uses [html-to-image](https://github.com/bubkoo/html-to-image) to capture screenshots entirely on the client side. When a user clicks the screenshot button:
46
46
47
-
1.html2canvas renders the current page to an HTML Canvas element in the user's browser
47
+
1.html-to-image renders the current page to an HTML Canvas element in the user's browser
48
48
2. In optional and required manual screenshot flows, the user can annotate the screenshot and cover sensitive regions with opaque blocks
49
49
3. The canvas is converted to a PNG image
50
50
4. The image is sent to the BugDrop API along with the form submission
@@ -198,7 +198,7 @@ Check the following:
198
198
199
199
1.**Verify the script tag** -- Make sure it does not have `async` or `defer` attributes
200
200
2.**Check the console** -- Open your browser's developer console and look for `[BugDrop]` messages or errors
201
-
3.**Check CSP** -- If your site uses a Content Security Policy, make sure `https://bugdrop.neonwatty.workers.dev`and `https://cdn.jsdelivr.net` are allowed in `script-src`
201
+
3.**Check CSP** -- If your site uses a Content Security Policy, make sure `https://bugdrop.neonwatty.workers.dev`is allowed in `script-src`
202
202
4.**Check the repo** -- Ensure `data-repo` matches your GitHub repository path exactly (case-sensitive)
203
203
5.**Check app installation** -- Verify the BugDrop GitHub App is installed on the repository
204
204
@@ -216,8 +216,8 @@ If the widget appears but submissions fail:
216
216
If issues are created but without screenshots:
217
217
218
218
1.**Check branch protection** -- The GitHub App needs permission to push to the `bugdrop-screenshots` branch. See the [Installation](/docs/installation) page for details on branch protection configuration.
219
-
2.**Check CSP** -- The html2canvas library is loaded from `cdn.jsdelivr.net`. Make sure it is allowed by your Content Security Policy.
220
-
3.**Cross-origin content** -- html2canvas cannot capture cross-origin iframes or images loaded without CORS headers. These elements may appear blank in the screenshot.
219
+
2.**Check CSP** -- Make sure your Content Security Policy allows the BugDrop widget script.
220
+
3.**Cross-origin content** -- Browser screenshot rendering cannot capture cross-origin iframes or images loaded without CORS headers. These elements may appear blank in the screenshot.
Copy file name to clipboardExpand all lines: docs/website/installation.mdx
+7-6Lines changed: 7 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -73,16 +73,17 @@ See the [Configuration](/docs/configuration) and [Styling](/docs/styling) docs f
73
73
74
74
## Protecting sensitive data
75
75
76
-
If your page renders customer data, billing details, or any other content you do not
77
-
want to appear in submitted screenshots, mark those elements with `data-bugdrop-mask`:
76
+
If your page renders customer data, billing details, or any other content you want
77
+
BugDrop to visually cover in supported screenshot modes, mark those elements with
78
+
`data-bugdrop-mask`:
78
79
79
80
```html
80
81
<divclass="customer-row"data-bugdrop-mask>
81
82
Jane Doe — jane@acme.com
82
83
</div>
83
84
```
84
85
85
-
BugDrop covers each marked element with an opaque rectangle on the captured screenshot.
86
+
BugDrop covers each marked element with an opaque rectangle on supported captured screenshots.
86
87
Password inputs and credit-card autocomplete fields are masked automatically. See
87
88
[Screenshot masking](/security#screenshot-masking) on the Security page for details.
88
89
@@ -107,13 +108,13 @@ The BugDrop script tag should **not** include the `async` or `defer` attributes.
107
108
108
109
### Content Security Policy (CSP)
109
110
110
-
If your site uses a Content Security Policy, you will need to allow `cdn.jsdelivr.net`in your CSP directives. BugDrop loads the html2canvas library from jsDelivr for screenshot functionality:
111
+
If your site uses a Content Security Policy, allow the BugDrop worker domain in your CSP directives:
Copy file name to clipboardExpand all lines: docs/website/security.mdx
+8-6Lines changed: 8 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -53,14 +53,14 @@ Treat screenshots as unauthenticated user-generated content. The hosted service
53
53
54
54
### Screenshot Format
55
55
56
-
Screenshots are captured client-side using [html2canvas](https://html2canvas.hertzen.com/), which renders the current page to a canvas element in the user's browser. The canvas is then converted to a PNG image and uploaded. This means:
56
+
Screenshots are captured client-side using [html-to-image](https://github.com/bubkoo/html-to-image), which renders the current page to a canvas element in the user's browser. The canvas is then converted to a PNG image and uploaded. This means:
57
57
58
58
- The initial screenshot capture is rendered from what the user actually sees
59
59
- No server-side rendering or page access is required
60
60
- The screenshot is generated entirely in the user's browser before being sent to the API
61
61
- Users can redact additional screenshot regions before submitting when using the manual screenshot flow
62
62
63
-
Manual redaction is user-driven and does not automatically detect sensitive content. It complements, but does not replace, developer-configured masking for fields that should never appear in screenshots, especially when using automatic screenshots.
63
+
Manual redaction is user-driven and does not automatically detect sensitive content. It complements, but does not replace, developer-configured masking for fields that should be visually covered in supported screenshot modes, especially when using automatic screenshots.
64
64
65
65
Because clients are untrusted, the API validates screenshot uploads server-side before storing them. BugDrop currently accepts PNG data URLs only and rejects SVG, malformed base64, oversized payloads, and data that does not have a PNG file signature.
66
66
@@ -78,8 +78,7 @@ BugDrop is built with a privacy-first approach:
78
78
79
79
### Screenshot masking
80
80
81
-
You can mark sensitive elements so they never appear in submitted screenshots. Add the
82
-
`data-bugdrop-mask` attribute to any element you want covered:
81
+
You can mark sensitive elements so BugDrop visually covers them in supported screenshot modes. Add the `data-bugdrop-mask` attribute to any element you want covered:
83
82
84
83
```html
85
84
<inputtype="email"data-bugdrop-mask />
@@ -94,6 +93,10 @@ When a user submits feedback, BugDrop paints an opaque rectangle over each tagge
94
93
element's bounding box on the captured PNG before showing the user the annotator
95
94
preview. The user sees what is masked and can audit it before submitting.
96
95
96
+
Masking is best-effort visual coverage, not a data-loss-prevention or security
97
+
boundary. Users should still review screenshots before submitting when the manual
98
+
screenshot flow is enabled.
99
+
97
100
**Inheritance.** When an ancestor has `data-bugdrop-mask`, the entire ancestor box is
98
101
masked as a single rectangle. Descendants do not get individual rectangles — this
99
102
prevents gaps from CSS `gap` or non-masked siblings inside a masked container.
@@ -121,8 +124,7 @@ prevents gaps from CSS `gap` or non-masked siblings inside a masked container.
121
124
The only network requests BugDrop makes are:
122
125
123
126
1. Loading the widget script from Cloudflare Workers
124
-
2. Loading html2canvas from cdn.jsdelivr.net (for screenshot functionality)
125
-
3. Submitting the feedback form to the BugDrop Cloudflare Worker API
127
+
2. Submitting the feedback form to the BugDrop Cloudflare Worker API
126
128
127
129
The API acts as a pass-through to the GitHub API -- it receives the form data, creates the issue and uploads the screenshot, and discards the data. Nothing is persisted on the Cloudflare Worker.
0 commit comments