Chrome
Works on stock Chrome with Developer Mode enabled. No store account needed.
- Download the repo zip and unzip it. (Or
git clone.)
- Open
chrome://extensions.
- Toggle Developer mode on (top right).
- Click Load unpacked and select the
chrome-extension/ folder.
- Pin the Q icon to the toolbar.
Chrome shows "extension was loaded unpacked" once on startup — that's expected.
Microsoft Edge
Edge is Chromium so the steps are nearly identical.
- Download or clone the repo.
- Open
edge://extensions.
- Toggle Developer mode.
- Load unpacked → select
edge-extension/.
Firefox
Two paths: temporary (instant, vanishes on restart) or signed XPI (permanent).
Temporary install
- Open
about:debugging#/runtime/this-firefox.
- Click Load Temporary Add-on…
- Select
firefox-extension/manifest.json.
Permanent install (signed XPI)
For a permanent install Firefox requires the add-on to be signed by Mozilla, but you don't need to publish it on AMO — choose self-distribution when you submit. We ship signed XPIs on the GitHub Releases page; drop the file onto Firefox to install.
Safari
Safari is the strictest. Two options:
Option A — Run unsigned during development
- Safari → Settings → Advanced → enable Show Develop menu.
- Develop → Allow Unsigned Extensions (re-prompts every Safari restart).
- Build the Xcode wrapper from
safari-extension/Resources/ per the README in that folder, then run it once from Xcode.
- Settings → Extensions → enable Qrammerly.
Option B — Notarize the host app
Notarization is an automated Apple security scan, not the App Store editorial review. After notarization, Safari runs the extension on any Mac forever. We ship a notarized .dmg on GitHub Releases.
macOS app
Distributable directly as a .dmg — no App Store needed.
From Releases
- Download
Qrammerly.dmg from GitHub Releases.
- Drag Qrammerly.app into Applications.
- If macOS shows a Gatekeeper warning, right-click the app → Open → confirm. (Notarized builds skip this entirely.)
- Grant Accessibility on first launch.
From source
cd mac-app
swift run
Self-host the API (optional)
By default everything talks to qrammerly.com/v1/*. Run your own backend if you'd rather keep keys and corpus on your hardware.
# Cloudflare Workers (free tier, recommended)
cd worker
npm install
npx wrangler login
npm run deploy
# Or self-hosted Docker
docker compose up --build
Then change the API endpoint in the extension popup's Settings tab.