text:
var path = require('path');
var webpack = require('webpack')
// var ROOT = path.resolve(__dirname, 'src/main/resources/static');
var ROOT = path.resolve(__dirname, 'src/main/webapp');
var SRC = path.resolve(ROOT, 'javascript');
// var DEST = path.resolve(__dirname, 'src/main/resources/static/dist');
var DEST = path.resolve(__dirname, 'src/main/webapp/dist');

module.exports = {
  devtool: 'source-map',
  entry: {
    app: SRC + '/index.jsx',
  },
  resolve: {
    root: [
      path.resolve(ROOT, 'javascript'),
      path.resolve(ROOT, 'css')
    ],
    extensions: ['', '.js', '.jsx']
  },
  output: {
    path: DEST,
    filename: 'bundle.js',
    publicPath: '/dist/'
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        loaders: ['babel-loader?presets[]=es2015&presets[]=react'],
        include: SRC
      },

      {test: /\.css$/, loader: 'style-loader!css-loader'},
      {test: /\.less$/, loader: 'style!css!less'},

      // Needed for the css-loader when [bootstrap-webpack](https://github.com/bline/bootstrap-webpack)
      // loads bootstrap's css.
      {test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=application/font-woff'},
      {test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=application/octet-stream'},
      {test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file'},
      {test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=image/svg+xml'}
    ]
  }
};


text:
@echo off
REM This is a simple helper script used to start the webpack watch process
REM so that javascript files can be automatically reloaded when they are saved.
REM The version of node must match what's in gradle.

SET NODE_VERSION=5.8.0
SET NODE_LOC=.gradle\nodejs\node-v%NODE_VERSION%-windows-x64\bin\node
SET WEBPACK_LOC=node_modules\webpack\bin\webpack.js

%~dp0%NODE_LOC% %~dp0%WEBPACK_LOC% --watch --display-error-details

repo_name: Blastman/webpack-gradle

repo_language: JavaScript

mime_type: text/plain


text:
webpack-gradle
==============
This project is a sample Spring boot application using Webpack and React.  The goal of this application is to show a simple project using React as a Javascript framework with Spring Boot. The JS framework can be anything though.

The gradle file is setup so that webpack is always run before bootRun.  There are also utility watchJS script files that can be run on *nix/Windows which will watch your JS files and recreate a bundle.  You'll need to refresh your page to see the changes though but you will not need to restart your Spring Boot app.

For a better step by step build up on this project, check out the [blog post](https://objectpartners.com/2016/04/22/using-webpack-with-gradle/) associated with this project. If you're a Java developer new to the JS world, then it's worth a read as I go over npm and package.json and how they are used.

The watch scripts can be used after initializing the project.  Type `./gradelw bootRun` (or run via gralde task in IDE) then you can use the watch script.  Running `gralelw bootRun` or `gradlew build` will initialize the node_modules directory.


text:
<!DOCTYPE html>

  <meta charset="UTF-8">
  <title>A Test Page</title>


text:
.seat {
  display: inline-block;
  width: 40px;
  text-align: center;
}

.seat.open{
  background-color: green;
}

.seat.reserved{
  background-color: red;
}

.table{
  margin-bottom: 10px;
}

.table-title{
  font-weight: bold;
}


text:
import ReactDOM from 'react-dom';
import React from 'react';
import Table from './table';
import '../css/general.css';

ReactDOM.render(

,
  document.getElementById('content')
);


text:
import React, {Component} from "react";
import Seat from "./seat.jsx";

const seatNumbers = [1, 2, 3, 4];

export default class Table extends Component {

  render() {
    let {number, openSeats} = this.props;
    return (

Table {number}

        {seatNumbers.map(seatNumber => {
          return <Seat key={seatNumber} number={seatNumber}
                       open={openSeats.indexOf(seatNumber) === -1}/>;
        })}

    );
  }
}


text:
import React, {Component} from 'react'

export default class Seat extends Component {

  render(){
    let {number, open} = this.props;
    return (

{number}

    )
  }
}


text:
package com.objectpartners.gradlenpm;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }

}


text:
package com.objectpartners.gradlenpm;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}


text:
#Sun Mar 06 19:05:22 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-all.zip


text:
# **IPFS Companion Privacy Policy**

First Posted: 2019-02-15

