{"id":47705530,"url":"https://github.com/prvashisht/force-paster","last_synced_at":"2026-04-02T17:55:31.961Z","repository":{"id":159071881,"uuid":"440529000","full_name":"prvashisht/force-paster","owner":"prvashisht","description":"This extension allows you to paste text into input fields in websites that have disabled pasting.","archived":false,"fork":false,"pushed_at":"2026-03-29T09:12:53.000Z","size":175,"stargazers_count":4,"open_issues_count":7,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-29T12:36:52.675Z","etag":null,"topics":["accessibility","chrome","chrome-extension","chrome-extensions","dont-fuck-with-paste","extension-chrome","extensions","extensions-chrome","paste"],"latest_commit_sha":null,"homepage":"https://vashis.ht/rd/forcepaster?from=github-sidebar","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prvashisht.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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":"2021-12-21T13:37:33.000Z","updated_at":"2026-03-29T09:12:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"cac336f9-322a-4ca5-a880-fb3c97dcd7eb","html_url":"https://github.com/prvashisht/force-paster","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/prvashisht/force-paster","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prvashisht%2Fforce-paster","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prvashisht%2Fforce-paster/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prvashisht%2Fforce-paster/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prvashisht%2Fforce-paster/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prvashisht","download_url":"https://codeload.github.com/prvashisht/force-paster/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prvashisht%2Fforce-paster/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31312744,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["accessibility","chrome","chrome-extension","chrome-extensions","dont-fuck-with-paste","extension-chrome","extensions","extensions-chrome","paste"],"created_at":"2026-04-02T17:55:31.112Z","updated_at":"2026-04-02T17:55:31.944Z","avatar_url":"https://github.com/prvashisht.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Force Paster\n\n[![Version](https://img.shields.io/github/manifest-json/v/prvashisht/force-paster)](https://github.com/prvashisht/force-paster/blob/master/manifest.json)\n\nForce Paster is a browser extension that lets you paste text into any input field or text area — even on sites that have deliberately blocked pasting. One click enables it; one click turns it back off.\n\n---\n\n## Features\n\n- **Force paste anywhere** — overrides paste-blocking on any website for `\u003cinput\u003e` and `\u003ctextarea\u003e` elements\n- **One-click toggle** — click the extension icon to enable or disable; the toolbar badge shows the current state (`on` / `off`)\n- **Keyboard shortcut** — toggle with **Alt+Shift+P** (remappable per browser)\n- **Right-click context menu** — toggle, open the dashboard, manage shortcuts, rate the extension, or report a bug directly from the toolbar icon\n- **Dashboard** — a tabbed settings page (Settings / What's new / More); open it via the context menu or `chrome://extensions` → Details → Extension options\n- **Dark \u0026 light icons** — the toolbar icon automatically follows your system theme\n- **Cross-browser** — works on Chrome, Firefox (121+), and Edge\n\n---\n\n## Installation\n\n### From the browser store\n\n| Browser | Link |\n|---------|------|\n| Chrome / Edge | [Chrome Web Store](https://vashis.ht/rd/forcepaster?from=github-readme) |\n| Firefox | [Firefox Add-ons](https://vashis.ht/rd/forcepaster?from=github-readme) |\n\n### Load unpacked (development)\n\n1. Clone the repository:\n   ```bash\n   git clone https://github.com/prvashisht/force-paster.git\n   ```\n2. **Chrome / Edge** — navigate to `chrome://extensions/`, enable **Developer mode**, click **Load unpacked**, and select the cloned folder.\n3. **Firefox** — navigate to `about:debugging#/runtime/this-firefox`, click **Load Temporary Add-on**, and select `manifest.json` inside the cloned folder.\n\n---\n\n## How it works\n\n```\nUser clicks icon / presses Alt+Shift+P / uses context menu\n        │\n        ▼\nservice_worker.js  ←─ action.onClicked / _execute_action command / contextMenus.onClicked\n  • toggles isPasteEnabled in storage.local\n  • updates badge text (\"on\" / \"off\") and badge colour\n  • syncs the \"Enable Force Paste\" checkbox in the context menu\n  • dispatches analytics events (fp_toggle, fp_menu_click, etc.)\n        │\n        ▼  storage.onChanged\ncontent.js  (injected into every page)\n  • listens on document.body.onpaste\n  • when isPasteEnabled, intercepts the paste event, reads clipboard\n    text, and writes it directly into the focused \u003cinput\u003e/\u003ctextarea\u003e\n  • reports paste completion back to the service worker via runtime messages\n  • watches prefers-color-scheme and notifies the service worker so the\n    correct toolbar icon variant (light/dark) is displayed\n        │\n        ▼  (options page)\noptions.html / options.js\n  • standalone dashboard — reads state from storage.local\n  • toggle sends a \"setenabled\" message to the service worker\n  • shows paste count, toggle count, and current keyboard shortcut\n  • sends analytics events (fp_options_open, fp_options_click) via messages\n```\n\n### Browser compatibility\n\nAll Chrome/Firefox API differences are centralised in `webext.js`. The service worker and options page use `webext.*` throughout; `content.js` and `analytics.js` use the `chrome` namespace, which Firefox MV3 also exposes in those contexts.\n\n---\n\n## Project structure\n\n| File | Description |\n|------|-------------|\n| `manifest.json` | Extension manifest (MV3) — permissions, icons, content script registration, keyboard command, options page |\n| `webext.js` | Browser adapter — detects Chrome/Edge vs Firefox at runtime, re-exports APIs under a unified `webext` object, and adds helpers like `openShortcutsPage()` and `action.getUserSettings()` |\n| `content.js` | Content script injected into every page — intercepts paste events and forwards theme-change messages to the service worker |\n| `service_worker.js` | Background service worker — manages toggle state, badge, context menu, options page, and all analytics calls |\n| `options.html` | Dashboard markup — tabbed UI with Settings, What's new, and More panels |\n| `options.js` | Dashboard logic — reads/writes storage, reflects live state changes, loads release notes, sends analytics via service worker messages |\n| `release-notes.json` | Current version's release notes — bundled with the extension and displayed in the What's new tab |\n| `analytics.js` | Analytics helper — proxies GA4 events through a Cloud Functions endpoint with client-ID and session management |\n\n---\n\n## Analytics events\n\nEvents are sent anonymously via a Cloud Functions proxy. The following events are tracked:\n\n| Event | When | Key params |\n|-------|------|------------|\n| `extension_installed` | Install or update | `reason`, platform info, locale |\n| `fp_toggle` | Enable/disable toggled | `enabled`, `source` (`action_icon` / `context_menu` / `options_page`) |\n| `fp_paste` | Paste completed | `tag` (element type), `domain` |\n| `fp_menu_click` | Context menu item clicked (non-toggle) | `item` (`shortcuts` / `options` / `rate` / `bug`) |\n| `fp_options_open` | Dashboard page opened | — |\n| `fp_options_click` | Link clicked on dashboard | `item` (`rate` / `bug` / `github` / `bmc` / `app_*` / `footer_author`) |\n| `fp_rating_prompt` | User responded to the rating toast | `choice` (`rate` / `later` / `never`) |\n\n---\n\n## Development guide\n\n### Prerequisites\n\n- Node.js is **not** required — the extension is plain JavaScript with no build step.\n\n### Workflow\n\n1. Make your changes to the source files.\n2. In Chrome, go to `chrome://extensions/` and click the **reload** icon on the Force Paster card to pick up changes.\n3. In Firefox, go to `about:debugging#/runtime/this-firefox` and click **Reload** next to Force Paster.\n4. Test on a site that blocks pasting (e.g. many banking or exam portals).\n\n### Keyboard shortcut remap\n\n- **Chrome / Edge** — `chrome://extensions/shortcuts`\n- **Firefox** — `about:addons` → Extensions → Force Paster → Manage\n\n### Releasing a new version\n\n1. Bump `\"version\"` in `manifest.json`.\n2. Update `\"version\"` and `\"notes\"` in `release-notes.json` to match — the build will **fail** if they differ.\n3. Merge to `main`. The `release.yml` workflow triggers automatically, builds both zips, creates a GitHub release with auto-generated notes, and attaches the zips as assets. This in turn triggers `store-deploy.yml`, which publishes automatically to the Chrome Web Store and Firefox Add-ons.\n4. **Edge** — upload `force-paster-chrome-v*.zip` from the GitHub release manually at [Microsoft Partner Center](https://partner.microsoft.com/dashboard/microsoftedge/overview). The Chrome zip is Edge-compatible (same Chromium base; Firefox-only manifest fields are stripped by the build script).\n\n\u003e **Checklist every release:**\n\u003e - [ ] `manifest.json` version bumped\n\u003e - [ ] `release-notes.json` version and notes updated\n\u003e - [ ] README features/structure updated if new things were added\n\u003e - [ ] Edge Add-ons updated manually via Partner Center\n\n---\n\n## Contributing\n\nContributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) and follow the [Code of Conduct](CODE_OF_CONDUCT.md) before opening a pull request.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprvashisht%2Fforce-paster","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprvashisht%2Fforce-paster","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprvashisht%2Fforce-paster/lists"}