Capture a job posting from the page you are looking at, straight into your Postulo instance. Firefox extension. https://source.tiagoagueda.com/postulo/postulo
  • JavaScript 100%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tiago Águeda aafb3ae6ef
All checks were successful
CI / build (push) Successful in 18s
Add issue forms for bugs and feature requests (#15)
2026-11-11 23:41:34 +00:00
.forgejo Add issue forms for bugs and feature requests (#15) 2026-11-11 23:41:34 +00:00
scripts Build from postulo-chromium v0.5.0; version 0.5.0 (#14) 2026-11-01 15:41:54 +00:00
test Pin only a full commit SHA of postulo-chromium, and build nothing else 2026-10-19 09:04:54 +02:00
.gitignore The Postulo extension for Firefox, assembled from the shared source 2026-09-05 23:30:51 +02:00
LICENSE The Postulo extension for Firefox, assembled from the shared source 2026-09-05 23:30:51 +02:00
package-lock.json Build from postulo-chromium v0.5.0; version 0.5.0 (#14) 2026-11-01 15:41:54 +00:00
package.json Build from postulo-chromium v0.5.0; version 0.5.0 (#14) 2026-11-01 15:41:54 +00:00
README.md Describe the stricter pin and the audit in the README 2026-10-19 09:05:05 +02:00
source.json Build from postulo-chromium v0.5.0; version 0.5.0 (#14) 2026-11-01 15:41:54 +00:00

postulo-firefox

The Postulo browser extension for Firefox, Firefox for Android, and the forks — LibreWolf, Zen, Waterfox, Floorp. One button sends the job posting you are looking at to your own Postulo, for review.

The code is the same as the Chromium extension and lives in postulo-chromium, which builds for both browsers from one source. This repository holds what Firefox and addons.mozilla.org need and nothing else: the pin to the shared source (source.json), the build that assembles the Firefox package from it, the signing and listing notes, and CI. Everything in postulo-chromium's README about privacy and setup applies here.

What Firefox does differently, and how the build handles it

  • Background. Firefox runs an event page (background.scripts), not a service worker. The shared manifest lists both; the Firefox build keeps scripts.
  • Identity. browser_specific_settings.gecko.id (postulo@tiagoagueda.com) is required for a Manifest V3 extension to be signed and to keep its storage across updates. It is in the shared manifest and stays in the Firefox build.
  • Host permissions are opt-in. Firefox grants nothing at install. The extension asks for your instance's origin when you Save the settings, from that click, and says so if you refuse — then it can do nothing, and tells you why.
  • Signing is mandatory. Release Firefox refuses unsigned extensions. npm run sign submits the build to addons.mozilla.org (needs WEB_EXT_API_KEY and WEB_EXT_API_SECRET from your AMO account); Developer Edition and Nightly load dist/ unsigned from about:debugging for development.
  • Android. Firefox for Android installs from addons.mozilla.org, so a capture from a phone comes with the listing.
  • Minimum version. The shared manifest declares data_collection_permissions (required: ["none"] — the extension collects nothing), which Firefox understands from 140 and Firefox for Android from 142. strict_min_version says so: 140 on desktop, 142 on Android. An older Firefox would install the extension and ignore the declaration, which is the one thing a declaration about data must not do. Both values live in postulo-chromium's src/manifest.json, the one manifest, and reach here through the pin.

Build

npm ci
npm run check:pin  # source.json pins something that cannot move
npm run audit      # no new high or critical advisory in the development chain
npm run build      # clones postulo-chromium at the pinned ref and assembles dist/
npm run lint       # web-ext lint on dist/
npm run package    # a zip under web-ext-artifacts/

The pin

source.json names the commit of postulo-chromium this package is built from, and it is never a branch. addons.mozilla.org rebuilds a source submission and compares it to the package: with "ref": "main" the reviewer's build is a later extension than the submitted one, and the Firefox and Chromium extensions quietly stop being the same extension. npm run check:pin, which CI runs before the build, refuses a branch, HEAD, a tag name or a short SHA (a tag can be moved: the pin is always a full 40-hex commit), refuses any repository but postulo-chromium's (the build runs that repository's scripts/build.mjs), and — once postulo-chromium cuts its first tag — refuses any pin that is not the commit of the latest of them. postulo-chromium has no tag yet, so the pin is the full commit SHA of its main; the check fails when main is ahead of it by commits that change src/ (naming them), so a fix to the shared source cannot skip this package unnoticed, and the first tag replaces it. npm test holds that rule against a throwaway repository.

To ship a new version: tag postulo-chromium, put the full SHA of the commit that tag points at in source.json, tag this repository vX.Y.Z — CI then builds, lints and leaves the zip as an artifact — and run npm run sign (or upload that zip on addons.mozilla.org). Signing is not done in CI: it needs the AMO credentials.

Licence

AGPL-3.0-or-later, like Postulo.