# IPFS Companion MV3
###### tags: `companion` `mv3` `webextension` `ipfs`
## Browser support for Manifest V3
| Browser | Supported | Planned | links | Alpha Support |
| ----------------- | ---------------- | ---------------- |------- | ------------- |
| Chrome |:heavy_check_mark:|:heavy_check_mark: | [:link:][Chrome-MV3] | ✔|
| Firefox |:heavy_check_mark:|:heavy_check_mark: | [:link:][Firefox-MV3] | 🚧|
| Safari |:x: |:heavy_check_mark: | [:link:][Safari-MV3] | 🛑|
[Chrome-MV3]: https://developer.chrome.com/docs/extensions/mv3/intro/
[Firefox-MV3]: https://blog.mozilla.org/addons/2021/05/27/manifest-v3-update/
[Safari-MV3]: https://developer.apple.com/forums/thread/685530
[ipfs-companion GitHub repo](https://github.com/ipfs/ipfs-companion)
[ipfs-companion MV3 tracking issue](https://github.com/ipfs/ipfs-companion/issues/666)
## Extension Capabilities
TABLE KEY:
* ✔ Possible in MV3 with working code in https://github.com/meandavejustice/ipfs-mv3-prototype
* ❔ Not yet determined
* 🛑 Not possible or cancelled
Alpha column = required for alpha:
* ✔ complete
* 🚧 in progress
* 🔮 planned for future release
* 🛑 not possible or cancelled
* ❔ Not yet determined
### Automatically detect and redirect IPFS resources
| STATUS | FEATURE | PRIORITY | API surface | Alpha |
| ------ | ------- | -------- | ----------- | ----- |
| ✔ | Detect URLs with IPFS paths | HIGH | MV3, is-ipfs | 🚧/🔮 |
| ✔ | Detect DNSLink-enabled URLs | HIGH | MV3, ipfs-http-client | ✔ |
| ✔ | Detect pages with x-ipfs-path headers | MEDIUM | MV3, is-ipfs | 🚧 |
| ✔ | Toggle redirects globally or per site | HIGH |MV3 | 🔮 |
| ✔ | Recover from HTTP/Network failures (onError) | MEDIUM | MV3, ipfs-http-client, is-ipfs | 🔮 |
### Access frequently-used IPFS actions from your browser bar
| STATUS | FEATURE | PRIORITY | API surface | Alpha |
| ------ | ------- | -------- | ---------- | ----- |
| ✔ | List peers in cube icon | SKIP - see [#662](https://github.com/ipfs/ipfs-companion/issues/662) [#1027](https://github.com/ipfs/ipfs-companion/issues/1027) | XX |🛑|
| ✔ | check ipfs API and gateway status by clicking cube icon | LOW | ipfs-http-client | ✔ |
| ✔ | right-click assets to add them to ipfs (including option to preserve filenames) | LOW | ipfs-http-client |🔮|
| ✔ | Import option in the main menu for quick drag-and-drop import from a browser tab | LOW | ipfs-http-client | 🔮|
| ✔ | Import to Files (MFS via `ipfs.files.cp`) | LOW | ipfs-http-client | 🔮|
| ✔ | Copy shareable public gateway links, IPFS content paths, or CIDs | LOW | ipfs-http-client | ✔ |
| ✔ | Launch the IPFS Web UI dashboard with single click | MEDIUM | ipfs-http-client | 🚧 |
| ✔ | Toggle gateway redirects or switch all IPFS Companion features on/off | MEDIUM | MV3 |🚧 |
| ✔ | [Surface CIDs to developers](https://filecoinproject.slack.com/archives/C02EQ3ELFBQ/p1639033925100700) | MEDIUM | MV3 |🔮| |
### Switch all IPFS Companion features on/off
| STATUS | FEATURE | PRIORITY | API surface | Alpha |
| ------ | -------- | -------- | ---- | ----- |
| ✔ | use the on/off button at the top of the IPFS Companion menu | HIGH | MV3 | 🚧 |
### Experiments
| STATUS | FEATURE | PRIORITY | API surface | Alpha |
| ------ | -------- | -------- | ---- | ----- |
| ❔ | Make plaintext IPFS links clickable | LOW | | ❔ |
| ❔ | Re-route requests made via experimental protocols to an HTTP gateway (public or custom)| LOW | MV3 | ❔|
| 🛑(js-ipfs) - ❔(brave) | Switch between the external HTTP API of your local IPFS node (default setting) and a js-ipfs node embedded in your browser | LOW | MV3, ipfs-http-client | 🛑 |
## PLANNING
### TIMELINE: January 2023
https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/
:dart: ~~MILESTONE 1 by end of Q4 2021~~ COMPLETE
:dart: MILESTONE 2 by end of Q1 2022
:dart: MILESTONE 3 by end of Q2 2022 (if prioritized)
### Milestone 1: Prove what limits of MV3 are
Goal: ensure there are no unknown unknowns around redirects and executing HTTP RPC calls over ipfs-http-client library.
- ipfs redirects
- detecting ipfs:// and ipns:// search queries (poor man's protocol handler support) (🛑 blocked by https://github.com/ipfs/ipfs-companion/issues/666#issuecomment-1069312218)
- content paths /ipfs/cid and /ipns/id
- ~~dnslink: resolving, adding and removing rules~~ COMPLETE ✔
- network error handling (recovering broken http links by loading from ipfs where possible) BUMPED TO FUTURE 🔮
- ~~http rpc API requests to local go-ipfs node (are we able to disable CORS and access /api/v0/* without user interaction?)~~ COMPLETE ✔
### Milestone 2: Build MV3 extension
Goal: reimplement companion in MV3
- port existing GUI features (minus peer count on badge) IN PROGRESS 🚧
- ~~define edge cases~~ (documented in https://github.com/ipfs/ipfs-companion/issues/666)
- ~~remove hack to keep content script open~~ (this is not able to be removed https://github.com/ipfs/ipfs-companion/issues/666#issuecomment-1022798229)
- test coverage
- ~~sourcemaps~~ (moving this to milestone 3, as sourcemaps are currently needed for debugging, "nice to have")
- browser parity between firefox and chrome IN PROGRESS 🚧
- ~~performance testing~~ (moving to milestone 3)
- ~~Make our jsbuild system efficient~~ COMPLETE ✔
### Milestone 3: Shift functionality with non technical end users in mind
[Companion mv3 redesign doc](https://hackmd.io/v8jvq4OEQEu-1IYEteETsg)
- Start discussions with designers for redesign
- define what new default behavior should be
- Create a story for non technical users vs power users
- super slow when enabled against local node, whats the story for speeding this up? (visual cues for searching network, etc)
- behavior of brave implementation seems to be better for end users, document whats different about brave so we can take what works and apply it to our new default UX
- We should use the badge icon to notify users of availablity of a page in ipfs
### Milestone 4: Deprecate mv2
Goal: sunset old codebase and publish new one to addon stores
- Implement any design tweaks(need design, maybe trigram?)
- dependent on Safari adding full support for MV3 (decision to drop Safari?)
- add experimental feature system
- deprecate ipfs-companion mv2
- sourcemaps
- performance testing
- create a template/library for [ipfs-enabled extensions](https://hackmd.io/Nyn1Ba8MRceGOP7KFf0yCQ)