{"id":42601161,"url":"https://github.com/neonwatty/bugdrop","last_synced_at":"2026-03-10T01:11:47.307Z","repository":{"id":329780514,"uuid":"1119772484","full_name":"neonwatty/bugdrop","owner":"neonwatty","description":"In-app feedback → GitHub Issues. Screenshots, annotations, the works.","archived":false,"fork":false,"pushed_at":"2026-02-23T23:58:29.000Z","size":558,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-24T04:57:13.895Z","etag":null,"topics":["bug-reporting","feedback-widget","github-app","in-app-feedback"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neonwatty.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-19T20:30:11.000Z","updated_at":"2026-02-23T23:58:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/neonwatty/bugdrop","commit_stats":null,"previous_names":["neonwatty/feedback-widget","neonwatty/bugdrop"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/neonwatty/bugdrop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neonwatty%2Fbugdrop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neonwatty%2Fbugdrop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neonwatty%2Fbugdrop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neonwatty%2Fbugdrop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neonwatty","download_url":"https://codeload.github.com/neonwatty/bugdrop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neonwatty%2Fbugdrop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30320723,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T20:05:46.299Z","status":"ssl_error","status_checked_at":"2026-03-09T19:57:04.425Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bug-reporting","feedback-widget","github-app","in-app-feedback"],"created_at":"2026-01-29T01:02:48.939Z","updated_at":"2026-03-10T01:11:47.299Z","avatar_url":"https://github.com/neonwatty.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BugDrop 🐛\n\n[![CI](https://github.com/neonwatty/bugdrop/actions/workflows/ci.yml/badge.svg)](https://github.com/neonwatty/bugdrop/actions/workflows/ci.yml)\n[![Version](https://img.shields.io/badge/version-1.11.0-14b8a6)](./CHANGELOG.md)\n[![Security Policy](https://img.shields.io/badge/Security-Policy-blue)](./SECURITY.md)\n[![Live Demo](https://img.shields.io/badge/Demo-Try_It_Live-ff9e64)](https://neonwatty.github.io/feedback-widget-test/)\n\nIn-app feedback → GitHub Issues. Screenshots, annotations, the works.\n\n![bugdrop-demo-small](https://github.com/user-attachments/assets/22d234fa-aa0f-4d01-bc4f-4c3e8f107165)\n\n## Quick Start\n\n\u003e Works with both public and private repositories!\n\n**1. Install the GitHub App** on your repository:\n\nhttps://github.com/apps/neonwatty-bugdrop/installations/new\n\n**2. Add the script** to your website:\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\u003e\u003c/script\u003e\n```\n\nThat's it! Users can now click the bug button to submit feedback as GitHub Issues.\n\n## Version Pinning\n\nBy default, `/widget.js` always serves the latest version. For production stability, pin to a specific version:\n\n```html\n\u003c!-- Recommended for production: pin to major version --\u003e\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.v1.js\"\n        data-repo=\"owner/repo\"\u003e\u003c/script\u003e\n```\n\n| URL | Updates | Best For |\n|-----|---------|----------|\n| `/widget.js` | Always latest | Development |\n| `/widget.v1.js` | Bug fixes only | Production (recommended) |\n| `/widget.v1.1.js` | Patch fixes only | Strict stability |\n| `/widget.v1.1.0.js` | Never | Maximum control |\n\nSee [CHANGELOG.md](./CHANGELOG.md) for version history and migration guides.\n\n## Widget Options\n\n| Attribute | Values | Default |\n|-----------|--------|---------|\n| `data-repo` | `owner/repo` | required |\n| `data-theme` | `light`, `dark`, `auto` | `auto` |\n| `data-position` | `bottom-right`, `bottom-left` | `bottom-right` |\n| `data-color` | Hex color (e.g. `#FF6B35`) | `#14b8a6` (teal) |\n| `data-icon` | Image URL | (bug emoji) |\n| `data-show-name` | `true`, `false` | `false` |\n| `data-require-name` | `true`, `false` | `false` |\n| `data-show-email` | `true`, `false` | `false` |\n| `data-require-email` | `true`, `false` | `false` |\n| `data-button-dismissible` | `true`, `false` | `false` |\n| `data-dismiss-duration` | Number (days) | (forever) |\n| `data-show-restore` | `true`, `false` | `true` |\n| `data-button` | `true`, `false` | `true` |\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-theme=\"dark\"\n        data-position=\"bottom-left\"\n        data-color=\"#FF6B35\"\u003e\u003c/script\u003e\n```\n\n### Custom Icon\n\nReplace the default bug emoji with your own image:\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-icon=\"https://example.com/my-logo.svg\"\u003e\u003c/script\u003e\n```\n\nThe image is displayed at 18px (16px on mobile). If the image fails to load, the default bug emoji is shown as a fallback.\n\n### Collecting Submitter Info\n\nBy default, BugDrop only asks for a title and description. You can optionally collect user name and email:\n\n```html\n\u003c!-- Require name, optional email --\u003e\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-show-name=\"true\"\n        data-require-name=\"true\"\n        data-show-email=\"true\"\u003e\u003c/script\u003e\n```\n\nWhen provided, submitter info appears at the top of the GitHub issue.\n\n### Dismissible Button\n\nAllow users to hide the floating button if they don't want it:\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-button-dismissible=\"true\"\u003e\u003c/script\u003e\n```\n\nWhen enabled, hovering over the button reveals an X icon. Clicking it hides the button and shows a subtle pull tab on the screen edge. Users can click the pull tab to restore the full button. The dismissed state is saved to localStorage (`bugdrop_dismissed`).\n\n**Disable the restore pull tab** — if you don't want the pull tab to appear:\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-button-dismissible=\"true\"\n        data-show-restore=\"false\"\u003e\u003c/script\u003e\n```\n\n**Auto-reappear after duration** — Let the button come back after a number of days:\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-button-dismissible=\"true\"\n        data-dismiss-duration=\"7\"\u003e\u003c/script\u003e\n```\n\nWith `data-dismiss-duration=\"7\"`, users who dismiss the button will see it again after 7 days. Without this attribute, the button stays hidden forever (until localStorage is cleared).\n\n### Feedback Categories\n\nWhen users submit feedback, they can select a category:\n\n| Category | Emoji | GitHub Label |\n|----------|-------|--------------|\n| Bug | 🐛 | `bug` |\n| Feature | ✨ | `enhancement` |\n| Question | ❓ | `question` |\n\nThe selected category is automatically mapped to a GitHub label on the created issue, making it easy to filter and triage feedback. Bug is selected by default.\n\n### Automatic System Info\n\nEach feedback submission automatically includes:\n\n- **Browser** name and version (e.g., Chrome 120)\n- **OS** name and version (e.g., macOS 14.2)\n- **Viewport** size with device pixel ratio\n- **Language** preference\n- **Page URL** (with query params redacted for privacy)\n\nThis information appears in a collapsible \"System Info\" section on the GitHub issue.\n\n### JavaScript API\n\nBugDrop exposes a JavaScript API for programmatic control, useful when you want to trigger feedback from your own UI instead of (or in addition to) the floating button.\n\n```javascript\nwindow.BugDrop = {\n  open(),           // Open the feedback modal\n  close(),          // Close the modal\n  hide(),           // Hide the floating button\n  show(),           // Show the floating button (clears dismissed state)\n  isOpen(),         // Returns true if modal is open\n  isButtonVisible() // Returns true if button is visible\n};\n```\n\n**API-only mode** — hide the floating button entirely and trigger feedback from your own UI:\n\n```html\n\u003cscript src=\"https://bugdrop.neonwatty.workers.dev/widget.js\"\n        data-repo=\"owner/repo\"\n        data-button=\"false\"\u003e\u003c/script\u003e\n```\n\n**Example: Menu item integration**\n\n```html\n\u003cnav\u003e\n  \u003ca href=\"#\"\u003eHome\u003c/a\u003e\n  \u003ca href=\"#\"\u003eProducts\u003c/a\u003e\n  \u003cspan id=\"report-bug\"\u003eReport Bug\u003c/span\u003e\n\u003c/nav\u003e\n\n\u003cscript\u003e\n  window.addEventListener('bugdrop:ready', () =\u003e {\n    document.getElementById('report-bug').addEventListener('click', () =\u003e {\n      window.BugDrop.open();\n    });\n  });\n\u003c/script\u003e\n```\n\nThe `bugdrop:ready` event fires when the API is available. You can also check `if (window.BugDrop)` for synchronous initialization.\n\n## Live Demo\n\nTry it on [WienerMatch](https://neonwatty.github.io/feedback-widget-test/) — click the bug button in the bottom right corner.\n\n## How It Works\n\n```\nUser clicks bug button → Widget captures screenshot → Worker authenticates via GitHub App → Issue created in your repo\n```\n\n1. **Widget** loads in a Shadow DOM (isolated from your page styles)\n2. **Screenshot** captured client-side using html2canvas\n3. **Worker** (Cloudflare) exchanges GitHub App credentials for an installation token\n4. **GitHub API** creates the issue with the screenshot stored in `.bugdrop/`\n\n## Security\n\n- **Permissions**: Issues (R/W), Contents (R/W) - only on repos you install it on\n- **Data storage**: Screenshots stored in your repo's `.bugdrop/` folder\n- **Privacy**: No user data stored by the widget service\n\n## Rate Limiting\n\nThe API includes rate limiting to prevent spam and protect GitHub API quotas:\n\n| Scope | Limit | Window |\n|-------|-------|--------|\n| Per IP | 10 requests | 15 minutes |\n| Per Repository | 50 requests | 1 hour |\n\nWhen rate limited, the API returns a `429 Too Many Requests` response with a `Retry-After` header indicating when to retry. Rate limit headers are included on all responses:\n\n- `X-RateLimit-Limit`: Maximum requests allowed\n- `X-RateLimit-Remaining`: Requests remaining in current window\n\n## Self-Hosting\n\nWant to run your own instance? See [SELF_HOSTING.md](./SELF_HOSTING.md).\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for version history, new features, and upgrade guides.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneonwatty%2Fbugdrop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneonwatty%2Fbugdrop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneonwatty%2Fbugdrop/lists"}