Quick Perplexes
A browser extension: one keystroke on any webpage opens a search box that hands the query to Perplexity. Live on Chrome and Firefox.
Context
Asking Perplexity something meant leaving the page I was on: switch tabs, open perplexity.ai, type. Spotlight, Raycast and Alfred show a faster pattern. A hotkey brings up a box over whatever you’re doing.
Quick Perplexes brings that pattern to the browser. I wrote the design doc on 2026-03-30, then built it with Claude Code against a written plan, in small commits. v1.0.0, the GitHub and project-site launch, went out on 2026-04-01. The current version, v1.1.1, shipped on 2026-04-10. It is live on the Chrome Web Store and Firefox Add-ons, and the source is public.
Problem
- Any page. The box has to work on every site without breaking it or being broken by it: the page’s CSS, its content security policy, its own keyboard shortcuts.
- Zero setup. No account, no API key, no options page.
- Nothing collected. A content script on every URL draws store-review scrutiny. The extension sends nothing anywhere. It opens a URL.
- Small. No backend, no runtime dependencies, no bundler.
Firefox was out of scope in the design doc. The extension gained Firefox support two days later, in v0.5.0, from the same source.
The extension doesn’t answer anything. It opens Perplexity in a tab. No inline answers keeps it dependency-free and keeps Perplexity’s API terms out of it. The hotkey is Ctrl+` on every platform, Mac included, because Cmd+` cycles windows on macOS.
What I built
The extension is four files plus icons. The source is what ships.
- The overlay.
content.jsruns on every page fromdocument_start. The firstCtrl+`builds the overlay inside a closed Shadow DOM, so page CSS can’t reach it. Its stylesheet is fetched from the extension and injected into the shadow root. Selected text pre-fills the box (v0.4.0).Enteropensperplexity.ai/search?q=with the encoded query in a new tab.Escor a click outside closes it. Focus stays in the box while it’s open. - Search modes. v1.1.0 added
Alt+Enter, which opens results in a 480×700 popup in the bottom-right corner. The footer now lists the modifiers: Ctrl for a background tab, Shift for a new window, Alt for the popup. v1.1.1 followed within a day: on macOS the footer says Command and Option. - The toolbar icon opens perplexity.ai. That is all
background.jsdoes. - Packaging.
node build.jswrites the Chrome and Firefox zips from one source. It is a pure-Node zip writer with no dependencies. Files go in a fixed order with one timestamp per build. Nothing is minified or transformed, so the zip’s files match the repo and a reviewer can diff them. The Firefox listing says so.
My rule: each fix or feature bumps the manifest version, though some fixes waited for the next bump. That gave ten versions, v0.1.0 to v1.1.1, between 2026-03-31 and 2026-04-10. Each one has a line in the public changelog.
How I knew it worked
Typing in the box could fire the page’s own shortcuts: on YouTube, the video player’s. My first fix, on 2026-03-31, stopped keydown events at the shadow root. Wrong layer. YouTube listens on window in the capture phase, so it saw every key before the overlay did. It also checks whether document.activeElement is an input, and shadow DOM retargets that to the host <div>. The bug was in v1.0.0, the GitHub and project-site launch. v1.0.1, the next day, runs the script at document_start so its window listeners register first. It stops keydown, keypress and keyup outright and reports the real input as the active element. The fix landed before the Chrome listing went live, and v1.0.1 is the first version Firefox Add-ons lists.
Store validators. Firefox’s validator failed the package: new extensions must declare their data collection. Getting the declaration right took three commits in about five minutes. Add the field. Make it an object with required and optional arrays. Then set it to ["none"], because an empty array is invalid. The field arrived in Firefox 140, so 140 became the minimum version. The same pass replaced innerHTML with DOM construction after a validator warning.
Chrome review. On 2026-04-02 my docs page said the Chrome listing was pending review. I linked it on 2026-04-04. Firefox lists v1.1.1 as released on 2026-04-10. Chrome shows the update on 2026-04-13.
Cross-platform. At first the shortcut didn’t fire on macOS. I matched e.key, which varies across platforms when a modifier is held. On 2026-04-01 I switched to e.code, the physical key.
Tests. Four unit tests, all on the URL builder, run in a browser page. The page redeclares buildSearchUrl instead of importing it, so it tests a copy. That is the only automated coverage. The keyboard handling has none.
Adoption. Small numbers, read off the store pages on 2026-10-01.
None of the fixes above came from a user report. There are no user reports yet.
What I’d change
Own less of the text field. v1.0.1 calls preventDefault on every key at window, so no keystroke reaches the input on its own. Typing is re-implemented by hand: characters, Backspace, Delete, arrows, Home, End, select-all and paste. Every other key is cancelled, undo and copy included. I’d test whether stopping propagation alone blocks the page while leaving the field native.
Build a feedback path. The extension collects nothing, by design. That leaves the store counters as the only signal, and they are near zero. My own docs page still says the Chrome listing is pending review and tells Chrome users to load the extension from source. I’d fix that first, then give users a visible way to report a problem.
Close the release gaps. Git tags stop at v1.0.1 while both stores ship 1.1.1. Firefox Add-ons lists an MIT license, and the repo has no LICENSE file. Both are small fixes.
Revisit a non-goal. The roadmap has a configurable shortcut on it. That needs the options page the design doc ruled out.
Links
- Chrome Web Store: install for Chrome.
- Firefox Add-ons: install for Firefox.
- Firefox version history: the three listed versions, with release notes.
- Source: the extension, the build script and the tests.
- Project site: landing page, docs and the full changelog.