Last Update: 2023-01-27 ([change history](https://github.com/ipfs-shipyard/ipfs-companion/commits/main/PRIVACY-POLICY.md))

This Privacy Policy governs the use of the IPFS Companion browser extension
offered by Protocol Labs, Inc. (“**IPFS Companion**” or the “**Service**”).

The Service is offered subject to your acceptance without modification of all
the terms and conditions herein, and all other other operating rules, policies
and procedures that may be updated from time to time.  By accessing or using any
part of the Service, you agree to be bound by the terms and conditions of the
Privacy Policy.  If you do not agree to all of the terms and conditions of this
Privacy Policy, then you may not access the Service.

**Personal Information**

We do not collect personal information from the users of the Service.

**Metrics**

We collect non-user-specific metrics via the Service. For more information on
how to change your preferences with respect to the metrics, please contact us
via methods mentioned below.

**Additional Privacy Considerations**

If you add files to the IPFS Network using the IPFS Companion extension, they
will be stored on your local IPFS Network node. Those files are also then cached
by anyone who retrieves those files from the IPFS network and co-hosted on that
user’s local IPFS Network node. Generally, cached files will eventually expire,
but it’s possible for a user with whom you have shared access to such files (by
sharing the relevant Content Identifier or CID) to pin that data, which means
the cached files then will not expire and will remain stored on such user’s
local IPFS Network node. All content shared with the IPFS Network is public by
default. This means your files and data that you’ve added will be accessible to
everyone who knows the CID or queries the data on the IPFS Network. If you want
to share certain materials or data privately, you must encrypt such data before
adding it to the IPFS Network.

If you are using “Linkify IPFS Addresses” or “Catch Unhandled IPFS Protocols”
experiments, websites will be able to detect you are running IPFS Companion.
This behavior can be changed on the Preferences screen by disabling mentioned experiments.

If you are using DNSLink (its lookup is enabled by default), then the IPFS node
will be executing DNS queries for all domain names visited during browsing, and
those queries will use a DNS resolver configured in your operating system. To
disable this behavior, set "DNSLink lookup" to "Off" in Preferences.

**Contact Us**

Questions about our Privacy Policy?  Please contact us at
<legalrequests@protocol.ai>.  For general information, please reach out via a [new issue on our GitHub repo](https://github.com/ipfs/ipfs-companion/issues/new/choose).

**Changes to our Privacy Policy**

If we decide to change our Privacy Policy, we will post those changes on this
page and also at https://ipfs.tech/companion-privacy.

This document is CC-BY-SA. It was last updated January 24th, 2023.

repo_name: ipfs/ipfs-companion

mime_type: text/x-diff


text:
{
  "compilerOptions": {
    "target": "es2016",
    "allowJs": true,
    "checkJs": true,
    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */

    /* Type Checking */
    "strict": true,
    "skipLibCheck": false,
    "emitDeclarationOnly": true,
    "declaration": true,
    "moduleResolution": "nodenext",
    "noImplicitAny": false
  },
  "include": ["add-on/src/**/*.js", "add-on/src/**/*.ts"]
}


text:
## [2.6.3](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.6.2...v2.6.3) (2018-12-10)

### Bug Fixes

* **ci:** switch to nodejs v10.11.0 ([687a4d8](https://github.com/ipfs-shipyard/ipfs-companion/commit/687a4d8))
* **security:** remove  event-stream/flatmap-stream ([d4db63a](https://github.com/ipfs-shipyard/ipfs-companion/commit/d4db63a))
* Origin in API requests under Chromium 72 ([#631](https://github.com/ipfs-shipyard/ipfs-companion/issues/631)) ([8866f76](https://github.com/ipfs-shipyard/ipfs-companion/commit/8866f76))

## [2.22.1](https://github.com/ipfs/ipfs-companion/compare/v2.22.0...v2.22.1) (2023-02-22)

### Bug Fixes

* **recovery:** :bug: false-positive for non-gateway URLs ([#1163](https://github.com/ipfs/ipfs-companion/issues/1163)) ([0ee35d2](https://github.com/ipfs/ipfs-companion/commit/0ee35d26f2002ccef84ead30cf6cc2a851ca1c60))
* **release-automation:** :construction_worker: should no longer be needed ([#1158](https://github.com/ipfs/ipfs-companion/issues/1158)) ([7651e9e](https://github.com/ipfs/ipfs-companion/commit/7651e9e1a3a92b819bf76eb1e7b1c319f247f60f))
* **release-automation:** :green_heart: stupid hack to add tag in CI ([#1161](https://github.com/ipfs/ipfs-companion/issues/1161)) ([9ea9897](https://github.com/ipfs/ipfs-companion/commit/9ea9897477ae6e6f59a2edefd1c4bf9d881d72a8))
* replace IPFS API with Kubo RPC ([#1164](https://github.com/ipfs/ipfs-companion/issues/1164)) ([1a6495d](https://github.com/ipfs/ipfs-companion/commit/1a6495de5e1017b533cac4cbf869577f64541770))

## [2.22.0](https://github.com/ipfs/ipfs-companion/compare/ipfs-companion-v2.21.0...ipfs-companion-v2.22.0) (2023-02-15)

### Features

* Adding Release Automation ([#1122](https://github.com/ipfs/ipfs-companion/issues/1122)) ([1ed411e](https://github.com/ipfs/ipfs-companion/commit/1ed411e5006a5a477c8002765977f16e1ff755a5))
* recovery page when local gateway is unreachable ([#1125](https://github.com/ipfs/ipfs-companion/issues/1125)) ([a74fbb3](https://github.com/ipfs/ipfs-companion/commit/a74fbb3736e6f29d337b6046b088f25a2d86e5b0))

### Bug Fixes

* :fire: Allow automation to run from manual triggers. ([#1143](https://github.com/ipfs/ipfs-companion/issues/1143)) ([a61e081](https://github.com/ipfs/ipfs-companion/commit/a61e081a75cee6d2a6c66d1c58819e9d63656a51))
* **release-automation:** :bug: Semver Path ([7036f6d](https://github.com/ipfs/ipfs-companion/commit/7036f6de0c9876e35d1ea0a9b1a5a25e6364d894))
* **release-automation:** Release Please Using Manifests ([#1149](https://github.com/ipfs/ipfs-companion/issues/1149)) ([f360ff8](https://github.com/ipfs/ipfs-companion/commit/f360ff8f2b132904e74ad551f32eaf07395c048c))

## [2.6.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.6.1...v2.6.2) (2018-11-22)

### Bug Fixes

* disable redirect for CID-in-subdomain ([#617](https://github.com/ipfs-shipyard/ipfs-companion/issues/617)) ([458bf34](https://github.com/ipfs-shipyard/ipfs-companion/commit/458bf34))
* **ci:** run-s: not found ([#620](https://github.com/ipfs-shipyard/ipfs-companion/issues/620)) ([00e87f8](https://github.com/ipfs-shipyard/ipfs-companion/commit/00e87f8))
* Origin in API calls in Firefox-65.0a1 ([#623](https://github.com/ipfs-shipyard/ipfs-companion/issues/623)) ([000e8da](https://github.com/ipfs-shipyard/ipfs-companion/commit/000e8da))

### Features

* Update Web UI to v2.2.0 ([#618](https://github.com/ipfs-shipyard/ipfs-companion/issues/618)) ([9c2b19a](https://github.com/ipfs-shipyard/ipfs-companion/commit/9c2b19a))

## [2.6.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.6.0...v2.6.1) (2018-11-08)

### Bug Fixes

* CORS false-positive in Chrome 71 ([#616](https://github.com/ipfs-shipyard/ipfs-companion/issues/616)) ([01e72f2](https://github.com/ipfs-shipyard/ipfs-companion/commit/01e72f2))

# [2.6.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.5.1...v2.6.0) (2018-11-07)

### Bug Fixes

* add support for quic multiaddrs ([#613](https://github.com/ipfs-shipyard/ipfs-companion/issues/613)) ([98134f6](https://github.com/ipfs-shipyard/ipfs-companion/commit/98134f6))
* add support for quic multiaddrs ([#613](https://github.com/ipfs-shipyard/ipfs-companion/issues/613)) ([9225b31](https://github.com/ipfs-shipyard/ipfs-companion/commit/9225b31))
* Chromium crash on 150MB upload ([19cf1dd](https://github.com/ipfs-shipyard/ipfs-companion/commit/19cf1dd))
* **ci:** switch fallback download to public gateway ([4d86259](https://github.com/ipfs-shipyard/ipfs-companion/commit/4d86259))
* edge cases around localhost redirects ([#607](https://github.com/ipfs-shipyard/ipfs-companion/issues/607)) ([b7606ae](https://github.com/ipfs-shipyard/ipfs-companion/commit/b7606ae)), closes [#604](https://github.com/ipfs-shipyard/ipfs-companion/issues/604)
* go back to js-ipfs 0.31.7 ([d79367d](https://github.com/ipfs-shipyard/ipfs-companion/commit/d79367d))
* menu items requiring both api and ipfs context ([1bcaa9d](https://github.com/ipfs-shipyard/ipfs-companion/commit/1bcaa9d))
* pin.ls ignored opts when hash was present ([#608](https://github.com/ipfs-shipyard/ipfs-companion/issues/608)) ([f703392](https://github.com/ipfs-shipyard/ipfs-companion/commit/f703392)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/360#issuecomment-427525801](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/360/issues/issuecomment-427525801) [#360](https://github.com/ipfs-shipyard/ipfs-companion/issues/360)
* reload bundled WebUI on IPFS Client change ([aa616fd](https://github.com/ipfs-shipyard/ipfs-companion/commit/aa616fd))
* remove maps from final bundle ([b170b22](https://github.com/ipfs-shipyard/ipfs-companion/commit/b170b22))
* use random preloader as a fallback ([fd7586f](https://github.com/ipfs-shipyard/ipfs-companion/commit/fd7586f))

### Features

* bundle the new WebUI ([d8fa019](https://github.com/ipfs-shipyard/ipfs-companion/commit/d8fa019))
* context option to Copy Direct CID ([bc35aa7](https://github.com/ipfs-shipyard/ipfs-companion/commit/bc35aa7)), closes [#508](https://github.com/ipfs-shipyard/ipfs-companion/issues/508)
* display revision in ipfs-webui ([a6c4a72](https://github.com/ipfs-shipyard/ipfs-companion/commit/a6c4a72))
* ipfs-webui v2.1.1 ([#611](https://github.com/ipfs-shipyard/ipfs-companion/issues/611)) ([f52749b](https://github.com/ipfs-shipyard/ipfs-companion/commit/f52749b))
* locale sync ([88ff7e6](https://github.com/ipfs-shipyard/ipfs-companion/commit/88ff7e6))
* refresh IPNS webui when API backend changes ([80cfce2](https://github.com/ipfs-shipyard/ipfs-companion/commit/80cfce2))
* separate context  action for links ([f517a3f](https://github.com/ipfs-shipyard/ipfs-companion/commit/f517a3f)), closes [#579](https://github.com/ipfs-shipyard/ipfs-companion/issues/579)
* **locales:** added ko-KR and zh-TW, updated no ([c8bbdb8](https://github.com/ipfs-shipyard/ipfs-companion/commit/c8bbdb8))
* separate labels for Image, Video and Audio ([bd274f7](https://github.com/ipfs-shipyard/ipfs-companion/commit/bd274f7))
* separate submenus for different contexts ([2336d9d](https://github.com/ipfs-shipyard/ipfs-companion/commit/2336d9d))
* smarter filename when adding via context menu ([b6b8638](https://github.com/ipfs-shipyard/ipfs-companion/commit/b6b8638)), closes [#599](https://github.com/ipfs-shipyard/ipfs-companion/issues/599)

## [2.5.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.5.0...v2.5.1) (2018-09-24)

### Bug Fixes

* add order to i18n links ([357a678](https://github.com/ipfs-shipyard/ipfs-companion/commit/357a678))
* always visible left column ([c0dc5a3](https://github.com/ipfs-shipyard/ipfs-companion/commit/c0dc5a3))
* check only for recursive pins ([ad84b82](https://github.com/ipfs-shipyard/ipfs-companion/commit/ad84b82)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/360#issuecomment-380631986](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/360/issues/issuecomment-380631986) [#360](https://github.com/ipfs-shipyard/ipfs-companion/issues/360)
* checkbox for panel_headerActiveToggleTitle ([602769e](https://github.com/ipfs-shipyard/ipfs-companion/commit/602769e))
* copy correct url via context menu ([1483862](https://github.com/ipfs-shipyard/ipfs-companion/commit/1483862)), closes [#571](https://github.com/ipfs-shipyard/ipfs-companion/issues/571)
* display landing page after companion init ([6c27519](https://github.com/ipfs-shipyard/ipfs-companion/commit/6c27519))
* i18n page title ([63f581e](https://github.com/ipfs-shipyard/ipfs-companion/commit/63f581e))
* i18n span renderer ([927f958](https://github.com/ipfs-shipyard/ipfs-companion/commit/927f958))
* make global toggle checkbox less ambiguous ([9c823b8](https://github.com/ipfs-shipyard/ipfs-companion/commit/9c823b8))
* pin URL with hash or query ([86760a5](https://github.com/ipfs-shipyard/ipfs-companion/commit/86760a5))
* pr review ([ec578d0](https://github.com/ipfs-shipyard/ipfs-companion/commit/ec578d0))
* pr review ([932084a](https://github.com/ipfs-shipyard/ipfs-companion/commit/932084a))
* remove bogus placeholders from source locale ([aa3c38a](https://github.com/ipfs-shipyard/ipfs-companion/commit/aa3c38a))
* remove indirect placeholder ([84c55db](https://github.com/ipfs-shipyard/ipfs-companion/commit/84c55db))
* remove title from html ([c98b516](https://github.com/ipfs-shipyard/ipfs-companion/commit/c98b516))
* **locale:** remove remapping of zh ([b7c0c5e](https://github.com/ipfs-shipyard/ipfs-companion/commit/b7c0c5e))
* replace youtube thumbnail host with IPFS ([1d609cf](https://github.com/ipfs-shipyard/ipfs-companion/commit/1d609cf))
* skip x-ipfs-path processing on active gateway ([b4cead0](https://github.com/ipfs-shipyard/ipfs-companion/commit/b4cead0))
* **locale:** rename zh to zh_CN ([40412e3](https://github.com/ipfs-shipyard/ipfs-companion/commit/40412e3))
* slow window.ipfs.files.add in Firefox ([6f6e5b3](https://github.com/ipfs-shipyard/ipfs-companion/commit/6f6e5b3))
* support gateway at localhost:80 ([dca067f](https://github.com/ipfs-shipyard/ipfs-companion/commit/dca067f))

### Features

* add i18n ([c13159d](https://github.com/ipfs-shipyard/ipfs-companion/commit/c13159d))
* Add selected text to IPFS ([27447b7](https://github.com/ipfs-shipyard/ipfs-companion/commit/27447b7)), closes [#569](https://github.com/ipfs-shipyard/ipfs-companion/issues/569)
* add Transifex config file ([5a070e1](https://github.com/ipfs-shipyard/ipfs-companion/commit/5a070e1))
* Chech and French locales ([f588802](https://github.com/ipfs-shipyard/ipfs-companion/commit/f588802))
* German - 100% translated ([40fd1a7](https://github.com/ipfs-shipyard/ipfs-companion/commit/40fd1a7))
* open landing page on first install ([b2fe74a](https://github.com/ipfs-shipyard/ipfs-companion/commit/b2fe74a))

# [2.5.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.4.4...v2.5.0) (2018-09-07)

### Bug Fixes

* **ci:** set 1h timeout for every build ([b7ef993](https://github.com/ipfs-shipyard/ipfs-companion/commit/b7ef993)), closes [/github.com/ipfs/jenkins-libs/blob/e758b80e3347a276a73cd4d463a03c0cc89995cd/vars/javascript.groovy#L212](https://github.com//github.com/ipfs/jenkins-libs/blob/e758b80e3347a276a73cd4d463a03c0cc89995cd/vars/javascript.groovy/issues/L212)
* **ci:** switch Docker to Node v10.4.1 ([d6d5934](https://github.com/ipfs-shipyard/ipfs-companion/commit/d6d5934))
* **ci:** switch Jenkins to Node v10.4.1 ([6967ef7](https://github.com/ipfs-shipyard/ipfs-companion/commit/6967ef7))
* **dnslink:** could not resolve name (recursion limit exceeded) ([4be3504](https://github.com/ipfs-shipyard/ipfs-companion/commit/4be3504)), closes [/github.com/ipfs/go-ipfs/issues/4293#issuecomment-416310364](https://github.com//github.com/ipfs/go-ipfs/issues/4293/issues/issuecomment-416310364)
* **dnslink:** recover from HTTP timeout ([d8dd8d7](https://github.com/ipfs-shipyard/ipfs-companion/commit/d8dd8d7))
* **dnslink:** try to recover only from final errors ([a433684](https://github.com/ipfs-shipyard/ipfs-companion/commit/a433684))
* 'invalid Read on closed Body' in files.add under Chrome ([ff20fb0](https://github.com/ipfs-shipyard/ipfs-companion/commit/ff20fb0)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/480#issuecomment-417657758](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/480/issues/issuecomment-417657758)
* drag & drop uploads ([d8fd3b3](https://github.com/ipfs-shipyard/ipfs-companion/commit/d8fd3b3))
* update share checkbox arrows ([e580662](https://github.com/ipfs-shipyard/ipfs-companion/commit/e580662))

### Features

* cache DNSLink lookups for 12h ([53e2891](https://github.com/ipfs-shipyard/ipfs-companion/commit/53e2891))
* poc dnslink policy with x-ipfs-header ([a02f801](https://github.com/ipfs-shipyard/ipfs-companion/commit/a02f801))
* poc lazy dnslink ([0e77766](https://github.com/ipfs-shipyard/ipfs-companion/commit/0e77766))

## [2.4.4](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.4.3...v2.4.4) (2018-08-01)

### Bug Fixes

* **linkify:** do not wrap ignore false-positives ([890ccd5](https://github.com/ipfs-shipyard/ipfs-companion/commit/890ccd5)), closes [#539](https://github.com/ipfs-shipyard/ipfs-companion/issues/539)
* pinning of IPNS paths ([68bb194](https://github.com/ipfs-shipyard/ipfs-companion/commit/68bb194))

## [2.4.3](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.4.2...v2.4.3) (2018-07-25)

### Bug Fixes

* always scope dest arg in window.ipfs.files.cp ([f5b43a9](https://github.com/ipfs-shipyard/ipfs-companion/commit/f5b43a9)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/531#pullrequestreview-139053285](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/531/issues/pullrequestreview-139053285)
* change minimizer flags to follow AEgir ([27a1dce](https://github.com/ipfs-shipyard/ipfs-companion/commit/27a1dce))
* do not prefix /ipfs/ source paths in window.ipfs.files.cp ([e16709c](https://github.com/ipfs-shipyard/ipfs-companion/commit/e16709c))
* files.cp|mv scoping for new syntax ([109565f](https://github.com/ipfs-shipyard/ipfs-companion/commit/109565f)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/530#issuecomment-405168177](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/530/issues/issuecomment-405168177)
* run linkify checks on entire parent tree ([a5b047d](https://github.com/ipfs-shipyard/ipfs-companion/commit/a5b047d))
* skip dnslink redirect for /ipfs/ paths ([bdad459](https://github.com/ipfs-shipyard/ipfs-companion/commit/bdad459))

### Features

* enable pinning with embedded js-ips node ([1fd72d4](https://github.com/ipfs-shipyard/ipfs-companion/commit/1fd72d4)), closes [#525](https://github.com/ipfs-shipyard/ipfs-companion/issues/525)
* support page actions for CID subdomains ([a0c0ca8](https://github.com/ipfs-shipyard/ipfs-companion/commit/a0c0ca8))
* upgrade to js-ipfs 0.30 ([6ca51df](https://github.com/ipfs-shipyard/ipfs-companion/commit/6ca51df))

## [2.4.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.4.1...v2.4.2) (2018-07-06)

### Bug Fixes

* additional checks for CORS XHR when dnslink is enabled ([a967a62](https://github.com/ipfs-shipyard/ipfs-companion/commit/a967a62))

### Features

* menu item to ipfs.addFromURL and keep filename ([35f1311](https://github.com/ipfs-shipyard/ipfs-companion/commit/35f1311))

## [2.4.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.4.0...v2.4.1) (2018-07-04)

### Bug Fixes

* cleanup on webRequest.onErrorOccurred ([0f11332](https://github.com/ipfs-shipyard/ipfs-companion/commit/0f11332))
* icons hover ([ca9bca8](https://github.com/ipfs-shipyard/ipfs-companion/commit/ca9bca8))
* preload request uses opt-out hint ([2bfda53](https://github.com/ipfs-shipyard/ipfs-companion/commit/2bfda53))
* rate-limiting Linkify experiment ([584ce0d](https://github.com/ipfs-shipyard/ipfs-companion/commit/584ce0d)), closes [#503](https://github.com/ipfs-shipyard/ipfs-companion/issues/503)
* restore gateway redirect for CORS XHR in Firefox ([db1a5f4](https://github.com/ipfs-shipyard/ipfs-companion/commit/db1a5f4))
* restore gateway redirect of HEAD requests ([910125e](https://github.com/ipfs-shipyard/ipfs-companion/commit/910125e))
* upload workaround for a bug in go-ipfs ([ac62df3](https://github.com/ipfs-shipyard/ipfs-companion/commit/ac62df3)), closes [#509](https://github.com/ipfs-shipyard/ipfs-companion/issues/509)
* upload workaround for a bug in go-ipfs ([b1bf771](https://github.com/ipfs-shipyard/ipfs-companion/commit/b1bf771))
* x-ipfs-companion-no-redirect examples in README ([f0d0336](https://github.com/ipfs-shipyard/ipfs-companion/commit/f0d0336)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/510#pullrequestreview-133557233](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/510/issues/pullrequestreview-133557233)

### Features

* meaningful error in redirect-based URI handler ([a6e53ba](https://github.com/ipfs-shipyard/ipfs-companion/commit/a6e53ba))
* support redirect opt-out hint in URLs ([6ea409d](https://github.com/ipfs-shipyard/ipfs-companion/commit/6ea409d))

# [2.4.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.3.1...v2.4.0) (2018-06-26)

### Bug Fixes

* addFromURL with URL-escaped file names ([4870354](https://github.com/ipfs-shipyard/ipfs-companion/commit/4870354))
* avoid UI jitter by keeping disabled menu items ([8bc5b7a](https://github.com/ipfs-shipyard/ipfs-companion/commit/8bc5b7a)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/500#issuecomment-397900418](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/500/issues/issuecomment-397900418)
* avoid window.ipfs in non-HTML context ([4482b40](https://github.com/ipfs-shipyard/ipfs-companion/commit/4482b40))
* change script name to webpack bundle ([3c53eb5](https://github.com/ipfs-shipyard/ipfs-companion/commit/3c53eb5))
* disable sharing action when upload is not possible ([8f2a719](https://github.com/ipfs-shipyard/ipfs-companion/commit/8f2a719)), closes [#477](https://github.com/ipfs-shipyard/ipfs-companion/issues/477)
* do not redirect preload requests ([1492d8d](https://github.com/ipfs-shipyard/ipfs-companion/commit/1492d8d))
* faded diagnostics in inactive state ([dad0286](https://github.com/ipfs-shipyard/ipfs-companion/commit/dad0286)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/500#issuecomment-397577842](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/500/issues/issuecomment-397577842)
* Fix addon-linter error for /content_scripts ([f3e3628](https://github.com/ipfs-shipyard/ipfs-companion/commit/f3e3628))
* hide unavailable actions in incognito mode ([29d7bb1](https://github.com/ipfs-shipyard/ipfs-companion/commit/29d7bb1))
* hide unused options when embedded node is active ([7706f62](https://github.com/ipfs-shipyard/ipfs-companion/commit/7706f62))
* limit the CORS workaround to Firefox ([8a713cd](https://github.com/ipfs-shipyard/ipfs-companion/commit/8a713cd)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/494#issuecomment-394647930](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/494/issues/issuecomment-394647930)
* make action icons actionable in suspended state ([19ba4ac](https://github.com/ipfs-shipyard/ipfs-companion/commit/19ba4ac)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/500#issuecomment-398695644](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/500/issues/issuecomment-398695644)
* release v2.3.1.9890 to Firefox Beta Channel ([e39a0a6](https://github.com/ipfs-shipyard/ipfs-companion/commit/e39a0a6))
* save vertical space by moving on/off toggle ([8b2197b](https://github.com/ipfs-shipyard/ipfs-companion/commit/8b2197b)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/500#issuecomment-398048452](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/500/issues/issuecomment-398048452)
* skip content script injection when inactive ([1d29ba9](https://github.com/ipfs-shipyard/ipfs-companion/commit/1d29ba9))
* skip XHRs that would fail due to CORS bug ([231df22](https://github.com/ipfs-shipyard/ipfs-companion/commit/231df22)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/436#issuecomment-378254294](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/436/issues/issuecomment-378254294)

### Features

* add global toggle to Preferences screen ([a7851d2](https://github.com/ipfs-shipyard/ipfs-companion/commit/a7851d2))
* add icon row with quick actions ([15eb284](https://github.com/ipfs-shipyard/ipfs-companion/commit/15eb284)), closes [/github.com/ipfs-shipyard/ipfs-companion/pull/500#issuecomment-398402554](https://github.com//github.com/ipfs-shipyard/ipfs-companion/pull/500/issues/issuecomment-398402554)
* global ON / OFF switch ([9f67a30](https://github.com/ipfs-shipyard/ipfs-companion/commit/9f67a30))
* improved webpack progress reporting ([fb973d8](https://github.com/ipfs-shipyard/ipfs-companion/commit/fb973d8))
* use browser.contentScripts API in Firefox ([52b0190](https://github.com/ipfs-shipyard/ipfs-companion/commit/52b0190)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/362#issuecomment-362231167](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/362/issues/issuecomment-362231167)
* wrapped uploads with js-ipfs v0.29.0 ([c38ac36](https://github.com/ipfs-shipyard/ipfs-companion/commit/c38ac36)), closes [#482](https://github.com/ipfs-shipyard/ipfs-companion/issues/482)

# [2.3.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.2.2...v2.3.0) (2018-05-24)

### Bug Fixes

* add validation of dir-wrapped ipfs.files.add ([45ccfca](https://github.com/ipfs-shipyard/ipfs-companion/commit/45ccfca))
* avoid crashing extension in Chrome ([cda171e](https://github.com/ipfs-shipyard/ipfs-companion/commit/cda171e))
* correct manifest for firefox beta bundle ([2b8026d](https://github.com/ipfs-shipyard/ipfs-companion/commit/2b8026d))
* hide upload options by default ([ece5d10](https://github.com/ipfs-shipyard/ipfs-companion/commit/ece5d10))
* introduce global whitelist for window.ipfs ([6c4c51f](https://github.com/ipfs-shipyard/ipfs-companion/commit/6c4c51f)), closes [#478](https://github.com/ipfs-shipyard/ipfs-companion/issues/478) [#452](https://github.com/ipfs-shipyard/ipfs-companion/issues/452)
* remove styling from locale label ([0abaf20](https://github.com/ipfs-shipyard/ipfs-companion/commit/0abaf20))
* restrict window.ipfs to Secure Contexts ([375f2c2](https://github.com/ipfs-shipyard/ipfs-companion/commit/375f2c2))
* workaround FILE_TOO_LARGE via factor-bundle ([c6840f7](https://github.com/ipfs-shipyard/ipfs-companion/commit/c6840f7))

### Features

* Share multiple files at once ([35384e1](https://github.com/ipfs-shipyard/ipfs-companion/commit/35384e1))
* Support wrapWithDirectory in Quick Upload ([6fc89d6](https://github.com/ipfs-shipyard/ipfs-companion/commit/6fc89d6)), closes [#349](https://github.com/ipfs-shipyard/ipfs-companion/issues/349)
* upload screen improvements ([9fbe63f](https://github.com/ipfs-shipyard/ipfs-companion/commit/9fbe63f))

## [2.2.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.2.1...v2.2.2) (2018-05-07)

### Bug Fixes

* forwards all postmsg-rpc messages between content script and background, and upgrade ipfs-postmsg-proxy with fix for pull-postmsg-stream ([69eb3a1](https://github.com/ipfs-shipyard/ipfs-companion/commit/69eb3a1))
* make tests work on windows ([4181d53](https://github.com/ipfs-shipyard/ipfs-companion/commit/4181d53))
* update yarn lock file. ([73eb7cc](https://github.com/ipfs-shipyard/ipfs-companion/commit/73eb7cc))

### Features

* create and use IpfsApiAccessError ([237cffb](https://github.com/ipfs-shipyard/ipfs-companion/commit/237cffb))
* refactor api-access error ([cf4241d](https://github.com/ipfs-shipyard/ipfs-companion/commit/cf4241d))
* update console.log in window.ipfs error example ([a840622](https://github.com/ipfs-shipyard/ipfs-companion/commit/a840622))
* use path-browserify instead of builtin path. ([ce7e71a](https://github.com/ipfs-shipyard/ipfs-companion/commit/ce7e71a))

## [2.2.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.2.0...v2.2.1) (2018-04-12)

# [2.2.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.1.0...v2.2.0) (2018-04-06)

### Bug Fixes

* [#329](https://github.com/ipfs-shipyard/ipfs-companion/issues/329) - Add explicit color styles ([8f7b96c](https://github.com/ipfs-shipyard/ipfs-companion/commit/8f7b96c))
* Big.js serialization problem ([c380100](https://github.com/ipfs-shipyard/ipfs-companion/commit/c380100))
* Firefox for Android ([2c43e75](https://github.com/ipfs-shipyard/ipfs-companion/commit/2c43e75)), closes [#356](https://github.com/ipfs-shipyard/ipfs-companion/issues/356)
* link to window.ipfs fallback demo ([9563ccd](https://github.com/ipfs-shipyard/ipfs-companion/commit/9563ccd))
* multi permisison dialogs for the same permission ([37d8f9b](https://github.com/ipfs-shipyard/ipfs-companion/commit/37d8f9b))
* notification error on pin/unpin ([6081df0](https://github.com/ipfs-shipyard/ipfs-companion/commit/6081df0)), closes [#338](https://github.com/ipfs-shipyard/ipfs-companion/issues/338) [#318](https://github.com/ipfs-shipyard/ipfs-companion/issues/318)
* popup render issue in Chrome on Mac ([6fdb91e](https://github.com/ipfs-shipyard/ipfs-companion/commit/6fdb91e)), closes [428044#c13](https://github.com/428044/issues/c13) [#318](https://github.com/ipfs-shipyard/ipfs-companion/issues/318)
* reduce menu render jank ([e383605](https://github.com/ipfs-shipyard/ipfs-companion/commit/e383605))
* response for multiple acl dialogs get mixed up ([ca758a6](https://github.com/ipfs-shipyard/ipfs-companion/commit/ca758a6))
* switch default URLs to 'localhost' ([27c6d76](https://github.com/ipfs-shipyard/ipfs-companion/commit/27c6d76)), closes [#291](https://github.com/ipfs-shipyard/ipfs-companion/issues/291)

### Features

* **firefox>59:** no prefix for redir protocols ([bb5a00a](https://github.com/ipfs-shipyard/ipfs-companion/commit/bb5a00a)), closes [/github.com/ipfs-shipyard/ipfs-companion/issues/164#issuecomment-355708883](https://github.com//github.com/ipfs-shipyard/ipfs-companion/issues/164/issues/issuecomment-355708883)
* upgrades ipfs-postmsg-proxy to 2.13.0 ([5736a93](https://github.com/ipfs-shipyard/ipfs-companion/commit/5736a93))

# [2.1.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.15...v2.1.0) (2017-11-26)

### Bug Fixes

* **protocols:** bad path to normalizeLinksWithUnhandledProtocols ([af0a428](https://github.com/ipfs-shipyard/ipfs-companion/commit/af0a428)), closes [#316](https://github.com/ipfs-shipyard/ipfs-companion/issues/316)
* **quickupload:** close browser action popup on click ([8d19a3b](https://github.com/ipfs-shipyard/ipfs-companion/commit/8d19a3b))

## [2.0.15](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.14...v2.0.15) (2017-11-11)

### Bug Fixes

* CSS fixes for Android ([a5fa00b](https://github.com/ipfs-shipyard/ipfs-companion/commit/a5fa00b)), closes [#109](https://github.com/ipfs-shipyard/ipfs-companion/issues/109)
* **pinning:** paths with URL-unsafe characters ([e8b4c9e](https://github.com/ipfs-shipyard/ipfs-companion/commit/e8b4c9e)), closes [#303](https://github.com/ipfs-shipyard/ipfs-companion/issues/303)
* **security:** remove URL shortener experiment ([15e7168](https://github.com/ipfs-shipyard/ipfs-companion/commit/15e7168)), closes [#305](https://github.com/ipfs-shipyard/ipfs-companion/issues/305)

### Features

* PoC URL Shortener ([2648c22](https://github.com/ipfs-shipyard/ipfs-companion/commit/2648c22))
* **dnslink:** redirect to IPNS path ([ba7cb53](https://github.com/ipfs-shipyard/ipfs-companion/commit/ba7cb53)), closes [#298](https://github.com/ipfs-shipyard/ipfs-companion/issues/298)

## [2.0.14](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.13...v2.0.14) (2017-10-16)

### Features

* restore copy items in page context menu ([abab537](https://github.com/ipfs-shipyard/ipfs-companion/commit/abab537)), closes [#294](https://github.com/ipfs-shipyard/ipfs-companion/issues/294)
* **contextMenus:** support image, video, audio, link ([12c5526](https://github.com/ipfs-shipyard/ipfs-companion/commit/12c5526)), closes [#294](https://github.com/ipfs-shipyard/ipfs-companion/issues/294)

## [2.0.13](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.12...v2.0.13) (2017-10-10)

### Bug Fixes

* exclude ':' from the end of linkified text ([b4384fe](https://github.com/ipfs-shipyard/ipfs-companion/commit/b4384fe))
* **dnslink:** skip URLs that could produce infinite recursion ([9eda0bf](https://github.com/ipfs-shipyard/ipfs-companion/commit/9eda0bf)), closes [/github.com/ipfs/ipfs-companion/issues/286#issuecomment-335553288](https://github.com//github.com/ipfs/ipfs-companion/issues/286/issues/issuecomment-335553288)

## [2.0.12](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.11...v2.0.12) (2017-10-10)

### Bug Fixes

* **linkifyDOM:** remove unnecessary DOM mutations ([27819e0](https://github.com/ipfs-shipyard/ipfs-companion/commit/27819e0))

### Features

* normalize dweb: in `href` and `src` ([4ed94bf](https://github.com/ipfs-shipyard/ipfs-companion/commit/4ed94bf)), closes [#286](https://github.com/ipfs-shipyard/ipfs-companion/issues/286)

## [2.0.11](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.10...v2.0.11) (2017-10-08)

### Bug Fixes

* optimize mayContainUnhandledIpfsProtocol ([85f7af3](https://github.com/ipfs-shipyard/ipfs-companion/commit/85f7af3))
* **browserAction:** improved support for HiDPI ([8a43015](https://github.com/ipfs-shipyard/ipfs-companion/commit/8a43015)), closes [#125](https://github.com/ipfs-shipyard/ipfs-companion/issues/125)
* **onBeforeRequest:** too much recursion ([64c498e](https://github.com/ipfs-shipyard/ipfs-companion/commit/64c498e))

### Features

* Option to customize Default Public Gateway ([6bb4ba1](https://github.com/ipfs-shipyard/ipfs-companion/commit/6bb4ba1)), closes [#284](https://github.com/ipfs-shipyard/ipfs-companion/issues/284)
* proper /ipns/ validation ([7d9a1f2](https://github.com/ipfs-shipyard/ipfs-companion/commit/7d9a1f2)), closes [/github.com/ipfs/ipfs-companion/issues/16#issuecomment-331121999](https://github.com//github.com/ipfs/ipfs-companion/issues/16/issues/issuecomment-331121999) [#69](https://github.com/ipfs-shipyard/ipfs-companion/issues/69)
* **options:** URL validation in Preferences ([3565061](https://github.com/ipfs-shipyard/ipfs-companion/commit/3565061))
* reset all preferences to default values ([7759546](https://github.com/ipfs-shipyard/ipfs-companion/commit/7759546))

## [2.0.10](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.9...v2.0.10) (2017-09-27)

### Bug Fixes

* more strict custom protocols ([c7285e8](https://github.com/ipfs-shipyard/ipfs-companion/commit/c7285e8)), closes [/github.com/ipfs/ipfs-companion/pull/283#issuecomment-330058239](https://github.com//github.com/ipfs/ipfs-companion/pull/283/issues/issuecomment-330058239)

### Features

* linkify only officially supported custom protocols ([93c794d](https://github.com/ipfs-shipyard/ipfs-companion/commit/93c794d)), closes [#280](https://github.com/ipfs-shipyard/ipfs-companion/issues/280) [/github.com/ipfs/ipfs-companion/pull/283#issuecomment-330005791](https://github.com//github.com/ipfs/ipfs-companion/pull/283/issues/issuecomment-330005791) [#231](https://github.com/ipfs-shipyard/ipfs-companion/issues/231)
* option to disable daemon online/offline notifications ([7d3a5e0](https://github.com/ipfs-shipyard/ipfs-companion/commit/7d3a5e0)), closes [#282](https://github.com/ipfs-shipyard/ipfs-companion/issues/282)
* Poor Man's Protocol Handlers ([1e62c9d](https://github.com/ipfs-shipyard/ipfs-companion/commit/1e62c9d)), closes [/github.com/ipfs/ipfs-companion/issues/164#issuecomment-328374052](https://github.com//github.com/ipfs/ipfs-companion/issues/164/issues/issuecomment-328374052)

## [2.0.9](https://github.com/ipfs-shipyard/ipfs-companion/compare/v2.0.8...v2.0.9) (2017-09-12)

### Bug Fixes

* **options:** disable spellcheck in textarea ([54d0bcd](https://github.com/ipfs-shipyard/ipfs-companion/commit/54d0bcd))
* **package:** remove unsafe-eval ([e3d9669](https://github.com/ipfs-shipyard/ipfs-companion/commit/e3d9669)), closes [#269](https://github.com/ipfs-shipyard/ipfs-companion/issues/269)
* linkify text nodes without whitespace padding ([fa673ea](https://github.com/ipfs-shipyard/ipfs-companion/commit/fa673ea)), closes [#275](https://github.com/ipfs-shipyard/ipfs-companion/issues/275)

### Features

* **automaticMode:** toggle redirect only when API is going online/offline ([a1aca04](https://github.com/ipfs-shipyard/ipfs-companion/commit/a1aca04)), closes [#274](https://github.com/ipfs-shipyard/ipfs-companion/issues/274)
* add CID support ([3b5ed39](https://github.com/ipfs-shipyard/ipfs-companion/commit/3b5ed39)), closes [#275](https://github.com/ipfs-shipyard/ipfs-companion/issues/275)

## [2.0.8](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.10...v2.0.8) (2017-07-26)

### Bug Fixes

* cross-platform commands in npm package scripts ([e3708a0](https://github.com/ipfs-shipyard/ipfs-companion/commit/e3708a0))
* remove dupliate task names from TravisCI ([585825c](https://github.com/ipfs-shipyard/ipfs-companion/commit/585825c))
* **contextMenu:** display help when upload fails due to Tracking Protection ([f44f564](https://github.com/ipfs-shipyard/ipfs-companion/commit/f44f564)), closes [#227](https://github.com/ipfs-shipyard/ipfs-companion/issues/227)
* tavisCI workaround for node-webcrypto-ossl@1.0.7 ([89a89b1](https://github.com/ipfs-shipyard/ipfs-companion/commit/89a89b1))
* **browserAction:** do not redirect WebUI ([3c7148b](https://github.com/ipfs-shipyard/ipfs-companion/commit/3c7148b))
* **browserAction:** hide quick upload when no peers ([3b7cde7](https://github.com/ipfs-shipyard/ipfs-companion/commit/3b7cde7))
* **browserAction:** hide redirect controls in automatic mode ([49a8d6a](https://github.com/ipfs-shipyard/ipfs-companion/commit/49a8d6a))
* **browserAction:** hide WebUI link when API is down ([1eed541](https://github.com/ipfs-shipyard/ipfs-companion/commit/1eed541))
* **browserAction:** Quick Upload retry via explicit file input ([13d1921](https://github.com/ipfs-shipyard/ipfs-companion/commit/13d1921))
* **browserAction:** switch to Buffer bundled with ipfs-api ([d4e6e7b](https://github.com/ipfs-shipyard/ipfs-companion/commit/d4e6e7b))
* **locales:** remove `-` from key names ([ce2c218](https://github.com/ipfs-shipyard/ipfs-companion/commit/ce2c218)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **options:** normalize api and gw URLs on start ([1b10d67](https://github.com/ipfs-shipyard/ipfs-companion/commit/1b10d67))
* **options:** show checkboxes in Firefox 55 ([447a2ca](https://github.com/ipfs-shipyard/ipfs-companion/commit/447a2ca)), closes [#257](https://github.com/ipfs-shipyard/ipfs-companion/issues/257)
* **package:** remove dependency on sinon-chai ([f98debe](https://github.com/ipfs-shipyard/ipfs-companion/commit/f98debe))
* **package:** update is-ipfs to version 0.3.0 ([#196](https://github.com/ipfs-shipyard/ipfs-companion/issues/196)) ([0a9ec55](https://github.com/ipfs-shipyard/ipfs-companion/commit/0a9ec55))
* **package:** update lru_map to version 0.3.3 ([5db4c4e](https://github.com/ipfs-shipyard/ipfs-companion/commit/5db4c4e))
* **pageAction:** Copy Public Gateway URL ([b2525ba](https://github.com/ipfs-shipyard/ipfs-companion/commit/b2525ba)), closes [#217](https://github.com/ipfs-shipyard/ipfs-companion/issues/217)
* **quickUpload:** Unsafe assignment to innerHTML ([0ae21a7](https://github.com/ipfs-shipyard/ipfs-companion/commit/0ae21a7))
* **wx:** add browser object via webextension-polyfill ([cb6d239](https://github.com/ipfs-shipyard/ipfs-companion/commit/cb6d239)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** browser-agnostic CSS for browserAction ([55490d2](https://github.com/ipfs-shipyard/ipfs-companion/commit/55490d2)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** Chromium uses raster as browserAction icon ([6432fc8](https://github.com/ipfs-shipyard/ipfs-companion/commit/6432fc8)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** fix Chrome error caused by i18 placeholders ([98d3946](https://github.com/ipfs-shipyard/ipfs-companion/commit/98d3946)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** fix version format in manifest ([f8a15c3](https://github.com/ipfs-shipyard/ipfs-companion/commit/f8a15c3)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** merge pageAction into browserAction ([a3650cd](https://github.com/ipfs-shipyard/ipfs-companion/commit/a3650cd)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** Origin mismatch under Chromium ([0afb113](https://github.com/ipfs-shipyard/ipfs-companion/commit/0afb113)), closes [#227](https://github.com/ipfs-shipyard/ipfs-companion/issues/227) [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** remove bogus Origin from API requests ([6fa4be1](https://github.com/ipfs-shipyard/ipfs-companion/commit/6fa4be1)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)
* **wx:** wrap badge update in try block ([176325a](https://github.com/ipfs-shipyard/ipfs-companion/commit/176325a)), closes [#218](https://github.com/ipfs-shipyard/ipfs-companion/issues/218)

### Features

* **browserAction:** [WIP] Quick Upload of local files ([8ac6a9e](https://github.com/ipfs-shipyard/ipfs-companion/commit/8ac6a9e)), closes [#184](https://github.com/ipfs-shipyard/ipfs-companion/issues/184)
* **browserAction:** Quick Upload PoC ([040444d](https://github.com/ipfs-shipyard/ipfs-companion/commit/040444d)), closes [#184](https://github.com/ipfs-shipyard/ipfs-companion/issues/184)
* **contextMenu:** Image Rehosting ([3be8b27](https://github.com/ipfs-shipyard/ipfs-companion/commit/3be8b27)), closes [#59](https://github.com/ipfs-shipyard/ipfs-companion/issues/59)
* **linkify:** PoC linkification of plaintext IPFS paths ([b8f6517](https://github.com/ipfs-shipyard/ipfs-companion/commit/b8f6517)), closes [#39](https://github.com/ipfs-shipyard/ipfs-companion/issues/39) [#202](https://github.com/ipfs-shipyard/ipfs-companion/issues/202)
* **pageAction:** pinning of IPNS resources ([0e6418b](https://github.com/ipfs-shipyard/ipfs-companion/commit/0e6418b)), closes [#222](https://github.com/ipfs-shipyard/ipfs-companion/issues/222) [#212](https://github.com/ipfs-shipyard/ipfs-companion/issues/212)
* **protocol:** support web+foo protocols ([20436d6](https://github.com/ipfs-shipyard/ipfs-companion/commit/20436d6)), closes [#164](https://github.com/ipfs-shipyard/ipfs-companion/issues/164)

## [1.5.10](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.9...v1.5.10) (2016-09-26)

## [1.5.9](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.8...v1.5.9) (2016-07-09)

## [1.5.8](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.7...v1.5.8) (2016-04-11)

## [1.5.7](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.6...v1.5.7) (2016-03-29)

## [1.5.6](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.5...v1.5.6) (2016-03-20)

## [1.5.5](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.4...v1.5.5) (2016-02-20)

## [1.5.4](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.3...v1.5.4) (2016-02-13)

## [1.5.3](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.2...v1.5.3) (2016-02-09)

## [1.5.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.1...v1.5.2) (2016-02-07)

## [1.5.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.5.0...v1.5.1) (2016-02-05)

# [1.5.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.4.2...v1.5.0) (2016-02-04)

## [1.4.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.4.1...v1.4.2) (2016-01-24)

## [1.4.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.4.0...v1.4.1) (2016-01-16)

# [1.4.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.3.2...v1.4.0) (2016-01-10)

## [1.3.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.3.1...v1.3.2) (2015-12-17)

## [1.3.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.3.0...v1.3.1) (2015-11-27)

# [1.3.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.2.0...v1.3.0) (2015-11-22)

# [1.2.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.1.0...v1.2.0) (2015-09-27)

# [1.1.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.0.3...v1.1.0) (2015-09-20)

## [1.0.3](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.0.2...v1.0.3) (2015-09-09)

## [1.0.2](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.0.1...v1.0.2) (2015-08-27)

## [1.0.1](https://github.com/ipfs-shipyard/ipfs-companion/compare/v1.0.0...v1.0.1) (2015-04-08)

# [1.0.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v0.2.0...v1.0.0) (2015-04-08)

# [0.2.0](https://github.com/ipfs-shipyard/ipfs-companion/compare/v0.1.0...v0.2.0) (2015-03-25)

# 0.1.0 (2015-03-22)


text:
version: "3.9"
services:
  firefox:
    image: ${FIREFOX_IMAGE:-selenium/standalone-firefox}:${FIREFOX_VERSION:-latest}
    shm_size: 2g
    ports:
      - 4444
      - 7900
  chromium:
    # WARN: `standalone-chrome` does NOT work on ARM-based machines;
    #  see https://github.com/SeleniumHQ/docker-selenium#experimental-mult-arch-aarch64armhfamd64-images;
    #  try using `seleniarm/standalone-chromium` instead
    # export CHROMIUM_IMAGE=seleniarm/standalone-chromium
    image: ${CHROMIUM_IMAGE:-selenium/standalone-chrome}:${CHROMIUM_VERSION:-latest}
    shm_size: 2g
    ports:
      - 4444
      - 7900
  kubo:
    image: ipfs/kubo:${KUBO_VERSION:-latest}
    ports:
      - 4001
      - 5001
      - 8080
    volumes:
      - ./ci/access-control-allow-all.sh:/container-init.d/001-access-control-allow-all.sh
  e2e:
    build:
      dockerfile: ./Dockerfile
      context: .
    environment:
      - SELENIUM_REMOTE_CHROMIUM_URL=http://chromium:4444
      - SELENIUM_REMOTE_FIREFOX_URL=http://firefox:4444
      - IPFS_API_URL=http://kubo:5001
      - CUSTOM_GATEWAY_URL=http://kubo:8080
      - TEST_E2E=true
      - TEST_HEADLESS=${TEST_HEADLESS:-false}
      - IPFS_COMPANION_VERSION=${IPFS_COMPANION_VERSION}
    volumes:
      - ./build:/home/node/app/build


text:
# Security notes

The IPFS protocol and its implementations are still in heavy development. This means that there may be problems in our protocols, or there may be mistakes in our implementations. And — though IPFS is not production-ready yet — many people are already running nodes on their machines, so we take security vulnerabilities very seriously.

## Reporting security issues

If you discover a security issue in ipfs-companion, please bring it to our attention right away!

If you find a vulnerability that may affect live deployments — for example, by exposing a remote execution exploit — please send your report privately to security@ipfs.io **Please do not file a public issue.**

If the issue is a protocol weakness that cannot be immediately exploited, or something not yet deployed, just discuss it openly.

## Local build and source verification

Security-conscious users can confirm that downloaded package does match source code.

Required steps:

1. Download package version that is to be verified
2. Check out sources of the [same tag](https://github.com/ipfs/ipfs-companion/tags)
2. Build package from sources using `yarn dev-build` command.
   As a result, you will have freshly built packages in `build/` directory
3. Unzip contents and compare manually or use handy one-liners below.

Convention used in examples below:
- `ipfs-firefox-addon1.xpi` and `ipfs-firefox-addon2.xpi` are equal and match Git sources
-  `ipfs-firefox-addon3.xpi` contains changes not present in current sources

### Compare SHA-256

Note that XPIs are unzipped before being piped to `sha256sum`:
```bash
$ diff -q <(unzip -p  ipfs-firefox-addon1.xpi|sha256sum|cut -f1 -d' ') <(unzip -p  ipfs-firefox-addon3.xpi|sha256sum|cut -f1 -d' ') && echo same || echo not_same
```

Sample output for files with matching contents:
```bash
$ diff <(unzip -v -l ipfs-firefox-addon1.xpi | cut -c 1-9,59-,49-57 | sort -k3) <(unzip -v -l ipfs-firefox-addon2.xpi | cut -c 1-9,59-,49-57 | sort -k3)  && echo same || echo not_same
same

```

Sample output for files with different contents:
```bash
$ diff -q <(unzip -p  ipfs-firefox-addon1.xpi|sha256sum|cut -f1 -d' ') <(unzip -p  ipfs-firefox-addon3.xpi|sha256sum|cut -f1 -d' ') && echo same || echo not_same
Files /proc/self/fd/11 and /proc/self/fd/12 differ
not_same
```

### Inspect differences

It is possible to list package contents with CRC-32 checksums provided by ZIP container:
```bash
$ unzip -v -l ipfs-firefox-addon1.xpi | cut -c 1-9,59-,49-57 | sort -k3
```
To compare two packages in one command:
```bash
$ diff <(unzip -v -l ipfs-firefox-addon1.xpi | cut -c 1-9,59-,49-57 | sort -k3) <(unzip -v -l ipfs-firefox-addon3.xpi | cut -c 1-9,59-,49-57 | sort -k3) && echo same || echo not_same
```

Sample output for two different versions of XPI:
```diff
$ diff <(unzip -v -l ipfs-firefox-addon1.xpi | cut -c 1-9,59-,49-57 | sort -k3) <(unzip -v -l ipfs-firefox-addon3.xpi | cut -c 1-9,59-,49-57 | sort -k3) && echo same || echo not_same
5,7c5,7
<      174 d991ba90 defaults/preferences/prefs.js
<    37615          30 files
<     2270 06d511c2 harness-options.json
---
>      225 5b287a38 defaults/preferences/prefs.js
>    38998          30 files
>     2315 6291e716 harness-options.json
13c13
<      385 c2c13711 options.xul
---
>      513 4f3e0732 options.xul
33,34c33,34
<     6376 45297f28 resources/ipfs-firefox-addon/lib/index.js
<      966 e48f0540 resources/ipfs-firefox-addon/lib/package.json
---
>     7517 7565d9af resources/ipfs-firefox-addon/lib/index.js
>      984 83079aef resources/ipfs-firefox-addon/lib/package.json
not_same
```


ipfs-companion

type: opencollective

pbjs: bin/pbjs

pbts: bin/pbts

adbkit: bin/adbkit

deprecated: This version has been deprecated and is no longer supported or maintained

type: github

type: individual

acorn: bin/acorn

addons-linter: bin/addons-linter

type: tidelift

type: patreon

type: consulting

bunyan: bin/bunyan

deprecated: This module has been superseded by the multiformats module

cssesc: bin/cssesc

esbuild: bin/esbuild

resolve: bin/resolve

type: paypal

deprecated: Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau

deprecated: Use mz or fs-extra^3.0 with Promise Support

fx-runner: bin/fx-runner

which: bin/which

get-firefox: bin/get-firefox

semver: bin/semver

deprecated: this library is no longer supported

he: bin/he

@achingbrain/node-fetch

license: MIT

jsesc: bin/jsesc

ncp: bin/ncp

deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.

regjsparser: bin/parser

deprecated: request has been deprecated, see https://github.com/request/request/issues/3142

deprecated: Please upgrade to v7.0.2+ of superagent.  We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing.  See the releases tab for more information at <https://github.com/visionmedia/superagent/releases>.

deprecated: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.


text:
# Licensed under MIT.
# Copyright (2016) by Kevin van Zonneveld https://twitter.com/kvz
#
# https://www.npmjs.com/package/fakefile
#
# Please do not edit this file directly, but propose changed upstream instead:
# https://github.com/kvz/fakefile/blob/master/Makefile
#
# This Makefile offers convience shortcuts into any Node.js project that utilizes npm scripts.
# It functions as a wrapper around the actual listed in `package.json`
# So instead of typing:
#
#  $ npm script build:assets
#
# you could also type:
#
#  $ make build-assets
#
# Notice that colons (:) are replaced by dashes for Makefile compatibility.
#
# The benefits of this wrapper are:
#
# - You get to keep the the scripts package.json, which is more portable
#   (Makefiles & Windows are harder to mix)
# - Offer a polite way into the project for developers coming from different
#   languages (npm scripts is obviously very Node centric)
# - Profit from better autocomplete (make <TAB><TAB>) than npm currently offers.
#   OSX users will have to install bash-completion
#   (http://davidalger.com/development/bash-completion-on-os-x-with-brew/)

ifeq ($(shell test -e ./yarn.lock && echo -n yes),yes)
	RUNNER=yarn
	INSTALLER=yarn install
else
	RUNNER=npm run
	INSTALLER=npm install
endif

define npm_script_targets
TARGETS := $(shell \
	node -e 'for (var k in require("./package.json").scripts) {console.log(k.replace(/:/g, "-"));}'
		| grep -v -E "^install$$"
)
$$(TARGETS):
	$(RUNNER) $(shell \
							node -e 'for (var k in require("./package.json").scripts) {console.log(k.replace(/:/g, "-"), k);}'
								| grep -E "^$(MAKECMDGOALS)\s"
								| head -n1
								| awk '{print $$2}'
							)

.PHONY: $$(TARGETS)
endef

$(eval $(call npm_script_targets))

# These npm run scripts are available, without needing to be mentioned in `package.json`
install:
	$(INSTALLER)


text:
FROM node:18.12.1

ARG USER_ID
ARG GROUP_ID

RUN curl -s https://ipfs.io/ipfs/QmbukYcmtyU6ZEKt6fepnvrTNa9F6VqsUPMUgNxQjEmphH > /usr/local/bin/jq && chmod +x /usr/local/bin/jq

RUN mkdir -p /home/node/app
RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \
    userdel -f node && \
    if getent group node ; then groupdel node; fi && \
    if getent passwd ${USER_ID} ; then userdel -f $(getent passwd ${USER_ID} | cut -d: -f1); fi && \
    if getent group ${GROUP_ID} ; then groupdel $(getent group ${GROUP_ID} | cut -d: -f1); fi && \
    groupadd -g ${GROUP_ID} node && \
    useradd -l -u ${USER_ID} -g node node; fi
RUN chown -fhR node:node /home/node

WORKDIR /home/node/app

COPY --chown=node:node ./package.json ./package-lock.json /home/node/app/

USER node

RUN npm run ci:install

COPY --chown=node:node . /home/node/app

ENV PATH="/home/node/app/node_modules/.bin:${PATH}"


text:
import path from 'path'
import webpack from 'webpack'
import { merge } from 'webpack-merge'
import TerserPlugin from 'terser-webpack-plugin'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import { fileURLToPath } from 'url'
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

const __dirname = path.dirname(fileURLToPath(import.meta.url))

const devBuild = process.env.NODE_ENV === 'development'

/**
 * common configuration shared by all targets
 * @type {import('webpack').Configuration}
 */
const commonConfig = {
  target: 'web',
  bail: true,
  output: {
    path: path.resolve(__dirname, './add-on/dist/bundles/'),
    publicPath: '/dist/bundles/',
    filename: '[name].bundle.js'
  },
  cache: process.env.CI
    ? false // no gain on CI
    : { type: 'filesystem' },
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: true
      })
    ]
  },
  plugins: [
    new webpack.ProgressPlugin({
      percentBy: 'entries'
    }),
    new MiniCssExtractPlugin({
      filename: '[name].css'
    }),
    new webpack.ProvidePlugin({
      process: 'process/browser',
      Buffer: ['buffer/', 'Buffer'] // ensure version from package.json is used
    }),
    new webpack.DefinePlugin({
      global: 'window', // https://github.com/webpack/webpack/issues/5627#issuecomment-394309966
      'process.emitWarning': (message, type) => {}, // console.warn(`${type}${type ? ': ' : ''}${message}`),
      'process.env': {
        // NODE_ENV: '"production"',
        IPFS_MONITORING: false,
        DEBUG: false // controls verbosity of Hapi HTTP server in js-ipfs
      }
    })
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader']
      },
      {
        test: /\.(png|jpe?g|gif|svg|eot|otf|ttf|woff|woff2)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'assets/[name][ext]'
        }
      },
      {
        // Ignore legacy fonts (both Firefox and Chromium talk WOFF2)
        test: /\.(otf|eot|ttf|woff)(\?.*$|$)/,
        use: ['raw-loader', 'ignore-loader']
      },
      {
        exclude: /node_modules/,
        test: /\.js$/,
        use: ['babel-loader']
      }
    ]
  },
  resolve: {
    mainFields: ['browser', 'main'],
    extensions: ['.js', '.json'],
    alias: {
      buffer: path.resolve(__dirname, 'node_modules/buffer'), // js-ipfs uses newer impl.
      url: 'iso-url',
      stream: 'readable-stream' // cure general insanity
    },
    fallback: {
      stream: 'readable-stream',
      'stream/web': 'readable-stream',
      worker_threads: false,
      util: false,
      fs: false,
      path: require.resolve('path-browserify'), // legacy in src/lib/ipfs-proxy
      os: require.resolve('os-browserify/browser'), // some legacy TBD
      crypto: false // @hapi (Brave)
    }
  },
  node: {
    global: false // https://github.com/webpack/webpack/issues/5627#issuecomment-394309966
    // TODO: remove, this is default in webpack v5: Buffer: false, // we don't want to use old and buggy version bundled node-libs
    // fs: 'empty',
    // tls: 'empty',
    // cluster: 'empty' // expected by js-ipfs dependency: node_modules/prom-client/lib/cluster.js
  },
  watchOptions: {
    ignored: ['add-on/dist/**/*', 'node_modules']
  },
  performance: {
    maxEntrypointSize: Infinity,
    maxAssetSize: 4194304 // https://github.com/mozilla/addons-linter/pull/892
  }
}

if (devBuild) {
  commonConfig.devtool = 'source-map'
}

/**
 * background page bundle (with heavy dependencies)
 * @type {import('webpack').Configuration}
 */
const bgConfig = merge(commonConfig, {
  name: 'background',
  entry: {
    backgroundPage: './add-on/src/background/background.js'
  },
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        defaultVendors: false,
        default: false,
        ipfs: {
          name: 'ipfs',
          priority: 10,
          enforce: true,
          // Include js-ipfs and js-kubo-rpc-client
          test: /\/node_modules\/(ipfs-core|kubo-rpc-client)\//
        }
      }
    }
  }
})

/**
 * user interface pages with shared common libraries
 * @type {import('webpack').Configuration}
 */
const uiConfig = merge(commonConfig, {
  name: 'ui',
  entry: {
    browserAction: './add-on/src/popup/browser-action/index.js',
    importPage: './add-on/src/popup/quick-import.js',
    optionsPage: './add-on/src/options/options.js',
    recoveryPage: './add-on/src/recovery/recovery.js',
    welcomePage: './add-on/src/landing-pages/welcome/index.js'
  },
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        defaultVendors: false,
        default: false,
        uiCommons: {
          name: 'uiCommons',
          minChunks: 2,
          enforce: true,
          // Exclude backend dependencies (known to slow down UI due to size)
          chunks: chunk => chunk.name !== 'backgroundPage'
        }
      }
    }
  }
})

/**
 * content scripts injected into tabs
 * @type {import('webpack').Configuration}
 */
const contentScriptsConfig = merge(commonConfig, {
  name: 'contentScripts',
  entry: {
    linkifyContentScript: './add-on/src/contentScripts/linkifyDOM.js'
  }
})

const config = [
  bgConfig,
  uiConfig,
  contentScriptsConfig
]

export default config


text:
# IPFS Companion
**Harness the power of [IPFS](https://ipfs.io/) in your browser!**

[![](https://img.shields.io/github/release/ipfs/ipfs-companion.svg)](https://github.com/ipfs/ipfs-companion/releases/latest)
[![](https://img.shields.io/badge/mozilla-reviewed-blue.svg)](https://addons.mozilla.org/en-US/firefox/addon/ipfs-companion/)
[![i18n status](https://img.shields.io/badge/i18n-translated-blue.svg)](https://github.com/ipfs-shipyard/ipfs-companion/blob/main/docs/LOCALIZATION-NOTES.md)
[![](https://img.shields.io/badge/matrix%20chat-%23lobby:ipfs.io-blue.svg?style=flat-square)](https://matrix.to/#/#lobby:ipfs.io)

![Quick runthrough of basic IPFS Companion features](https://gateway.ipfs.io/ipfs/QmSsGphTN1eWMhkFFNFb23jWTXyhNbo47PF9FbmC6ZaRNg)

|  [Firefox](https://www.mozilla.org/firefox/new/) \| [Firefox for Android](https://play.google.com/store/apps/details?id=org.mozilla.firefox) |  [Chrome](https://www.google.com/chrome/) \|  [Brave](https://brave.com/) \|  [Opera](https://www.opera.com/)  \|  [Edge](https://www.microsoftedgeinsider.com/)
|------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [![Install From AMO](https://ipfs.io/ipfs/QmWNa64XjA78QvK3zG2593bSMizkDXXcubDHjnRDYUivqt)
![](https://img.shields.io/amo/users/ipfs-companion?label=AMO%20users&style=social)](https://addons.mozilla.org/firefox/addon/ipfs-companion/) | [![Install from Chrome Store](https://ipfs.io/ipfs/QmU4Qm5YEKy5yHmdAgU2fD7PjZLgrYTUUbxTydqG2QK3TT)
![](https://img.shields.io/chrome-web-store/users/nibjojkomfdiaoajekhjakgkdhaomnch?label=Chrome%20Web%20Store%20users&style=social)](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch) |

## Lead maintainer

[Marcin Rataj](https://github.com/lidel)

## Table of contents

- [About IPFS Companion](#about-ipfs-companion)
- [Features](#ipfs-companion-features)
- [Install](#install-ipfs-companion)
- [Contribute](#contribute)
- [Help & Troubleshooting](#help--troubleshooting)
- [Privacy & Licenses](#privacy--license-info)

## About IPFS Companion

IPFS Companion harnesses the power of your locally running IPFS node (either through the [IPFS Desktop](https://docs.ipfs.io/install/ipfs-desktop/) app or the [command-line daemon](https://docs.ipfs.io/install/command-line/)) directly inside your favorite Chromium-based or Firefox browser, enabling support for [`ipfs://` addresses](https://docs.ipfs.io/how-to/address-ipfs-on-web/#native-urls), redirecting content-addressed  websites and file paths to your local [Gateway](https://docs.ipfs.io/concepts/glossary/#gateway), easy IPFS file import and sharing, and more.

IPFS is a peer-to-peer hypermedia protocol designed to make the web faster, safer, more resilient, and more open. It enables the creation and dissemination of completely distributed sites and applications that don’t rely on centralized hosting and stay true to the original vision of an open, flat web. Visit [the IPFS Project website](https://ipfs.io) to learn more.

## IPFS Companion features

### Automatically detect and redirect IPFS resources

#### Detect URLs with IPFS paths

IPFS Companion detects and tests requests for IPFS-like paths ( such as `/ipfs/{cid}` or `/ipns/{peerid_or_host-with-dnslink}`) on any website. If a path is a [valid IPFS address](https://github.com/ipfs/is-ipfs), it is redirected to load from your local gateway. The gateway at `localhost` will also automatically switch to a subdomain to provide a unique origin for each website:
> `https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR`
> → `http://localhost:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR`
> → `http://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi.ipfs.localhost:8080`

#### Detect DNSLink-enabled URLs

IPFS Companion [detects DNSLink info](http://docs.ipfs.io/how-to/dnslink-companion/) in the DNS records of websites. If a site uses DNSLink (a few examples are https://docs.ipfs.io, https://ipld.io, and http://tr.wikipedia-on-ipfs.org), IPFS Companion redirects the HTTP request to your local gateway:

> `http://docs.ipfs.tech`
> → `http://localhost:8080/ipns/docs.ipfs.tech` → `http://docs.ipfs.tech.ipns.localhost:8080/`

#### Detect pages with `x-ipfs-path` headers

IPFS Companion also upgrades transport to IPFS if it finds the `x-ipfs-path` in any HTTP response headers; this also acts as a fallback for cases when an IPFS path is not present in the URL. [Learn more.](http://docs.ipfs.io/how-to/companion-x-ipfs-path-header/)

#### Toggle redirects globally or per site

You can disable and re-enable local gateway redirects by several means:
- Suspend redirects **globally** in IPFS Companion's preferences
- Suspend redirects **per site** using the toggle under "Current tab" ([illustrated below](#toggle-gateway-redirects-on-a-per-website-basis)) or in IPFS Companion's preferences
- Add `x-ipfs-companion-no-redirect` to the URL itself as a hash ([example](https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR#x-ipfs-companion-no-redirect)) or query parameter ([example](https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?x-ipfs-companion-no-redirect))

### Access frequently-used IPFS actions from your browser bar

IPFS Companion enables you to quickly and easily access common actions from your browser bar with just a few clicks:

- See how many peers you're connected with a glance at the cube icon in your browser bar
- Check your IPFS API and gateway status by clicking the cube icon to reveal the main menu
- Right-click images and other page assets to easily add them to IPFS (including the option to preserve file names)
- Choose the _Import_ option in the main menu for quick drag-and-drop import from a browser tab
- Pin or unpin IPFS resources (via API) directly from the main menu
- Copy shareable public gateway links, IPFS content paths, or CIDs of IPFS resources directly from the main menu
- Launch the [IPFS Web UI dashboard](https://github.com/ipfs-shipyard/ipfs-webui) from the main menu with a single click
- Toggle gateway redirects or switch all IPFS Companion features on/off quickly and easily from the main menu (illustrations below)

#### Toggle gateway redirects on a per-website basis

You can toggle redirects (of any IPFS sub-resources) for an individual website under the _Current Tab_ section of the main menu. If that site uses DNSLink, toggling off will restore the site's original URL, too.

![Toggle per-site opt-out](https://gateway.ipfs.io/ipfs/QmYWXd4TSjk1RSzqzpaUbYp42obYjWtRme1oeYaTUdqkWu)

#### Switch all IPFS Companion features on/off

To temporarily suspend all IPFS integrations (redirects, API status content scripts, protocol handlers, etc.), use the on/off button at the top of the IPFS Companion menu.

![Turn IPFS Companion off and on again](https://gateway.ipfs.io/ipfs/QmZqyBnLY1jatj2ppJEbJqyj8oJecZt7chNB62jhhq8f9g)

### Try out experiments!

IPFS Companion ships with a variety of experimental features. Some are disabled by default, so be sure to check out IPFS Companion's Preferences to see them all.

- Make plaintext IPFS links clickable ([demo](https://ipfs.io/ipfs/bafybeidvtwx54qr44kidymvhfzefzxhgkieigwth6oswk75zhlzjdmunoy/linkify-demo.html))
- Re-route requests made via the following [experimental protocols](https://github.com/ipfs/ipfs-companion/issues/164) to an HTTP gateway (public or custom):
    - `ipfs://$cid`
    - `ipns://$cid_or_fqdn`
    - `dweb:/ipfs/$cid`
    - `dweb:/ipns/$cid_or_fqdn`

- Switch between the external HTTP API of your local IPFS node (default setting) and a js-ipfs node embedded in your browser (note that this has some [functionality limitations](https://docs.ipfs.io/how-to/companion-node-types/))
[![screenshot of node type switch](https://gateway.ipfs.io/ipfs/QmPDxawBTEmH5Dk1anaqpryRyyaNwmqVPt5DsCf21eFWQz)](http://docs.ipfs.io/how-to/companion-node-types/)

## Install IPFS Companion

### Latest stable release

|  [Firefox](https://www.mozilla.org/firefox/new/) \| [Firefox for Android](https://play.google.com/store/apps/details?id=org.mozilla.firefox) |  [Chrome](https://www.google.com/chrome/) \|  [Brave](https://brave.com/) \|  [Opera](https://www.opera.com/) \|  [Edge](https://www.microsoftedgeinsider.com/)
|------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [![Install From AMO](https://ipfs.io/ipfs/QmWNa64XjA78QvK3zG2593bSMizkDXXcubDHjnRDYUivqt)
![](https://img.shields.io/amo/users/ipfs-companion?label=AMO%20users&style=social)](https://addons.mozilla.org/firefox/addon/ipfs-companion/) | [![Install from Chrome Store](https://ipfs.io/ipfs/QmU4Qm5YEKy5yHmdAgU2fD7PjZLgrYTUUbxTydqG2QK3TT)
![](https://img.shields.io/chrome-web-store/users/nibjojkomfdiaoajekhjakgkdhaomnch?label=Chrome%20Web%20Store%20users&style=social)](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch) |

**Important!** Make sure you have [IPFS installed](https://ipfs.io/#install) on your computer as well. Because IPFS Companion (in its standard configuration) talks to your computer’s local IPFS node to work its browser magic, you’ll need to have IPFS running on your computer, too.

It's also possible to grab [vendor-specific packages for each release](https://github.com/ipfs-shipyard/ipfs-companion/releases),
but these builds are not signed, nor will automatically update. `.zip` bundles are meant only to be manually loaded via `chrome://extensions` (Chromium) or `about:debugging` (Firefox) for smoke-testing.

### Development

To work on IPFS Companion's code, you'll need to install it from source. Quick steps are below, but see the full [developer notes](./docs/DEVELOPER-NOTES.md) for more detailed instructions and tips.

1. Clone https://github.com/ipfs-shipyard/ipfs-companion.git
2. Run this all-in-one dev build to install dependencies, build, and launch in the browser of your choice:
    * Chromium
        ```console
        $ npm run dev-build chromium
        ```
    * Firefox
        ```console
        $ npm run dev-build firefox    # firefox:nightly works too!
        ```

## Contribute

[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](./docs/CONTRIBUTING.md)

All are welcome to help make IPFS Companion even better!
- Check out the [contribution guide](./docs/CONTRIBUTING.md) for how to get started as a developer
- Open an [issue](https://github.com/ipfs/ipfs-companion/issues)
- Make sure you read and abide by the [IPFS Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md)

## Release Process

The release process has been [documented here](./docs/RELEASE-PROCESS.md).

## Help & troubleshooting

### Ask a question
The best place to ask about IPFS Companion (or IPFS in general!) is in the [official IPFS Forums](https://discuss.ipfs.io/), where you can search past discussions for others who may have had the same questions, too. There's also an active [#ipfs](https://webchat.freenode.net/?channels=ipfs) community on IRC.

### Common troubleshooting steps
These frequently encountered troubleshooting situations may be helpful:
- **Import via right-click does not work in Firefox:** See [this workaround](https://github.com/ipfs/ipfs-companion/issues/227).
- **HTTP-to-HTTPS redirects fail when using Ghostery:** [Ghostery](https://addons.mozilla.org/en-US/firefox/addon/ghostery/) is known to toy with HTTP-to-HTTPS redirect, which in some setups breaks websites utilizing public gateways [(more details)](https://github.com/ipfs-shipyard/ipfs-companion/issues/466). Until this is fixed upstream, a workaround is to [whitelist](https://user-images.githubusercontent.com/157609/39089525-5834c104-45c9-11e8-9e17-4459a97e5676.png) affected sites.
- **NoScript breaks IPFS Companion:** By default, [NoScript](https://addons.mozilla.org/en-US/firefox/addon/noscript/) breaks IPFS Companion by blocking assets loaded from an IPFS gateway running on localhost. To fix this, extend the SYSTEM ruleset and prepend it with IPFS whitelist (feel free to modify this, but get familiar with [ABE rule syntax](https://noscript.net/abe/abe_rules.pdf) first):
```
# Enable IPFS redirect to LOCAL
Site ^http://127.0.0.1:8080/(ipfs|ipns)*
Anonymize

# Prevent Internet sites from requesting LAN resources.
Site LOCAL
Accept from LOCAL
Deny
```

## Privacy & license info

- IPFS Companion [Privacy policy](./PRIVACY-POLICY.md)
- The IPFS logo belongs to the [IPFS Project](https://github.com/ipfs) and is licensed under a CC-BY-SA 3.0 license
- [is-ipfs](https://github.com/ipfs-shipyard/is-ipfs), [js-multihash](https://github.com/multiformats/js-multihash), and other npm dependencies are under MIT license, unless stated otherwise
- IPFS Companion itself is released under [CC0](LICENSE); to the extent possible under law, the author has waived all copyright and related or neighboring rights to this work, effectively placing it in the public domain


text:
# Developer notes for IPFS Companion

### Table of contents

- [Developer notes for IPFS Companion](#developer-notes-for-ipfs-companion)
    - [Table of contents](#table-of-contents)
  - [Build from source](#build-from-source)
    - [Clone and install dependencies](#clone-and-install-dependencies)
    - [Build and run in Firefox](#build-and-run-in-firefox)
    - [Build and run in Chromium](#build-and-run-in-chromium)
    - [Run build on file changes](#run-build-on-file-changes)
  - [Reproducible build in Docker](#reproducible-build-in-docker)
  - [Useful tasks](#useful-tasks)
  - [Other tips](#other-tips)
  - [Legacy Firefox (\< 53) and XUL-compatible browsers](#legacy-firefox--53-and-xul-compatible-browsers)
  - [Using IPFS Companion on Firefox for Android](#using-ipfs-companion-on-firefox-for-android)
    - [Install Firefox for Android](#install-firefox-for-android)
    - [Install IPFS Companion](#install-ipfs-companion)
    - [Hot-deploy over USB](#hot-deploy-over-usb)
    - [Debugging in Firefox for Android](#debugging-in-firefox-for-android)
    - [Further resources](#further-resources)

## Build from source

If you're looking to develop on IPFS Companion, you should build the project from source. You will need [NodeJS](https://nodejs.org/) and [Firefox](https://www.mozilla.org/en-US/firefox/developer/). Make sure `npm` and `firefox` are in your `PATH`.

### Clone and install dependencies

First, clone the `ipfs-shipyard/ipfs-companion` [repository](https://github.com/ipfs-shipyard/ipfs-companion):

 ```bash
 git clone https://github.com/ipfs-shipyard/ipfs-companion.git
 ```

Then, run this all-in-one dev build, which includes installing dependencies into the `node_modules` directory:

```bash
npm run dev-build
```

### Build and run in Firefox

Use this one-stop command to build, test and deploy the add-on in Firefox:

```bash
npm start        # all-in-one
```

If you run into issues, you can run each step manually to pinpoint where the process is failing:

```bash
npm run build    # build runs bundle:firefox at the end, so manifest will be ok
npm run test     # test suite
npm run firefox  # spawn new Firefox
```

It is also possible to load the extension manually:
1. Enter `about:debugging` in the address bar
2. Click "This Firefox" in the left nav
3. Click "Load Temporary Add-on..."
4. Pick the _file_ `add-on/manifest.json`

### Build and run in Chromium

Use this one-stop command to build, test and deploy the add-on in Chromium:

```bash
npm run dev-build chromium        # all-in-one
```

You can also build it to manually install:

```bash
npm run build bundle:chromium     # last part is important: it overwrites manifest
```

Then load the extension manually:
1. Enter `chrome://extensions` in the address bar
2. Enable "Developer mode" using the toggle in the top right of the page
3. Click "Load unpacked"
4. Pick the _directory_ `add-on`

### Run build on file changes

The regular `run build` command minifies code and strips source maps. It is possible to build in `watch` mode, which will rebuild a debug version of all changed bundles:

```bash
npm run build     # do regular build first
npm run watch     # watch for new changes
```

**Note:** `watch` is a blocking command, so one needs to run it in a different terminal than `firefox` or `chromium`. Press ctrl+c to stop it.

## Reproducible build in Docker

Want to ensure prebuilt bundle does not include any additional code?
Don't want to install JS dependencies such as NodeJS and yarn?

Do an isolated build inside of Docker!

Run the following command for ending up
with a built extension inside the `build/` directory:

```sh
npm run release-build
```

It is an alias for running `ci:build` script inside of immutable Docker image, which guarantees the same output on all platforms.

## Useful tasks

Each `npm` task can run separately, but most of the time, `dev-build`, `test`, and `fix:lint` are all you need.

- `npm run dev-build`: Fast dependency install, build with yarn (updates `yarn.lock` if needed)
- `npm run dev-build firefox`: All-in-one for Firefox: fast dependency install, build with yarn, run as temporary add-on in Firefox
- `npm run dev-build chromium`: All-in-one for Chromium: fast dependency install, build with yarn, run as temporary add-on in Chromium
- `npm run firefox`: Run as temporary add-on in Firefox
- `npm run firefox:nightly`: Run as temporary add-on in Firefox Nightly (uses one in `./firefox/`, see `get-firefox-nightly` below)
- `npm run chromium`: Run as temporary add-on in Chromium
- `npm run get-firefox-nightly`: Fetch latest Firefox nightly build to `./firefox/`
- `npm run build`: Build the add-on (copy external libraries, create `.zip` bundles for Chrome and Firefox)
- `npm run watch`: Rebuild JS/CSS on file changes (run regular `build` first to ensure everything else is in place)
- `npm run bundle:chromium`: Overwrite manifest and package a generic, Chromium-compatible version
- `npm run bundle:brave`: Overwrite manifest and package a Brave-compatible version requesting access to `chrome.sockets`
- `npm run bundle:firefox`: Overwrite manifest and package a Firefox-compatible version
- `npm run build:rename-artifacts`: Rename artifacts to include runtimes in filenames
- `npm run ci`: Run tests and build (with frozen `yarn.lock`)
- `npm test`: Run the entire test suite
- `npm run lint`: Read-only check for potential syntax problems (run all linters)
- `npm run fix:lint`: Try to fix simple syntax problems (run `standard` with `--fix`, etc.)
- `npm run lint:standard`: Run [Standard](http://standardjs.com) linter ([IPFS JavaScript projects default to standard code style](https://github.com/ipfs/community/blob/master/CONTRIBUTING_JS.md))
- `npm run lint:web-ext`: Run [addons-linter](https://github.com/mozilla/addons-linter) shipped with `web-ext` tool

Release build shortcuts:

- `npm run dev-build`: All-in-one: fast dependency install, build with yarn (updates `yarn.lock` if needed)
- `npm run release-build`: Reproducible release build in docker with frozen `yarn.lock`

E2E tests:

- `npm run compose:e2e:prepare`: Pull and build docker images for e2e tests
- `npm run compose:e2e:up`: Start e2e test docker environment
- `npm run compose:e2e:test`: Run e2e tests in the docker environment
- `npm run compose:e2e:down`: Stop e2e test docker environment

## Running E2E tests

E2E tests are run in a docker environment, so you need to have docker installed.

### Preparing extension builds

You can run the tests against either release or dev builds of the extension.

To download release builds of the extension, run:

```sh
./ci/e2e/download-release-builds.sh
```

_NOTE_: When using release builds, you can control the version of the extension by setting the `IPFS_COMPANION_VERSION` environment variable:

```sh
export IPFS_COMPANION_VERSION=x.y.z
```

To build dev versions of the extension, run:

```sh
npm run build
```

or (to perform the build inside a docker container):

```sh
npm run release-build
```

### Preparing the docker environment

You need to pull docker images for [Kubo](https://github.com/ipfs/kubo), [Chromium](https://hub.docker.com/r/selenium/standalone-chrome/) and [Firefox](https://hub.docker.com/r/selenium/standalone-firefox/) before running the tests.

You also need to build the docker image containing the e2e tests.

To do all of this, run:

```sh
npm run compose:e2e:prepare
```

_NOTE_: You can control the versions of Kubo, Chromium and Firefox by setting the following environment variables:

```sh
export KUBO_VERSION=x.y.z
export CHROMIUM_VERSION=x.y.z
export FIREFOX_VERSION=x.y.z
```

**IMPORTANT**: If you are running the tests on a ARM machine, you need to use a different Chromium image. To do this, run:

```sh
export CHROMIUM_IMAGE=seleniarm/standalone-chromium
export FIREFOX_IMAGE=seleniarm/standalone-firefox
```

### Running the tests

To run the tests, run:

```sh
npm run compose:e2e:test
```

_NOTE_: You can control whether the browsers operate in headless mode as follows:

```sh
export TEST_HEADLESS=true
```

### Stopping the docker environment

To stop the docker environment, run:

```sh
npm run compose:e2e:down
```

## Other tips

- You can switch to an alternative Firefox version by overriding your `PATH`:

  ```bash
  export PATH="/path/to/alternative/version/of/firefox/:${PATH}"
  ```

- [Using localization in IPFS Companion](./LOCALIZATION-NOTES.md) (running browsers with specific locale, etc)
- [Testing persistent and restart features (Mozilla)](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Testing_persistent_and_restart_features)

## Legacy Firefox (< 53) and XUL-compatible browsers

Legacy versions `1.x.x` were based on currently deprecated Add-On SDK (Firefox-only).
While it is not maintained any more, one can inspect, build, and install it using codebase from [legacy-sdk](https://github.com/ipfs/ipfs-companion/tree/legacy-sdk) branch. For historical background on the rewrite, see [Issue #20: Move to WebExtensions](https://github.com/ipfs/ipfs-companion/issues/20).

## Using IPFS Companion on Firefox for Android

Firefox for Android is capable of running some of the same extensions as the desktop version. This makes it very useful for experimenting with IPFS.

### Install Firefox for Android

All channels are available at the Google Play Store:

- [Latest stable](https://play.google.com/store/apps/details?id=org.mozilla.firefox&hl=en)
- [Latest beta](https://play.google.com/store/apps/details?id=org.mozilla.firefox_beta)

### Install IPFS Companion

For full installation instructions, see [`README/#install`](https://github.com/ipfs-shipyard/ipfs-companion#install) in the IPFS Companion repo.

You can also test the latest code locally on an emulator, or via USB on your own device. See below for details.

### Hot-deploy over USB

To run your extension in [Firefox for Android](https://www.mozilla.org/en-US/firefox/mobile/), follow these instructions:

- [Set up your computer and Android emulator or device](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Developing_WebExtensions_for_Firefox_for_Android#Set_up_your_computer_and_Android_emulator_or_device) (enable Developer Mode, USB debugging, etc.)

Build everything, and switch `add-on/manifest.json` to the Firefox profile:

```
npm run dev-build
npm run bundle:firefox
```

Then, with your device connected to your development computer, run:

```
web-ext run -s add-on --target=firefox-android
```

It will list all connected devices with their IDs. If the list is empty, go back to the setup step and try again.

Next, deploy your extension to the specific device:

```
web-ext run -s add-on --target=firefox-android --android-device=<device ID>
```

The first time you run this command, there may be a popup on your Android device asking if you want to grant access over USB.

### Debugging in Firefox for Android

The remote debug port will be printed to the console right after successful deployment:

```
You can connect to this Android device on TCP port <debug PORT>
```

The fastest way to connect is to open `chrome://devtools/content/framework/connect/connect.xhtml` in Firefox on the same machine you run `web-ext` from.

### Further resources

- [MDN: Developing extensions for Firefox for Android](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Developing_WebExtensions_for_Firefox_for_Android)


text: Moved [here](https://docs.ipfs.io/how-to/companion-x-ipfs-path-header/)


text:
# Contributing

> Contributions are always welcome!

This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).

## Issues

### Creating New Issues

Do not hesitate and [create a new Issue](https://github.com/ipfs/ipfs-companion/issues/new/choose) if you see a bug, room for improvement or simply have a question.

### Working on existing Issues

Feel free to work on issues that are [not assigned yet](https://github.com/ipfs/ipfs-companion/issues?utf8=✓&q=is%3Aissue+is%3Aopen+no%3Aassignee), especially ones marked with [help wanted](https://github.com/ipfs/ipfs-companion/issues?q=is%3Aopen+label%3A%22help+wanted%22+no%3Aassignee) tag.
As a courtesy, please add a comment informing  about your intent. That way we will not duplicate effort.

### Submitting Pull Requests

Just make sure your PR comes with its own tests and does pass CI tests.
See the [GitHub Flow Guide](https://guides.github.com/introduction/flow/) for details.

## Translations

Go to Transifex and join [IPFS Companion Translation Project](https://www.transifex.com/ipfs/ipfs-companion/) :sparkles:

If you want to download translations from Transifex and run them locally, make sure to read [Localization Notes](./LOCALIZATION-NOTES.md) first.

## Writing Code

**If you plan to write code make sure to read [Developer Notes](DEVELOPER-NOTES.md) to get familiar with tools and commands that will make your work easier.**

## How to Help with Things Beyond Browser Extension?

- https://github.com/ipfs/in-web-browsers
- https://github.com/ipfs/community/blob/master/CONTRIBUTING.md
  [![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md)


text: Moved [here](https://docs.ipfs.io/how-to/dnslink-companion/)


text: Moved [here](https://docs.ipfs.io/how-to/companion-node-types/)


text:
# Localization in IPFS Companion

### Table of contents

- [Localization in IPFS Companion](#localization-in-ipfs-companion)
    - [Table of contents](#table-of-contents)
  - [Running Chrome with a specific locale](#running-chrome-with-a-specific-locale)
    - [Further resources](#further-resources)
  - [Running Firefox with a specific locale](#running-firefox-with-a-specific-locale)
    - [Further resources](#further-resources-1)
  - [Contributing translations](#contributing-translations)

IPFS Companion supports running in specific locales, with translations provided by the community via Transifex.

## Running Chrome with a specific locale

Chrome comes with locales out of the box, so it is enough to set the proper env:

```go
LANGUAGE=pl chromium --user-data-dir=`mktemp -d`
```

### Further resources

- [Language Codes in Chromium Project](https://src.chromium.org/viewvc/chrome/trunk/src/third_party/cld/languages/internal/languages.cc)

## Running Firefox with a specific locale

Unless you've installed a locale-specific build, Firefox will have English only. If your build already has the locale you are interested in, skip step #2.

1. Set `intl.locale.requested` in `about:config` or the command line via:

   ```bash
   web-ext run --pref intl.locale.requested=pl
   ```

2. Install your language pack from https://addons.mozilla.org/firefox/language-tools/
3. Reload the browser extension; it should detect your new locale

### Further resources

- [Mozilla: Use Firefox in another language](https://support.mozilla.org/en-US/kb/use-firefox-interface-other-languages-language-pack#w_how-to-change-the-language-of-the-user-interface)
- [Mozilla: Locale Codes](https://wiki.mozilla.org/L10n:Locale_Codes)

## Contributing translations

Internationalization in IPFS Companion (and all IPFS-related projects) depends on the contributions of the community. You can give back by contributing translations in your language(s)! Go to the [IPFS Companion Transifex page](https://www.transifex.com/ipfs/ipfs-companion/), send a request to join a specific language team, and start translating. You can also download raw files from Transifex, translate them in your own editor/tool, and then upload them back there, but many people prefer using the simple and friendly Transifex GUI.

If your language is not present in `add-on/_locales` yet, but is supported by mainstream browsers, please create a [new issue](https://github.com/ipfs/ipfs-companion/issues/new) requesting it.

Don't worry if GitHub does not immediately reflect translations added at Transifex: New translations are merged manually before every release. Locale files at GitHub are often behind what is already translated at Transifex. It is a good idea to keep Transifex email notifications enabled to be notified about new strings to translate.


text:
# Release Process
---

This process can be used to push a manual release to the [Firefox Add-Ons](https://addons.mozilla.org/) and [Chrome Web Store](https://chrome.google.com/webstore/category/extensions). Before you can do that you need to:

- [Release Process](#release-process)
  - [Tag a Release](#tag-a-release)
  - [Build Release Artifacts](#build-release-artifacts)
  - [Publish on Chrome Web Store](#publish-on-chrome-web-store)
  - [Publish on Firefox Add-Ons Store](#publish-on-firefox-add-ons-store)
  - [Release on Github.](#release-on-github)

## Tag a Release

- Bump `<semver>` version in `add-on/manifest.common.json`
- Create a `chore(main): Release v<semver>` PR.
- Create a PR for Release
    - Generate and push the tag to github
    ```sh
        git tag v<semver> && git push && git push origin v<semver> # Don't forget the 'v' prefix
    ```
    - Create draft release from https://github.com/ipfs/ipfs-companion/releases using the `v<semver>` tag
    - Use github's auto release notes feature to fill release notes.

## Build Release Artifacts

- run `npm run release-build`
- `build` folder would contain three artifacts, one each for:
    - brave
    - chromium
    - firefox
- Attach these assets to the draft release.

## Publish on Chrome Web Store

All Chromium-based browsers support install from Chrome Web Store.
Brave, Opera, and Edge do not require  additional publishing step.

- IPFS Companion Chrome Webstore: https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch
- Publishing requires your Google Account to belong to the IPFS Companion Maintainers Google Group (ask IPFS Stewards to be added).
- Go to Developer Dashboard and select publisher: `IPFS Shipyard`.
- Select `Package` from the left sub-menu.
- Upload the newly built package for Chromium [earlier](#build-release-artifacts).
- The new package goes to draft state automatically.
- Go to `Store listing` section from the left sub-menu.
- Click `Save Draft` and then `Submit for Review`.
- "Review" may take from a few hours to a few days. Google sends no email informing when new version is approved.
- Only way to check it is to inspect the version number on the store listing or Dev Dashboard.

## Publish on [Firefox Add-Ons Store](https://addons.mozilla.org/)

- IPFS Companion Firefox Add-On: https://addons.mozilla.org/en-US/firefox/addon/ipfs-companion/
- Publishing requires logging into a [Developer Account](https://addons.mozilla.org/developers/) at Firefox Add-Ons site. The account needs to be marked as one of developers of IPFS Companion (ask IPFS Stewards to be added).
- Goto `Manage My Submissions` from the drop-down menu from your username.
- Select `IPFS Companion` item.
- On the left menu select `Manage Status & Versions`
- Open the latest one in a new tab because you'll need this for reference for copying listing details.
- Click `Upload a New Version`.
- Select the Firefox-specific asset generated [earlier](#build-release-artifacts).
- For `Compatibility` select both :
    - Firefox
    - Firefox for Android
- Optionally quickly check the validation report to see there are no blocking validations.
- Click continue.
- When asked: `Do you need to submit source code`  select `yes`
    - Go to Github Release and download .zip with Source Code for the release tag.
    - Upload it to Mozilla.
- In the field asking for release notes just link to the release at Github
- Add Instructions/Notes for the reviewer (*Warning: if you forget, the release may be rejected during human review*):
    - Reuse the explanation from the previous release (ask reviewer to run the `npm run release-build` so they can run the build in a Docker container and get reproducible result across platforms)
- The new build is published immediately, but it will be reviewed in a week by a real human (unlike Chrome Web Store),  and can be taken down if it doesn’t meet the guidelines around privacy and reproducibility.

## Release on Github.

Release the draft release just created. That's it!


text: Content present in this directory was moved to [IPFS Docs](https://docs.ipfs.io).