···11-## Contributing to ATProto Social
11+# Contributing to ATProto Social
2233-### Development install (temporary)
33+## Development install (temporary)
44551. Open `about:debugging#/runtime/this-firefox`.
662. Click **Load Temporary Add-on…** and choose `manifest.json` inside the
···991010> This method is ideal while iterating; Firefox forgets the add-on on restart.
11111212-### Development tips
1212+## Development tips
13131414- Inspect background/service-worker logs from `about:debugging` → **Inspect**.
1515- The UI scripts (`popup.js` and `options.js`) log to the DevTools console
···1818 directory (see workflow below).
1919- Licensed under the [Apache License 2.0](./LICENSE).
20202121-### Implementation notes
2121+## Implementation notes
22222323- The background worker discovers the user's PDS by resolving the handle
2424 (`com.atproto.identity.resolveHandle` + PLC lookup).
···3131- Maximum lengths follow the current Frontpage limits (120 characters for the
3232 title, 2048 for URLs).
33333434-### Self-distribution pipeline
3434+## Cutting a release
3535+3636+Mozilla requires every signed upload to have a unique version number, so the
3737+first step is always bumping the version.
3838+3939+**1. Bump the version in `extension/manifest.json`:**
4040+4141+```json
4242+"version": "0.1.7"
4343+```
4444+4545+**2. Commit and push to `main`:**
4646+4747+```sh
4848+git add extension/manifest.json
4949+git commit -m "Bump version to 0.1.7"
5050+git push
5151+```
5252+5353+**3. Trigger the `package-extension` workflow:**
5454+5555+Via the GitHub UI (`Actions` → **package-extension** → **Run workflow**), or
5656+with the `gh` CLI:
5757+5858+```sh
5959+gh workflow run package-extension.yml --repo antonmry/atproto_firefox_plugin
6060+```
6161+6262+**4. Monitor the run:**
35633636-This repository includes `.github/workflows/package-extension.yml` which builds
3737-(and optionally signs) the add-on using
3838-[`web-ext`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/).
6464+```sh
6565+gh run list --workflow=package-extension.yml --repo antonmry/atproto_firefox_plugin
6666+gh run watch --repo antonmry/atproto_firefox_plugin
6767+```
39684040-1. Configure `AMO_JWT_ISSUER` and `AMO_JWT_SECRET` repository secrets with your
4141- AMO API credentials if you want automatic signing. Without the secrets, the
4242- workflow still produces an unsigned ZIP you can download.
4343-2. Trigger the workflow manually (`Actions` → **package-extension** →
4444- **Run workflow**).
4545-3. Download the artifacts:
4646- - `frontpage-extension-unsigned` contains the ZIP that `web-ext build`
4747- generates.
4848- - `frontpage-extension-signed` (only when secrets are present) contains the
4949- signed `.xpi` from AMO for self-hosting.
5050-4. Each run also publishes a GitHub Release (tagged `v<version>-<run-id>`) that
5151- ships the same ZIP/XPI assets, so you can share a permanent download link.
5252- - Mozilla requires every signed upload to have a unique version number. Bump
5353- `version` in `extension/manifest.json` before rerunning the workflow if you
5454- need a new signed package.
6969+**5. Check the resulting release:**
55705656-These artifacts can be hosted directly for self-distribution as described in the
7171+```sh
7272+gh release list --repo antonmry/atproto_firefox_plugin
7373+gh release view --repo antonmry/atproto_firefox_plugin
7474+```
7575+7676+The workflow publishes a GitHub Release tagged `v<version>-<run-id>` with the
7777+signed `.xpi` (when `AMO_JWT_ISSUER` and `AMO_JWT_SECRET` secrets are set) and
7878+an unsigned `.zip`. These artifacts can be hosted directly for self-distribution
7979+as described in the
5780[Mozilla documentation](https://extensionworkshop.com/documentation/publish/self-distribution/).
58815959-### Tangled mirror
8282+## Tangled mirror
60836184The `mirror-to-tangled.yml` workflow pushes every commit on `main` to Tangled, a
6285federated Git hosting platform built on ATProto. Browse the mirror at