commit abda08cac10abd3b1c01eb4fa238aa718b56a823 Author: Ricardo Date: Thu Dec 3 14:23:48 2020 +0000 feat: vuepress replatform init diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..cb041044 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +!src/.vuepress +public +node_modules \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..de39954c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": [ + "standard", + "plugin:vue/recommended", + "plugin:prettier/recommended", + "prettier/vue", + "prettier/standard" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + "vue/no-v-html": "off" + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2551d34f --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# fs & dev +.DS_Store +node_modules +public +.temp +.eslintcache + +# logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# editor +.vscode \ No newline at end of file diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 00000000..df7e01b1 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["stylelint-prettier/recommended"] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..55a2d036 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Protocol Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/PIPELINE.md b/PIPELINE.md new file mode 100644 index 00000000..29039141 --- /dev/null +++ b/PIPELINE.md @@ -0,0 +1,94 @@ +# IPFS Blog Pipeline + +This document describes the IPFS Blog work pipeline. This is the protocol of how work happens in this project and repository. + +## Pipeline High Level Description (Model) + +1. **Idea Generation** - The first step of the pipeline is to generate a set of blog post ideas. An idea should include a name, and a single sentence description of the thrust of the post, and a short abstract. (these will change over time, of course, but it's useful to be able to refer to the post ideas by name). + +2. **Selection** - the maintainer and other people interested will assign Owners to a given post, decide on rough deadlines, and assign people to support (with image editing, review, QA, etc). + +3. **Skeleton** - General list of the headings, things which we want to exposé, and code segments that will be relevant + +4. **Research** - Identify the key points to discuss in the piece. This can cycle back to improve the skeleton as well. + +5. **Writing** - Flesh out the material into smooth, interesting prose. This is the most writing-craft part of the pipeline. + +6. **Review** - Review is an iterative process where the writer(s) and reviewer(s) discuss various facets of the post and refine it. This process is similar to Code Review. Review involves different pieces: + +a. **Content Review** is focused on refining the quality of the written content, this involves review of the ideas, the points, the technical discussion, any assets (like images), and so on. This is the space for reviewing what the piece says. + +b. **Technical Review** is focused on ensuring the content is technically correct. It is important that developers review and address any issues. + +c. **Cohesion Review** is focused on how this post relates to others, and to the rest of the project. The goal is to surface any intersection points with other content, other projects, and so on. This makes the post richer, and makes it fit better in the larger context. + +d. **Mechanics Review** is focused on things about our particular blog publishing process, things making sure all embedded assets are included directly in the post directory, links are relative, etc. (this needs to be a checklist) + +7. **Backlog** - Once the post has finished review, it is marked ready to publish. This promotes the post into a backlog. The queue is not sequential, meaning that posts that enter it after others may be published before. The goal of the backlog is to aggregate content **_READY TO PUBLISH_** to create a better, more regular experience for blog readers. + +8. **Publish** - Publishing the post involves pushing it to our blog website and various other communication channels. For example: + +- Publishing on the blog website (and/or ipfs.io website) +- Publishing posts on Twitter, IRC, mailing lists, and so on. +- If relevant, promote on related publications +- Mail to specific interested groups or individuals. + +## Pipeline Implementation + +This is how the pipeline described above is actually implemented. We discuss the roles being played by various participants, the mechanics in GitHub (issues, pull requests, labels), and the artifacts (the text, markdown files, image assets, etc). + +- **Repo:** We will run this pipeline primarily through a repository on github: https://github.com/ipfs/blog, we will use issues to source ideas for posts, and pull requests for fleshing out, writing, and reviewing posts. + +### Pipeline Roles + +- **Maintainer:** The pipeline has a "maintainer" that ensures the pipelines is progressing smoothly, and is there to ensure adherence to the guidelines and help address issues. +- **Owner:** Each post will have an "owner" that will pick up the post at Step 2 (Skeleton) and be responsible for running it through the pipeline to its conclusion. The owner can change, it just needs to be an explicit hand off, as the owner will be directly responsible individual for finishing and publishing post. The owner will work with whoever else is relevant to achieve the rest of the steps in the pipeline. +- **Reviewers:** Each post will have a set of reviewers that will come in during the review step of the pipeline. +- **Publishers:** The final step, publishing, may involve other people independent of the pipeline, that manage the various communication channels (blog website, mailing lists, social media, etc). It is the responsibility of the **Owner** to get what they need from the **Publishers** to deliver. **Important Note:** it is up to the **Maintainer** to figure out and decide when blog posts should be published, because broader context is required. + +Note that the role of "author" is not used, as authorship may end up including the owner(s), reviewer(s), maintainer(s), and other writer(s) who help alongside. The final Authors of the piece are established based on the contribution. Hence, let's not say "author" when we mean "owner" or "writer". + +### Pipeline Stage Mechanics + +**Important Note** each of the pipeline stages has an associated **Github Label**, please use them! We use these labels to figure out where the blog post is in the pipeline. Post **Owners**: make sure both the issue and pull requests for your post have the right label, and are assigned to you. **Pipeline Maintainer**: please verify posts carry the right labels and are assigned to the owners. + +1. **Idea Generation:** this part happens on the issue tracker: https://github.com/ipfs/blog/issues - each blog post idea is posted as an independent issue, with its own name, sentence description, and short abstract. + +2. **Selection:** this part happens in the blog post's issue, with whatever relevant discussion should happen. From there, the issue is assigned to whoever is selected as "Owner". + +3. **Skeleton:** this part happens as a pull request. A pull request is created adding a directory (draft), with markdown files for the post content (`index.md`) and the skeleton (`skeleton.md`). Copy the post skeleton directory into a new directory for your post. Fill in the skeleton (take a look at the example, and remove that file). And create a pull request: + + ``` + # clone the repo if you haven't + git clone https://github.com/ipfs/blog + cd blog + + # then edit drafts/my-post-draft/skeleton.md + cp -r drafts/post-draft-template drafts/my-post-draft + + # remove the example when you're ready + rm drafts/my-post-draft/skeleton-example.md + ``` + +4. **Research**: this should happen in the pull request. Feel free to drop down ideas in the pull request comments section, or in the files themselves. Whatever you find most productive! Feel free to involve others in the pull request. Source the knowledge from wherever you need to. This is a good time to line up any illustrations you may need. + +5. **Writing**: this happens in the markdown file. At the end, the draft for review should be committed and on the github pull-request. + +6. **Review**: this happens in the blog post pull request. Reviewers will check various parts of the post, for content, technical accuracy, story cohesion, and mechanics. (It is possible that the mechanics part is a checklist, and it may be able to be turned into a CI test). Reviewer and Owner iteration happens in the pull-request. Once the pull-request is ready, and all reviewers have signed off on it, the post can be merged. It will be merged as a draft, into the `drafts/` folder. At this point, the blog post issue moves to the Backlog stage. + +7. **Backlog**: in this stage, all the post materials are ready to go and in the `drafts/` folder, and the post issue has the `Backlog` label. The post stays here until publication, which the maintainer and owner figure out together. During this time, the post may get "unfresh" (no longer accurate, or should also incorporate new news), if so, maintainer and owner can file a PR to improve the post. + +8. **Publish**: this stage involves the following steps. These are mostly mechanical and involve support from a developer on the infra or web team (@lgierth as of June 2017). It is possible some of this can be automated with scripts, and CI tests. + +- [ ] file a PR with changes necessary to publish + - [ ] move the post directory from the `drafts/` folder into `src/` + - [ ] adjust the filenames (to add the sequential number) + - [ ] change the post date to reflect publication date +- [ ] review + merge PR. +- [ ] publish blog website (blog.ipfs.io and on ipfs website) + - [ ] ensure all content is pinned + - [ ] ensure website is live and post is correct +- [ ] post and/or announce on communication channels: + - [ ] publish post in newsletter mailing list + - [ ] tweet out from @IPFSbot and RT + - [ ] post link to tweet in IRC diff --git a/README.md b/README.md new file mode 100644 index 00000000..68fe15b9 --- /dev/null +++ b/README.md @@ -0,0 +1,164 @@ +# IPFS Blog + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) + +> Source for the [IPFS Blog](https://blog.ipfs.io) + +![ipfs-blog @ 2018-11-30](https://ipfs.io/ipfs/QmYxumHGuNdu8rAwcw6kgc2UU1buJxv7V7uFs17tBx9w3W/ipfs-blog.png) + +- [IPFS Blog](#ipfs-blog) + - [Usage](#usage) + - [Create a new blog post](#create-a-new-blog-post) + - [Custom header image](#custom-header-image) + - [Editing](#editing) + - [Publishing](#publishing) + - [Translating 🌐✍️🖖](#translating-️) + - [Contribute](#contribute) + - [Want to hack on IPFS?](#want-to-hack-on-ipfs) + - [License](#license) + +## Usage + +The IPFS blog is a static website, built with `hugo`. We use `node`, `npm`, `less`, and a few other helpful modules to optimize the site for deployment. + +With `make`, [`node`](http://nodejs.org) and `npm` installed on your system, you can: + +**Run the site in dev mode** + +```console +$ make dev +... + +Web Server is available at http://localhost:1313/ +``` + +The first time you run it, it will install all the dependencies ✨, Then it will watch for changes in the source code and rebuild the site when you save your changes. + +Run it and open in your browser, and start editing your new blog post. + +**Note**: In dev mode, you will see all posts, even ones where you set the `date` field to be in the future, say to schedule a post for a specific date. Posts with a `date` value in the future will not appear on the live site until that date arrives. There is a nightly CI job that runs at 00:00 UTC that will cause posts that are merged to master to go live on the `date` you set. + +**Build the production site** + +```console +$ make + +... + +Site built out to ./public dir +``` + +This will build out the static site, optimized and ready for deployment, to the `./public` directory. + +## Create a new blog post + +Each blog post is a markdown file, with a little metadata at the top (known as YAML front matter) to help us create the post index page. + +A blog post looks like this: + +```markdown +--- +date: 2019-01-24 +title: 2018 Q4 London Hack Week Summary +author: David Dias +--- + +Back in October last year, the Go Core Dev Team for the IPFS, IPLD, and libp2p projects spent some quality time together. + +... +``` + +**To create your new post** find the last post in `content/post`, create a copy, and change the file name by incrementing the number in the title, and change the name to be a useful URL slug for your post. e.g. + +```console +$ cd content/post +$ cp 66-london-hack-week-report.md 67-incredible-adventures.md +``` + +Now edit the metadata at the top of the file. + +- `date` - the "_published at_" date, shown on the [blog index page](https://blog.ipfs.io), please update at posting time to reflect current date - **required** (posts will not be displayed until this date on the live blog, but you will see them locally when using `make dev`) +- `author` - used to give you credit for your words - **required** +- `title` - used as the `h1` on the post-page, and the name of the post on the index page. **required** +- `tags` - don't appear to be used right now, but set them anyway as we'll want to add a _see more posts like this one_ feature one day. +- `url` - can be used to override the post URL if needed. Please start and end URLs with a `/` (`/my/url/`). +- `header_image` - name of the image displayed on the [blog homepage](https://blog.ipfs.io/). If no image is set, a [default header image](https://raw.githubusercontent.com/ipfs/blog/blog-picture-list/static/header_images/blog-placeholder.png) is shown. See [Custom header image](#custom-header-image) for more details. +- `snippet` - the short string of text that is displayed for each post on the [blog homepage](https://blog.ipfs.io). If no snippet is set, the first ~20 words are shown. + +We have a process for creating and reviewing content before it gets published. **Please review [PIPELINE.md](./PIPELINE.md) for the details.** + +#### Custom header image + +Each post can have a custom image that is shown on the [blog homepage](https://blog.ipfs.io/). To set an image: + +1. Create the image you want to use and crop it to `500px` by `250px`. +1. Move the image into `static\header_images`. +1. Rename the image to match the file name of your post. For example, the `085-announcing-rust-ipfs.md` post uses `085-announcing-rust-ipfs.png` as the header. +1. In the post markdown, edit the front-matter to include the `header_image` variable: + + ```markdown + header_image: 085-announcing-rust-ipfs.png + ``` + +1. Push your changes. + +### Editing + +Submit a Github PR with your changes, and request a review. + +1. Make a change to a file +2. Add and commit. +3. Push to a remote branch. +4. Make a pull request to `master`. +5. Request a review from another member of the IPFS org. + +### Publishing + +CircleCI builds the static site, Pins it to our IPFS Cluster, and provides a preview link for a review on the Gateway. Merges to to `master` do the same steps plus update the DNSLink for the domain. + +In order for CircleCI to build the site after your merge, you _must_ be a member of the [website-deployers](https://github.com/orgs/ipfs/teams/website-deployers/members), comms, GUI or admin teams on the IPFS GitHub org and you _must_ subscribe to the CircleCI builds for the ipfs/blog repository. Create a free CircleCI account, and then [subscribe to the repo here](https://circleci.com/gh/ipfs/workflows/blog/tree/master). + +After the CircleCI build completes, it will take a few minutes for the DNS update to propagate and your changes to show up on the website. + +### Translating 🌐✍️🖖 + +Every post can be optionally translated by: + +1. Ensuring `config.toml` includes relevant [language code](http://www.rssboard.org/rss-language-codes) in `[languages]` section +2. Adding a translation file with correct locale suffix, for example: + + - English: `content/post/45-ipfs-weekly-11.md` → //blog.ipfs.io/45-ipfs-weekly-11/ + - Chinese (Simplified): `content-i18n//post/45-ipfs-weekly-11.md` → //blog.ipfs.io/**zh-cn**/45-ipfs-weekly-11/ + + Note: To ensure the translation is grouped with source post the `translationKey` header needs to be the same in both files, and `url` of translation needs to be prefixed with locale code (`zh-cn` for Chinese Simplified), for example: + + ```markdown + --- + date: 2018-09-25 + title: IPFS 周报-11 + url: /zh-cn/45-ipfs-weekly-11/ + translationKey: 45-ipfs-weekly-11 + --- + ``` + +Having that, non-english version will have unique URL, as seen on the example below: + +| Chinese (Simplified) | English | +| --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| ![en](https://user-images.githubusercontent.com/157609/52483815-13a27680-2bb5-11e9-83d5-63a3f0122728.png) | ![zh-cn](https://user-images.githubusercontent.com/157609/52483825-169d6700-2bb5-11e9-94a6-cfde2f82e2b7.png) | + +## Contribute + +Feel free to join in! PRs and [issues](https://github.com/ipfs/blog/issues) are welcome. + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) + +## License + +© Protocol Labs | Code is licensed with the [MIT](LICENSE) License. Except as noted, other content licensed [CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/us/). diff --git a/config.toml b/config.toml new file mode 100644 index 00000000..796315ab --- /dev/null +++ b/config.toml @@ -0,0 +1,36 @@ +baseURL = "https://blog.ipfs.io" +relativeURLs = true +googleAnalytics = "UA-52930282-2" +ignoreFiles = [ "\\.js\\.tmp*"] + +DefaultContentLanguage = "en" +languageCode = "en-us" +hasCJKLanguage = true +enableMissingTranslationPlaceholders = false +summaryLength = 20 +paginate = 9 + +[params] + domain = "blog.ipfs.io" + name = "IPFS Blog" + title = "IPFS Blog" + description = "A peer-to-peer hypermedia protocol to make the web faster, safer, and more open." + author = "Protocol Labs" + github = "https://github.com/ipfs/blog" + social = [ { title = "Twitter", link = "https://twitter.com/IPFS" }, + { title = "Facebook", link = "https://www.facebook.com/sharer/sharer.php?u=https://ipfs.io" }, + { title = "YouTube", link = "https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew" } ] + +[outputs] + home = ["HTML", "RSS", "JSON"] + +[languages] + [languages.en] + languageName = "English" + languageCode = "en" + weight = 0 + [languages.zh-cn] + languageName = "中文(中国)" + contentDir = "content-i18n/zh-cn" + languageCode = "zh-cn" + weight = 10 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..c9cc54d7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,19560 @@ +{ + "name": "ipfs-blog", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "dev": true + }, + "@babel/core": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.4.tgz", + "integrity": "sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.12.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + } + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", + "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + } + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } + } + }, + "@fullhuman/postcss-purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", + "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "dev": true, + "requires": { + "postcss": "7.0.32", + "purgecss": "^2.3.0" + } + }, + "@jsdevtools/rehype-url-inspector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@jsdevtools/rehype-url-inspector/-/rehype-url-inspector-2.0.2.tgz", + "integrity": "sha512-iQL2lb+nOoT+5jFz1nfOa3oBJPF2JyBtPQgGmrRhxLT3QZAGIMLz/mh/9mUmk7FfKF5NB8xq0KoLn5F4/QHpyA==", + "dev": true, + "requires": { + "url-regex": "^5.0.0", + "vfile": "^4.1.1" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==", + "dev": true, + "requires": { + "@babel/core": ">=7.9.0" + } + }, + "@stylelint/postcss-markdown": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz", + "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==", + "dev": true, + "requires": { + "remark": "^12.0.0", + "unist-util-find-all-after": "^3.0.1" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/node": { + "version": "14.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.9.tgz", + "integrity": "sha512-iXuiZ65PL5c8VAlF426GVJGKcsnAb2rW2037LJe3G6eM6nz35bK9QAUOH3Ic3kF4ZcKLpM02sFkSzCflIpoIKA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "dev": true + }, + "@vssue/api-github-v3": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@vssue/api-github-v3/-/api-github-v3-1.4.4.tgz", + "integrity": "sha512-/ZQwO+/XgHz7hnVX6zLIWA0L1fmI4LBzQoRp1J56tonH6gbDpvl/VZ8VHIcSldHnpEsjf8wYmbIEz8rJd7jG2Q==", + "dev": true, + "requires": { + "@vssue/utils": "^1.4.0", + "axios": "^0.18.1" + } + }, + "@vssue/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vssue/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-3d9WCYNurdFKApFzU8i7YD1GCGhunEVYnwSJxwQ2rDmEdpLneAYNJWg9+QS6bqzB+Pw7ymtwLf/Sqti9+xUGqA==", + "dev": true, + "requires": { + "date-fns": "^1.29.0", + "qs": "^6.6.0" + } + }, + "@vssue/vuepress-plugin-vssue": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@vssue/vuepress-plugin-vssue/-/vuepress-plugin-vssue-1.4.6.tgz", + "integrity": "sha512-oP63mMvue54ASrfMJVTpmT74is4eU2OeAqDqSOLYUytpqgba2AKPXnq6xhY8fua/+hxpttq0pOVajF6GL4WTgg==", + "dev": true, + "requires": { + "vssue": "^1.4.6" + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.0-rc.2.tgz", + "integrity": "sha512-1+7CwjQ0Kasml6rHoNQUmbISwqLNNfFVBUcZl6QBremUl296ZmLrVQPqJP5pyAAWjZke5bpI1hlj+LVVuT7Jcg==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.0-rc.3.tgz", + "integrity": "sha512-/Ibq0hoKsidnHWPhgRpjcjYhYcHpqEm2fiKVAPO88OXZNHGwaGgS4yXkC6TDEvlZep4mBDo+2S5T81wpbVh90Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.0-rc.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-preset-app": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.7.tgz", + "integrity": "sha512-A9ujqmvR9wb8nWiMnEYZW/8QfGZbqxC/etzbKIDrUdsqJ27jx106leMHJc8nmAn58RqGd6iww6uZ3Sx7aYiG3A==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.0-0", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.1.tgz", + "integrity": "sha512-6bGmltqzIJrinwRRdczQsMhruSi9Sqty9Te+/5hudn4Izx/JYRhW1QELpR+CIL0gC/c9A7WroH6FmkDGxmWx3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helpers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/parser": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.1.tgz", + "integrity": "sha512-grtrkl7FoNT3l0ZCQUp8UQra2vdGZ1v6Nti5NtSzP5/lS9VA9XUuiZt0tsabOjSw6Q6gfNTvgiZDZdLktyysHQ==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.1", + "@vue/babel-sugar-functional-vue": "^1.2.1", + "@vue/babel-sugar-inject-h": "^1.2.1", + "@vue/babel-sugar-v-model": "^1.2.1", + "@vue/babel-sugar-v-on": "^1.2.1" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.1.tgz", + "integrity": "sha512-F2gQbEMOUPyapqc85/O1Tbw0qBuvgXC/qBcBsjMKqC7KWJ4hK1eJUvU3iLHHTbre6V7zzIjrqEe0SoE1lR4mfw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.1.tgz", + "integrity": "sha512-SUUrD936wKcgWPauuwrZ9OIitH0Rhc3BzDrdq2LE7JfPSGKR1OXyihnsia++lPufiY7A/cEkbRgNyMFIYm7L9w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.1.tgz", + "integrity": "sha512-JV8QicpnLaKurpm5K5pBlK8jDTdIpmGW7e1R88DRveLAFlW5un6cl+JM2100/7+t0xI08F3GQ1NWIb8d1YYBzA==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.1.tgz", + "integrity": "sha512-6kTx+hZVJ6dclAwWXSvfnv4XlkzCzKthQ/xlnypFW8+9uhy3E5ehNiAaHfr83R8+7d3DlvbZrQ9xgbZc1quuJg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.1.tgz", + "integrity": "sha512-rQhM52dC/vWxgMmi8ZY5MwudOb9sWrqN4gffbPDV44TNqyd2j1+PmW2qLR0QfcDsAccR5U+gcguHc3qhLSrXNw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vuepress/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.7.1.tgz", + "integrity": "sha512-M5sxZq30Ke1vXa4ZZjk6185fwtpiJOqzXNnzcIe0GxtvtaF8Yij6b+KqQKlUJnnUXm+CKxiLCr8PTzDY26N7yw==", + "dev": true, + "requires": { + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.1.2", + "@vuepress/markdown": "1.7.1", + "@vuepress/markdown-loader": "1.7.1", + "@vuepress/plugin-last-updated": "1.7.1", + "@vuepress/plugin-register-components": "1.7.1", + "@vuepress/shared-utils": "1.7.1", + "autoprefixer": "^9.5.1", + "babel-loader": "^8.0.4", + "cache-loader": "^3.0.0", + "chokidar": "^2.0.3", + "connect-history-api-fallback": "^1.5.0", + "copy-webpack-plugin": "^5.0.2", + "core-js": "^3.6.4", + "cross-spawn": "^6.0.5", + "css-loader": "^2.1.1", + "file-loader": "^3.0.1", + "js-yaml": "^3.13.1", + "lru-cache": "^5.1.1", + "mini-css-extract-plugin": "0.6.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "portfinder": "^1.0.13", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", + "url-loader": "^1.0.1", + "vue": "^2.6.10", + "vue-loader": "^15.7.1", + "vue-router": "^3.4.5", + "vue-server-renderer": "^2.6.10", + "vue-template-compiler": "^2.6.10", + "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.2", + "webpack": "^4.8.1", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.5.1", + "webpack-merge": "^4.1.2", + "webpackbar": "3.2.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@vuepress/markdown": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.7.1.tgz", + "integrity": "sha512-Ava9vJECHG1+RC53ut1dXSze35IH5tc3qesC06Ny37WS93iDSQy09j8y+a0Lugy12j1369+QQeRFWa40tdHczA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.7.1", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" + } + }, + "@vuepress/markdown-loader": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.7.1.tgz", + "integrity": "sha512-GM1F/tRhP9qZydTC89FXJPlLH+BmZijMKom5BYLAMEXsU20A9kABTRoatPjOUbZuKT+gn03JgG97qVd8xa/ETw==", + "dev": true, + "requires": { + "@vuepress/markdown": "1.7.1", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" + } + }, + "@vuepress/plugin-active-header-links": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.7.1.tgz", + "integrity": "sha512-Wgf/oB9oPZLnYoLjQ/xbQc4Qa3RU5tXAo2dB4Xl/7bUL6SqBxO866kX3wPxKdSOIL58tq8iH9XbUe3Sxi8/ISQ==", + "dev": true, + "requires": { + "lodash.debounce": "^4.0.8" + } + }, + "@vuepress/plugin-blog": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-1.9.3.tgz", + "integrity": "sha512-HUv2pPg1u58NEJukeNPixbJcsIKgNLaEk3FjYq8VIeCkmrODIi7YrDam7+g+GzQyrIkm/xYfEiE0Y/TSX5crFw==", + "dev": true, + "requires": { + "@vssue/api-github-v3": "^1.1.2", + "@vssue/vuepress-plugin-vssue": "^1.2.0", + "dayjs": "^1.8.19", + "vuejs-paginate": "^2.1.0", + "vuepress-plugin-disqus": "^0.2.0", + "vuepress-plugin-feed": "^0.1.8", + "vuepress-plugin-mailchimp": "^1.4.1", + "vuepress-plugin-sitemap": "^2.3.1" + } + }, + "@vuepress/plugin-html-redirect": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-html-redirect/-/plugin-html-redirect-0.1.2.tgz", + "integrity": "sha512-5UIWO6+s/pAXysauYDbLAJg1Jv9eSYjRsQqVPZaLmS666R1ExPmfYiCjsD4vqju+jjlPCngJ8yB7zcHrCTqXEQ==", + "dev": true + }, + "@vuepress/plugin-last-updated": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.7.1.tgz", + "integrity": "sha512-VW5jhBuO0WRHDsBmFsKC6QtEyBLCgyhuH9nQ65aairCn3tdoJPz0uQ4g3lr/boVbgsPexO677Sn3dRPgYqnMug==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@vuepress/plugin-nprogress": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.7.1.tgz", + "integrity": "sha512-KtqfI3RitbsEbm22EhbooTvhjfMf6zttKlbND7LcyJwP3MEPVYyzQJuET03hk9z4SgCfNV2r/W3sYyejzzTMog==", + "dev": true, + "requires": { + "nprogress": "^0.2.0" + } + }, + "@vuepress/plugin-register-components": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz", + "integrity": "sha512-MlFdH6l3rTCJlGMvyssXVG998cq5LSMzxCuQLYcRdtHQT4HbikIcV4HSPGarWInD1mP12+qX/PvKUawGwp1eVg==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.7.1" + } + }, + "@vuepress/plugin-search": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.7.1.tgz", + "integrity": "sha512-OmiGM5eYg9c+uC50b6/cSxAhqxfD7AIui6JEztFGeECrlP33RLHmteXK9YBBZjp5wTNmoYs+NXI/cWggYUPW8Q==", + "dev": true + }, + "@vuepress/shared-utils": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.7.1.tgz", + "integrity": "sha512-ydB2ZKsFZE6hFRb9FWqzZksxAPIMJjtBawk50RP6F+YX5HbID/HlyYYZM9aDSbk6RTkjgB5UzJjggA2xM8POlw==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@vuepress/theme-default": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.7.1.tgz", + "integrity": "sha512-a9HeTrlcWQj3ONHiABmlN2z9TyIxKfQtLsA8AL+WgjN3PikhFuZFIJGzfr+NLt67Y9oiI+S9ZfiaVyvWM+7bWQ==", + "dev": true, + "requires": { + "@vuepress/plugin-active-header-links": "1.7.1", + "@vuepress/plugin-nprogress": "1.7.1", + "@vuepress/plugin-search": "1.7.1", + "docsearch.js": "^2.5.2", + "lodash": "^4.17.15", + "stylus": "^0.54.8", + "stylus-loader": "^3.0.2", + "vuepress-plugin-container": "^2.0.2", + "vuepress-plugin-smooth-scroll": "^0.0.3" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "agentkeepalive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "algoliasearch": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", + "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", + "dev": true, + "requires": { + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "all-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/all-relative/-/all-relative-1.1.0.tgz", + "integrity": "sha512-MjeUdJCgWynAg1zPgpBkq5DwEe1K4hLimlCqPY75c50ZAr8PnQdR7WQn6WwQxAb2kPA0JyUyXyE6/V63LJ1tVw==", + "dev": true, + "requires": { + "postcss": "^7.0.30", + "postcss-url": "^8.0.0", + "rehype-parse": "^6.0.2", + "rehype-stringify": "^7.0.0", + "rehype-url-inspector": "^2.0.1", + "relative": "^3.0.2", + "unified": "^9.0.0", + "vfile-find-down": "^5.0.1" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autocomplete.js": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", + "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", + "dev": true, + "requires": { + "immediate": "^3.2.3" + } + }, + "autoprefixer": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", + "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001087", + "colorette": "^1.2.0", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true + }, + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "body-scroll-lock": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-2.7.1.tgz", + "integrity": "sha512-hS53SQ8RhM0e4DsQ3PKz6Gr2O7Kpdh59TWU98GHjaQznL7y4dFycEPk7pFQAikqBaUSCArkc5E3pe7CWIt2fZA==" + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cac": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.6.1.tgz", + "integrity": "sha512-uhki4T3Ax68hw7Dufi0bATVAF8ayBSwOKUEJHjObPrUN4tlQ8Lf7oljpTje/mArLxYN0D743c2zJt4C1bVTCqg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", + "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001094", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz", + "integrity": "sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true + }, + "character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "dev": true, + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" + }, + "dependencies": { + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", + "integrity": "sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "conventional-changelog": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.23.tgz", + "integrity": "sha512-sScUu2NHusjRC1dPc5p8/b3kT78OYr95/Bx7Vl8CPB8tF2mG1xei5iylDTRjONV5hTlzt+Cn/tBWrKdd299b7A==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.11", + "conventional-changelog-atom": "^2.0.7", + "conventional-changelog-codemirror": "^2.0.7", + "conventional-changelog-conventionalcommits": "^4.4.0", + "conventional-changelog-core": "^4.2.0", + "conventional-changelog-ember": "^2.0.8", + "conventional-changelog-eslint": "^3.0.8", + "conventional-changelog-express": "^2.0.5", + "conventional-changelog-jquery": "^3.0.10", + "conventional-changelog-jshint": "^2.0.8", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true + }, + "conventional-changelog-conventionalcommits": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz", + "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.1.tgz", + "integrity": "sha512-8cH8/DEoD3e5Q6aeogdR5oaaKs0+mG6+f+Om0ZYt3PNv7Zo0sQhu4bMDRsqAF+UTekTAtP1W/C41jH/fkm8Jtw==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^4.0.18", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "2.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "shelljs": "^0.8.3", + "through2": "^4.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", + "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "meow": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", + "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", + "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^2.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "meow": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", + "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "conventional-recommended-bump": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.10.tgz", + "integrity": "sha512-2ibrqAFMN3ZA369JgVoSbajdD/BHN6zjY7DZFKTHzyzuQejDUCjQ85S5KHxCRxNwsbDJhTPD5hOKcis/jQhRgg==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.6", + "conventional-commits-parser": "^3.1.0", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^4.1.0", + "meow": "^7.0.0", + "q": "^1.5.1" + }, + "dependencies": { + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + } + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "dayjs": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.6.tgz", + "integrity": "sha512-HngNLtPEBWRo8EFVmHFmSXAjtCX8rGNqeXQI0Gh7wCTSqwaKgPIDqu9m07wABVopNwzvOeCb+2711vQhDlcIXw==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "docsearch.js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", + "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", + "dev": true, + "requires": { + "algoliasearch": "^3.24.5", + "autocomplete.js": "0.36.0", + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domready": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", + "integrity": "sha1-kfJS5Ze2Wvd+dFriTdAYXV4m1Yw=", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + } + } + }, + "dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.488", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", + "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "dev": true, + "requires": { + "esprima": "^4.0.0", + "through": "~2.3.4" + } + }, + "envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", + "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + } + } + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-config-standard": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.1.tgz", + "integrity": "sha512-WBBiQQZdaPyL+4sPkGWhWrHCDtvJoU195B9j8yXE9uFQnX34gMXI5CeBRm95gx3PMEZPM5OpwET10hH4F4SxCA==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", + "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", + "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", + "dev": true + }, + "eslint-plugin-vue": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.1.0.tgz", + "integrity": "sha512-9dW7kj8/d2IkDdgNpvIhJdJ3XzU3x4PThXYMzWt49taktYnGyrTY6/bXCYZ/VtQKU9kXPntPrZ41+8Pw0Nxblg==", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^7.3.2", + "vue-eslint-parser": "^7.1.1" + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "feed": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/feed/-/feed-2.0.4.tgz", + "integrity": "sha512-sWatfulDP6d18qVaWcu34qmq9ml6UeN6nHSBJpNZ2muBqxjPAdT375whPYAHP+gqLfyabtYU5qf2Dv4nqtlp0w==", + "dev": true, + "requires": { + "luxon": "^1.3.3", + "xml": "^1.0.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "generate-robotstxt": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/generate-robotstxt/-/generate-robotstxt-7.1.0.tgz", + "integrity": "sha512-CA1cT9sX+Q0mDfZmQaigd34dSqzvhLGoiHdC1RnBGCVwpklYRAs/PeQbC5wfYxKhTdQDV0h0DXLA+jXExZe5SA==", + "dev": true, + "requires": { + "cosmiconfig": "^5.2.1", + "fs-extra": "^8.1.0", + "ip-regex": "^4.1.0", + "is-absolute-url": "^3.0.0", + "meow": "^5.0.0", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "ip-regex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.2.0.tgz", + "integrity": "sha512-n5cDDeTWWRwK1EBoWwRti+8nP4NbytBBY0pldmnIkq6Z55KNFmWofh4rl9dPZpj+U/nVq7gweR3ylrvMt4YZ5A==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "requires": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "meow": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", + "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "github-markdown-css": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/github-markdown-css/-/github-markdown-css-3.0.1.tgz", + "integrity": "sha512-9G5CIPsHoyk5ObDsb/H4KTi23J8KE1oDd4KYU51qwqeM+lKWAiO7abpSgCkyWswgmSKBiuE7/4f8xUz7f2qAiQ==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "requires": { + "ini": "^1.3.5" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "gray-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", + "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", + "dev": true, + "requires": { + "js-yaml": "^3.11.0", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dev": true, + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "dev": true + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "dev": true + }, + "hast-util-to-html": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.2.tgz", + "integrity": "sha512-pu73bvORzdF6XZgwl9eID/0RjBb/jtRfoGRRSykpR1+o9rCdiAHpgkSukZsQBRlIqMg6ylAcd7F0F7myJUb09Q==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "dev": true + }, + "hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dev": true, + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=", + "dev": true, + "requires": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true + }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "dependencies": { + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + } + } + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", + "requires": { + "string-convert": "^0.2.0" + } + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz", + "integrity": "sha1-pltPoPEL2nGaBUQep7lMVfPhW64=", + "dev": true, + "requires": { + "debug": "^2.1.3" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "known-css-properties": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", + "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==", + "dev": true + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lint-staged": { + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz", + "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "listr2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz", + "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.3", + "through": "^2.3.8" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.trimend": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", + "integrity": "sha1-EoBENyhrmMrYmWt5QU4RMAEUCC8=", + "dev": true + }, + "lodash.trimstart": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", + "integrity": "sha1-j/TexTLYJIavWVc8OURZFOlEp/E=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "loglevel": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "dev": true + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "luxon": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz", + "integrity": "sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "dev": true + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true + }, + "markdown-it-chain": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", + "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", + "dev": true, + "requires": { + "webpack-chain": "^4.9.0" + }, + "dependencies": { + "webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + } + } + }, + "markdown-it-container": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", + "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=", + "dev": true + }, + "markdown-it-deflist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==", + "dev": true + }, + "markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=", + "dev": true + }, + "markdown-it-footnote": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.2.tgz", + "integrity": "sha512-JVW6fCmZWjvMdDQSbOT3nnOQtd9iAXmw7hTSh26+v42BnvXeVyGMDBm5b/EZocMed2MbCAHiTX632vY0FyGB8A==", + "dev": true + }, + "markdown-it-img-lazy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-img-lazy/-/markdown-it-img-lazy-1.0.2.tgz", + "integrity": "sha512-xBgh0s3NDxJyR09PyqPVMGqTXOLSKA2idIRx0p6eeHAEuXGCcQGIushgf7Aoyk6AqoAujjqma+PgH0Glq4IAiw==" + }, + "markdown-it-imsize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz", + "integrity": "sha1-zKBCeQXQUziiR8ucqdloxc3dUXA=" + }, + "markdown-it-table-of-contents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", + "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==", + "dev": true + }, + "markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", + "dev": true + }, + "markdown-it-video": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/markdown-it-video/-/markdown-it-video-0.6.3.tgz", + "integrity": "sha512-T4th1kwy0OcvyWSN4u3rqPGxvbDclpucnVSSaH3ZacbGsAts964dxokx9s/I3GYsrDCJs4ogtEeEeVP18DQj0Q==", + "dev": true + }, + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "requires": { + "repeat-string": "^1.0.0" + } + }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "dev": true, + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "meow": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", + "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mitt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.2.tgz", + "integrity": "sha1-OA5hSA1qYVtmDwertg1R4KTkvtY=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "dev": true + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "dev": true + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", + "dev": true, + "requires": { + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + } + }, + "postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-nested": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz", + "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==", + "dev": true, + "requires": { + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-prefix-selector": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.7.2.tgz", + "integrity": "sha512-ddmzjWNmGs7E/nyolJ021/Gk6oBLRQLyyXKGV4Mu+Y0gquo+XlXSDP0/Y2J8C/cad/GLyftf2H0XtuDFQZxN3w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "requires": { + "postcss": "^7.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "posthtml-render": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.3.0.tgz", + "integrity": "sha512-km+kuwydlc2lnx4FnHmTwejGtgmfjBT2fOqu9mDTJUoNecwwMnx4soRxngfJ1Qvpa/OLu1YIqZ+/0OiJDOnCzg==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true + }, + "prismjs": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.22.0.tgz", + "integrity": "sha512-lLJ/Wt9yy0AiSYBf212kK3mM5L8ycwlyTlSxHBAneXLR0nzFMlZ5y7riFPF3E33zXOF2IH95xdY5jIyZbM9z/w==", + "dev": true, + "requires": { + "clipboard": "^2.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", + "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "glob": "^7.0.0", + "postcss": "7.0.32", + "postcss-selector-parser": "^6.0.2" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reduce": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", + "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", + "dev": true, + "requires": { + "object-keys": "^1.1.0" + } + }, + "reduce-css-calc": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", + "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dev": true, + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "rehype-stringify": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-7.0.0.tgz", + "integrity": "sha512-u3dQI7mIWN2X1H0MBFPva425HbkXgB+M39C9SM5leUS2kh5hHUn2SxQs2c2yZN5eIHipoLMojC0NP5e8fptxvQ==", + "dev": true, + "requires": { + "hast-util-to-html": "^7.0.0", + "xtend": "^4.0.0" + } + }, + "rehype-url-inspector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rehype-url-inspector/-/rehype-url-inspector-2.0.2.tgz", + "integrity": "sha512-mMbllcH41iweCClditEVD+dCntCdItKJh+ajh8XdjhdaPPvHOy0RW0Fa1Il4+Zq0yvAaqG/dGCrlDyW79X/rhA==", + "dev": true, + "requires": { + "@jsdevtools/rehype-url-inspector": "2.0.2" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "relative": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", + "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", + "dev": true, + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "remark": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", + "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", + "dev": true, + "requires": { + "remark-parse": "^8.0.0", + "remark-stringify": "^8.0.0", + "unified": "^9.0.0" + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "remove-markdown": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz", + "integrity": "sha1-XktmdJOpNXlyjz1S7MHbnKUF3Jg=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true, + "optional": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sitemap": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-3.2.2.tgz", + "integrity": "sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg==", + "dev": true, + "requires": { + "lodash.chunk": "^4.2.0", + "lodash.padstart": "^4.6.1", + "whatwg-url": "^7.0.0", + "xmlbuilder": "^13.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "slug": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.2.tgz", + "integrity": "sha512-c5XbWkwxHU13gAdSvBHQgnGy2sxv/REMz0ugcM0SOSBCO/N4wfU0TDBC3pgdOwVGjZwGnLBTRljXzdVYE+KYNw==", + "dev": true + }, + "smoothscroll-polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", + "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "standard-version": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.0.0.tgz", + "integrity": "sha512-eRR04IscMP3xW9MJTykwz13HFNYs8jS33AGuDiBKgfo5YrO0qX0Nxb4rjupVwT5HDYL/aR+MBEVLjlmVFmFEDQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.23", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.4.0", + "conventional-recommended-bump": "6.0.10", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^4.1.0", + "fs-access": "^1.0.1", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^15.3.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "std-env": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", + "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", + "dev": true, + "requires": { + "ci-info": "^1.6.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string.prototype.padend": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "stringify-entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", + "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", + "is-hexadecimal": "^1.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=", + "dev": true + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylelint": { + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz", + "integrity": "sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==", + "dev": true, + "requires": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.1", + "autoprefixer": "^9.8.6", + "balanced-match": "^1.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.1.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.4", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^5.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.1", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.19.0", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "mathml-tag-names": "^2.1.3", + "meow": "^7.1.1", + "micromatch": "^4.0.2", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.32", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.2", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.0.1", + "v8-compile-cache": "^2.1.1", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001137", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001137.tgz", + "integrity": "sha512-54xKQZTqZrKVHmVz0+UvdZR6kQc7pJDgfhsMYDG19ID1BWoNnDMFm5Q3uSBSU401pBvKYMsHAt9qhEDcxmk8aw==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "table": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz", + "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + } + } + } + }, + "stylelint-config-prettier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz", + "integrity": "sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==", + "dev": true + }, + "stylelint-prettier": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-1.1.2.tgz", + "integrity": "sha512-8QZ+EtBpMCXYB6cY0hNE3aCDKMySIx4Q8/malLaqgU/KXXa6Cj2KK8ulG1AJvUMD5XSSP8rOotqaCzR/BW6qAA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svg-baker-runtime": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz", + "integrity": "sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==", + "dev": true, + "requires": { + "deepmerge": "1.3.2", + "mitt": "1.1.2", + "svg-baker": "^1.7.0" + }, + "dependencies": { + "deepmerge": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", + "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", + "dev": true + } + } + }, + "svg-sprite-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-5.0.0.tgz", + "integrity": "sha512-/hedkRC2IS0E+kFIb+OUCfqQlbVx72/WEEeRGw2uPsNgOOgJEONXzjfSm+CJ3pB9gOHytlBmPMS8ijMCp5s2Eg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "deepmerge": "1.3.2", + "domready": "1.0.8", + "escape-string-regexp": "1.0.5", + "html-webpack-plugin": "^3.2.0", + "loader-utils": "^1.1.0", + "svg-baker": "^1.5.0", + "svg-baker-runtime": "^1.4.7", + "url-slug": "2.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", + "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", + "dev": true + } + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "svgo-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.1.tgz", + "integrity": "sha512-9dyz/h6ae04pAVRz7QY8bLXtMbwA19NPpCPfCixgW0qXNDCOlHbDRqvtT5/2gzRxfuibWCUP6ZBQmZWF9rjWhQ==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "loader-utils": "^1.0.3" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tailwindcss": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", + "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "dev": true, + "requires": { + "@fullhuman/postcss-purgecss": "^2.1.2", + "autoprefixer": "^9.4.5", + "browserslist": "^4.12.0", + "bytes": "^3.0.0", + "chalk": "^3.0.0 || ^4.0.0", + "color": "^3.1.2", + "detective": "^5.2.0", + "fs-extra": "^8.0.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.20", + "node-emoji": "^1.8.1", + "normalize.css": "^8.0.1", + "object-hash": "^2.0.3", + "postcss": "^7.0.11", + "postcss-functions": "^3.0.0", + "postcss-js": "^2.0.0", + "postcss-nested": "^4.1.1", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.6", + "resolve": "^1.14.2" + } + }, + "tailwindcss-touch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tailwindcss-touch/-/tailwindcss-touch-1.0.1.tgz", + "integrity": "sha512-h8A/S9+Mk2rnnaOB/NGCE7CxDhtGKbsAWf8Y2tCO6Zf381Y8dKcygPl1OXkFDnWXkL+FfHxmrGpwculDWAumbA==", + "dev": true + }, + "tailwindcss-typography": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tailwindcss-typography/-/tailwindcss-typography-3.1.0.tgz", + "integrity": "sha512-uqovHMt9orPs1kl2U+bidlcO25tmUGJjjluQdI67yRnOy/IlqKe6tYcHHAsQPhehlk3r11/T3CE7Uc0PSUJcNg==", + "requires": { + "lodash": "^4.17.15" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true, + "optional": true + }, + "tlds": { + "version": "1.212.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.212.0.tgz", + "integrity": "sha512-03rYYO1rGhOYpdYB+wlLY2d0xza6hdN/S67ol2ZpaH+CtFedMVAVhj8ft0rwxEkr90zatou8opBv7Xp6X4cK6g==", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", + "integrity": "sha1-hzivi9lxIK0dQEeXKtpVY7+UebE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "to-vfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.1.0.tgz", + "integrity": "sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==", + "dev": true, + "requires": { + "is-buffer": "^2.0.0", + "vfile": "^4.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", + "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==", + "dev": true + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dev": true, + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "unidecode": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", + "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=", + "dev": true + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-util-find-all-after": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz", + "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==", + "dev": true, + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", + "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==", + "dev": true + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dev": true, + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", + "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "dev": true, + "requires": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "dependencies": { + "ip-regex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.2.0.tgz", + "integrity": "sha512-n5cDDeTWWRwK1EBoWwRti+8nP4NbytBBY0pldmnIkq6Z55KNFmWofh4rl9dPZpj+U/nVq7gweR3ylrvMt4YZ5A==", + "dev": true + } + } + }, + "url-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/url-slug/-/url-slug-2.0.0.tgz", + "integrity": "sha1-p4nVrtSZXA2VrzM3etHVxo1NcCc=", + "dev": true, + "requires": { + "unidecode": "0.1.8" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v-lazy-image": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/v-lazy-image/-/v-lazy-image-1.4.0.tgz", + "integrity": "sha512-Xp/fM786hdXlP10HatvtNsvvPjW6yOsH17lvVEEuGiNMnyiafT9XVomQRRM4t+IzN21cz3SQcw9cqd486yhpgQ==" + }, + "v-scroll-lock": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/v-scroll-lock/-/v-scroll-lock-1.3.1.tgz", + "integrity": "sha512-t41gdxloJ0+5VzHPTi9+PjqjXMeXsM81nP1QUszMQCaLp4pfF0vcJ8aNh3UKK49Pc+RJdCbw3Kj/Z1HCSPQEyA==", + "requires": { + "body-scroll-lock": "^2.6.4" + } + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vfile": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz", + "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-find-down": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vfile-find-down/-/vfile-find-down-5.0.1.tgz", + "integrity": "sha512-T2hz/8h2GMND9MNyEfnBW0hnYOGOv2xN5oNmJiMQEK7Bwx9nc9UGQ33bsldEg+c+w69ZBMk9KYwwh0dO6OQIkQ==", + "dev": true, + "requires": { + "to-vfile": "^6.0.0" + } + }, + "vfile-location": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz", + "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==", + "dev": true + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vssue": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/vssue/-/vssue-1.4.6.tgz", + "integrity": "sha512-s92qMIaI/9LzBQCUUaX0fpNlA3kRRGtm0hQxDN/YBziOB4NXTWgPvoimLreyjP75hRItHvVhKzkXiZ8bIMjy7A==", + "dev": true, + "requires": { + "@vssue/utils": "^1.4.0", + "github-markdown-css": "^3.0.1", + "vue": "^2.6.10", + "vue-i18n": "^8.11.2", + "vue-property-decorator": "^8.1.1" + } + }, + "vue": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==", + "dev": true + }, + "vue-class-component": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.6.tgz", + "integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==", + "dev": true + }, + "vue-disqus": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vue-disqus/-/vue-disqus-3.0.5.tgz", + "integrity": "sha512-T3Y68lXf5W2lYt6j4Y3kZ4opLPH0EAzqriy11MS4D4Q2+UN0tFuUXeYP1MxfvdyaCEboXSM6CUswxsULuNV70Q==", + "dev": true + }, + "vue-eslint-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", + "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-i18n": { + "version": "8.22.1", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.22.1.tgz", + "integrity": "sha512-JNgiEJ5a8YPfk5y2lKyfOAGLmkpAVfhaUi+T4wGpSppRYZ3XSyawSDDketY5KV2CsAiBLAGEIO6jO+0l2hQubg==", + "dev": true + }, + "vue-loader": { + "version": "15.9.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz", + "integrity": "sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-mq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-mq/-/vue-mq-1.0.1.tgz", + "integrity": "sha512-FceZ1tFE0MZ8GroRBKPQWBRy4ZEAa7p5R7cGAzJpGuKPU2AI4ClmE+S6O/yV4jO5271o9tgaUFt7fzUAIf9xOQ==", + "requires": { + "json2mq": "^0.2.0" + } + }, + "vue-multiselect": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-2.1.6.tgz", + "integrity": "sha512-s7jmZPlm9FeueJg1RwJtnE9KNPtME/7C8uRWSfp9/yEN4M8XcS/d+bddoyVwVnvFyRh9msFo0HWeW0vTL8Qv+w==" + }, + "vue-property-decorator": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz", + "integrity": "sha512-O6OUN2OMsYTGPvgFtXeBU3jPnX5ffQ9V4I1WfxFQ6dqz6cOUbR3Usou7kgFpfiXDvV7dJQSFcJ5yUPgOtPPm1Q==", + "dev": true, + "requires": { + "vue-class-component": "^7.1.0" + } + }, + "vue-router": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.7.tgz", + "integrity": "sha512-CbHXue5BLrDivOk5O4eZ0WT4Yj8XwdXa4kCnsEIOzYUPF/07ZukayA2jGxDCJxLc9SgVQX9QX0OuGOwGlVB4Qg==", + "dev": true + }, + "vue-server-renderer": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz", + "integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "hash-sum": "^1.0.2", + "he": "^1.1.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.2.0", + "serialize-javascript": "^3.1.0", + "source-map": "0.5.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vuejs-paginate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vuejs-paginate/-/vuejs-paginate-2.1.0.tgz", + "integrity": "sha512-gnwyXlmCiDOu9MLWxN5UJ4PGijKGNOMpHG8ujsrynCzTJljn/rp7Jq0WiDGDAMi5/u0AHuYIHhced+tUW4jblA==", + "dev": true + }, + "vuepress": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.7.1.tgz", + "integrity": "sha512-AdA3do1L4DNzeF8sMTE+cSUJ5hR/6f3YujU8DVowi/vFOg/SX2lJF8urvDkZUSXzaAT6aSgkI9L+B6D+i7SJjA==", + "dev": true, + "requires": { + "@vuepress/core": "1.7.1", + "@vuepress/theme-default": "1.7.1", + "cac": "^6.5.6", + "envinfo": "^7.2.0", + "opencollective-postinstall": "^2.0.2", + "update-notifier": "^4.0.0" + } + }, + "vuepress-html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "vuepress-plugin-canonical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vuepress-plugin-canonical/-/vuepress-plugin-canonical-1.0.0.tgz", + "integrity": "sha512-R2mcc+bp9VbKBQ3YIbCqUbWcWfmWSp1NIEyNGiLKkrcZmyUF/+0D48BqMCTx61AgJzWPW5DJzB6VkmpjbMIDbA==", + "dev": true + }, + "vuepress-plugin-clean-urls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vuepress-plugin-clean-urls/-/vuepress-plugin-clean-urls-1.1.2.tgz", + "integrity": "sha512-36r6XT9stybGSL9zHfFM6F+EBOF9rRDzGdNeias3AmU3AH5+DqsciMjRpHfecKXDKeVcc0PlNfG1Tf19CW5MzA==", + "dev": true + }, + "vuepress-plugin-container": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "^1.2.0", + "markdown-it-container": "^2.0.0" + } + }, + "vuepress-plugin-disqus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/vuepress-plugin-disqus/-/vuepress-plugin-disqus-0.2.0.tgz", + "integrity": "sha512-kx+AeVzjJ9lx9bufLt1/X35V1VXfnQ1srkDMIzFKD9NyQ3eycsWQRcGO1dFe1HMrY3+7fTu+1/JeUEUEpGZ5tw==", + "dev": true, + "requires": { + "vue-disqus": "^3.0.5" + } + }, + "vuepress-plugin-feed": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/vuepress-plugin-feed/-/vuepress-plugin-feed-0.1.9.tgz", + "integrity": "sha512-iOJkR7zPmJAX0TEVdxNsUT07xNQB6lZFpU7DqsYzO01FhaPkMOOVM5Vx5a/iOOuOggAeoI9H9yuah+cRmCImlw==", + "dev": true, + "requires": { + "feed": "2.0.4", + "lodash.defaultsdeep": "4.6.1", + "lodash.isempty": "4.4.0", + "lodash.trimend": "^4.5.1", + "lodash.trimstart": "^4.5.1", + "remove-markdown": "0.3.0", + "striptags": "3.1.1" + } + }, + "vuepress-plugin-img-lazy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vuepress-plugin-img-lazy/-/vuepress-plugin-img-lazy-1.0.4.tgz", + "integrity": "sha512-4mMIy3vZzNZupFuohPKlOHGd0rNZEMEHEyN8b2M3j1yBANrkhGg1wNnpsdpe7ZnLdtVpxH3JQT7a3TDdxLLFmQ==", + "requires": { + "markdown-it-img-lazy": "^1.0.2", + "markdown-it-imsize": "^2.0.1" + } + }, + "vuepress-plugin-ipfs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vuepress-plugin-ipfs/-/vuepress-plugin-ipfs-1.0.2.tgz", + "integrity": "sha512-T5vkjs+WvwpOSHmYxvfkoyjE5WAVu+Y3hvY5blbhuza9O4TfnOnVrSrgDMAprv7RV2Xbjdtiwdjoo2EkOyYKvg==", + "dev": true, + "requires": { + "all-relative": "^1.1.0" + } + }, + "vuepress-plugin-mailchimp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/vuepress-plugin-mailchimp/-/vuepress-plugin-mailchimp-1.4.2.tgz", + "integrity": "sha512-4t5ZaKZXu5ZkwgE+WW//7CgXgz6DEhRefGrO5aql4PwapauNXlHKgQ2JMf9FRe5y5WHjNpDHYveEDNzISZmxJw==", + "dev": true, + "requires": { + "jsonp": "^0.2.1", + "query-string": "^6.9.0" + }, + "dependencies": { + "query-string": { + "version": "6.13.7", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.7.tgz", + "integrity": "sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "dev": true + } + } + }, + "vuepress-plugin-robots": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vuepress-plugin-robots/-/vuepress-plugin-robots-1.0.1.tgz", + "integrity": "sha512-WNZuxuiPKXEbDhFDDu4coKpJrnccmSoqRiVbANmUa1T0Ezw7txsInGH2QnwElws2rSVqda9E19iVzTg6vmU5XA==", + "dev": true, + "requires": { + "generate-robotstxt": "^7.1.0" + } + }, + "vuepress-plugin-seo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vuepress-plugin-seo/-/vuepress-plugin-seo-0.1.4.tgz", + "integrity": "sha512-foNKrAAKihiC47bx0UXFzs/+BIFmnowTQsLVF/8pfsnsPDp8FXjkTGyjxyjOhbwj7ADPv32CdX3pEoYGnZ7OjA==", + "dev": true + }, + "vuepress-plugin-sitemap": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vuepress-plugin-sitemap/-/vuepress-plugin-sitemap-2.3.1.tgz", + "integrity": "sha512-n+8lbukhrKrsI9H/EX0EBgkE1pn85LAQFvQ5dIvrZP4Kz6JxPOPPNTQmZMhahQV1tXbLZQCEN7A1WZH4x+arJQ==", + "dev": true, + "requires": { + "sitemap": "^3.0.0" + } + }, + "vuepress-plugin-smooth-scroll": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", + "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", + "dev": true, + "requires": { + "smoothscroll-polyfill": "^0.4.3" + } + }, + "vuex": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.5.1.tgz", + "integrity": "sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw==" + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "dependencies": { + "javascript-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpackbar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", + "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "xmlbuilder": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..d258f59d --- /dev/null +++ b/package.json @@ -0,0 +1,80 @@ +{ + "name": "ipfs-blog", + "version": "1.0.0", + "description": "ipfs blog", + "main": "index.js", + "scripts": { + "start": "npm run dev", + "dev": "vuepress dev src", + "build": "vuepress build src", + "lint": "prettier --write \"**/*.{json,yaml,md}\" && run-p lint:**", + "lint:eslint": "eslint --cache \"**/*.{js,vue}\" --fix", + "lint:styles": "stylelint \"**/*.css\" \"src/.vuepress/**/*.css\" --fix" + }, + "keywords": [], + "prettier": { + "semi": false, + "singleQuote": true + }, + "devDependencies": { + "@vuepress/plugin-blog": "^1.9.3", + "@vuepress/plugin-html-redirect": "^0.1.2", + "@vuepress/plugin-last-updated": "^1.7.1", + "eslint": "^7.13.0", + "eslint-config-prettier": "^6.15.0", + "eslint-config-standard": "^16.0.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.1.0", + "eslint-plugin-vue": "^7.1.0", + "husky": "^4.3.0", + "lint-staged": "^10.5.1", + "lodash": "^4.17.20", + "markdown-it-deflist": "^2.1.0", + "markdown-it-footnote": "^3.0.2", + "markdown-it-task-lists": "^2.1.1", + "markdown-it-video": "^0.6.3", + "npm-run-all": "^4.1.5", + "postcss-nested": "^4.2.3", + "prettier": "^2.1.2", + "slug": "^4.0.2", + "standard-version": "^9.0.0", + "stylelint": "^13.7.2", + "stylelint-config-prettier": "^8.0.2", + "stylelint-prettier": "^1.1.2", + "svg-sprite-loader": "^5.0.0", + "svgo": "^1.3.2", + "svgo-loader": "^2.2.1", + "tailwindcss": "^1.9.6", + "tailwindcss-touch": "^1.0.1", + "vue": "^2.6.12", + "vuepress": "^1.7.1", + "vuepress-plugin-canonical": "^1.0.0", + "vuepress-plugin-clean-urls": "^1.1.2", + "vuepress-plugin-ipfs": "^1.0.2", + "vuepress-plugin-robots": "^1.0.1", + "vuepress-plugin-seo": "^0.1.4" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{json,yaml,md}": "prettier --write", + "*.{js,vue}": "eslint --cache --fix", + "*.{css,styl}": "stylelint --fix" + }, + "dependencies": { + "dayjs": "^1.9.6", + "tailwindcss-typography": "^3.1.0", + "v-lazy-image": "^1.4.0", + "v-scroll-lock": "^1.3.1", + "vue-mq": "^1.0.1", + "vue-multiselect": "^2.1.6", + "vuepress-plugin-img-lazy": "^1.0.4", + "vuex": "^3.5.1" + } +} diff --git a/src/.vuepress/config.js b/src/.vuepress/config.js new file mode 100644 index 00000000..9cf1d426 --- /dev/null +++ b/src/.vuepress/config.js @@ -0,0 +1,186 @@ +const { reverse, sortBy } = require('lodash') +const authors = require('./config/authors') + +// configure this to an absolute url to enable a generated sitemap & blog RSS feeds +const CANONICAL_BASE = process.env.CANONICAL_BASE || '' +const IPFS_DEPLOY = process.env.IPFS_DEPLOY === 'true' || false + +module.exports = { + title: 'IPFS Blog', + description: + 'This is the IPFS Starlog, a series of communications about the IPFS Project.', + domain: CANONICAL_BASE, + authors, + locales: { + '/': { + lang: 'en-US', + title: 'IPFS Blog', + description: + 'This is the IPFS Starlog, a series of communications about the IPFS Project.', + }, + }, + head: require('./config/head'), + dest: './public', + markdown: { + extendMarkdown: (md) => { + md.set({ + breaks: true, + }) + md.use(require('markdown-it-video')) + md.use(require('markdown-it-footnote')) + md.use(require('markdown-it-task-lists')) + md.use(require('markdown-it-deflist')) + }, + }, + themeConfig: { + dateFormat: 'DD MMMM YYYY', + socialLinks: [], + footerLinks: [], + footerLegal: '', + headerLinks: [], + mobileNavLinks: [], + }, + plugins: [ + ['@vuepress/last-updated'], + [ + 'vuepress-plugin-clean-urls', + { + normalSuffix: '/', + indexSuffix: '/', + notFoundPath: '/404/', + }, + ], + [ + 'vuepress-plugin-canonical', + CANONICAL_BASE + ? { + baseURL: CANONICAL_BASE, + stringExtension: true, + } + : false, + ], + [require('./plugins/pageData'), { authors }], + [require('./plugins/vuepress-plugin-trigger-scroll')], + // [require('./plugins/vuepress-plugin-ga-dnt'), { ga: 'UA-xxxxxx' }], + ['vuepress-plugin-img-lazy'], + [ + '@vuepress/blog', + { + feed: { + canonical_base: CANONICAL_BASE, + sort: (entries) => reverse(sortBy(entries, 'date')), + feed_options: {}, + feeds: { + rss2: { + enable: true, + }, + atom1: { + enable: false, + }, + json1: { + enable: false, + }, + }, + }, + sitemap: { + hostname: CANONICAL_BASE, + changefreq: 'weekly', + }, + directories: [ + { + id: 'blog', + dirname: '_blog', + path: '/', + itemPermalink: '/blog/:slug', + layout: 'Blog', + itemLayout: 'BlogPost', + frontmatter: { + title: 'Blog', + description: + 'This is the IPFS Starlog, a series of communications about the IPFS Project.', + }, + pagination: { + lengthPerPage: Number.MAX_SAFE_INTEGER, + }, + }, + ], + }, + ], + [ + 'vuepress-plugin-seo', + { + siteTitle: (_, $site) => $site.title, + title: ($page, $site) => $page.title || $site.title, + description: ($page, $site) => + $page.frontmatter.description || $site.description, + author: ($page) => $page.frontmatter.author, + tags: ($page) => $page.frontmatter.tags, + twitterCard: (_) => 'summary_large_image', + type: ($page) => + ['_blog'].some((folder) => $page.regularPath.startsWith('/' + folder)) + ? 'article' + : 'website', + url: (_, $site, path) => ($site.domain || '') + path, + image: ($page, $site) => + $page.frontmatter.image + ? ($site.domain || '') + $page.frontmatter.image + : ($site.domain || '') + '/images/og-default.jpg', + publishedAt: ($page) => + $page.frontmatter.date && + new Date($page.frontmatter.date).toISOString(), + modifiedAt: ($page) => + $page.lastUpdated && new Date($page.lastUpdated).toISOString(), + customMeta: (add, ctx) => { + const { $site } = ctx + if ($site.authors instanceof Map) { + // select first object from the authors list + const { twitter } = $site.authors.values().next().value + add('twitter:site', twitter) + } + }, + }, + ], + ['vuepress-plugin-robots', { host: CANONICAL_BASE }], + [ + '@vuepress/html-redirect', + { + duration: 0, + }, + ], + ['vuepress-plugin-ipfs', IPFS_DEPLOY], + ], + extraWatchFiles: ['.vuepress/config/head.js', '.vuepress/config/authors.js'], + chainWebpack: (config, isServer) => { + config.module.rules.delete('svg') + + // prettier-ignore + config.module + .rule('svg') + .test(/\.(svg)(\?.*)?$/) + .oneOf('svg-sprite') + .include + .add(/svg-icon/) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .end() + .use('svgo-loader') + .loader('svgo-loader') + .options({ + removeDimensions: true, + removeAttrs: { + attrs: '*:(stroke|fill):((?!^none$).)*', + }, + }) + .end() + .end() + .oneOf('svg-file') + .use('file-loader') + .loader('file-loader') + .options({ + name: `assets/img/[name].[hash:8].[ext]`, + }) + .end() + .end() + }, +} diff --git a/src/.vuepress/config/authors.js b/src/.vuepress/config/authors.js new file mode 100644 index 00000000..2362a92d --- /dev/null +++ b/src/.vuepress/config/authors.js @@ -0,0 +1,37 @@ +/** + * Site authors: + * Use a RFC 3986 safe key in lowercase this object + * is merged into the $page.frontmatter.author data + * at runtime from the original $page.frontmatter.author + * key. + * + * Avatar images should be stored in the site root: + * _assets/avatars/firstname-surname.jpg + * + */ +module.exports = new Map([ + [ + 'protocol-labs', + { + name: 'Protocol Labs', + svgIcon: 'logo-icon', + twitter: '@protocollabs', + }, + ], + [ + 'juan-benet', + { + name: 'Juan Benet', + avatar: 'juan-benet.jpg', + twitter: '@juanbenet', + }, + ], + [ + 'jesse-clayburgh', + { + name: 'Jesse Clayburgh', + avatar: 'jessie-clayburgh.jpg', + twitter: '@jesseclayburgh', + }, + ], +]) diff --git a/src/.vuepress/config/head.js b/src/.vuepress/config/head.js new file mode 100644 index 00000000..4bf24149 --- /dev/null +++ b/src/.vuepress/config/head.js @@ -0,0 +1,30 @@ +const favicons = ['16x16', '32x32', '48x48'].map((size) => [ + 'link', + { + rel: 'icon', + type: 'image/png', + sizes: size, + href: `/favicon-${size}.png`, + }, +]) + +module.exports = [ + ['link', { rel: 'stylesheet', href: '/fonts.css' }], + ['link', { rel: 'manifest', href: '/site.webmanifest' }], + [ + 'link', + { rel: 'mask-icon', href: '/safari-pinned-tab.svg', color: '#16161F' }, + ], + [ + 'link', + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + ], + ['meta', { name: 'theme-color', content: '#16161F' }], + ['meta', { name: 'msapplication-TileColor', content: '#156ff7' }], + ['meta', { name: 'apple-mobile-web-app-title', content: 'Protocol Labs' }], + ['meta', { name: 'application-name', content: 'Protocol Labs' }], +].concat(favicons) diff --git a/src/.vuepress/plugins/pageData.js b/src/.vuepress/plugins/pageData.js new file mode 100644 index 00000000..170aa2f6 --- /dev/null +++ b/src/.vuepress/plugins/pageData.js @@ -0,0 +1,34 @@ +const slug = require('slug') + +module.exports = (options, context) => ({ + extendPageData($page) { + const { frontmatter } = $page + + // author config + const authorName = frontmatter.author + if (typeof authorName === 'string') { + const authorKey = slug(authorName, { lower: true }) + + // setup author stub to keep templates happy + const author = { name: authorName } + + // setup the page author object + frontmatter.author = author + frontmatter.authorKey = authorKey + } + + // exclude a page from the feed & robots if excluded from sitemap + if (frontmatter.sitemap && frontmatter.sitemap.exclude) { + frontmatter.feed = { + enable: false, + } + + const noIndex = { name: 'robots', content: 'noindex' } + if (Array.isArray(frontmatter.meta)) { + frontmatter.meta.push(noIndex) + } else { + frontmatter.meta = [noIndex] + } + } + }, +}) diff --git a/src/.vuepress/plugins/vuepress-plugin-ga-dnt/clientRootMixin.js b/src/.vuepress/plugins/vuepress-plugin-ga-dnt/clientRootMixin.js new file mode 100644 index 00000000..08098b0c --- /dev/null +++ b/src/.vuepress/plugins/vuepress-plugin-ga-dnt/clientRootMixin.js @@ -0,0 +1,18 @@ +export default { + mounted() { + // track outbound clicks + document.addEventListener('click', this.trackOutbound) + }, + beforeDestroy() { + // remove on unmount + document.removeEventListener('click', this.trackOutbound) + }, + methods: { + trackOutbound(e) { + if (!window.ga) return + const link = e.target.closest('a') + if (link === null || window.location.host === link.host) return + window.ga('send', 'event', 'outbound', 'click', link.href) + }, + }, +} diff --git a/src/.vuepress/plugins/vuepress-plugin-ga-dnt/enhanceAppFile.js b/src/.vuepress/plugins/vuepress-plugin-ga-dnt/enhanceAppFile.js new file mode 100755 index 00000000..5dc5ba15 --- /dev/null +++ b/src/.vuepress/plugins/vuepress-plugin-ga-dnt/enhanceAppFile.js @@ -0,0 +1,65 @@ +/* global GA_ID, ga */ + +export default ({ router, isServer }) => { + // only apply on client + if (isServer) return + + const initAnalytics = () => { + // ga integration + if (process.env.NODE_ENV === 'production' && GA_ID) { + ;(function (i, s, o, g, r, a, m) { + i.GoogleAnalyticsObject = r + i[r] = + i[r] || + function () { + ;(i[r].q = i[r].q || []).push(arguments) + } + i[r].l = 1 * new Date() + a = s.createElement(o) + m = s.getElementsByTagName(o)[0] + a.async = 1 + a.src = g + m.parentNode.insertBefore(a, m) + })( + window, + document, + 'script', + 'https://www.google-analytics.com/analytics.js', + 'ga' + ) + + ga('create', GA_ID, 'auto') + ga('set', 'anonymizeIp', true) + + router.afterEach(function (to) { + ga('set', 'page', to.fullPath) + ga('send', 'pageview') + }) + } + } + + if ( + window.doNotTrack || + navigator.doNotTrack || + navigator.msDoNotTrack || + (window.external && 'msTrackingProtectionEnabled' in window.external) + ) { + // DNT available + if ( + window.doNotTrack === '1' || + navigator.doNotTrack === 'yes' || + navigator.doNotTrack === '1' || + navigator.msDoNotTrack === '1' || + (typeof window.external.msTrackingProtectionEnabled === 'function' && + window.external.msTrackingProtectionEnabled()) + ) { + // DNT enabled + } else { + // DNT disabled + initAnalytics() + } + } else { + // DNT not supported + initAnalytics() + } +} diff --git a/src/.vuepress/plugins/vuepress-plugin-ga-dnt/index.js b/src/.vuepress/plugins/vuepress-plugin-ga-dnt/index.js new file mode 100755 index 00000000..5ef37097 --- /dev/null +++ b/src/.vuepress/plugins/vuepress-plugin-ga-dnt/index.js @@ -0,0 +1,15 @@ +const { path } = require('@vuepress/shared-utils') + +// eslint-disable-next-line default-param-last +module.exports = (options = {}, context) => ({ + name: 'vuepress-plugin-ga-dnt', + define() { + const { siteConfig = {} } = context + const ga = options.ga || siteConfig.ga + const GA_ID = ga || false + return { GA_ID } + }, + + clientRootMixin: path.resolve(__dirname, 'clientRootMixin.js'), + enhanceAppFiles: path.resolve(__dirname, 'enhanceAppFile.js'), +}) diff --git a/src/.vuepress/plugins/vuepress-plugin-trigger-scroll/enhanceApp.js b/src/.vuepress/plugins/vuepress-plugin-trigger-scroll/enhanceApp.js new file mode 100644 index 00000000..e8e39ea9 --- /dev/null +++ b/src/.vuepress/plugins/vuepress-plugin-trigger-scroll/enhanceApp.js @@ -0,0 +1,27 @@ +const enhanceApp = ({ router, isServer }) => { + // we'll handle the scrolling from here, thanks + // https://dev.to/uwutrinket/fix-scroll-jump---vue-router-45ja + if (!isServer && 'scrollRestoration' in window.history) { + window.history.scrollRestoration = 'manual' + } + + router.options.scrollBehavior = (to, from, savedPosition) => + new Promise((resolve) => { + const position = savedPosition || {} + if (!savedPosition) { + if (to.hash) { + position.selector = to.hash + position.offset = { + x: 0, + } + } else { + position.x = 0 + position.y = 0 + } + } + router.app.$root.$once('triggerScroll', () => { + router.app.$nextTick(() => resolve(position)) + }) + }) +} +export default enhanceApp diff --git a/src/.vuepress/plugins/vuepress-plugin-trigger-scroll/index.js b/src/.vuepress/plugins/vuepress-plugin-trigger-scroll/index.js new file mode 100644 index 00000000..00f5d7c6 --- /dev/null +++ b/src/.vuepress/plugins/vuepress-plugin-trigger-scroll/index.js @@ -0,0 +1,6 @@ +const path = require('path') + +module.exports = { + name: 'vuepress-plugin-trigger-scroll', + enhanceAppFiles: path.resolve(__dirname, 'enhanceApp.js'), +} diff --git a/src/.vuepress/theme/LICENSE b/src/.vuepress/theme/LICENSE new file mode 100644 index 00000000..72dc60d8 --- /dev/null +++ b/src/.vuepress/theme/LICENSE @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/.vuepress/theme/components/CTA.vue b/src/.vuepress/theme/components/CTA.vue new file mode 100644 index 00000000..4f6c4d40 --- /dev/null +++ b/src/.vuepress/theme/components/CTA.vue @@ -0,0 +1,162 @@ + + + + diff --git a/src/.vuepress/theme/components/ColumnText.vue b/src/.vuepress/theme/components/ColumnText.vue new file mode 100644 index 00000000..5c787c0b --- /dev/null +++ b/src/.vuepress/theme/components/ColumnText.vue @@ -0,0 +1,54 @@ + + + + diff --git a/src/.vuepress/theme/components/DynamicContent.vue b/src/.vuepress/theme/components/DynamicContent.vue new file mode 100644 index 00000000..23412190 --- /dev/null +++ b/src/.vuepress/theme/components/DynamicContent.vue @@ -0,0 +1,46 @@ + + diff --git a/src/.vuepress/theme/components/Footer.vue b/src/.vuepress/theme/components/Footer.vue new file mode 100644 index 00000000..c26e502e --- /dev/null +++ b/src/.vuepress/theme/components/Footer.vue @@ -0,0 +1,71 @@ + + diff --git a/src/.vuepress/theme/components/NavLink.vue b/src/.vuepress/theme/components/NavLink.vue new file mode 100644 index 00000000..0acf2079 --- /dev/null +++ b/src/.vuepress/theme/components/NavLink.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/.vuepress/theme/components/RSSSubscription.vue b/src/.vuepress/theme/components/RSSSubscription.vue new file mode 100644 index 00000000..a3b29af5 --- /dev/null +++ b/src/.vuepress/theme/components/RSSSubscription.vue @@ -0,0 +1,32 @@ + + + + diff --git a/src/.vuepress/theme/components/Section.vue b/src/.vuepress/theme/components/Section.vue new file mode 100644 index 00000000..bf5d574b --- /dev/null +++ b/src/.vuepress/theme/components/Section.vue @@ -0,0 +1,214 @@ + + + + diff --git a/src/.vuepress/theme/components/SocialLinks.vue b/src/.vuepress/theme/components/SocialLinks.vue new file mode 100644 index 00000000..5aadce2d --- /dev/null +++ b/src/.vuepress/theme/components/SocialLinks.vue @@ -0,0 +1,30 @@ + + diff --git a/src/.vuepress/theme/components/TextBlock.vue b/src/.vuepress/theme/components/TextBlock.vue new file mode 100644 index 00000000..04918eac --- /dev/null +++ b/src/.vuepress/theme/components/TextBlock.vue @@ -0,0 +1,53 @@ + + + + diff --git a/src/.vuepress/theme/components/Typography.vue b/src/.vuepress/theme/components/Typography.vue new file mode 100644 index 00000000..9bd434a9 --- /dev/null +++ b/src/.vuepress/theme/components/Typography.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/.vuepress/theme/components/UnstyledLink.vue b/src/.vuepress/theme/components/UnstyledLink.vue new file mode 100644 index 00000000..69466cf5 --- /dev/null +++ b/src/.vuepress/theme/components/UnstyledLink.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/.vuepress/theme/components/base/Avatar.vue b/src/.vuepress/theme/components/base/Avatar.vue new file mode 100644 index 00000000..6b8a37d0 --- /dev/null +++ b/src/.vuepress/theme/components/base/Avatar.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/.vuepress/theme/components/base/BackgroundVideo.vue b/src/.vuepress/theme/components/base/BackgroundVideo.vue new file mode 100644 index 00000000..e8ec4adf --- /dev/null +++ b/src/.vuepress/theme/components/base/BackgroundVideo.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/.vuepress/theme/components/base/Column.vue b/src/.vuepress/theme/components/base/Column.vue new file mode 100644 index 00000000..1446f042 --- /dev/null +++ b/src/.vuepress/theme/components/base/Column.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/.vuepress/theme/components/base/Container.vue b/src/.vuepress/theme/components/base/Container.vue new file mode 100644 index 00000000..d36925d8 --- /dev/null +++ b/src/.vuepress/theme/components/base/Container.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/.vuepress/theme/components/base/LazyImage.vue b/src/.vuepress/theme/components/base/LazyImage.vue new file mode 100644 index 00000000..df55cc27 --- /dev/null +++ b/src/.vuepress/theme/components/base/LazyImage.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/.vuepress/theme/components/base/Link.vue b/src/.vuepress/theme/components/base/Link.vue new file mode 100644 index 00000000..caa17d2f --- /dev/null +++ b/src/.vuepress/theme/components/base/Link.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/.vuepress/theme/components/base/SVGIcon.vue b/src/.vuepress/theme/components/base/SVGIcon.vue new file mode 100644 index 00000000..a9232469 --- /dev/null +++ b/src/.vuepress/theme/components/base/SVGIcon.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/.vuepress/theme/components/base/Transitions.vue b/src/.vuepress/theme/components/base/Transitions.vue new file mode 100644 index 00000000..6e393765 --- /dev/null +++ b/src/.vuepress/theme/components/base/Transitions.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/.vuepress/theme/components/blog/ActiveTags.vue b/src/.vuepress/theme/components/blog/ActiveTags.vue new file mode 100644 index 00000000..f1fe568f --- /dev/null +++ b/src/.vuepress/theme/components/blog/ActiveTags.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/.vuepress/theme/components/blog/Card.vue b/src/.vuepress/theme/components/blog/Card.vue new file mode 100644 index 00000000..fc8f0084 --- /dev/null +++ b/src/.vuepress/theme/components/blog/Card.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/.vuepress/theme/components/blog/LinksAndSocial.vue b/src/.vuepress/theme/components/blog/LinksAndSocial.vue new file mode 100644 index 00000000..fb3d25aa --- /dev/null +++ b/src/.vuepress/theme/components/blog/LinksAndSocial.vue @@ -0,0 +1,35 @@ + + + diff --git a/src/.vuepress/theme/components/blog/NewsletterForm.vue b/src/.vuepress/theme/components/blog/NewsletterForm.vue new file mode 100644 index 00000000..585c03f6 --- /dev/null +++ b/src/.vuepress/theme/components/blog/NewsletterForm.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/.vuepress/theme/components/blog/PostAuthor.vue b/src/.vuepress/theme/components/blog/PostAuthor.vue new file mode 100644 index 00000000..2aab4bb8 --- /dev/null +++ b/src/.vuepress/theme/components/blog/PostAuthor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/.vuepress/theme/components/blog/PostMeta.vue b/src/.vuepress/theme/components/blog/PostMeta.vue new file mode 100644 index 00000000..6cc295c6 --- /dev/null +++ b/src/.vuepress/theme/components/blog/PostMeta.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/.vuepress/theme/components/blog/PostTag.vue b/src/.vuepress/theme/components/blog/PostTag.vue new file mode 100644 index 00000000..9101f664 --- /dev/null +++ b/src/.vuepress/theme/components/blog/PostTag.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/.vuepress/theme/components/blog/SearchCategoriesAndTags.vue b/src/.vuepress/theme/components/blog/SearchCategoriesAndTags.vue new file mode 100644 index 00000000..ca7d313e --- /dev/null +++ b/src/.vuepress/theme/components/blog/SearchCategoriesAndTags.vue @@ -0,0 +1,85 @@ + + + + + + + diff --git a/src/.vuepress/theme/components/blog/SortAndFilter.vue b/src/.vuepress/theme/components/blog/SortAndFilter.vue new file mode 100644 index 00000000..cf517d2c --- /dev/null +++ b/src/.vuepress/theme/components/blog/SortAndFilter.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/.vuepress/theme/components/directives/Transition.js b/src/.vuepress/theme/components/directives/Transition.js new file mode 100644 index 00000000..d4e04175 --- /dev/null +++ b/src/.vuepress/theme/components/directives/Transition.js @@ -0,0 +1,122 @@ +const transitions = new Map([ + [ + 'fade', + { + setup: ['transition-opacity', 'ease-in-out'], + hidden: ['opacity-0'], + visible: ['opacity-100', 'duration-700'], + threshold: 0.25, + rootMargin: '0px 0px 0px 0px', + }, + ], + [ + 'transformX', + { + setup: ['transition', 'transform', 'ease-in-out'], + hidden: ['opacity-0', 'translate-x-32'], + visible: ['opacity-100', 'translate-x-0', 'duration-700'], + threshold: 0.25, + rootMargin: '0px 0px 200px 0px', + }, + ], + [ + 'transformY', + { + setup: ['transition', 'transform', 'ease-in-out'], + hidden: ['opacity-0', 'translate-y-32'], + visible: ['opacity-100', 'translate-y-0', 'duration-700'], + threshold: 0.25, + rootMargin: '0px 0px 200px 0px', + }, + ], +]) + +function fetchTransitionClasses(transitionName, type) { + const validTransitionType = + typeof transitionName === 'string' && transitions.has(transitionName) + + if (validTransitionType) { + return transitions.get(transitionName)[type] + } + + return [] +} + +function reduceMotion() { + return window.matchMedia('prefers-reduced-motion: reduce)').matches +} + +const Observer = { + bind: function (el, binding, vnode) { + if (reduceMotion()) { + return + } + + const { value } = binding + + const validCallback = + value && value.callback && typeof value.callback === 'function' + + const transitionName = value && value.transition ? value.transition : 'fade' + const initialClasses = fetchTransitionClasses(transitionName, 'setup') + el.classList.add(...initialClasses) + + const transitionDelay = + value && value.delay && typeof value.delay === 'string' ? value.delay : '' + el.style.transitionDelay = transitionDelay + + const threshold = transitions.get(transitionName).threshold + const rootMargin = transitions.get(transitionName).rootMargin + + vnode.tracker = new IntersectionObserver( + (entries) => { + const ratio = entries[0].intersectionRatio + + if (ratio === 0.0 && !vnode.data.isVisible) { + vnode.data.isVisible = false + + const visibleClasses = fetchTransitionClasses( + transitionName, + 'visible' + ) + const hiddenClasses = fetchTransitionClasses(transitionName, 'hidden') + + el.classList.remove(...visibleClasses) + el.classList.add(...hiddenClasses) + } else if (ratio >= threshold) { + vnode.data.isVisible = true + + const visibleClasses = fetchTransitionClasses( + transitionName, + 'visible' + ) + const hiddenClasses = fetchTransitionClasses(transitionName, 'hidden') + + el.classList.remove(...hiddenClasses) + el.classList.add(...visibleClasses) + } + + if (validCallback) { + value.callback({ isIntersecting: vnode.data.isVisible }) + } + }, + { rootMargin: rootMargin, threshold: [0, threshold] } + ) + }, + inserted: function (el, binding, vnode) { + if (el && window.IntersectionObserver && !reduceMotion()) { + vnode.tracker.observe(el) + } + }, + unbind: function (el, binding, vnode) { + if (el && vnode.tracker) { + vnode.tracker.disconnect() + vnode.tracker = null + } + }, +} + +export default { + name: 'Transition', + directive: Observer, +} diff --git a/src/.vuepress/theme/components/mixins/Author.vue b/src/.vuepress/theme/components/mixins/Author.vue new file mode 100644 index 00000000..12d5f8de --- /dev/null +++ b/src/.vuepress/theme/components/mixins/Author.vue @@ -0,0 +1,22 @@ + diff --git a/src/.vuepress/theme/components/mixins/link.js b/src/.vuepress/theme/components/mixins/link.js new file mode 100644 index 00000000..d552aeec --- /dev/null +++ b/src/.vuepress/theme/components/mixins/link.js @@ -0,0 +1,66 @@ +import { isExternal, isMailto, isTel, ensureExt } from '../../util' + +export default { + computed: { + link() { + return ensureExt(this.to ? this.to : this.item.link) + }, + + exact() { + if (this.$site.locales) { + return Object.keys(this.$site.locales).some( + (rootLink) => rootLink === this.link + ) + } + return this.link === '/' + }, + + isNonHttpURI() { + return isMailto(this.link) || isTel(this.link) + }, + + isBlankTarget() { + return this.target === '_blank' + }, + + isInternal() { + return !isExternal(this.link) && !this.isBlankTarget + }, + + target() { + if (!this.item || this.isNonHttpURI) { + return null + } + if (this.item.target) { + return this.item.target + } + return isExternal(this.link) ? '_blank' : '' + }, + + rel() { + if (!this.item || this.isNonHttpURI) { + return null + } + if (this.item.rel) { + return this.item.rel + } + return this.isBlankTarget ? 'noopener noreferrer' : '' + }, + }, + + methods: { + // TODO: this is temporary and can be removed when router-link upgrades to v4 (https://github.com/vuejs/vue-router/issues/1668) + handleAnchorClick(e) { + // check if is not an anchor link + const hash = e.target.hash + if (hash) { + const targetElement = document.querySelector(hash) + + if (targetElement) { + e.preventDefault() + window.scrollTo({ top: targetElement.offsetTop }) + } + } + }, + }, +} diff --git a/src/.vuepress/theme/components/mixins/requireAsset.js b/src/.vuepress/theme/components/mixins/requireAsset.js new file mode 100644 index 00000000..db045883 --- /dev/null +++ b/src/.vuepress/theme/components/mixins/requireAsset.js @@ -0,0 +1,27 @@ +import { isExternal } from '@theme/util' +const { normalize, isAbsolute } = require('path') + +export default { + methods: { + requireAsset: function (assetPath, ctx = this.$page.regularPath) { + // bail if assetPath doesn't exist + if (!assetPath) return '' + + // if a url or absolute path simply return the asset link + if (isExternal(assetPath)) return assetPath + if (isAbsolute(assetPath)) return this.withBase(assetPath) + + const fullPath = normalize(ctx + assetPath).replace(/^\/|\/$/g, '') + try { + return require('@source/' + fullPath) + } catch (e) { + console.error('could not load asset: ', fullPath) + return '' + } + }, + withBase: function (path = '') { + const { $withBase } = this.$root + return path.charAt(0) === '/' ? $withBase.call(this, path) : path + }, + }, +} diff --git a/src/.vuepress/theme/enhanceApp.js b/src/.vuepress/theme/enhanceApp.js new file mode 100644 index 00000000..c6828253 --- /dev/null +++ b/src/.vuepress/theme/enhanceApp.js @@ -0,0 +1,30 @@ +import './styles/index.css' +import VScrollLock from 'v-scroll-lock' +import VueMq from 'vue-mq' +import { VLazyImagePlugin } from 'v-lazy-image' + +import Transition from '@theme/components/directives/Transition.js' + +export default ({ Vue, router, siteData }) => { + const { breakpoints } = siteData.themeConfig + + /** + * We need to update the Routers push prototype method. It's a known issue where + * vue router won't broadcast a change event when navigating to the same route + * or updating parameters on a route. + * @see: https://github.com/vuejs/vue-router/issues/974 + * @see: https://github.com/vuejs/vue-router/issues/3027 + */ + const originalPush = router.push + router.push = function push(location, onResolve, onReject) { + if (onResolve || onReject) + return originalPush.call(this, location, onResolve, onReject) + return originalPush.call(this, location) + } + + Vue.use(VScrollLock) + Vue.use(VueMq, { breakpoints }) + Vue.use(VLazyImagePlugin) + + Vue.directive(Transition.name, Transition.directive) +} diff --git a/src/.vuepress/theme/index.js b/src/.vuepress/theme/index.js new file mode 100644 index 00000000..a4c967bd --- /dev/null +++ b/src/.vuepress/theme/index.js @@ -0,0 +1,33 @@ +const tailwindConfig = require('./tailwind.config') + +// Theme API. +module.exports = (themeConfig, ctx) => { + const { siteConfig, sourceDir, isProd } = ctx + const { breakpoints } = tailwindConfig + + // add breakpoints to themeConfig + siteConfig.themeConfig = { ...themeConfig, breakpoints } + + const purge = { + enabled: isProd, + content: [ + `${sourceDir}/.vuepress/**/*.{vue,js,html,css,styl}`, + `${sourceDir}/**/*.md`, + ], + } + + const plugins = [ + require('tailwindcss')({ ...tailwindConfig, purge }), + require('postcss-nested'), + require('autoprefixer'), + ] + + /** + * Merge in the site's purgecss config + */ + siteConfig.postcss = { ...(siteConfig.postcss || {}), plugins } + + return { + globalLayout: './layouts/GlobalLayout', + } +} diff --git a/src/.vuepress/theme/layouts/404.vue b/src/.vuepress/theme/layouts/404.vue new file mode 100644 index 00000000..a6eb941e --- /dev/null +++ b/src/.vuepress/theme/layouts/404.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/.vuepress/theme/layouts/Blog.vue b/src/.vuepress/theme/layouts/Blog.vue new file mode 100644 index 00000000..5a08614d --- /dev/null +++ b/src/.vuepress/theme/layouts/Blog.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/.vuepress/theme/layouts/BlogPost.vue b/src/.vuepress/theme/layouts/BlogPost.vue new file mode 100644 index 00000000..06b378a0 --- /dev/null +++ b/src/.vuepress/theme/layouts/BlogPost.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/.vuepress/theme/layouts/DirectoryPagination.vue b/src/.vuepress/theme/layouts/DirectoryPagination.vue new file mode 100644 index 00000000..b05b7a0b --- /dev/null +++ b/src/.vuepress/theme/layouts/DirectoryPagination.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/.vuepress/theme/layouts/GlobalLayout.vue b/src/.vuepress/theme/layouts/GlobalLayout.vue new file mode 100644 index 00000000..747b8df9 --- /dev/null +++ b/src/.vuepress/theme/layouts/GlobalLayout.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/.vuepress/theme/layouts/Layout.vue b/src/.vuepress/theme/layouts/Layout.vue new file mode 100644 index 00000000..137c6b81 --- /dev/null +++ b/src/.vuepress/theme/layouts/Layout.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/.vuepress/theme/layouts/Simple.vue b/src/.vuepress/theme/layouts/Simple.vue new file mode 100644 index 00000000..b1cea963 --- /dev/null +++ b/src/.vuepress/theme/layouts/Simple.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/.vuepress/theme/layouts/StyleGuide.vue b/src/.vuepress/theme/layouts/StyleGuide.vue new file mode 100644 index 00000000..68917c30 --- /dev/null +++ b/src/.vuepress/theme/layouts/StyleGuide.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/.vuepress/theme/layouts/Tag.vue b/src/.vuepress/theme/layouts/Tag.vue new file mode 100644 index 00000000..05f74fbe --- /dev/null +++ b/src/.vuepress/theme/layouts/Tag.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/.vuepress/theme/layouts/TagItem.vue b/src/.vuepress/theme/layouts/TagItem.vue new file mode 100644 index 00000000..cc5142fe --- /dev/null +++ b/src/.vuepress/theme/layouts/TagItem.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/.vuepress/theme/scripts/favicons/.gitignore b/src/.vuepress/theme/scripts/favicons/.gitignore new file mode 100644 index 00000000..48912d24 --- /dev/null +++ b/src/.vuepress/theme/scripts/favicons/.gitignore @@ -0,0 +1,2 @@ +build +node_modules \ No newline at end of file diff --git a/src/.vuepress/theme/scripts/favicons/favicon-white.svg b/src/.vuepress/theme/scripts/favicons/favicon-white.svg new file mode 100644 index 00000000..a6d1dba3 --- /dev/null +++ b/src/.vuepress/theme/scripts/favicons/favicon-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/scripts/favicons/favicon.svg b/src/.vuepress/theme/scripts/favicons/favicon.svg new file mode 100644 index 00000000..73eb4564 --- /dev/null +++ b/src/.vuepress/theme/scripts/favicons/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/scripts/favicons/favicons.js b/src/.vuepress/theme/scripts/favicons/favicons.js new file mode 100644 index 00000000..dd783c84 --- /dev/null +++ b/src/.vuepress/theme/scripts/favicons/favicons.js @@ -0,0 +1,76 @@ +const favicons = require('favicons') +const path = require('path') +const fs = require('fs-extra') + +const source = path.resolve(__dirname, 'favicon.svg') // Source image(s). `string`, `buffer` or array of `string` +const buildDir = path.resolve(__dirname, 'build') + +const configuration = { + path: '/', // Path for overriding default icons path. `string` + appName: 'Protocol Labs', // Your application's name. `string` + appShortName: 'Protocol Labs', // Your application's short_name. `string`. Optional. If not set, appName will be used + appDescription: + 'Protocol Labs is building the next generation of the internet', // Your application's description. `string` + developerName: null, // Your (or your developer's) name. `string` + developerURL: null, // Your (or your developer's) URL. `string` + dir: 'auto', // Primary text direction for name, short_name, and description + lang: 'en-US', // Primary language for name and short_name + background: '#156ff7', // Background colour for flattened icons. `string` + theme_color: '#16161F', // Theme color user for example in Android's task switcher. `string` + appleStatusBarStyle: 'black-translucent', // Style for Apple status bar: "black-translucent", "default", "black". `string` + display: 'minimal-ui', // Preferred display mode: "fullscreen", "standalone", "minimal-ui" or "browser". `string` + orientation: 'any', // Default orientation: "any", "natural", "portrait" or "landscape". `string` + scope: '/', // set of URLs that the browser considers within your app + start_url: '/?source=pwa', // Start URL when launching the application from a device. `string` + version: '1.0', // Your application's version string. `string` + logging: true, // Print logs to console? `boolean` + pixel_art: false, // Keeps pixels "sharp" when scaling up, for pixel art. Only supported in offline mode. + loadManifestWithCredentials: false, // Browsers don't send cookies when fetching a manifest, enable this to fix that. `boolean` + icons: { + // Platform Options: + // - offset - offset in percentage + // - background: + // * false - use default + // * true - force use default, e.g. set background for Android icons + // * color - set background for the specified icons + // * mask - apply mask in order to create circle icon (applied by default for firefox). `boolean` + // * overlayGlow - apply glow effect after mask has been applied (applied by default for firefox). `boolean` + // * overlayShadow - apply drop shadow after mask has been applied .`boolean` + // + android: { offset: '20' }, // Create Android homescreen icon. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + appleIcon: { offset: '20' }, // Create Apple touch icons. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + appleStartup: false, // Create Apple startup images. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + coast: false, // Create Opera Coast icon. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + favicons: true, // Create regular favicons. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + firefox: false, // Create Firefox OS icons. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + windows: false, // Create Windows 8 tile icons. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + yandex: false, // Create Yandex browser icon. `boolean` or `{ offset, background, mask, overlayGlow, overlayShadow }` + }, +} +const callback = function (error, response) { + if (error) { + console.log(error.message) // Error description e.g. "An unknown error has occurred" + return + } + response.images.forEach((image) => writeFile(image.name, image.contents)) + response.files.forEach((file) => writeFile(file.name, file.contents)) + + writeFile('html.json', JSON.stringify(response.html)) +} + +var writeFile = function (fileName, content) { + fs.writeFile(path.resolve(buildDir, fileName), content, (err) => { + if (err) { + console.error(err) + } + // file written successfully + }) +} + +fs.emptyDir(buildDir) + .then(() => { + favicons(source, configuration, callback) + }) + .catch((err) => { + console.error(err) + }) diff --git a/src/.vuepress/theme/scripts/favicons/package-lock.json b/src/.vuepress/theme/scripts/favicons/package-lock.json new file mode 100644 index 00000000..b9885665 --- /dev/null +++ b/src/.vuepress/theme/scripts/favicons/package-lock.json @@ -0,0 +1,1792 @@ +{ + "name": "favicons-gen", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@jimp/bmp": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.9.8.tgz", + "integrity": "sha512-CZYQPEC3iUBMuaGWrtIG+GKNl93q/PkdudrCKJR/B96dfNngsmoosEm3LuFgJHEcJIfvnJkNqKw74l+zEiqCbg==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "bmp-js": "^0.1.0", + "core-js": "^3.4.1" + } + }, + "@jimp/core": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.9.8.tgz", + "integrity": "sha512-N4GCjcXb0QwR5GBABDK2xQ3cKyaF7LlCYeJEG9mV7G/ynBoRqJe4JA6YKU9Ww9imGkci/4A594nQo8tUIqdcBw==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "core-js": "^3.4.1", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/custom": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.9.8.tgz", + "integrity": "sha512-1UpJjI7fhX02BWLJ/KEqPwkHH60eNkCNeD6hEd+IZdTwLXfZCfFiM5BVlpgiZYZJSsVoRiAL4ne2Q5mCiKPKyw==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/gif": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.9.8.tgz", + "integrity": "sha512-LEbfpcO1sBJIQCJHchZjNlyNxzPjZQQ4X32klpQHZJG58n9FvL7Uuh1rpkrJRbqv3cU3P0ENNtTrsBDxsYwcfA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1", + "omggif": "^1.0.9" + } + }, + "@jimp/jpeg": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.9.8.tgz", + "integrity": "sha512-5u29SUzbZ32ZMmOaz3gO0hXatwSCnsvEAXRCKZoPPgbsPoyFAiZKVxjfLzjkeQF6awkvJ8hZni5chM15SNMg+g==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1", + "jpeg-js": "^0.3.4" + } + }, + "@jimp/plugin-blit": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.9.8.tgz", + "integrity": "sha512-6xTDomxJybhBcby1IUVaPydZFhxf+V0DRgfDlVK81kR9kSCoshJpzWqDuWrMqjNEPspPE7jRQwHMs0FdU7mVwQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-blur": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.9.8.tgz", + "integrity": "sha512-dqbxuNFBRbmt35iIRacdgma7nlXklmPThsKcGWNTDmqb/hniK5IC+0xSPzBV4qMI2fLGP39LWHqqDZ0xDz14dA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-circle": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.9.8.tgz", + "integrity": "sha512-+UStXUPCzPqzTixLC8eVqcFcEa6TS+BEM/6/hyM11TDb9sbiMGeUtgpwZP/euR5H5gfpAQDA1Ppzqhh5fuMDlw==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-color": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.9.8.tgz", + "integrity": "sha512-SDHxOQsJHpt75hk6+sSlCPc2B3UJlXosFW+iLZ11xX1Qr0IdDtbfYlIoPmjKQFIDUNzqLSue/z7sKQ1OMZr/QA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/plugin-contain": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.9.8.tgz", + "integrity": "sha512-oK52CPt7efozuLYCML7qOmpFeDt3zpU8qq8UZlnjsDs15reU6L8EiUbwYpJvzoEnEOh1ZqamB8F/gymViEO5og==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-cover": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.9.8.tgz", + "integrity": "sha512-nnamtHzMrNd5j5HRSPd1VzpZ8v9YYtUJPtvCdHOOiIjqG72jxJ2kTBlsS3oG5XS64h/2MJwpl/fmmMs1Tj1CmQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-crop": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.9.8.tgz", + "integrity": "sha512-Nv/6AIp4aJmbSIH2uiIqm+kSoShKM8eaX2fyrUTj811kio0hwD3f/vIxrWebvAqwDZjAFIAmMufFoFCVg6caoQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-displace": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.9.8.tgz", + "integrity": "sha512-0OgPjkOVa2xdbqI8P6gBKX/UK36RbaYVrFyXL8Jy9oNF69+LYWyTskuCu9YbGxzlCVjY/JFqQOvrKDbxgMYAKA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-dither": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.9.8.tgz", + "integrity": "sha512-jGM/4ByniZJnmV2fv8hKwyyydXZe/YzvgBcnB8XxzCq8kVR3Imcn+qnd2PEPZzIPKOTH4Cig/zo9Vk9Bs+m5FQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-fisheye": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.9.8.tgz", + "integrity": "sha512-VnsalrD05f4pxG1msjnkwIFi5QveOqRm4y7VkoZKNX+iqs4TvRnH5+HpBnfdMzX/RXBi+Lf/kpTtuZgbOu/QWw==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-flip": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.9.8.tgz", + "integrity": "sha512-XbiZ4OfHD6woc0f6Sk7XxB6a7IyMjTRQ4pNU7APjaNxsl3L6qZC8qfCQphWVe3DHx7f3y7jEiPMvNnqRDP1xgA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-gaussian": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.9.8.tgz", + "integrity": "sha512-ZBl5RA6+4XAD+mtqLfiG7u+qd8W5yqq3RBNca8eFqUSVo1v+eB2tzeLel0CWfVC/z6cw93Awm/nVnm6/CL2Oew==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-invert": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.9.8.tgz", + "integrity": "sha512-ESploqCoF6qUv5IWhVLaO5fEcrYZEsAWPFflh6ROiD2mmFKQxfeK+vHnk3IDLHtUwWTkAZQNbk89BVq7xvaNpQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-mask": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.9.8.tgz", + "integrity": "sha512-zSvEisTV4iGsBReitEdnQuGJq9/1xB5mPATadYZmIlp8r5HpD72HQb0WdEtb51/pu9Odt8KAxUf0ASg/PRVUiQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-normalize": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.9.8.tgz", + "integrity": "sha512-dPFBfwTa67K1tRw1leCidQT25R3ozrTUUOpO4jcGFHqXvBTWaR8sML1qxdfOBWs164mE5YpfdTvu6MM/junvCg==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-print": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.9.8.tgz", + "integrity": "sha512-nLLPv1/faehRsOjecXXUb6kzhRcZzImO55XuFZ0c90ZyoiHm4UFREwO5sKxHGvpLXS6RnkhvSav4+IWD2qGbEQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1", + "load-bmfont": "^1.4.0" + } + }, + "@jimp/plugin-resize": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.9.8.tgz", + "integrity": "sha512-L80NZ+HKsiKFyeDc6AfneC4+5XACrdL2vnyAVfAAsb3pmamgT/jDInWvvGhyI0Y76vx2w6XikplzEznW/QQvWg==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-rotate": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.9.8.tgz", + "integrity": "sha512-bpqzQheISYnBXKyU1lIj46uR7mRs0UhgEREWK70HnvFJSlRshdcoNMIrKamyrJeFdJrkYPSfR/a6D0d5zsWf1Q==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-scale": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.9.8.tgz", + "integrity": "sha512-QU3ZS4Lre8nN66U9dKCOC4FNfaOh/QJFYUmQPKpPS924oYbtnm4OlmsdfpK2hVMSVVyVOis8M+xpA1rDBnIp7w==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-shadow": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.9.8.tgz", + "integrity": "sha512-t/pE+QS3r1ZUxGIQNmwWDI3c5+/hLU+gxXD+C3EEC47/qk3gTBHpj/xDdGQBoObdT/HRjR048vC2BgBfzjj2hg==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugin-threshold": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.9.8.tgz", + "integrity": "sha512-WWmC3lnIwOTPvkKu55w4DUY8Ehlzf3nU98bY0QtIzkqxkAOZU5m+lvgC/JxO5FyGiA57j9FLMIf0LsWkjARj7g==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1" + } + }, + "@jimp/plugins": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.9.8.tgz", + "integrity": "sha512-tD+cxS9SuEZaQ1hhAkNKw9TkUAqfoBAhdWPBrEZDr/GvGPrvJR4pYmmpSYhc5IZmMbXfQayHTTGqjj8D18bToA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.9.8", + "@jimp/plugin-blur": "^0.9.8", + "@jimp/plugin-circle": "^0.9.8", + "@jimp/plugin-color": "^0.9.8", + "@jimp/plugin-contain": "^0.9.8", + "@jimp/plugin-cover": "^0.9.8", + "@jimp/plugin-crop": "^0.9.8", + "@jimp/plugin-displace": "^0.9.8", + "@jimp/plugin-dither": "^0.9.8", + "@jimp/plugin-fisheye": "^0.9.8", + "@jimp/plugin-flip": "^0.9.8", + "@jimp/plugin-gaussian": "^0.9.8", + "@jimp/plugin-invert": "^0.9.8", + "@jimp/plugin-mask": "^0.9.8", + "@jimp/plugin-normalize": "^0.9.8", + "@jimp/plugin-print": "^0.9.8", + "@jimp/plugin-resize": "^0.9.8", + "@jimp/plugin-rotate": "^0.9.8", + "@jimp/plugin-scale": "^0.9.8", + "@jimp/plugin-shadow": "^0.9.8", + "@jimp/plugin-threshold": "^0.9.8", + "core-js": "^3.4.1", + "timm": "^1.6.1" + } + }, + "@jimp/png": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.9.8.tgz", + "integrity": "sha512-9CqR8d40zQCDhbnXHqcwkAMnvlV0vk9xSyE6LHjkYHS7x18Unsz5txQdsaEkEcXxCrOQSoWyITfLezlrWXRJAA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.8", + "core-js": "^3.4.1", + "pngjs": "^3.3.3" + } + }, + "@jimp/tiff": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.9.8.tgz", + "integrity": "sha512-eMxcpJivJqMByn2dZxUHLeh6qvVs5J/52kBF3TFa3C922OJ97D9l1C1h0WKUCBqFMWzMYapQQ4vwnLgpJ5tkow==", + "requires": { + "@babel/runtime": "^7.7.2", + "core-js": "^3.4.1", + "utif": "^2.0.1" + } + }, + "@jimp/types": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.9.8.tgz", + "integrity": "sha512-H5y/uqt0lqJ/ZN8pWqFG+pv8jPAppMKkTMByuC8YBIjWSsornwv44hjiWl93sbYhduLZY8ubz/CbX9jH2X6EwA==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.9.8", + "@jimp/gif": "^0.9.8", + "@jimp/jpeg": "^0.9.8", + "@jimp/png": "^0.9.8", + "@jimp/tiff": "^0.9.8", + "core-js": "^3.4.1", + "timm": "^1.6.1" + } + }, + "@jimp/utils": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.9.8.tgz", + "integrity": "sha512-UK0Fu0eevQlpRXq5ff4o/71HJlpX9wJMddJjMYg9vUqCCl8ZnumRAljfShHFhGyO+Vc9IzN6dd8Y5JZZTp1KOw==", + "requires": { + "@babel/runtime": "^7.7.2", + "core-js": "^3.4.1" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "favicons": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/favicons/-/favicons-6.0.0.tgz", + "integrity": "sha512-S8k5uL9aGRxrBtdVP7lgm+cU7k7nTe0ubI+lfuxpn3+JCuWTqPSiuu5IV6wVczfpmeiP9uHBLOHiJIfF8PCvCQ==", + "requires": { + "clone": "^2.1.2", + "colors": "^1.4.0", + "image-size": "^0.8.3", + "jimp": "^0.9.3", + "jsontoxml": "^1.0.1", + "lodash.defaultsdeep": "^4.6.1", + "require-directory": "^2.1.1", + "sharp": "^0.24.0", + "through2": "^3.0.1", + "tinycolor2": "^1.4.1", + "to-ico": "^1.1.5", + "vinyl": "^2.2.0", + "xml2js": "^0.4.23" + } + }, + "file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "image-size": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "requires": { + "queue": "6.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jimp": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.9.8.tgz", + "integrity": "sha512-DHN4apKMwLIvD/TKO9tFfPuankNuVK98vCwHm/Jv9z5cJnrd38xhi+4I7IAGmDU3jIDlrEVhzTkFH1Ymv5yTQQ==", + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.9.8", + "@jimp/plugins": "^0.9.8", + "@jimp/types": "^0.9.8", + "core-js": "^3.4.1", + "regenerator-runtime": "^0.13.3" + } + }, + "jpeg-js": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz", + "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "jsontoxml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", + "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "load-bmfont": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", + "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", + "requires": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node-abi": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.16.0.tgz", + "integrity": "sha512-+sa0XNlWDA6T+bDLmkCUYn6W5k5W6BPRL6mqzSCs6H/xUgtl4D5x2fORKDzopKiU6wsyn/+wXlRXwXeSp+mtoA==", + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" + }, + "parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" + }, + "parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "requires": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, + "parse-png": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", + "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", + "requires": { + "pngjs": "^3.2.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "requires": { + "pngjs": "^3.0.0" + } + }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, + "prebuild-install": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", + "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + } + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "queue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", + "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "requires": { + "inherits": "~2.0.3" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "resize-img": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", + "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", + "requires": { + "bmp-js": "0.0.1", + "file-type": "^3.8.0", + "get-stream": "^2.0.0", + "jimp": "^0.2.21", + "jpeg-js": "^0.1.1", + "parse-png": "^1.1.1" + }, + "dependencies": { + "bmp-js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", + "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=" + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "requires": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + }, + "dependencies": { + "bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" + }, + "jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" + } + } + }, + "jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "sharp": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.24.1.tgz", + "integrity": "sha512-1Lph6o7D6bU8WrcbG/kT7cVzi2UBi2xrrBfS/WUaD+ZcGd4MZ7+LbtFoGwbMVJH95d5aziBGyExYF4Urm2pjOQ==", + "requires": { + "color": "^3.1.2", + "detect-libc": "^1.0.3", + "nan": "^2.14.0", + "npmlog": "^4.1.2", + "prebuild-install": "^5.3.3", + "semver": "^7.1.3", + "simple-get": "^3.1.0", + "tar": "^6.0.1", + "tunnel-agent": "^0.6.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=" + }, + "stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "requires": { + "stream-to": "~0.2.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + }, + "timm": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz", + "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==" + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, + "to-ico": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", + "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", + "requires": { + "arrify": "^1.0.1", + "buffer-alloc": "^1.1.0", + "image-size": "^0.5.0", + "parse-png": "^1.0.0", + "resize-img": "^1.1.0" + }, + "dependencies": { + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=" + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "requires": { + "ip-regex": "^1.0.1" + } + }, + "utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "requires": { + "pako": "^1.0.5" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/src/.vuepress/theme/scripts/favicons/package.json b/src/.vuepress/theme/scripts/favicons/package.json new file mode 100644 index 00000000..f40e743a --- /dev/null +++ b/src/.vuepress/theme/scripts/favicons/package.json @@ -0,0 +1,16 @@ +{ + "name": "favicons-gen", + "version": "1.0.0", + "description": "", + "main": "favicons.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "Chris Waring (https://wwaves.co/)", + "license": "MIT", + "dependencies": { + "favicons": "^6.0.0", + "fs-extra": "^9.0.0" + } +} diff --git a/src/.vuepress/theme/scripts/getCollabs.js b/src/.vuepress/theme/scripts/getCollabs.js new file mode 100644 index 00000000..65f68d31 --- /dev/null +++ b/src/.vuepress/theme/scripts/getCollabs.js @@ -0,0 +1,42 @@ +const path = require('path') +const fs = require('fs') + +const directoryPath = path.join(__dirname, '../../public/images') + +function pbcopy(data) { + const proc = require('child_process').spawn('pbcopy') + proc.stdin.write(data) + proc.stdin.end() +} + +const collabs = [] +let data = '' +const hexStub = (file) => { + const ext = path.extname(file) + const fileName = path.basename(file, ext) + return ` +- component: Hexagon + backgroundImage: + alt: ${fileName} + src: /images/${file} + srcset: + 1x: /images/${file} + 2x: /images/${fileName}@2x${ext} +` +} +fs.readdir(directoryPath, function (err, files) { + if (err) { + return console.log('Unable to scan directory: ' + err) + } + + files.forEach(function (file) { + if (/^collab/.test(file)) { + if (!file.includes('@2x')) { + collabs.push(file) + } + } + }) + + collabs.map((collab) => (data += hexStub(collab))) + pbcopy(data) +}) diff --git a/src/.vuepress/theme/styles/components/embed-responsive.css b/src/.vuepress/theme/styles/components/embed-responsive.css new file mode 100644 index 00000000..74ac8770 --- /dev/null +++ b/src/.vuepress/theme/styles/components/embed-responsive.css @@ -0,0 +1,33 @@ +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; + + .embed-responsive-item, + iframe, + embed, + object, + video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; + } +} + +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} + +.embed-responsive-og { + padding-bottom: 52.63%; +} + +.embed-responsive-4by3 { + padding-bottom: 75%; +} diff --git a/src/.vuepress/theme/styles/components/index.css b/src/.vuepress/theme/styles/components/index.css new file mode 100644 index 00000000..d8e5f7d0 --- /dev/null +++ b/src/.vuepress/theme/styles/components/index.css @@ -0,0 +1,35 @@ +@import './typography.css'; +@import './embed-responsive.css'; + +/* grid margins comp */ +.grid-margins { + @apply mx-15px; +} + +@screen md { + .grid-margins { + @apply mx-58px; + } +} +/* 1440 max width + 58px left & right padding */ +@media only screen and (min-width: 1556px) { + .grid-margins { + @apply max-w-screen-xxl mx-auto; + } +} +/* hr-gradient comp */ +.hr-gradient, +.hr-transparent { + height: 1px; + @apply border-0; +} +.hr-gradient { + @apply bg-gradient-3; +} +.hr-transparent { + @apply bg-white opacity-60; +} + +.border-gray-30 { + border-color: rgba(142, 142, 147, 0.3); +} diff --git a/src/.vuepress/theme/styles/components/typography.css b/src/.vuepress/theme/styles/components/typography.css new file mode 100644 index 00000000..7c80b816 --- /dev/null +++ b/src/.vuepress/theme/styles/components/typography.css @@ -0,0 +1,64 @@ +/* apply custom rich type formatting */ +.type-rich { + @apply text-primary; + > * + * { + margin-top: 1.5em; + } + li + li { + margin-top: 1em; + } + b, + strong { + @apply font-bold; + } + i, + em { + @apply italic; + } + ul { + @apply list-disc; + } + ol { + @apply list-decimal; + } + ul, + ol { + @apply pl-5; + } + li > ul, + li > ol { + @apply pt-5; + } + + blockquote { + @apply text-black; + @apply pl-8 relative; + &:before { + content: ''; + width: 4px; + @apply bg-gradient-5 h-full left-0 absolute; + } + } + a { + @apply transition duration-200; + } + a.header-anchor { + font-size: 0.85em; + margin-left: -0.87em; + padding-right: 0.23em; + margin-top: 0.125em; + @apply opacity-0 float-left; + } + + a.header-anchor:hover { + @apply underline; + } + h1:hover .header-anchor, + h2:hover .header-anchor, + h3:hover .header-anchor, + h4:hover .header-anchor, + h5:hover .header-anchor, + h6:hover .header-anchor { + @apply opacity-100; + } +} diff --git a/src/.vuepress/theme/styles/index.css b/src/.vuepress/theme/styles/index.css new file mode 100644 index 00000000..ad4ef0a2 --- /dev/null +++ b/src/.vuepress/theme/styles/index.css @@ -0,0 +1,5 @@ +@import './tailwind.css'; + +body { + @apply bg-gray-light antialiased; +} diff --git a/src/.vuepress/theme/styles/tailwind.css b/src/.vuepress/theme/styles/tailwind.css new file mode 100644 index 00000000..2b8027eb --- /dev/null +++ b/src/.vuepress/theme/styles/tailwind.css @@ -0,0 +1,4 @@ +@tailwind base; +@tailwind components; +@import './components/index.css'; +@tailwind utilities; diff --git a/src/.vuepress/theme/svg-icon/arrow-right-icon.svg b/src/.vuepress/theme/svg-icon/arrow-right-icon.svg new file mode 100644 index 00000000..865d8238 --- /dev/null +++ b/src/.vuepress/theme/svg-icon/arrow-right-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/arrow-up-icon.svg b/src/.vuepress/theme/svg-icon/arrow-up-icon.svg new file mode 100644 index 00000000..54640af7 --- /dev/null +++ b/src/.vuepress/theme/svg-icon/arrow-up-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/chevron-down-icon.svg b/src/.vuepress/theme/svg-icon/chevron-down-icon.svg new file mode 100755 index 00000000..3c20b807 --- /dev/null +++ b/src/.vuepress/theme/svg-icon/chevron-down-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/close-icon.svg b/src/.vuepress/theme/svg-icon/close-icon.svg new file mode 100644 index 00000000..9785840f --- /dev/null +++ b/src/.vuepress/theme/svg-icon/close-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/hamburger-icon.svg b/src/.vuepress/theme/svg-icon/hamburger-icon.svg new file mode 100644 index 00000000..54e583d6 --- /dev/null +++ b/src/.vuepress/theme/svg-icon/hamburger-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/linkedin-icon.svg b/src/.vuepress/theme/svg-icon/linkedin-icon.svg new file mode 100644 index 00000000..766cb0e5 --- /dev/null +++ b/src/.vuepress/theme/svg-icon/linkedin-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/logo-icon.svg b/src/.vuepress/theme/svg-icon/logo-icon.svg new file mode 100644 index 00000000..5b55edcb --- /dev/null +++ b/src/.vuepress/theme/svg-icon/logo-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/pause.svg b/src/.vuepress/theme/svg-icon/pause.svg new file mode 100644 index 00000000..5a59deca --- /dev/null +++ b/src/.vuepress/theme/svg-icon/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/play.svg b/src/.vuepress/theme/svg-icon/play.svg new file mode 100755 index 00000000..29688597 --- /dev/null +++ b/src/.vuepress/theme/svg-icon/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/rss.svg b/src/.vuepress/theme/svg-icon/rss.svg new file mode 100644 index 00000000..c820b97f --- /dev/null +++ b/src/.vuepress/theme/svg-icon/rss.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/.vuepress/theme/svg-icon/twitter-icon.svg b/src/.vuepress/theme/svg-icon/twitter-icon.svg new file mode 100644 index 00000000..d0a4f98e --- /dev/null +++ b/src/.vuepress/theme/svg-icon/twitter-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/svg-icon/youtube-icon.svg b/src/.vuepress/theme/svg-icon/youtube-icon.svg new file mode 100644 index 00000000..f48c644c --- /dev/null +++ b/src/.vuepress/theme/svg-icon/youtube-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/.vuepress/theme/tailwind.config.js b/src/.vuepress/theme/tailwind.config.js new file mode 100644 index 00000000..944e8ec0 --- /dev/null +++ b/src/.vuepress/theme/tailwind.config.js @@ -0,0 +1,242 @@ +const breakpoints = { sm: 640, md: 768, lg: 1024, xl: 1280, xxl: 1440 } +const theme = { + extend: { + spacing: { + '15px': '15px', + '58px': '58px', + '120px': '120px', + '140px': '140px', + '180px': '180px', + '240px': '240px', + }, + screens: Object.fromEntries( + Object.entries(breakpoints).map(([k, v]) => [k, `${v}px`]) + ), + letterSpacing: { + tight: '-0.01em', + loose: '0.01em', + }, + lineHeight: { + 120: '1.2', + 125: '1.25', + 130: '1.3', + 140: '1.4', + 150: '1.5', + }, + maxWidth: { + '1/6': '16.666667%', + '1/5': '20%', + '1/4': '25%', + '1/3': '33.33%', + }, + zIndex: { + '-1': '-1', + '-10': '-10', + }, + minHeight: { + 500: '500px', + }, + rotate: { + 5: '5deg', + }, + fontSize: { + 12: '0.75rem', + 14: '0.875rem', + 16: '1rem', + 18: '1.125rem', + 20: '1.25rem', + 22: '1.375rem', + 24: '1.5rem', + 28: '1.75rem', + 30: '1.875rem', + 35: '2.1875rem', + 36: '2.25rem', + 50: '3.125rem', + }, + opacity: { + 60: '.6', + }, + colors: { + webBlue: '#156FF7', + deepBlue: '#002256', + plBlack: '#16161F', + blueGreen: '#3e9096', + gray: { + dark: '#707175', + default: '#d1d1d6', + light: '#f5f6f7', + pale: '#edf0f4', + }, + }, + borderColor: { + 'gray-dark': '#707175', + 'gray-default': '#d1d1d6', + }, + textColor: { + primary: '#16161F', + }, + transitionDuration: { + 2000: '2000ms', + }, + gridTemplateColumns: { + '2-offset-left': 'repeat(1, minmax(0, 1fr) minmax(0, 2fr))', + '2-offset-right': 'repeat(1, minmax(0, 2fr) minmax(0, 1fr))', + }, + }, + fontFamily: { + sans: ['aileron', 'sans-serif'], + serif: ['source-serif-pro', 'serif'], + }, + textStyles: (theme) => ({ + h1: { + fontFamily: theme('fontFamily.sans'), + lineHeight: theme('lineHeight.120'), + fontWeight: theme('fontWeight.semibold'), + letterSpacing: theme('letterSpacing.tight'), + fontSize: theme('fontSize.35'), + '@screen sm': { + fontSize: theme('fontSize.50'), + }, + }, + h2: { + fontSize: theme('fontSize.30'), + lineHeight: theme('lineHeight.120'), + fontFamily: theme('fontFamily.sans'), + fontWeight: theme('fontWeight.bold'), + letterSpacing: theme('letterSpacing.tight'), + '@screen sm': { + fontSize: theme('fontSize.36'), + lineHeight: theme('lineHeight.125'), + }, + }, + h3: { + fontFamily: theme('fontFamily.serif'), + fontWeight: theme('fontWeight.semibold'), + fontSize: theme('fontSize.24'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.130'), + '@screen sm': { + fontSize: theme('fontSize.30'), + }, + }, + h4: { + fontFamily: theme('fontFamily.serif'), + fontWeight: theme('fontWeight.normal'), + fontSize: theme('fontSize.24'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.130'), + '@screen sm': { + fontSize: theme('fontSize.28'), + lineHeight: theme('lineHeight.140'), + }, + }, + h5: { + fontFamily: theme('fontFamily.sans'), + fontWeight: theme('fontWeight.normal'), + fontSize: theme('fontSize.18'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.130'), + '@screen sm': { + fontSize: theme('fontSize.22'), + }, + }, + p1: { + fontFamily: theme('fontFamily.sans'), + fontWeight: theme('fontWeight.normal'), + fontSize: theme('fontSize.16'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.130'), + '@screen sm': { + fontSize: theme('fontSize.18'), + lineHeight: theme('lineHeight.140'), + }, + }, + 'p1-serif': { + fontFamily: theme('fontFamily.serif'), + fontWeight: theme('fontWeight.normal'), + fontSize: theme('fontSize.16'), + lineHeight: theme('lineHeight.150'), + letterSpacing: theme('letterSpacing.tight'), + '@screen sm': { + fontSize: theme('fontSize.18'), + }, + }, + p2: { + fontFamily: theme('fontFamily.serif'), + fontWeight: theme('fontWeight.semibold'), + fontSize: theme('fontSize.18'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.130'), + }, + p3: { + fontFamily: theme('fontFamily.sans'), + fontWeight: theme('fontWeight.normal'), + fontSize: theme('fontSize.16'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.140'), + }, + p4: { + fontFamily: theme('fontFamily.sans'), + fontWeight: theme('fontWeight.normal'), + fontSize: theme('fontSize.12'), + letterSpacing: theme('letterSpacing.normal'), + lineHeight: theme('lineHeight.150'), + }, + cta: { + fontFamily: theme('fontFamily.sans'), + fontWeight: theme('fontWeight.semibold'), + fontSize: theme('fontSize.16'), + lineHeight: theme('lineHeight.130'), + letterSpacing: theme('letterSpacing.loose'), + }, + link: { + fontWeight: theme('fontWeight.bold'), + color: theme('colors.webBlue'), + '&:hover': { + textDecoration: 'underline', + }, + }, + rich: { + extends: 'p1-serif', + h1: { + extends: 'h1', + }, + h2: { + extends: 'h2', + }, + h3: { + extends: 'h3', + }, + h4: { + extends: 'h4', + }, + h5: { + extends: 'h5', + }, + h6: { + extends: 'h6', + }, + a: { + extends: 'link', + }, + blockquote: { + extends: 'h4', + }, + }, + }), +} + +module.exports = { + breakpoints, + theme, + variants: { + margin: ['responsive', 'first', 'last'], + scale: ['group-hover', 'hover'], + rotate: ['group-hover'], + opacity: ['group-hover', 'responsive'], + }, + plugins: [ + require('tailwindcss-typography')({ componentPrefix: 'type-' }), + require('./tailwind.gradients'), + ], +} diff --git a/src/.vuepress/theme/tailwind.gradients.js b/src/.vuepress/theme/tailwind.gradients.js new file mode 100644 index 00000000..644f1ab4 --- /dev/null +++ b/src/.vuepress/theme/tailwind.gradients.js @@ -0,0 +1,25 @@ +const plugin = require('tailwindcss/plugin') +module.exports = plugin(function ({ addUtilities }) { + const newUtilities = { + '.bg-gradient-1': { + background: 'linear-gradient(311.2deg, #1a1c49 41.59%, #367ce4 121.07%)', + }, + '.bg-gradient-2': { + background: 'linear-gradient(323.03deg, #1f6ce0 20.31%, #4df185 118.99%)', + }, + '.bg-gradient-3': { + background: 'linear-gradient(104.24deg, #1a74fc -4.4%, #4ef286 112.23%)', + }, + '.bg-gradient-4': { + background: 'linear-gradient(294.43deg, #0819ae 10.18%, #2166cd 100%)', + }, + '.bg-gradient-5': { + background: 'linear-gradient(287.44deg, #2166cd 10.18%, #0819ae 100%)', + }, + '.bg-gradient-6': { + background: 'linear-gradient(to bottom,#041727 0,#062b3f 100%)', + }, + } + + addUtilities(newUtilities, ['responsive', 'hover']) +}) diff --git a/src/.vuepress/theme/util/index.js b/src/.vuepress/theme/util/index.js new file mode 100644 index 00000000..0cc7c1f7 --- /dev/null +++ b/src/.vuepress/theme/util/index.js @@ -0,0 +1,245 @@ +export const hashRE = /#.*$/ +export const extRE = /\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^[a-z]+:/i + +export function normalize(path) { + return decodeURI(path).replace(hashRE, '').replace(extRE, '') +} + +export function getHash(path) { + const match = path.match(hashRE) + if (match) { + return match[0] + } +} + +export function isExternal(path) { + return outboundRE.test(path) +} + +export function isMailto(path) { + return /^mailto:/.test(path) +} + +export function isTel(path) { + return /^tel:/.test(path) +} + +export function ensureExt(path) { + if (isExternal(path)) { + return path + } + const hashMatch = path.match(hashRE) + const hash = hashMatch ? hashMatch[0] : '' + const normalized = normalize(path) + + if (endingSlashRE.test(normalized)) { + return path + } + return normalized + '.html' + hash +} + +export function isActive(route, path) { + const routeHash = decodeURIComponent(route.hash) + const linkHash = getHash(path) + if (linkHash && routeHash !== linkHash) { + return false + } + const routePath = normalize(route.path) + const pagePath = normalize(path) + return routePath === pagePath +} + +export function resolvePage(pages, rawPath, base) { + if (isExternal(rawPath)) { + return { + type: 'external', + path: rawPath, + } + } + if (base) { + rawPath = resolvePath(rawPath, base) + } + const path = normalize(rawPath) + for (let i = 0; i < pages.length; i++) { + if (normalize(pages[i].regularPath) === path) { + return Object.assign({}, pages[i], { + type: 'page', + path: ensureExt(pages[i].path), + }) + } + } + console.error( + `[vuepress] No matching page found for sidebar item "${rawPath}"` + ) + return {} +} + +function resolvePath(relative, base, append) { + const firstChar = relative.charAt(0) + if (firstChar === '/') { + return relative + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative + } + + const stack = base.split('/') + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop() + } + + // resolve relative path + const segments = relative.replace(/^\//, '').split('/') + for (let i = 0; i < segments.length; i++) { + const segment = segments[i] + if (segment === '..') { + stack.pop() + } else if (segment !== '.') { + stack.push(segment) + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift('') + } + + return stack.join('/') +} + +/** + * @param { Page } page + * @param { string } regularPath + * @param { SiteData } site + * @param { string } localePath + * @returns { SidebarGroup } + */ +export function resolveSidebarItems(page, regularPath, site, localePath) { + const { pages, themeConfig } = site + + const localeConfig = + localePath && themeConfig.locales + ? themeConfig.locales[localePath] || themeConfig + : themeConfig + + const pageSidebarConfig = + page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar + if (pageSidebarConfig === 'auto') { + return resolveHeaders(page) + } + + const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar + if (!sidebarConfig) { + return [] + } else { + const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) + return config ? config.map((item) => resolveItem(item, pages, base)) : [] + } +} + +/** + * @param { Page } page + * @returns { SidebarGroup } + */ +function resolveHeaders(page) { + const headers = groupHeaders(page.headers || []) + return [ + { + type: 'group', + collapsable: false, + title: page.title, + path: null, + children: headers.map((h) => ({ + type: 'auto', + title: h.title, + basePath: page.path, + path: page.path + '#' + h.slug, + children: h.children || [], + })), + }, + ] +} + +export function groupHeaders(headers) { + // group h3s under h2 + headers = headers.map((h) => Object.assign({}, h)) + let lastH2 + headers.forEach((h) => { + if (h.level === 2) { + lastH2 = h + } else if (lastH2) { + ;(lastH2.children || (lastH2.children = [])).push(h) + } + }) + return headers.filter((h) => h.level === 2) +} + +export function resolveNavLinkItem(linkItem) { + return Object.assign(linkItem, { + type: linkItem.items && linkItem.items.length ? 'links' : 'link', + }) +} + +/** + * @param { Route } route + * @param { Array | Array | [link: string]: SidebarConfig } config + * @returns { base: string, config: SidebarConfig } + */ +export function resolveMatchingConfig(regularPath, config) { + if (Array.isArray(config)) { + return { + base: '/', + config: config, + } + } + for (const base in config) { + if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { + return { + base, + config: config[base], + } + } + } + return {} +} + +function ensureEndingSlash(path) { + return /(\.html|\/)$/.test(path) ? path : path + '/' +} + +function resolveItem(item, pages, base, groupDepth = 1) { + if (typeof item === 'string') { + return resolvePage(pages, item, base) + } else if (Array.isArray(item)) { + return Object.assign(resolvePage(pages, item[0], base), { + title: item[1], + }) + } else { + if (groupDepth > 3) { + console.error('[vuepress] detected a too deep nested sidebar group.') + } + const children = item.children || [] + if (children.length === 0 && item.path) { + return Object.assign(resolvePage(pages, item.path, base), { + title: item.title, + }) + } + return { + type: 'group', + path: item.path, + title: item.title, + sidebarDepth: item.sidebarDepth, + children: children.map((child) => + resolveItem(child, pages, base, groupDepth + 1) + ), + collapsable: item.collapsable !== false, + } + } +} diff --git a/src/.vuepress/theme/util/tagUtils.js b/src/.vuepress/theme/util/tagUtils.js new file mode 100644 index 00000000..2d8f1967 --- /dev/null +++ b/src/.vuepress/theme/util/tagUtils.js @@ -0,0 +1,15 @@ +export const getTags = (posts) => { + const tags = [] + + posts.forEach((post) => { + const postTags = post.frontmatter.tags.replaceAll(', ', ',').split(',') + + for (let i = 0; i < postTags.length; i++) { + if (postTags[i] && !tags.includes(postTags[i])) { + tags.push(postTags[i]) + } + } + }) + + return tags.sort() +} diff --git a/src/.vuepress/theme/util/trapFocus.js b/src/.vuepress/theme/util/trapFocus.js new file mode 100644 index 00000000..9f5c31fe --- /dev/null +++ b/src/.vuepress/theme/util/trapFocus.js @@ -0,0 +1,28 @@ +// eslint-disable-next-line default-param-last +export default function trapFocus(tabItems = [], escapeCallback, e) { + const keyCode = e.keyCode || e.which + + if (keyCode === 27) { + // Handles escape key + + if (escapeCallback) { + escapeCallback() + } + } else if ( + e.target === tabItems[tabItems.length - 1] && + !e.shiftKey && + keyCode === 9 + ) { + // Handles tabbing past the last menu item to return to menu toggle button + + e.preventDefault() + tabItems[0].focus() + } else if (e.target === tabItems[0] && e.shiftKey && keyCode === 9) { + // Handles shift-tabbing past the first menu item + e.preventDefault() + tabItems[tabItems.length - 1].focus() + } else if (keyCode === 32) { + // Handles spacebar for click + // e.target.click() + } +} diff --git a/src/README.md b/src/README.md new file mode 100644 index 00000000..112100d5 --- /dev/null +++ b/src/README.md @@ -0,0 +1,5 @@ +# Hello World + +Welcome to the VuePress website starter kit + +{{ $site }} diff --git a/src/_blog/000-hello-worlds/README.md b/src/_blog/000-hello-worlds/README.md new file mode 100644 index 00000000..83b22309 --- /dev/null +++ b/src/_blog/000-hello-worlds/README.md @@ -0,0 +1,32 @@ +--- +date: 2015-05-05 +url: /0-hello-worlds/ +title: Hello Worlds +description: +author: Juan Benet +--- + +```sh +> echo "hello worlds" | ipfs add +added QmZ4tDuvesekSs4qM5ZBKpXiZGun7S2CYtEZRB3DYXkjGx +> ipfs cat QmZ4tDuvesekSs4qM5ZBKpXiZGun7S2CYtEZRB3DYXkjGx +hello worlds +``` + +Greetings Internet! + +This post kicks off the official IPFS (InterPlanetary File System) Blog. This is long overdue-- the project is many months old. We will be making a series of posts explaining various aspects of IPFS, its development, our growing community, and so on. This blog will also be used to make all important announcements henceforth. + + + +You can't _yet_ "follow" the blog with ipfs, but we're working on it and expect to have it working soon. For now, you can follow one of these ways: + +- HTTP: https://blog.ipfs.io +- Git: `git clone https://github.com/ipfs/blog` +- GitHub: click watch at https://github.com/ipfs/blog +- RSS: [follow RSS Feed](https://blog.ipfs.io/index.xml) +- IPFS: https://gateway.ipfs.io/ipns/blog.ipfs.io + +Don't miss any InterPlanetary updates! + +![](earthrise.png) diff --git a/src/_blog/001-run-ipfs-on-docker/README.md b/src/_blog/001-run-ipfs-on-docker/README.md new file mode 100644 index 00000000..881019d6 --- /dev/null +++ b/src/_blog/001-run-ipfs-on-docker/README.md @@ -0,0 +1,61 @@ +--- +date: 2015-07-11 +url: /1-run-ipfs-on-docker/ +title: Run IPFS in a Docker container +description: +author: Kyle Drake +--- + +In recent years, Docker and a few other projects have redefined how we run server applications. In the future, we might be running containerized apps in our personal devices. At its core, this fast-paced improvement is a combination of good interfaces to standardize how to do things, and great tooling to make using containers easy. + +The IPFS Project has many things planned for the world of containers. The most interesting is using IPFS to distribute containers hyper efficiently across data-centers and the internet. We will be discussing many of these things in upcoming posts, but first things first. This post is a quick guide for running an IPFS node directly within Docker. + +The IPFS team has provided an [IPFS Docker image](https://registry.hub.docker.com/r/ipfs/go-ipfs), which is syncronized with the latest commits to [go-ipfs](https://github.com/ipfs/go-ipfs). It only takes a few commands to try it out! + +```sh +> mkdir /tmp/ipfs-docker-staging +> mkdir /tmp/ipfs-docker-data +> docker run -d --name ipfs-node \ + -v /tmp/ipfs-docker-staging:/export -v /tmp/ipfs-docker-data:/data/ipfs \ + -p 8080:8080 -p 4001:4001 -p 127.0.0.1:5001:5001 \ + ipfs/go-ipfs:latest +faa8f714398c7a1a5a29adc2aed01857b41444ed53ec11863a3136ad37c8064c +``` + +Port `8080` is the HTTP Gateway, which allows you to query ipfs data with your browser ([see this example](http://gateway.ipfs.io/ipfs/QmVyS3iAy7mvDA2HqQWm2aqZDcGDH3bCRLFkEutfBWNBqN/)), port `4001` is what swarm port IPFS uses to communicate with other nodes, and port `5001` is used for the local API. We bind `5001` only on `127.0.0.1` because it should not be exposed to the outside world. The `faa8f7143...` is the docker container id. + +We've mounted a data and staging volume. The `data` volume is used to store the IPFS local repo (config and database), and `staging` is a directory you can use for staging files for command line usage (such as `ipfs add`). If you're only using the API, you can omit the staging directory volume. And of course, feel free to put those directories somewhere other than `/tmp`. + +Now what? Your node is running. You can issue commands directly to the containerized ipfs with `docker exec `. For example, you can try `ipfs swarm peers` to see who you are connected to: + +```sh +# let's set $cid = for easy access +> cid=faa8f714398c7a1a5a29adc2aed01857b41444ed53ec11863a3136ad37c8064c +> docker exec $cid ipfs swarm peers +/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLpPVmHKQ4XTPdz8tjDFgdeRFkpV8JgYq8JVJ69RrZm +/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu +/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm +/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 +``` + +And of course, you can `add` or `cat` content as usual: + +```sh +> echo "hello from dockerized ipfs" >/tmp/ipfs-docker-staging/hello +> docker exec $cid ipfs add /export/hello +added QmcDge1SrsTBU8b9PBGTGYguNRnm84Kvg8axfGURxqZpR1 /export/hello +> docker exec $cid ipfs cat /ipfs/QmSvCqazpuuib8qyRyddyFemLc2qmRukLLy8YfkdRPEXoQ +hello there! +``` + +Your dockerized IPFS is now also running a Gateway at `http://:8080`. You can try it out with `curl`, or with your browser: + +```sh +> curl http://localhost:8080/ipfs/QmcDge1SrsTBU8b9PBGTGYguNRnm84Kvg8axfGURxqZpR1 +hello from dockerized ipfs +``` + +[Kubernetes 1.0](http://kuberneteslaunch.com) comes out next week, so after that, we'll try using it to build a cluster of IPFS nodes that can store any kind of data and be able to retreive it from any other IPFS node. Not just with IPFS nodes in your cluster, but with everyone! + + +

asciicast powered by asciinema

diff --git a/src/_blog/002-ipscend/README.md b/src/_blog/002-ipscend/README.md new file mode 100644 index 00000000..83ec03b0 --- /dev/null +++ b/src/_blog/002-ipscend/README.md @@ -0,0 +1,101 @@ +--- +date: 2015-11-27 +url: /3-ipscend/ +tags: codec +title: ipscend - Publish static web content to IPFS +description: +author: David Dias +--- + +[![](img/ipscend.png)](https://github.com/diasdavid/ipscend) + +[`ipscend`](https://github.com/diasdavid/ipscend) is a new tool to help developers publish their static web content to IPFS and share it easily, while keeping history and more. It is heavily inspired by previous static web content publishing tools, like GitHub Pages and surge. + +## Features + +Currently, `ipscend` offers a set of features, accessible through a CLI, and installable through npm (`npm i -g ipscend`), which enable a simple workflow for working in your Web page/app and publishing it to the IPFS network. + +- `ipscend browse` - Opens the last published version of your application in the browser. +- `ipscend init` - Initializes your project. Asks for the folder where the web application will be available and stores an `ipscend.json` object in your current path to store all the metadata it generates, such as published versions and taken screenshots. +- `ipscend preview` - Serves your application on a local static file server, so that you can try it out before you feel ready to publish it. +- `ipscend publish` - Publishes the current state of your application to IPFS and stores a reference to it. +- `ipscend versions` - Prints out the published versions for the app and its respective timestamp. +- `ipscend screenshot` - Opens a screenshot preview of all the published versions of your app. In order to generate the screenshots, you must first run `ipscend screenshot --gen`. + +![](img/ipscend-screenshot.gif) + +An `ipscend.json` object for a project with some published versions will look like: + +```bash +$ cat ipscend.json +{ + "versions": [ + { + "hash": "QmQhNMwk7fThpwRNUR3bStb1eA7aeFJaApZjDaQCnykowL", + "timestamp": "2015-11-14T14:50:10.998Z", + "snapshot": "QmNMqiKZG7gCsnaQFTqG3AUeVhA1n8byy974Yqn3qRGZcJ" + }, + { + "hash": "QmSAmgQPCWjbrpbYHZQ2rVkH7a9vavubG1Jzv5CjDWrUmt", + "timestamp": "2015-11-14T14:51:00.860Z", + "snapshot": "QmcCNrn72FuHWkXtpJuUYfbH87d61qa6PSagUbLiK6VfLJ" + }, + { + "hash": "QmVNgdUoBQHiBhSeDe2z8LttJaDZq7JZi17sR1SPnJmjMh", + "timestamp": "2015-11-14T14:51:24.379Z", + "snapshot": "QmP5NuGdozeWaZqEdY1zBpcupB6qQ66AWReqm4L2vJzt73" + } + ], + "path": "src/public" +} +``` + +## Workflow + +In order to get started, all you need to do is initiate your ipscend in your web page/app project: + +```bash +$ ipscend init +This utility will walk you through creating a ipscend.json file. +Path of your Web Application (project)? (public) src/public +$ cat ipscend.json +{ + "versions": [], + "path": "src/public" +} +``` + +Once you are ready to publish, run the `ipscend publish` command: + +```bash +$ ipscend publish +{ hash: 'QmVNgdUoBQHiBhSeDe2z8LttJaDZq7JZi17sR1SPnJmjMh', + timestamp: Fri Nov 27 2015 10:23:37 GMT+0000 (WET) } +published src/public QmVNgdUoBQHiBhSeDe2z8LttJaDZq7JZi17sR1SPnJmjMh +$ cat ipscend.json +{ + "versions": [ + { + "hash": "QmVNgdUoBQHiBhSeDe2z8LttJaDZq7JZi17sR1SPnJmjMh", + "timestamp": "2015-11-27T16:23:37.971Z" + } + ], + "path": "src/public" +``` + +Grab that hash and share it with your friends, by sending them a link to ipfs.io, appending "/ipfs/Hash" (e.g. https:/ipfs.io/ipfs/ QmVNgdUoBQHiBhSeDe2z8LttJaDZq7JZi17sR1SPnJmjMh). + +If you want to use your awesome.domain.com to load your page from IPFS, you can check how to do it now at https://github.com/diasdavid/ipscend#use-ipfs-to-host-your-webpage-using-a-standard-domain-includes-cool-dns-trick. + +## Awesome (FUTURE)! + +`ipscend` is still in its humble beginnings. Some of the ideas and plans to build in the future include being able to: + +- Extract the version from the VCS itself (https://github.com/ipfs/notes/issues/23), so that every commit can be a different working version, allowing you to test every commit in your CI. +- Roll back history, following the 'time machine' analogy. +- Update your DNS provider automatically, avoiding having to use an external tool like [`dnslink-deploy`](https://github.com/ipfs/dnslink-deploy). +- Enable reviewers to write notes. +- Take screenshots in every browser version, so that we can use the timeline to see if there was any regression at a point in time, which might happen in a specific browser. +- moaaaar :D If you have ideas or want to contribute, ipscend is fully MIT Licensed, so feel free to open a issue or PR on https://github.com/diasdavid/ipscend. + +A big thank you to [Andrés Gutgon](https://github.com/andresgutgon) who made the screenshot preview look [really good](https://github.com/diasdavid/ipscend-screenshot-visualizer/pull/1) diff --git a/src/_blog/003-registry-mirror/README.md b/src/_blog/003-registry-mirror/README.md new file mode 100644 index 00000000..a107dbf2 --- /dev/null +++ b/src/_blog/003-registry-mirror/README.md @@ -0,0 +1,118 @@ +--- +date: 2015-12-08 +url: /8-registry-mirror/ +tags: modules +title: Stellar Module Management - Install your Node.js modules using IPFS +description: +author: David Dias +draft: true +--- + +![](img/node-interactive-logo.png) + +Node.js Interactive, the first Node.js conference organized by the Linux Foundation, happened on Dec 8-9 of 2015. There were hundreds of participants, and dozens of really amazing talks divided in 3 specific tracks: backend, frontend and IoT. + +I was fortunate to attend and present a project we've been developing at [Protocol Labs](https://ipn.io), that builds on on top of [IPFS, the InterPlanetary FileSystem](https://ipfs.io). + +You can learn about that project in this blog post, check out the [talk slides](http://www.slideshare.net/DavidDias11/nodejs-interactive) or wait for the video recording of the talk. I will update this blog post when that happens. + +## Enter registry-mirror + +![](img/enter-registry-mirror.png) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) + +`registry-mirror` enables distributed discovery of npm modules by fetching and caching the latest state of npm through IPNS, the InterPlanetary Naming System. With this state, a node in the network is capable of querying IPFS network for an npm module's cryptographic hash, fetching it from any peer that has it available. + +`registry-mirror` is open source, MIT licensed and available at [github.com/diasdavid/registry-mirror](https://github.com/diasdavid/registry-mirror). + +## Getting started + +In order to get started, you must first be sure that you are running IPFS 0.4.0. IPFS 0.4.0 is not yet released, but you can already use it by compiling from source or downloading the pre-built binary. + +#### Compiling from source + +You can find a tutorial on how to compile and install IPFS from source at [https://github.com/ipfs/go-ipfs#build-from-source](https://github.com/ipfs/go-ipfs#build-from-source). Just make sure to change to the `dev0.4.0` branch, as 0.4.0 isn't released yet. + +Please make sure you have go 1.5.2 or above installed. + +#### Downloading pre-built Binary + +Download the pre-built binary for your OS and Arch at [gobuilder](https://gobuilder.me/github.com/ipfs/go-ipfs/cmd/ipfs?branch=v0.4.0-dev). + +#### Installing and running registry-mirror + +Once you have IPFS 0.4.0 available, install registry-mirror by running the following command (you should have Node.js 4 and npm 2 or above available): + +```bash +$ npm i registry-mirror -g +# ... +``` + +Then start your IPFS daemon, run: + +```bash +$ ipfs daemon +Initializing daemon... +Swarm listening on /ip4/127.0.0.1/tcp/4001 +Swarm listening on /ip4/172.19.248.69/tcp/4001 +Swarm listening on /ip6/::1/tcp/4001 +API server listening on /ip4/127.0.0.1/tcp/5001 +Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 +Daemon is ready +``` + +After, run registry-mirror daemon with the `--ipfs` option: + +```bash +$ registry-mirror daemon --ipfs --port=9595 +IPFS mode ON +registry-mirror [info] output dir: /npm-registry/ +registry-mirror [info] listening:127.0.0.1:9595 +registry-mirror [info] Updated /npm-registry to: /ipfs/QmSjG9fadu4mPdtRsQYtXhwwCBouFEPiYHtVf8f4iH6vwj +``` + +Now, to install a module using IPFS, you only need to set this local registry when running an `npm install`. This can be done through [config](https://docs.npmjs.com/cli/config) or a command line argument: + +```bash +$ npm i bignumber --registry=http://localhost:9595 +npm http request GET http://localhost:9595/bignumber +npm http 200 http://localhost:9595/bignumber +npm http fetch GET http://localhost:9595/bignumber/-/bignumber-1.1.0.tgz +npm http fetch 200 http://localhost:9595/bignumber/-/bignumber-1.1.0.tgz +/Users/david/Documents/code/ipfs/ip-npm/node-interactive +└── bignumber@1.1.0 +``` + +## Features + +`registry-mirror` itself is quite a simple application, as most of the heavy lifting is done by [IPFS](https://ipfs.io). IPFS's distributed nature affords a set of really nice features as a transport layer that `registry-mirror` leverages to create its service. + +#### Find where the module lives without having to hit the backbone + +With `registry-mirror`, a registry becomes a curated list of hashes. While the modules live in the network, as soon as `registry-mirror` caches this list locally (which it gets from the IPFS network), it has a list of the hashes of the modules that a user might need in the future. With this list, a user doesn't have to know of the whereabouts of a module until it needs to request it from the network. + +This list is fetched and kept up to date through IPNS. This ensures secure distribution, as IPNS records and validated with the publisher's priate key. + +#### Work offline/disconnected + +Just like git, `registry-mirror` is able to work offline and/or in a disconnected scenario. As long as the module you are looking for exists in the network you are currently in, IPFS would be able to find it through its Peer and Content Routing (e.g. with a DHT). + +#### Enable several registries to coexist + +Once the notion of a registry becomes a curated list of modules available, enabling more than one registry to exist becomes simpler. This scenario can be especially interesting for private networks such as the ones within companies and organizations that don't want their modules to be publicly known and available. + +#### Run only what you were looking for + +Just like git, IPFS verifies the content received using cryptographic hashing, making sure it is exactly what was requested -- you can always be sure that what you are running is what you asked for. + +#### Faster + +By leveraging local and network caches efficiently, downloading your dependencies can be much faster as it avoids going to npm's servers or CDN all the time. This can be crucial in high latency networks or more remote areas. + +## Demo Video + +

registry-mirror demo from David Dias on Vimeo.

+ +## A special thanks + +A very big thank you goes to [Bryan English](https://github.com/bengl) and everyone that was involved in the [discussion](https://github.com/ipfs/notes/issues/2) and contributed to make this possible. diff --git a/src/_blog/004-v04x-migration/README.md b/src/_blog/004-v04x-migration/README.md new file mode 100644 index 00000000..3632f818 --- /dev/null +++ b/src/_blog/004-v04x-migration/README.md @@ -0,0 +1,129 @@ +--- +date: 2016-02-12 +url: /9-v04x-migration/ +tags: gateway, bootstrap, infrastructure +title: Migrating ipfs.io from go-ipfs 0.3.x to 0.4.0 +description: +author: Lars Gierth +--- + +Good news everyone! We'll soon release go-ipfs 0.4.0, +which contains lots of great changes and enhancements. +An upcoming post will detail the improvements of 0.4.0. +This post is about important things to be aware of when upgrading. +Users who already rely on go-ipfs or the ipfs.io services should pay special attention. + +There are breaking changes +which prevent 0.4.x nodes from communicating with 0.3.x nodes. +We know breaking changes are painful. We avoid them. +In this case, the improvement makes IPFS substantially more upgradable. +It's one of those things that "should've been different" from the start. +Having the freedom to improve the core protocol is why IPFS is still in alpha phase. + +Nevertheless, we take service disruption very seriously even in these early days. +We know thousands of developers use IPFS, +and hundreds of thousands of people rely on IPFS links to our gateway. +So we planned a smooth upgrade path. + +The breaking change is at the wire protocol level, +which means there will be, and already are, two separate networks. +We'll call these networks v03x and v04x. +IPFS nodes built from the master branch are already part of v04x. +The Docker image `ipfs/go-ipfs` is built from master (until 0.4.0 is released) +and thus also part of v04x. + +ipfs.io provides two essential services to the community, which are affected by this: +the public HTTP-to-IPFS gateway and the default bootstrappers. +We'll continue to support them for the v03x network until the **end of April 2016**. + +Please note that we won't support 0.3.x with patches or new features. +All development effort is directed towards 0.4.0, and you should update as soon as possible. + +- [How do I update go-ipfs to 0.4.0?](#how-do-i-update-go-ipfs-to-0-4-0-) +- [The public gateways at ipfs.io](#the-public-gateways-at-ipfs-io) +- [Solarnet: the default bootstrappers](#solarnet-the-default-bootstrappers) +- [How does this affect me?](#how-does-this-affect-me-) + +## How do I update go-ipfs to 0.4.0? + +Until we release 0.4.0, you can update by [building from source][ipfs-source]. + +After the release, you can: + +- Use the brand new [ipfs-update tool][ipfs-update] to update go-ipfs **(recommended)** +- Download [the new go-ipfs binaries][ipfs-binary] and install them. +- Download [the new source][ipfs-github] and [build it yourself][ipfs-source]. + +Please note that installation with `go get` does not work at this time. +We are experimenting with [gx, the new IPFS-based package manager][gx]. + +[ipfs-update]: http://dist.ipfs.io/#ipfs-update +[ipfs-binary]: http://dist.ipfs.io/#go-ipfs +[ipfs-github]: https://github.com/ipfs/go-ipfs +[ipfs-source]: https://github.com/ipfs/go-ipfs#build-from-source +[gx]: https://github.com/whyrusleeping/gx + +## The public gateways at ipfs.io + +For the time being, https://ipfs.io uses both v03x and v04x to service requests. +Content available in either network will be served just fine. +Whichever responds successfully first (2xx or 3xx status code), +gets to serve its content. The other response is discarded. +If the first response is not successful (4xx/5xx, connection errors), +it is discarded and the second response is served, regardless of its status code. + +We're using the [multireq proxy][multireq] to accomplish this multiplexing behaviour. +`multireq` is a new tool, so if you notice any weirdness with gateway requests, +[please let us know][infra-issues]. + +If you want to target a specific network, use v03x.ipfs.io or v04x.ipfs.io. +These domain names will stay around as long as the respective network is +supported by the public gateway. + +All of the above also applies to the `/api` endpoint (the readonly API), +which is part of the gateway. + +Expect the **v03x gateway** to be **supported until the end of April 2016.** +After that day, ipfs.io will be served by v04x exclusively, +and v03x.ipfs.io will no longer work. + +[multireq]: https://github.com/whyrusleeping/multireq +[infra-issues]: https://github.com/ipfs/infrastructure/issues/ + +## Solarnet: the default bootstrappers + +We call the 8 bootstrap nodes in go-ipfs's default config the default bootstrappers. +Their PeerIDs start with `QmSoL` (for Solarnet), +and all of them use `/tcp/4001` and/or `/udp/4002/utp`. +Use `ipfs bootstrap` to see or modify the bootstrappers currently used by your IPFS node. + +In order to balance the default bootstrappers over v03x and v04x, +a few of them bind v04x to these ports, and a few bind v03x. +The respective other network is bound to `/tcp/14001` and `/udp/14002/utp`. +This means that all 8 hosts run bootstrappers for both networks, +but are available as default bootstrappers only to one. + +We'll gradually shift the v03x/v04x ratio to v04x. +Expect at least **two v03x bootstrappers** to be **supported until the end of April 2016.** + +## How does this affect me? + +Check which version of go-ipfs you are running: `ipfs version` + +If you rely on the public gateways, +we ask you to please upgrade to 0.4.0 as soon as you can. +You can subscribe [to this issue][ready-yet] to be notified when 0.4.0 is released. + +If you're running an 0.3.x node, it won't be able to communicate +with any node which has updated to 0.4.x, let alone exchange data. +You can access data added by 0.4.0 nodes using the public gateway. +Likewise, data added by your 0.3.x node is still available on the public gateway. + +If you're running an 0.4.0 node, all is well in the world. +You don't need to do anything. + +Thank you for bearing with this important change. +We seek to provide a smooth transition for everyone, +and wish we didn't have to bother you with this at all. + +[ready-yet]: https://github.com/ipfs/go-ipfs/issues/2334 diff --git a/src/_blog/005-ipfs-0-4-0-released/README.md b/src/_blog/005-ipfs-0-4-0-released/README.md new file mode 100644 index 00000000..5b1ef9c5 --- /dev/null +++ b/src/_blog/005-ipfs-0-4-0-released/README.md @@ -0,0 +1,314 @@ +--- +date: 2016-04-07 +url: /14-ipfs-0-4-0-released/ +tags: modules +title: go-ipfs 0.4.0 has been released +description: +author: Kyle Drake and @whyrusleeping +--- + +[go-ipfs 0.4.0](http://dist.ipfs.io/#go-ipfs) has been +released! Among the many changes are a revamped implementation of the IPFS +communication protocols, increased performance, improvements to IPNS (the +Interplanetary Naming System), many bugfixes, and lots of new features to make +IPFS even more powerful. + +![0.4.0](fireworks.jpg) + +## The IPFS **Files API** + +In 0.4.0, we've added a new feature, the Files API, available through the +subcommand: `ipfs files`. This subcommand allows a program to interact with IPFS +using familiar filesystem operations, namely: creating directories, reading, writing +and deleting files, listing out different directories, and so on. + +This feature enables any application that uses a filesystem-like backend +to use IPFS for storage without changing the application logic at all. + +It is used like so: + +```sh +> ipfs files mkdir /cats + +> ipfs files ls / +cats + +> echo bar | ipfs files write --create /cats/foo + +> ipfs files ls /cats +foo + +> ipfs files read /cats/foo +bar + +> ipfs files stat / +QmNU8HmaeRa8VtfqAoQRJhSE5Zx54vyYf2nT1bDGcYXaNv +... + +# /ipfs/QmNU8HmaeRa8VtfqAoQRJhSE5Zx54vyYf2nT1bDGcYXaNv is a snapshot +# of this file system! + +# You can see it locally or on the public gateway: +# https://ipfs.io/ipfs/QmNU8HmaeRa8VtfqAoQRJhSE5Zx54vyYf2nT1bDGcYXaNv + +# Subsequent edits will produce a new /ipfs address for the root directory. +``` + +One great example of this is [ipfs-blob-store](https://github.com/ipfs/ipfs-blob-store), +an IPFS-backed storage driver that implements the +[blob-store-interface](https://github.com/maxogden/abstract-blob-store), so that any app +that uses any other blob-store storage driver (S3, IndexedDB, LevelDB, etc) can now use +IPFS. [registry-mirror](https://github.com/diasdavid/registry-mirror) uses this +approach to mirror the npm registry onto IPFS. + +We are looking forward to seeing more use cases of this new convenient and powerful API. + +## Why we're changing the protocol + +The most important change allows IPFS implementations to use pluggable stream +multiplexers, such as [yamux](https://github.com/hashicorp/yamux), +[spdystream](https://github.com/docker/spdystream), or +[muxado](https://github.com/inconshreveable/muxado). Instead of locking IPFS +permanently into a single multiplexer that won't work for every language or +situation, this change allows each IPFS implementation to implement the +multiplexers that they choose to, and then negotiate which to use during the +initial connection handshake. + +This modularity with stream muxing makes it easier for certain languages to +improve performance. For example, the Go programming language may have muxado +and yamux implementations that are really good, but many languages lack good (or +any) implementations of them. Or take Node.js, which works well with +spdy-transport, and it would be nice to take advantage of that. And +then there are options like +[multiplex](https://github.com/maxogden/multiplex), which may not have the +same performance, but are much easier to implement. + +So, by supporting as many muxers as we can, we get to choose the best +multiplexers for the job. It also makes it much easier to implement the IPFS +protocols in a new language. And of course, if a better multiplexers standard +comes along, it will be easier to upgrade IPFS to support it in the future. + +The same code that allows us to easily select a stream muxer is also being +used to select which IPFS sub-protocol to use for any given stream between +peers. Now, if we need to make a breaking protocol change to any of those (like +the DHT or bitswap) we can do so seamlessly, and provide easy backwards +compatibility. We won't need to "break" anything because we will be able to +have nodes run multiple protocols at the same time for compatibility. + +In addition to the multiplexers changes, the protocol revamp has also improved +efficiency and performance in a few important ways, including the elimination of +a double wrapping of the length prefixer, and the removal of some unnecessary +round trips between nodes. + +### Breaking changes + +This release contains a **breaking change** to the network wire protocol in the +form of a major refactor and upgrade to the libp2p handshake protocol. Because +of the refactor, **all IPFS daemons earlier than 0.4.0 will not be able to +communicate with the newest version**. It is strongly recommended that everyone +running an IPFS node upgrades to the latest version as soon as possible, as +these nodes will, after a certain time, no longer be able to communicate with +the majority of the network until they are upgraded. There are instructions on +how to update below. + +Refactoring the protocol is not something to be done lightly. But at this early +stage, this is necessary to ensure we have the right design for IPFS in place +for the future. It's better to improve the protocol now during this alpha stage +of the project than when there are a lot more people running nodes across a +lot of different implementations. + +One of the important changes that's been made to the protocol means that _there +should never be a breaking change like this again_. This is due to a change to +allow nodes to announce the version of the protocol they are using when +connecting to other IPFS nodes. The goal is to roll any future protocol changes +into the implementations gradually, so that we can still support legacy +protocols for a period of time, making it easier to deprecate old versions over +time. + +### The public gateway and bootstrappers + +We provide two essential public services to the IPFS community: the public +gateway at https://ipfs.io and the default bootstrap nodes. We're making sure +that despite the breaking changes, both will continue to work with 0.4.x and +0.3.x for a while. You can read more about the details of this in an earlier +blog post: [Migrating ipfs.io from go-ipfs 0.3.x to 0.4.0](../9-v04x-migration). +We expect to keep this grace period open until the end of April 2016. + +## Changes to the repo + +We made a few changes to our on disk storage format (called the 'repo'). +The way object pinning (`ipfs pin add`) works has also been upgraded to be much +more efficient, which will improve the overall speed of adding and downloading +IPFS data. Previously, when you pinned a file recursively, it would add a +recursive type pin to the root, and then add an indirect type pin to each child +node. This made enumeration for GC convenient, but was very slow and made a lot +of things needlessly complicated. We have switched to just adding the recursive +pin to the root object, and then doing the enumeration of child nodes when we +actually run a garbage collection. + +Because of this change, you will need to run a migration (from repo version 2 +to version 3). If you update with the `ipfs-update` tool, this will be done for +you automatically. If you updated manually, and did not run the migration, ipfs +will fail to run, and print a message saying that there is a mismatch in the repo +versions. + +## Other improvements and fixes + +In addition to a major protocol improvement and upgrade, this release adds a lot +of new functionality, performance speedups, and stability fixes that make this +the best version of IPFS to date. + +This release also includes performance and usability improvements to IPNS, +which is IPFS's mutability layer. IPNS creates a link from an IPFS node's +public key to the hash of an arbitrary objects hash, in a way that is +cryptographically verifiable. We call this "publishing" a hash, and you can try +it out using the `ipfs publish` command. By allowing users to change what the +pubkey hash points to, we provide users with a single hash they can give to their +users to get the latest version of their data. This creates a seamless way to +use IPFS to verify content, and to distribute content via trustless nodes in a +smart, safe way. This brings IPFS closer to the goal of being a global +filesystem of data, that can allow everyone in the world to help serve the +world's data in a way that enriches and empowers everybody. + +## How to upgrade + +Depending on how you initially installed IPFS, there are several ways to +upgrade. If you installed IPFS with a pre-built binary, you can either head over +to [dist.ipfs.io](http://dist.ipfs.io/#go-ipfs) and grab the latest version +from there. Or alternatively, from the same page you can grab the `ipfs-update` +binary, and use it to perform the upgrade for you. If you installed from +source, you can simply update your git repo to the `v0.4.0` tag, run `make toolkit_upgrade && make install`. + +Please upgrade your IPFS nodes as soon as you can, so you can take advantage +of the improvements! + +## Changelog + +This is a major release with plenty of new features and bugfixes. +It also includes breaking changes which make it incompatible with v0.3.x +on the networking layer. + +- Major Changes + - Multistream + - The addition of multistream is a breaking change on the networking layer, + but gives IPFS implementations the ability to mix and match different + stream multiplexers, e.g. yamux, spdystream, or muxado. + This adds a ton of flexibility on one of the lower layers of the protocol, + and will help us avoid further breaking protocol changes in the future. + - Files API + - The new `files` command and API allow a program to interact with IPFS + using familiar filesystem operations, namely: creating directories, + reading, writing, and deleting files, listing out different directories, + and so on. This feature enables any other application that uses a + filesystem-like backend for storage, to use IPFS as its storage driver + without having change the application logic at all. + - Gx + - go-ipfs now uses [gx](https://github.com/whyrusleeping/gx) to manage its + dependencies. This means that under the hood, go-ipfs's dependencies are + backed by IPFS itself! It also means that go-ipfs is no longer installed + using `go get`. Use `make install` instead. +- New Features + - Web UI + - Update to new version which is compatible with 0.4.0. (@dignifiedquire) + - Networking + - Implement uTP transport. (@whyrusleeping) + - Allow multiple addresses per configured bootstrap node. (@whyrusleeping) + - IPNS + - Improve IPNS resolution performance. (@whyrusleeping) + - Have dnslink prefer `TXT _dnslink.example.com`, allows usage of CNAME records. (@Kubuxu) + - Prevent `ipfs name publish` when `/ipns` is mounted. (@noffle) + - Repo + - Improve performance of `ipfs add`. (@whyrusleeping) + - Add `Datastore.NoSync` config option for flatfs. (@rht) + - Implement mark-and-sweep GC. (@whyrusleeping) + - Allow for GC during `ipfs add`. (@whyrusleeping) + - Add `ipfs repo stat` command. (@tmg, @diasdavid) + - General + - Add support for HTTP OPTIONS requests. (@lidel) + - Add `ipfs diag cmds` to view active API requests (@whyrusleeping) + - Add an `IPFS_LOW_MEM` environment veriable which relaxes Bitswap's memory usage. (@whyrusleeping) + - The Docker image now lives at `ipfs/go-ipfs` and has been completely reworked. (@lgierth) +- Security fixes + - The gateway path prefix added in v0.3.10 was vulnerable to cross-site + scripting attacks. This release introduces a configurable list of allowed + path prefixes. It's called `Gateway.PathPrefixes` and takes a list of + strings, e.g. `["/blog", "/foo/bar"]`. The v0.3.x line will not receive any + further updates, so please update to v0.4.0 as soon as possible. (@lgierth) +- Incompatible Changes + - Install using `make install` instead of `go get` (@whyrusleeping) + - Rewrite pinning to store pins in IPFS objects. (@tv42) + - Bump fs-repo version to 3. (@whyrusleeping) + - Use multistream muxer (@whyrusleeping) + - The default for `--type` in `ipfs pin ls` is now `all`. (@chriscool) +- Bug Fixes + - Remove msgio double wrap. (@jbenet) + - Buffer msgio. (@whyrusleeping) + - Perform various fixes to the FUSE code. (@tv42) + - Compute `ipfs add` size in background to not stall add operation. (@whyrusleeping) + - Add option to have `ipfs add` include top-level hidden files. (@noffle) + - Fix CORS checks on the API. (@rht) + - Fix `ipfs update` error message. (@tomgg) + - Resolve paths in `ipfs pin rm` without network lookup. (@noffle) + - Detect FUSE unmounts and track mount state. (@noffle) + - Fix go1.6rc2 panic caused by CloseNotify being called from wrong goroutine. (@rwcarlsen) + - Bump DHT kvalue from 10 to 20. (@whyrusleeping) + - Put public key and IPNS entry to DHT in parallel. (@whyrusleeping) + - Fix panic in CLI argument parsing. (@whyrusleeping) + - Fix range error by using larger-than-zero-length buffer. (@noffle) + - Fix yamux hanging issue by increasing AcceptBacklog. (@whyrusleeping) + - Fix double Transport-Encoding header bug. (@whyrusleeping) + - Fix uTP panic and file descriptor leak. (@whyrusleeping) +- Tool Changes + - Add `--pin` option to `ipfs add`, which defaults to `true` and allows `--pin=false`. (@eminence) + - Add arguments to `ipfs pin ls`. (@chriscool) + - Add `dns` and `resolve` commands to read-only API. (@Kubuxu) + - Add option to display headers for `ipfs object links`. (@palkeo) +- General Codebase Changes + - Check Golang version in Makefile. (@chriscool) + - Improve Makefile. (@tomgg) + - Remove dead Jenkins CI code. (@lgierth) + - Add locking interface to blockstore. (@whyrusleeping) + - Add Merkledag FetchGraph and EnumerateChildren. (@whyrusleeping) + - Rename Lock/RLock to GCLock/PinLock. (@jbenet) + - Implement pluggable datastore types. (@tv42) + - Record datastore metrics for non-default datastores. (@tv42) + - Allow multistream to have zero-rtt stream opening. (@whyrusleeping) + - Refactor `ipnsfs` into a more generic and well tested `mfs`. (@whyrusleeping) + - Grab more peers if bucket doesn't contain enough. (@whyrusleeping) + - Use CloseNotify in gateway. (@whyrusleeping) + - Flatten multipart file transfers. (@whyrusleeping) + - Send updated DHT record fixes to peers who sent outdated records. (@whyrusleeping) + - Replace go-psutil with go-sysinfo. (@whyrusleeping) + - Use ServeContent for index.html. (@AtnNn) + - Refactor `object patch` API to not store data in URL. (@whyrusleeping) + - Use mfs for `ipfs add`. (@whyrusleeping) + - Add `Server` header to API responses. (@Kubuxu) + - Wire context directly into HTTP requests. (@rht) + - Wire context directly into GetDAG operations within GC. (@rht) + - Vendor libp2p using gx. (@whyrusleeping) + - Use gx vendored packages instead of Godeps. (@whyrusleeping) + - Simplify merkledag package interface to ease IPLD inclusion. (@mildred) + - Add default option value support to commands lib. (@whyrusleeping) + - Refactor merkledag fetching methods. (@whyrusleeping) + - Use net/url to escape paths within Web UI. (@noffle) + - Deprecated key.Pretty(). (@MichealMure) +- Documentation + - Fix and update help text for **every** `ipfs` command. (@RichardLitt) + - Change sample API origin settings from wildcard (`*`) to `example.com`. (@Kubuxu) + - Improve documentation of installation process in README. (@whyrusleeping) + - Improve windows.md. (@chriscool) + - Clarify instructions for installing from source. (@noffle) + - Make version checking more robust. (@jedahan) + - Assert the source code is located within GOPATH. (@whyrusleeping) + - Remove mentions of `/dns` from `ipfs dns` command docs. (@lgierth) +- Testing + - Refactor iptb tests. (@chriscool) + - Improve t0240 sharness test. (@chriscool) + - Make bitswap tests less flaky. (@whyrusleeping) + - Use TCP port zero for ipfs daemon in sharness tests. (@whyrusleeping) + - Improve sharness tests on AppVeyor. (@chriscool) + - Add a pause to fix timing on t0065. (@whyrusleeping) + - Add support for arbitrary TCP ports to t0060-daemon.sh. (@noffle) + - Make t0060 sharness test use TCP port zero. (@whyrusleeping) + - Randomized ipfs stress testing via randor (@dignifiedquire) + - Stress test pinning and migrations (@whyrusleeping) diff --git a/src/_blog/006-distributions/README.md b/src/_blog/006-distributions/README.md new file mode 100644 index 00000000..64e830d1 --- /dev/null +++ b/src/_blog/006-distributions/README.md @@ -0,0 +1,69 @@ +--- +date: 2016-06-01 +url: /17-distributions/ +tags: dist, distributions +title: IPFS distributions +description: +author: Richard Littauer +--- + +[![](img/screenshot.png)](https://dist.ipfs.io/) + +[dist.ipfs.io](https://dist.ipfs.io/) is the new distributions page for IPFS. This is the new one-stop-shop for finding and downloading all official binaries that the IPFS Team produces. + +## The IPFS Distributions Website + +The distributions website itself is served by, hosted, and distributed through IPFS. The website assets and all of the binaries form one large IPFS content graph. This means that you can view and use this website through any IPFS node, even your own local ipfs node. All you need to do is to run an IPFS daemon and direct your browser to http://localhost:8080/ipns/dist.ipfs.io. Of course, you'll need to be online and connected to the internet, so you can find other ipfs nodes that have this website. + +### Download Deduplication + +If you download files from dist.ipfs.io using your local IPFS node, future downloads **may be** much faster. When you click to download a file, your browser will ask to download it from your local IPFS node. In turn, your IPFS node will fetch the relevant content from other nodes in the network, and return it to your browser. Your browser will place the file in your Downloads folder, or wherever you directed it to. + +However, once your local IPFS node has fetched the content, it will cache it locally for some time. This makes subsequent downloads of the exact same content instantaneous! Your browser asks the IPFS node for the content; the node already has it and simply returns it, without ever having to connect to other nodes. This also means that if other IPFS nodes in your local area network try to download the file, they may be able to fetch it from your node. Once you have the content locally, this can even work while disconnected from the internet! + +It may also make downloading **new** versions much faster, because different versions of large binary files often have lots of duplicated data. IPFS represents files as a Merkle DAG (a datastructure similar to a [merkle tree](https://en.wikipedia.org/wiki/Merkle_tree)), much like Git or BitTorrent. Unlike them, when IPFS imports files, it chunks them to deduplicate similar data within single files. So when you need to download a new version, you only download the parts that are new or different - this can make your future downloads faster! + +## Project details + +Every distribution has a section, which includes: + +- The distribution name and a short description; +- The current version number and release date; +- The software license (usually MIT); +- A download button that detects your platform and automatically suggests the appropriate distribution for you; +- A grid with download links for all supported platforms (operating system and architectures); +- A `Changelog`, a link to a summary of all version changes; +- An `All Versions`, a link to view and download previous versions. + +The `All Versions` link on each distribution shows directory listings for all the available versions, and a `versions` file ([example](https://dist.ipfs.io/go-ipfs/versions)). This file can be used by tools, such as [ipfs-update](https://dist.ipfs.io/#ipfs-update), to find all the available versions and download the latest. + +The directory listing of each version ([example](https://dist.ipfs.io/go-ipfs/v0.3.11)) has all the platform archives (`.zip` or `.tar.gz`), a `README.md` and a `dist.json` which describe the release for humans and machines. It is meant to be easily consumed and used by tools. + +The site is also used directly by [`ipfs-update`](https://github.com/ipfs/ipfs-update) to update IPFS. + +## Project Prerequisites + +In order to be added to the distributions page, a product must: + +- Originate from the IPFS community; +- Have high-quality UX and documentation; +- Be well maintained and active. + +If you think that a product should be there that isn't, get in touch. + +## Future Plans + +In the future, we hope to: + +- Enable code signing, for progress on this subject you can check this [pull request](https://github.com/ipfs/distributions/pull/51). +- Enable closer integration with package managers. +- Add more products. +- Host more screenshots of the tools directly in the Distributions page. +- Import binaries more intelligently in order to enhance change of deduplication. +- Add the software license (usually MIT) to each distribution. + +## Contribute + +We welcome any and all sorts of contributions! File issues or send us patches at [ipfs/distributions](https://github.com/ipfs/distributions). + +Last but not least, a huge thank you to [@dignifiedquire](https://github.com/dignifiedquire) for his amazing work with the Dist page. None of this would be possible without him. diff --git a/src/_blog/007-v03x-shutdown/README.md b/src/_blog/007-v03x-shutdown/README.md new file mode 100644 index 00000000..270dbe38 --- /dev/null +++ b/src/_blog/007-v03x-shutdown/README.md @@ -0,0 +1,24 @@ +--- +date: 2016-07-09 +url: /18-v03x-shutdown/ +tags: operations, v03x, gateway, bootstrap +title: go-ipfs 0.3.x network shutdown on July 14th +description: +author: Lars Gierth +--- + +The [0.4.x (v04x) series][v04x] of go-ipfs has brought plenty of useful features, and it has been a great success for the whole IPFS community. + +As we're getting closer to the release of go-ipfs 0.4.3, we're also getting closer to ceasing the [remaining support that we've given to the 0.3.x (v03x) series][migration] of go-ipfs. It's been a good while since we last reminded everyone that the v03x network will be discontinued, and we want to use this opportunity to make sure that nobody is taken by surprise. + +We'll be **shutting down** the v03x bootstrappers and gateways on **Thursday, July 14th**. After this date, with go-ipfs 0.3.x: + +- The bootstrap nodes configured by default will no longer allow you to connect. +- The public HTTP-to-IPFS gateway at [ipfs.io][gw] will no longer be able to access data from v03x networks. + +We ask you to update to the latest 0.4.x version, available through [dist.ipfs.io][dist]. If you can't update just yet, you can still connect your v03x nodes to each other by using the `ipfs bootstrap` or `ipfs swarm connect` commands. + +[migration]: https://ipfs.io/blog/9-v04x-migration/ +[v04x]: https://ipfs.io/blog/14-ipfs-0-4-0-released/ +[dist]: https://dist.ipfs.io +[gw]: https://ipfs.io diff --git a/src/_blog/008-ipfs-0-4-3-released/README.md b/src/_blog/008-ipfs-0-4-3-released/README.md new file mode 100644 index 00000000..4b05c06a --- /dev/null +++ b/src/_blog/008-ipfs-0-4-3-released/README.md @@ -0,0 +1,44 @@ +--- +date: 2016-09-20 +url: /19-ipfs-0-4-3-released/ +tags: modules +title: go-ipfs 0.4.3 has been released +description: +author: Lars Gierth +--- + +[go-ipfs 0.4.3](https://dist.ipfs.io/#go-ipfs) has been released today, +and we're incredibly proud as it's the fastest and most stable IPFS ever. +Give it a try as soon as you can, we're sure you'll like it as much as we do. + +## What's changed? + +- Runtime performance has improved all over the place! + Bitswap, Content Routing and Peer Routing, Datastore, Blockstore, you name it. +- Memory usage has improved as Provider records are now stored on disk. +- We now use Golang 1.7, which produces smaller and faster binaries. +- Connectivity between nodes is stabler than ever, + as we fixed transport issues that were previously thought to be NAT-related. +- The go-ipfs daemon now automatically raises the limit of file descriptors if needed. +- The daemon now automatically runs fs-repo migrations. +- The daemon got new flags: + - `ipfs daemon --offline` can be used to disable all swarm networking. + - `ipfs daemon --migrate` automatically runs any pending fs-repo migrations. +- The Datastore got a few more config options: + - `Datastore.HashOnRead` allows you to verify data on read access. + - `Datastore.BloomFilterSize` tunes the new lookup cache. + +And plenty of bug fixes as well as improvements to documentation and test coverage. +[Take a look at the Changelog](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md). + +## How to upgrade + +Depending on how you initially installed IPFS, there are several ways to +upgrade. If you installed IPFS with a pre-built binary, you can either head over +to [dist.ipfs.io](https://dist.ipfs.io/#go-ipfs) and grab the latest version +from there. Or alternatively, from the same page you can grab the `ipfs-update` +binary, and use it to perform the upgrade for you. If you installed from +source, you can simply run `git checkout v0.4.3`, then run `make install`. + +Please upgrade your IPFS nodes as soon as you can, +so you can take advantage of the improvements. diff --git a/src/_blog/009-q3-review/README.md b/src/_blog/009-q3-review/README.md new file mode 100644 index 00000000..59032715 --- /dev/null +++ b/src/_blog/009-q3-review/README.md @@ -0,0 +1,23 @@ +--- +date: 2016-09-27 +url: /20-q3-review/ +title: Join us for the Q3 Roadmap review calls +description: +author: Richard littauer +--- + +Our next weekly call will be focused on roadmaps. We will be planning our roadmaps for the rest of 2016. _You're invited to join in!_ We want to make sure the community is heard and involved as much as possible. + +If you're interested in seeing the progress we've made with IPFS over the last few months or if you have something you want to see done in Q4, tune into these calls and chime in on IRC. + +You are welcome to dial into these calls as a participant if any of the following are true: + +- You maintain software that relies directly on IPFS +- You have done work on js-ipfs, go-ipfs, libp2p, orbit, etc. +- You plan to do work on the these projects in the coming months + +To prepare for these calls, take a look at the [video calls from last week](https://www.youtube.com/watch?v=cp0acLtBGvE), where we reviewed the third quarter roadmaps. + +This is a diversion from our usual weekly schedule. As you may know, every Monday we have a series of calls to align work on IPFS for the following week. We announce the calls each week in an issue in [ipfs/pm](https://github.com/ipfs/pm/issues) and on the [#ipfs IRC channel](http://webchat.freenode.net/?channels=%23ipfs). Next week, instead of following [our usual routine](https://github.com/ipfs/pm#sprints-wip), we're going to look at roadmaps. We will cover some of the work we plan to do in the next few months. In mid-October all of the project leads will be meeting in person to lay out our finalized roadmap for the rest of 2016. + +If you'd like to weigh in on the process for the next two weeks, check out [this issue](https://github.com/ipfs/pm/issues/202) and let us know! If you have never participated in the calls before and you plan to dial in as a participant on these roadmapping calls, please let us know you're coming by leaving a comment on that github issue. diff --git a/src/_blog/010-go-ipfs-0-4-4-released/README.md b/src/_blog/010-go-ipfs-0-4-4-released/README.md new file mode 100644 index 00000000..036f1608 --- /dev/null +++ b/src/_blog/010-go-ipfs-0-4-4-released/README.md @@ -0,0 +1,81 @@ +--- +date: 2016-10-11 +url: /21-go-ipfs-0-4-4-released/ +title: go-ipfs 0.4.4 has been released +description: +author: whyrusleeping & Lars Gierth +--- + +[go-ipfs 0.4.4](https://dist.ipfs.io/#go-ipfs) has been released today, +including an important hotfix for a bug we discovered in how _pinning_ works. +If you had a large number of pins, new pins would overwrite existing pins. +Apart from the hotfix, this release is equal to the previous release 0.4.3. + +- [How pinning works](#how-pinning-works) +- [The bug](#the-bug) +- [Find out if you're affected](#find-out-if-you-re-affected) +- [How to upgrade](#how-to-upgrade) + +## How pinning works + +Pinning is a means of persisting data in your IPFS repo after adding or fetching it. +It'll prevent objects from getting removed by garbage collection or other methods +of cleaning up the IPFS repo. There are three ways an object can be pinned: + +- **Direct:** Only this object is pinned. Its children aren't pinned. +- **Recursive:** This object and all its children are pinned. + If the recursive pin is removed, the children aren't pinned any longer either. +- **Indirect:** This object is pinned because one of its parents is pinned. + If the pins of all parents are removed, this object isn't pinned any longer. + +The `ipfs add` command adds a _recursive pin_ for the added file by default. +With `--pin=false`, it skips pinning. Similarly, the default pin type for +`ipfs pin add` is _recursive_. With `--recursive=false` this changes to _direct_. + +For more information on how pinning works, check out `ipfs pin --help` and `ipfs add --help`. + +## The bug + +Direct and recursive pins are stored in separate so-called _pinsets_. +Indirect pins aren't stored, since they're derived from recursive pins. + +Once you had more than 8192 pins, recursive or direct, an +issue with the recursive hash trie implementation caused hash table buckets to +be overwritten, resulting in only 256 pins remaining in the pinset. After that, +the bug wouldn't be triggered again until the number of pins exceeded 8192 again. +The 256 pins that remained would be random. + +We fixed this by instead making sure that each item in a pinset be put into its +own bucket, and by modulo'ing hash output from this process into the final key +space. The details for this can be seen +[in this pull request](https://github.com/ipfs/go-ipfs/pull/3273). We added a +stress test to make sure that this doesn't happen in the future, and will +redouble our efforts to make sure that our test suites are more robust to ensure +that these kinds of problems do not happen in the future. + +For now, don't run `ipfs repo gc` on sensitive data that is not otherwise backed up, +as IPFS is still not 1.0 and our development may still find problems. + +[@kyledrake](https://github.com/kyledrake) of [neocities.org](https://neocities.org) +pointed out this bug to us; thank you, Kyle! + +## Find out if you're affected + +If you think you have experienced this issue and have _not_ run a garbage +collection, you can still find the 'lost' pins. We have written a new tool +called 'ipfs-see-all' that allows you to try and recover any old pins that are +still in your local repo. The tool is available on [our distributions +page](https://dist.ipfs.io), or, if you prefer building from source, head over +to [the GitHub repo](https://github.com/whyrusleeping/ipfs-see-all). Once you +have the tool, invoke it as `ipfs-see-all lost-pins` and it will scan for and +print out every pin object that is not actually pinned in your pinset. Note +that this may contain anything you have manually unpinned. + +## How to upgrade + +Depending on how you initially installed IPFS, there are several ways to +upgrade. If you installed IPFS with a pre-built binary, you can head over +to [dist.ipfs.io](https://dist.ipfs.io/#go-ipfs) and grab the latest version +from there. Or alternatively, from the same page you can grab the `ipfs-update` +binary, and use it to perform the upgrade for you. If you installed from +source, you can simply run `git checkout v0.4.4`, then run `make install`. diff --git a/src/_blog/011-run-ipfs-on-a-vps/README.md b/src/_blog/011-run-ipfs-on-a-vps/README.md new file mode 100644 index 00000000..edb1d558 --- /dev/null +++ b/src/_blog/011-run-ipfs-on-a-vps/README.md @@ -0,0 +1,136 @@ +--- +date: 2016-11-14 +url: /22-run-ipfs-on-a-vps/ +title: Run IPFS latest on a VPS +description: +author: Richard Littauer +--- + +The best way to provide content using [IPFS](https://ipfs.io) is to run your own IPFS node. You can do this by running an IPFS node on your personal computer, but that will only work as long as your computer is running. For users running mostly from laptops or with bandwidth constraints, it is useful to run IPFS nodes in a datacenter, and pinning the content there too. This ensures your content is replicated, online, and available to other nodes on the network. + +VPS instances provided by [Digital Ocean](https://www.digitalocean.com/), [Ramnode](http://ramnode.com/), [Linode](https://www.linode.com/), [Vultr](https://www.vultr.com/) and many other providers allow you to quickly setup your own Linux server with the reliability of a managed dedicated server without the full cost. This is a quick guide to setting up your own dedicated IPFS node on a VPS. We'll be using [Ubuntu](http://www.ubuntu.com/) 14.04LTS 64-bit for the example. + +## Installing IPFS + +First, let's get the packages we'll need to install IPFS: + +```sh +> apt-get update +> apt-get install tar wget +``` + +Now you can download the latest build of IPFS from the [install page](https://ipfs.io/docs/install/). We'll be using Linux x86_64: + +```sh +> wget https://dist.ipfs.io/go-ipfs/v0.4.14/go-ipfs_v0.4.14_linux-amd64.tar.gz +> tar xfv go-ipfs_v0.4.14_linux-amd64.tar.gz +# Move it into your bin. This requires root permissions. +> sudo cp go-ipfs/ipfs /usr/local/bin/ +``` + +It's usually not a good idea to run a public-facing service as root. So we'll create a user account to run IPFS in and switch to it: + +```sh +> adduser ipfs +> su ipfs +``` + +## Adding content to IPFS + + + +First let's initialize the IPFS config: + +```sh +> ipfs init +initializing ipfs node at ~/.ipfs +generating 2048-bit RSA keypair...done +peer identity: QmSyPpT59gXxtnLRZePQBthJd934iy17bmQesgHUAw25pB +to get started, enter: + + ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme +``` + +Note that your peer ID will be different, and that your node init file will be in your default user directory. + +IPFS works by actively seeking nearby nodes to connect to, which is a good thing for performance and availability, particularly in home and office networks. This causes addresses in the networks to be dialed that may not be there. Unfortunately, some VPS providers incorrectly classify this as suspicious activity, and some even have blocked nodes for doing so. To avoid this, let's add two things to the config file: + +```sh +# 1. disable mDNS discovery +ipfs config --json Discovery.MDNS.Enabled false + +# 2. filter out local network addresses +ipfs config --json Swarm.AddrFilters '[ + "/ip4/10.0.0.0/ipcidr/8", + "/ip4/100.64.0.0/ipcidr/10", + "/ip4/169.254.0.0/ipcidr/16", + "/ip4/172.16.0.0/ipcidr/12", + "/ip4/192.0.0.0/ipcidr/24", + "/ip4/192.0.0.0/ipcidr/29", + "/ip4/192.0.0.8/ipcidr/32", + "/ip4/192.0.0.170/ipcidr/32", + "/ip4/192.0.0.171/ipcidr/32", + "/ip4/192.0.2.0/ipcidr/24", + "/ip4/192.168.0.0/ipcidr/16", + "/ip4/198.18.0.0/ipcidr/15", + "/ip4/198.51.100.0/ipcidr/24", + "/ip4/203.0.113.0/ipcidr/24", + "/ip4/240.0.0.0/ipcidr/4" +]' +``` + +Now you're ready to start IPFS! + +```sh +> ipfs daemon & +[1] 16252 +Initializing daemon... +Adjusting current ulimit to 1024. +> Swarm listening on /ip4/127.0.0.1/tcp/4001 +Swarm listening on /ip4/172.20.20.20/tcp/4001 +Swarm listening on /ip4/73.114.34.208/tcp/37131 +Swarm listening on /ip6/::1/tcp/4001 +API server listening on /ip4/127.0.0.1/tcp/5001 +Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 +Daemon is ready +``` + +This will run your daemon in the background, so you won't need to switch to a new window. You can make sure it is running using the `jobs` command. + +Give it a minute to connect to some other IPFS nodes, and then test that it's working by running a quick test: + +```sh +> echo "hello world" | ipfs add +added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +``` + +Now run this command to make sure that your IPFS node had this content locally: + +```sh +> ipfs refs local | grep QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +``` + +To check if your IPFS node has this content pinned, you can run `ipfs pin ls`: + +``` +> ipfs pin ls | grep QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o recursive +``` + +In this example, the hash is returned because `ipfs add` pins a file passed to it by default. If the hash is not returned, then the content will be removed at the next garbage collection. To stop this from happening, let's pin it: + +```sh +> ipfs pin add QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +pinned QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o recursively +``` + +If you want to have IPFS boot at startup, add an entry to `/etc/rc.local`. You can run this command as root to quickly add it: + +```sh +sed -i -e '$i /bin/su ipfs -c "/usr/local/bin/ipfs daemon &"\n' /etc/rc.local +``` + +We also have [init scripts](https://github.com/ipfs/examples/tree/master/examples/init) to help you launch IPFS on start. + +This process will simplify in the future when IPFS starts being packaged with distributions (`apt-get install ipfs`). But until then, this will get you started with IPFS experimentation on your own server. Run `ipfs help` to get a list of things you can do, and let us know if you run into any issues. diff --git a/src/_blog/012-js-ipfs-0-23/README.md b/src/_blog/012-js-ipfs-0-23/README.md new file mode 100644 index 00000000..84f88551 --- /dev/null +++ b/src/_blog/012-js-ipfs-0-23/README.md @@ -0,0 +1,111 @@ +--- +date: 2017-03-24 +url: /23-js-ipfs-0-23/ +title: js-ipfs 0.23.0 released +description: +author: David Dias & Victor Bjelkholm +header_image: js-ipfs-placeholder.png +--- + +Today we're happy to announce that we have released js-ipfs version 0.23.0. + +## Highlights + +- DAG API (IPLD Support) +- Interoperability with go-ipfs +- Bootstrap nodes +- Easier initialization +- Datastore +- New tutorials +- `jsipfs add --wrap-with-directory` feature +- Support for unixfs sharding + +## Installation + +```bash +npm install --save ipfs@0.23.0 +``` + +## Full Details + +### ✨ A new way API is born, welcome to `.dag` + +The new DAG API (available through `ipfs.dag`) offers a new way to create and operate over any MerkleGraph, today it has support for the IPFS MerkleDAG (referenced as dag-cbor), the new dag-cbor (which lets you drop json into IPFS seamlessly) and a preview of Ethereum. + +You can learn how to use it through: + +- [docs](https://github.com/ipfs/interface-ipfs-core/tree/master/API/dag#dag-api) +- [examples](https://github.com/ipfs/js-ipfs/tree/master/examples/dag#create-and-resolve-through-graphs-with-the-dag-api) +- [video running through the demos](https://www.youtube.com/watch?v=drULwJ_ZDRQ) + +If you are new to the Merkle Forest, make sure to watch @jbenet's talk ["Enter the Merkle Forest"](https://www.youtube.com/watch?v=Bqs_LzBjQyk) + +### 🙌🏽 Interoperability with go-ipfs is here! + +This took us more time than what we had initially expected, however, now it is a thing of the past, you can dial to a go-ipfs node and exchange files without going through complicated set ups, it just works™ + +If you would like to know more about the issue we faced, you can find more info here: ["Stream Muxing issues between go-ipfs and js-ipfs are a thing of the past"](https://github.com/ipfs/js-ipfs/issues/721) + +**Note:** Interop is only fully available with go-ipfs 0.4.7 and onwards, if you haven't updated yet, please do so by visiting http://dist.ipfs.io/. + +### 🌍 js-ipfs will now also bootstrap with bootstrap nodes as well + +Same way that go-ipfs does, now your jsipfs daemon will bootstrap itself with the bootstraper nodes. This was easy once we had the Stream Muxing figured out. + +```sh +> jsipfs swarm peers +/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ +/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z +/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM +/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm +/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu +/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64 +/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd +/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 +/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx +``` + +### ⚡️ Starting an IPFS instance is easier than ever + +We've heard you, starting an ipfs instance was cumbersome 3 step process, but not anymore! + +Now, all you need to do to start an instance is: + +```javascript +const IPFS = require('ipfs') +const node = new IPFS() + +node.on('start', () => { + // Your node is now ready to use \o/ +}) +``` + +That's it! See more [Usage examples in the README](https://github.com/ipfs/js-ipfs#ipfs-core-use-ipfs-as-a-module) + +### 💾 Datastore is here! + +We've migrated away from [pull-blob-store](https://github.com/ipfs/interface-pull-blob-store)/[blob-store](https://github.com/maxogden/abstract-blob-store) to [`datastore`](https://github.com/ipfs/interface-datastore), the storage interface that is used in go-ipfs. This was a requirement towards implementing the DHT on js-ipfs. + +### 👩🏽‍🏫 New tutorial! Transfer files between browser and desktop nodes + +We've build a new Tutorial in how to use js-ipfs that explain how to interact with other nodes, from connecting, discovering and exchanging files. The tutorial is the most bare bones possible (i.e no frameworks) so that it focus on IPFS. + +Find this tutorial at our [examples folder](https://github.com/ipfs/js-ipfs/tree/master/examples/transfer-files) + +### 👏🏽 jsipfs add --wrap-with-directory is now a feature! + +Thanks to @harshjv, now you can add files wrapped in a directory just like go-ipfs. Example: + +```sh +> jsipfs add --wrap-with-directory +> jsipfs add There is more than one way to burn a book. And the world is full of people running about with lit matches. +> -- Ray Bradbury, Fahrenheit 451 + +> The Internet treats censorship as a malfunction and routes around it. +> -- John Perry Barlow + +We are happy to announce that **we have published a [snapshot of tr.wikipedia.org, the Turkish version of Wikipedia](https://ipfs.io/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html) on IPFS**. There will be Arabic, Kurdish and English versions coming shortly. This blog post includes information on how you can access those snapshots, how you can help mirror them, and why it's so powerful to put content like this on IPFS. + +The effort to put snapshots of Wikipedia onto IPFS is an independent effort undertaken by the IPFS maintainers. It is not affiliated with the Wikimedia Foundation and is not connected with the volunteers who contribute to Wikipedia articles. + +## What Triggered This Announcement + +At 8am local time on April 29th, Wikipedia went dark for everyone in Turkey. According to the independent watchdog group [Turkey Blocks](https://turkeyblocks.org), the Turkish government has issued a court order that permanently restricts access to the online encyclopedia. + + + + +A main goal of the IPFS Project is improving humanity's access to information. We strongly oppose the censorship of history, of news, of free thought, of discourse, and of compendiums of vital information such as Wikipedia. Free access to information is key to modern human life, to a free society, and to a flourishing culture. We're alarmed by the erosion of civil liberties wherever it occurs, and we want to help people like the citizens of Turkey preserve freedom of information, even in the face of a tightening iron fist. + +Upon hearing the news, we revived an effort to put snapshots of Wikipedia on IPFS, so that people may be able to read it in a decentralized and distributed way. This can help people to at least _view_ all of the Wikipedia content, even if they cannot reach Wikipedia.org itself. + +## Quick Background: IPFS and Content Addressing + +**[IPFS](https://ipfs.io) -- the Inter-Planetary File System** -- is a new internet protocol that makes the web faster, safer, and more open. IPFS changes the _addressing_ of information, moving from _location addressing_ to _content addressing_. You can find out more about IPFS at [the IPFS Website](https://ipfs.io) or by [watching this talk](https://www.youtube.com/watch?v=2RCwZDRwk48). + +_Content addressing_ is a technique to reference files or data by a unique fingerprint derived from the contents of the file or data itself. Content addressing is implemented with [cryptographic hashing](https://simple.wikipedia.org/wiki/Cryptographic_hash_function), so that content addresses are secure, permanent, and derived directly from the content itself. Information systems like IPFS use content addressing to ensure files, websites, and webapps can move around the network and be distributed by any computer securely and with perfect fidelity. This means that the contents of websites like Wikipedia can be moved around and accessed in a peer-to-peer, decentralized way, much like BitTorrent or even email. This works even if access to the specific https://en.wikipedia.org servers is censored. To find out more about content addressing, you can watch [this part of a talk](https://youtu.be/2RCwZDRwk48?t=847) or [this excellent post](https://ipfs.io/ipfs/QmNhFJjGcMPqpuYfxL62VVB9528NXqDNMFXiqN5bgFYiZ1/its-time-for-the-permanent-web.html). + +### Why put Wikipedia on IPFS? + +By putting important information like Wikipedia onto the decentralized web, we open many avenues for people to access, hold, cite, and use that information in more durable ways. This is a quick summary of the ways IPFS makes these things possible. To learn more, visit https://ipfs.io. + +In short, content on IPFS is **harder to attack** and easier to distribute because it’s **peer-to-peer and decentralized**. + +**Even if the original publisher is taken down, the content can be served by anyone who has it.** As long as at least one node on the network has a copy of the content, everyone will be able to get it. This means the responsibility for serving content can change over time without changing the way people link to the content and without any doubt that the content you're reading is exactly the content that was originally published. + +**The content you download is cryptographically verified** to ensure that it hasn’t been tampered with. + +**IPFS can work in partitioned networks** - you don’t need a stable connection to the rest of the web in order to access content through IPFS. As long as your node can connect to at least one node with the content you want, it works! + +**As soon as any node has the content, everyone's links start working.** Even if someone destroys all the copies on the network, it only takes one node adding the content in order to restore availability. + +**If one IPFS gateway gets blocked, you can use another one.** IPFS gateways are all capable of serving the same content, so you’re not stuck relying on one point of failure. + +**Lightening the load**: With IPFS, people viewing the content are also helping distribute the content (unless they opt out) and anyone can choose to pin a copy of some content on their node in order to help with access and preservation. + +**You can read anonymously.** As with HTTP, IPFS can work over Tor and other anonymity systems + +**IPFS does not rely on DNS**. If someone blocks your access to DNS or spoofs DNS in your network, it will not prevent IPFS nodes from resolving content over the peer-to-peer network. Even if you're using the DNSlink feature of IPFS, you just need to find a gateway that _does_ have access to DNS. As long as the gateway you're relying on has access to DNS it will be able to resolve your DNSlink addresses. + +**IPFS does not rely on the Certificate Authority System**, so bad or corrupt Certificate Authorities do not impact it. + +**You can move content via [sneakernet](https://en.wikipedia.org/wiki/Sneakernet)!** _This is very useful in areas with poor connectivity, due to resource limitations, security reasons, or censorship._ Even if your network is physically disconnected from the rest of the internet, you can write content from IPFS onto USB drives or other external drives, physically move them to computers connected to a new network, and re-publish the content on the new network. Even though you're on a separate network, IPFS will let nodes access the content using the same identifiers in both networks as long as at least one node on the network has that content. + +**IPFS nodes work hard to find each other on the network** and to reconnect with each other after connections get cut. + +(experimental) **You can even form private IPFS networks** to share information _only_ with computers you've chosen to connect with. + +## Wikipedia on IPFS -- Background + +### What does it mean to put Wikipedia on IPFS? + +The idea of putting Wikipedia on IPFS has been around for a while. Every few months or so someone revives the threads. You can find such discussions in [this github issue about archiving Wikipedia](https://github.com/ipfs/archives/issues/20), [this issue about possible integrations with Wikipedia](https://github.com/ipfs/notes/issues/46), and [this proposal for a new project](https://github.com/ipfs/notes/issues/47#issuecomment-140587530). + +We have two consecutive goals regarding Wikipedia on IPFS: Our first goal is to create periodic read-only snapshots of Wikipedia. A second goal will be to create a full-fledged read-write version of Wikipedia. This second goal would connect with the Wikimedia Foundation’s bigger, longer-running conversation about decentralizing Wikipedia, which you can read about at https://strategy.m.wikimedia.org/wiki/Proposal:Distributed_Wikipedia + +### (Goal 1) Read-Only Wikipedia on IPFS + +The easy way to get Wikipedia content on IPFS is to periodically -- say every week -- take snapshots of all the content and add it to IPFS. That way the majority of Wikipedia users -- who only read Wikipedia and don’t edit -- could use all the information on Wikipedia with all the benefits of IPFS. Users couldn't edit it, but users could download and archive swaths of articles, or even the whole thing. People could serve it to each other peer-to-peer, reducing the bandwidth load on Wikipedia servers. People could even distribute it to each other in closed, censored, or resource-constrained networks -- with IPFS, peers do not need to be connected to the original source of the content, being connected to anyone who has the content is enough. Effectively, the content can jump from computer to computer in a peer-to-peer way, and avoid having to connect to the content source or even the internet backbone. We've been in discussions with many groups about the potential of this kind of thing, and how it could help billions of people around the world to access information better -- either free of censorship, or circumventing serious bandwidth or latency constraints. + +So far, we have achieved part of this goal: we have static snapshots of all of Wikipedia on IPFS. This is already a huge result that will help people access, keep, archive, cite, and distribute lots of content. In particular, we hope that this distribution helps people in Turkey, who find themselves in a tough situation. We are still working out a process to continue updating these snapshots, we hope to have someone at Wikimedia in the loop as they are the authoritative source of the content. **If you could help with this, please get in touch with us at wikipedia-project@ipfs.io.** + +### (Goal 2) Fully Read-Write Wikipedia on IPFS + +The long term goal is to get the full-fledged read-write Wikipedia to work on top of IPFS. This is much more difficult because for a read-write application like Wikipedia to leverage the distributed nature of IPFS, we need to change the how the applications write data. A read-write Wikipedia on IPFS would allow completely decentralized and extremely difficult to censor operation. In addition to all the benefits of the static version above, the users of a read-write Wikipedia on IPFS could write content from anywhere and publish it, even without being directly connected to any wikipedia.org servers. There would be automatic version control and version history archiving. We could allow people to view, edit, and publish in completely encrypted contexts, which is important to people in highly repressive regions of the world. + +A full read-write version (2) would require a strong collaboration with Wikipedia.org itself, and finishing work on important dynamic content challenges -- we are working on all the technology (2) needs, but it's not ready for prime-time yet. We will update when it is. + +## Wikipedia on IPFS -- The Release Today + +Today, we are releasing the first full static snapshot on IPFS of all of https://tr.wikipedia.org. We describe how to access it and how we did this below. This snapshot was taken on `2017-04-30`. Over the coming days we will also release snapshots of the Arabic (https://ar.wikipedia.org) and Kurdish (https://ku.wikipedia.org) versions of Wikipedia. There's an English snapshot coming too. The English version of Wikipedia is taking longer to load onto IPFS because it's much bigger than the others (20 times larger), with many more links. We will post updates when we add snapshots of each new language. + +The unique identifier (cryptographic hash) for the snapshot of tr.wikipedia.org from April 30th is: + +- Turkish Wikipedia (30 April 2017): [/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html](https://ipfs.io/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html) + +This link points to a specific snapshot. It will always point to that specific day's snapshot. To find the most up-to-date snapshot of Wikipedia on IPFS you can use this IPNS link, which will resolve to the latest snapshot whenever we release a new one: + +- Turkish Wikipedia (most recent snapshot, resolved through IPNS): [/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html](https://ipfs.io/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html) + +### Human-readable links + +For your convenience we have set up a domain name and DNS entry at [tr.wikipedia-on-ipfs.org](http://tr.wikipedia-on-ipfs.org) that will resolve to the current IPFS snapshot. + +If you are not able to access ipfs.io or wikipedia-on-ipfs.org, you can use this dnslink URL to access the content -- simply replace `ipfs.io` with the address of any IPFS gateway: + +- Turkish Wikipedia: [https://ipfs.io/ipns/tr.wikipedia-on-ipfs.org](https://ipfs.io/ipns/tr.wikipedia-on-ipfs.org/wiki/Anasayfa.html) + +Failing that, use the (less readable) IPFS or IPNS links from above. + +## How to access Wikipedia on IPFS + +IPFS makes it possible to access information through many different paths. If one path is closed, you have other options. Some of the options are very simple. Others require a bit more effort. In most cases you can use [this link](https://ipfs.io/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html) to view the Wikipedia snapshot through the ipfs-to-http gateway at ipfs.io. If that path doesn't work, for example if ipfs.io is blocked in your area, you can use the same basic information from that ipfs.io link and access Wikipedia through a different path. + +We've written a number of tutorials describing the many different ways to access content through IPFS, including ways to access IPFS anonymously through Tor. You can read those tutorials in the current draft of [The Decentralized Web Primer](https://dweb-primer.ipfs.io/avenues-for-access/), which is available [online](https://dweb-primer.ipfs.io/avenues-for-access/) or as a [downloadable PDF](https://dweb-primer.ipfs.io/decentralized-web-primer.pdf), [epub](https://dweb-primer.ipfs.io/decentralized-web-primer.epub), or [mobi](https://dweb-primer.ipfs.io/decentralized-web-primer.mobi) + +Your main options for accessing the snapshot of Wikipedia are: _(depending on your network, some of these won't work)_ + +- **Option**: Use the ipfs.io gateway to access the 30 April 2017 snapshot: https://ipfs.io/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html +- **Option**: Use the ipfs.io gateway to access the latest version: https://ipfs.io/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html +- **Option**: Connect with the IPFS network over Tor (this is experimental). Read [this tutorial on Tor gateways](https://dweb-primer.ipfs.io/avenues-for-access/lessons/tor-gateways.html). +- **Option**: Install an IPFS node on your computer and access Wikipedia through that node (requires [using the command line](http://lifehacker.com/5633909/who-needs-a-mouse-learn-to-use-the-command-line-for-almost-anything). _This is the most reliable method because it retrieves the content directly from the IPFS peer-to-peer network)_ + 1. Install IPFS [following these instructions](https://dweb-primer.ipfs.io/install-ipfs/). Use the most recent verison of IPFS: 0.4.9-rc2 or higher if possible. + 2. Start your IPFS node by running `ipfs daemon` so it can connect to the network. + 3. Read the content through your IPFS node's local HTTP gateway by visiting: + - 30 April 2017 snapshot: http://localhost:8080/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html + - latest snapshot: http://localhost:8080/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html + +**Coming soon:** We've almost finished creating a web browser extension that will allow you to access IPFS directly from your web browser without installing any additional external tools. Watch https://github.com/ipfs/in-web-browsers for the announcement when we release that browser extension. + +## How to Mirror Wikipedia on an IPFS Node + +If you want to help make this information available, you can install IPFS on your computer and _"pin"_ the Wikipedia snapshot(s) on that IPFS node. Here are instructions for doing that. + +**Prerequisites**: + +- Requires [using the command line](http://lifehacker.com/5633909/who-needs-a-mouse-learn-to-use-the-command-line-for-almost-anything) +- You need to have enough storage space to hold the snapshot(s) you want to serve. + - Turkish snapshot requires 10 GB + - Turkish, Arabic and Kurdish snapshots combined together will require 25 GB + - English snapshot will require 250 GB +- _If possible, use a machine with a public IP address._ If you want to run an ipfs-to-http gateway that lets people access the IPFS content using their web browswer, you need to ensure that your machine can be reached with a public IP address. + +If you don't have enough storage space to hold full copies of the snapshot(s), you can still run an IPFS gateway so that people can rely on you to retrieve the content from the IPFS network on the fly. + +**Steps**: + +1. Install IPFS [following these instructions](https://dweb-primer.ipfs.io/install-ipfs/). Use the most recent verison of IPFS -- 0.4.9-rc2 or higher if possible. +2. Start your IPFS node by running `ipfs daemon` so it can connect to the network. +3. Pin the snapshot(s) onto your machine + - Pin Turkish Wikipedia: `ipfs pin add QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX` +4. If your machine has a public IP addresses, tell people the address of your gateway. They can use that address to request IPFS content from their web browsers. + +**Alternative: Using a Sneakernet to Mirror data** + +I'm not kidding. If you'd like to access this content via [sneakernet](https://en.wikipedia.org/wiki/Sneakernet), IPFS is just fine with that. To find out how, follow the instructions in [this tutorial](https://dweb-primer.ipfs.io/avenues-for-access/lessons/sneakernets.html) + +## How we made this Wikipedia snapshot + +The steps we followed to create these first snapshots were: + +1. Download the latest snapshot of Wikipedia (in ZIM format) from http://wiki.kiwix.org/wiki/Content_in_all_languages +2. Unpack the ZIM snapshot using https://github.com/dignifiedquire/zim/commit/a283151105ab4c1905d7f5cb56fb8eb2a854ad67 +3. Add mirror info and search bar to the snapshot using the script [here](https://github.com/ipfs/distributed-wikipedia-mirror/blob/master/execute-changes.sh) +4. Add the snapshot to IPFS with the command `ipfs add -w -r --raw-leaves $upacked_wiki` + +This work was primarily done by [@Kubuxu](https://github.com/kubuxu) [@dignifiedquire](https://github.com/dignifiedquire) and [@lgierth](https://github.com/lgierth) with help from [@whyrusleeping](https://github.com/whyrusleeping). They used code originally written by [@eminence](https://github.com/eminence) + +## How to add new Wikipedia snapshots to IPFS + +If you would like to repeat this process, adding an updated Wikipedia snapshot on IPFS, you can follow the instructions at https://github.com/ipfs/distributed-wikipedia-mirror. We will keep that page up to date as we improve the process. + +## How we will publish the hashes of new snapshots + +Whenever we add an updated snapshot of Wikipedia to IPFS, we will announce it in a few ways. + +1. We will tweet the new snapshot hash on the [@ipfsbot](https://twitter.com/ipfsbot) account along with the hashtag [#WikipediaOnIPFS](https://twitter.com/search?f=tweets&q=WikipediaOnIPFS) +2. We will update this IPNS entry to point to the latest snapshot: + - Turkish Wikipedia: [/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html](https://ipfs.io/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html) + +The DNS entry at [tr.wikipedia-on-ipfs.org](https://tr.wikipedia-on-ipfs.org) is mapped to the IPNS value, so it will also give you the latest available snapshot (if DNS and IPNS are working properly in your area). + +## Who controls the information + +At the moment this is an experiment, done in haste in response to current events. Employees of Protocol Labs are building the Wikipedia snapshots on IPFS and pinning that content onto some of the IPFS nodes that they run. + +If people start relying on this information over time, it will be important to establish a clear chain of custody, ideally with people at Wikimedia foundation building the snapshots and publishing the hashes. Protocol Labs is exploring possibilities in this direction. + +## Review + +- You can access a snapshot of Wikipedia through any IPFS gateway + - Turkish Wikipedia (30 April 2017 snapshot): [/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html](https://ipfs.io/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html) +- These are read-only snapshots. Supporting full read-and-write would take further work. +- IPFS links use cryptographic hashes, so you don’t have to worry about spoofing +- The IPNS hashes point to the most recent snapshot + - Turkish Wikipedia (most recent snapshot): [/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html](https://ipfs.io/ipns/QmVH1VzGBydSfmNG7rmdDjAeBZ71UVeEahVbNpFQtwZK8W/wiki/Anasayfa.html) +- If people start relying on this information, we will encourage Wikimedia to take over generating these snapshots +- We are encouraging Wikimedia to publish their own IPNS hash that is always up to date AND is cryptographically signed by Wikimedia +- (if wikimedia updates DNS) if you have access to a gateway that’s outside of Turkey, you will be able to use the convenient path [/ipns/wikipedia.org](https://ipfs.io/ipns/wikipedia.org) instead of using hashes in your IPFS links +- If you want to mirror the data, run an ipfs node and pin the Wikipedia data onto your node diff --git a/src/_blog/014-pubsub/README.md b/src/_blog/014-pubsub/README.md new file mode 100644 index 00000000..00e40e86 --- /dev/null +++ b/src/_blog/014-pubsub/README.md @@ -0,0 +1,126 @@ +--- +date: 2017-05-17 +url: /25-pubsub/ +title: Take a look at pubsub on IPFS +description: +author: Jeromy Johnson +--- + +We recently merged a simple, experimental pubsub implementation into IPFS. This +implementation is just a beginning. It is far from the performance and security goals +we will achieve in our long-term target. However, even this early implementation opens +the doors to several useful and interesting new applications. + +In this post, I will point out some applications of this technology, show how to +get started started using `ipfs pubsub`, and discuss upcoming improvements. + +## Why pubsub? + +[Publish-Subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern), +called 'pubsub' for short, is a pattern often used to handle events in +large-scale networks. 'Publishers' send messages classified by topic or content and +'subscribers' receive only the messages they are interested in, all without direct +connections between publishers and subscribers. This approach offers much greater +network scalability and flexibility. + +Some applications include collaborative document editing, "dynamic" website +content, chat applications, multiplayer games, continuously evolving datasets, +and webservice workers passing around messages. It gives us ways to make IPFS fast +for large-scale networks such as datacenters, local area networks, and large p2p +applications. In the near future, IPNS records will be pushed over pubsub, allowing +lightning fast updates of peers' IPNS entries. Peers could use pubsub to track the +head of a [merkle-linked global log](https://en.wikipedia.org/wiki/Blockchain). + +## Getting started with pubsub for go-ipfs + +_Note: There is also a js-ipfs implementation of pubsub. Documentation will come soon._ + +First, you'll need to enable the pubsub code. Make sure you're running go-ipfs 0.4.5 or +above. Once you have that version of ipfs installed, start the daemon with: + +```sh +> ipfs daemon --enable-pubsub-experiment +``` + +This will tell ipfs to create and enable the pubsub service. It also implies +that you will only be able to use pubsub with other peers who choose to enable +it. + +To subscribe to the topic `foo`, run: + +```sh +> ipfs pubsub sub foo +``` + +Now, any messages for the topic `foo` will print to your console. + +To publish a message to the topic `foo`, open up another terminal and run: + +```sh +> ipfs pubsub pub foo "hello world" +``` + +You should see "hello world" printed out in the first terminal. You can also +run the `pub` command on any other connected ipfs node and your node will +receive the message. Messages are routed through connected, subscribed peers. +This means that if peers A, B, and C are all subscribed to `foo`, A is connected +to B, and B is connected to C, but A is not directly connected to C, A will +still receive messages that C published to `foo` through B. This can be very +useful for routing messages in networks with poor NAT traversal or otherwise +suboptimal connectivity. + +To see all peers with pubsub enabled, check the output of: + +```sh +> ipfs pubsub peers +``` + +To see all the topics you are currently subscribed to, run: + +```sh +> ipfs pubsub ls +``` + +## Pubsub in the wild + +As an example, we have integrated pubsub into [Orbit](https://github.com/orbitdb/orbit). +This allows Orbit to provide a fully distributed, peer-to-peer chat without _any_ +server anywhere. We are also actively working to put Conflict-Free Replicated Data +Types (CRDTs) on IPFS pubsub using libraries like Y.js and swarm.js. + +Together, pubsub and CRDTs open new doors for collaborative editing of distributed +content. We are working with [@edsilv](https://github.com/edsilv) and +[@aeschylus](https://github.com/aeschylus) to prepare a demo of IPFS in two +[IIIF](http://iiif.io/about/) image viewers +[#240](https://github.com/ipfs/notes/issues/240). This will showcase how to +collaboratively annotate images from repositories dispersed around the world. +The demo will take place at the [IIIF 2017 Conference](https://2017iiifconferencethevatican.sched.com/event/AChW/presentation-interoperable-peer-to-peer-research-with-iiif-and-ipfs-room-5.0) in The Vatican. +We will publish a video of the demo, along with all of the code. + +## What's next? + +The next two areas of focus for IPFS pubsub are authentication and message routing. + +Currently, any peer can publish to any pubsub topic. We plan to implement an +authenticated mode for pubsub topics, where only authorized peers — those given a +cryptographic key or capability — can publish messages. We are still working out +the sharing and capability granting model. + +After that, we plan to improve message routing. The current routing algorithm +floods messages to every subscriber, resulting in some peers receiving the same +message multiple times. We affectionately call this approach "floodsub". We plan +to replace it with a more efficient routing algorithm, which will go a long way +towards reducing overhead and improving scalability. + +Please note that this is a simple first-blush implementation of the technology. +It has known limitations that we will address in future iterations. As it is +today, the pubsub implementation can be quite bandwidth intensive. It works well +for apps with few peers in the group, but does not scale. We have designed a more +robust underlying algorithm that will scale to much larger use cases but we wanted +to ship this simple implementation so you can begin using it for your applications. + +## Enjoy! + +All that said, we hope you give `ipfs pubsub` a try. You can head over to the +[Discussion Forum](https://discuss.ipfs.io/categories) to ask questions, get help, +or simply let us know how it goes. diff --git a/src/_blog/015-js-ipfs-0-24/README.md b/src/_blog/015-js-ipfs-0-24/README.md new file mode 100644 index 00000000..57fe2606 --- /dev/null +++ b/src/_blog/015-js-ipfs-0-24/README.md @@ -0,0 +1,64 @@ +--- +date: 2017-05-25 +url: /26-js-ipfs-0-24/ +title: js-ipfs 0.24.0 released +description: +author: David Dias +header_image: js-ipfs-placeholder.png +--- + +I am pleased to announce to everyone in our community that js-ipfs 0.24.0 has been successfully launched! This new minor release brings new features, bug fixes and new examples so that you can jump in and start hacking your IPFS enabled apps right away! + + + + +# Highlights + +### 👢 WebSockets DNS Bootstrappers by default on the browser + +With this release, you won’t need to connect to Bootstrapper nodes manually, they will dialed from the start through their WebSockets endpoints. This also means that we’ve successfully deployed DNS support for multiaddrs, so that you can host your js-ipfs enabled app behind an HTTPS domain and dial to the Bootstrappers through WSS. + +### 🎈WebRTC is now a default transport + +We now include WebRTC multiaddr by default on new js-ipfs init calls. This means that both your Node.js and Browser nodes will be able to dial each other using WebRTC and discover other nodes in the network through signalling Peer Discovery. + +Caveat for Linux/Windows users: Due to limited support of Node.js wrtc module, you will have to set an environment variable or an Experimental flag. Instructions are in the [README](https://github.com/ipfs/js-ipfs#advanced-options-when-creating-an-ipfs-node) to learn how to do so. + +### 🗺 1st Phase of DHT Implementation Complete + +We now have a working DHT implementation, which means that js-libp2p and js-ipfs are now capable of Peer Routing and Content Routing. This feature should be treated as experimental for the time being, and is behind a [feature flag](https://github.com/ipfs/js-ipfs#advanced-options-when-creating-an-ipfs-node) until a few remaining interoperability issues are cleared out. + +### 🕸 WebWorker and ServiceWorker Support + +Now you can run js-ipfs in a WebWorker or a ServiceWorker without encountering any stoppers. We also added a rule to our tests to be run inside a WebWorker to ensure that this feature stays intact. + +We've recorded a live demo of a Service Worker with js-ipfs running during IPFS All Hands on May 22. You can see this recording and many others on the IPFS Youtube video channel. You can find the code for this demo at [ipfs-service-worker](https://github.com/ipfs/ipfs-service-worker). + + + +### 📶 Better reconnect handling with WebRTC Transport + +You can now switch off your wifi or close your laptop and your js-ipfs node will be able to recover any lost connections graciously. + +### 💅🏽 Refreshed libp2p API + +As a byproduct of shipping new features in js-ipfs, js-libp2p got a refreshed API, documentation and examples. Please do check them out and try libp2p at [js-libp2p](https://github.com/libp2p/js-libp2p) + +### 📦 Updated Packages table + +Always wondered of how many pieces IPFS is built with? Check the updated Packages table at -- https://github.com/ipfs/js-ipfs#packages. + +A **big thank you** goes for everyone who helped make this release possible! We really appreciate all the code contributions, reviews and testing we get from you ❤️. + +# Want to get started using js-ipfs today? + +We've been building a [series of examples](https://github.com/ipfs/js-ipfs/tree/master/examples) to help everyone get started using js-ipfs. With this release, these examples got even simpler, requiring less configuration. Go to [js-ipfs github repo and check the examples folder](https://github.com/ipfs/js-ipfs/tree/master/examples), containing: + +- [How to start a node and add a file to IPFS](https://github.com/ipfs/js-ipfs/tree/master/examples/basics) +- [Learn how to transfer files between nodes over multiple transports](https://github.com/ipfs/js-ipfs/tree/master/examples/transfer-files) +- [Learn how to manipulate IPLD Graphs with the DAG API](https://github.com/ipfs/js-ipfs/tree/master/examples/dag) +- [Wanna try resolving Eth blocks on IPFS?](https://github.com/ipfs/js-ipfs/tree/master/examples/explore-ethereum) + +If you run into any hurdles, please open an issue on [ipfs/js-ipfs/issues](https://github.com/ipfs/js-ipfs/issues). + +Thank you for your attention, I bid you a good day! diff --git a/src/_blog/016-go-ipfs-0-4-10/README.md b/src/_blog/016-go-ipfs-0-4-10/README.md new file mode 100644 index 00000000..8d8b29d4 --- /dev/null +++ b/src/_blog/016-go-ipfs-0-4-10/README.md @@ -0,0 +1,86 @@ +--- +date: 2017-06-28 +url: /27-go-ipfs-0-4-10/ +title: go-ipfs 0.4.10 released +description: +author: Jeromy Johnson +--- + +Yesterday was the [3rd birthday of go-ipfs](https://github.com/ipfs/go-ipfs/commit/9d0e6a7ffb5deea2c8c8e555d7bf6bcab6fdc6ac). +To celebrate, we would like to share some virtual cake 🎂 with ipfs users and +contributors from all over the world, and also announce the release of +go-ipfs 0.4.10. + +go-ipfs 0.4.10 is a patch release that contains several exciting new features, +bugfixes and general improvements. This includes new commands, easier corruption +recovery, and a generally cleaner codebase. + +The `ipfs pin` command has two new subcommands, `verify` and `update`. `ipfs pin verify` is used to scan the repo for pinned object graphs and check their +integrity. Any issues are reported back with helpful error text to make error +recovery simpler. This subcommand was added to help recover from datastore +corruptions, particularly if using the experimental filestore and accidentally +deleting tracked files. + +`ipfs pin update` was added to make the task of keeping a large, frequently +changing object graph pinned. Previously users had to call `ipfs pin rm` on the +old pin, and `ipfs pin add` on the new one. The 'new' `ipfs pin add` call would +be very expensive as it would need to verify the entirety of the graph again. +The `ipfs pin update` command takes shortcuts, portions of the graph that were +covered under the old pin are assumed to be fine, and the command skips +checking them. + +Next up, we have finally implemented an `ipfs shutdown` command so users can +shut down their ipfs daemons via the API. This is especially useful on +platforms that make it difficult to control processes (Android, for example), +and is also useful when needing to shut down a node remotely and you do not +have access to the machine itself. + +`ipfs add` has gained a new flag; the `--hash` flag allows you to select which +hash function to use and we have given it the ability to select `blake2b-256`. +This pushes us one step closer to shifting over to using blake2b as the +default. Blake2b is significantly faster than sha2-256, and also is conjectured +to provide superior security. + +We have also finally implemented a very early (and experimental) `ipfs p2p`. +This command and its subcommands will allow you to open up arbitrary streams to +other ipfs peers through libp2p. The interfaces are a little bit clunky right +now, but shouldn't get in the way of anyone wanting to try building a fully +peer to peer application on top of go-ipfs and libp2p. For more info on this +command, to ask questions, or to provide feedback, head over to the [feedback +issue](https://github.com/ipfs/go-ipfs/issues/3994) for the command. + +A few other subcommands and flags were added around the API, as well as many +other requested improvements. See below for the full list of changes. + +- Features + - Add support for specifying the hash function in `ipfs add` ([ipfs/go-ipfs#3919](https://github.com/ipfs/go-ipfs/pull/3919)) + - Implement `ipfs key {rm, rename}` ([ipfs/go-ipfs#3892](https://github.com/ipfs/go-ipfs/pull/3892)) + - Implement `ipfs shutdown` command ([ipfs/go-ipfs#3884](https://github.com/ipfs/go-ipfs/pull/3884)) + - Implement `ipfs pin update` ([ipfs/go-ipfs#3846](https://github.com/ipfs/go-ipfs/pull/3846)) + - Implement `ipfs pin verify` ([ipfs/go-ipfs#3843](https://github.com/ipfs/go-ipfs/pull/3843)) + - Implemented experimental p2p commands ([ipfs/go-ipfs#3943](https://github.com/ipfs/go-ipfs/pull/3943)) +- Improvements + - Add MaxStorage field to output of "repo stat" ([ipfs/go-ipfs#3915](https://github.com/ipfs/go-ipfs/pull/3915)) + - Add Suborigin header to gateway responses ([ipfs/go-ipfs#3914](https://github.com/ipfs/go-ipfs/pull/3914)) + - Add "--file-order" option to "filestore ls" and "verify" ([ipfs/go-ipfs#3938](https://github.com/ipfs/go-ipfs/pull/3938)) + - Allow selecting ipns keys by Peer ID ([ipfs/go-ipfs#3882](https://github.com/ipfs/go-ipfs/pull/3882)) + - Don't redirect to trailing slash in gateway for `go get` ([ipfs/go-ipfs#3963](https://github.com/ipfs/go-ipfs/pull/3963)) + - Add 'ipfs dht findprovs --num-providers' to allow choosing number of providers to find ([ipfs/go-ipfs#3966](https://github.com/ipfs/go-ipfs/pull/3966)) + - Make sure all keystore keys get republished ([ipfs/go-ipfs#3951](https://github.com/ipfs/go-ipfs/pull/3951)) +- Documentation + - Adding documentation on PubSub encodedings ([ipfs/go-ipfs#3909](https://github.com/ipfs/go-ipfs/pull/3909)) + - Change 'neccessary' to 'necessary' ([ipfs/go-ipfs#3941](https://github.com/ipfs/go-ipfs/pull/3941)) + - README.md: add Nix to the linux package managers ([ipfs/go-ipfs#3939](https://github.com/ipfs/go-ipfs/pull/3939)) + - More verbose errors in filestore ([ipfs/go-ipfs#3964](https://github.com/ipfs/go-ipfs/pull/3964)) +- Bugfixes + - Fix typo in message when file size check fails ([ipfs/go-ipfs#3895](https://github.com/ipfs/go-ipfs/pull/3895)) + - Clean up bitswap ledgers when disconnecting ([ipfs/go-ipfs#3437](https://github.com/ipfs/go-ipfs/pull/3437)) + - Make odds of 'process added after close' panic less likely ([ipfs/go-ipfs#3940](https://github.com/ipfs/go-ipfs/pull/3940)) +- General Changes and Refactorings + + - Remove 'ipfs diag net' from codebase ([ipfs/go-ipfs#3916](https://github.com/ipfs/go-ipfs/pull/3916)) + - Update to dht code with provide announce option ([ipfs/go-ipfs#3928](https://github.com/ipfs/go-ipfs/pull/3928)) + - Apply the megacheck code vetting tool ([ipfs/go-ipfs#3949](https://github.com/ipfs/go-ipfs/pull/3949)) + - Expose port 8081 in docker container for /ws listener ([ipfs/go-ipfs#3954](https://github.com/ipfs/go-ipfs/pull/3954)) + + If you have questions or run into any issues, please post in the IPFS Discussion and Support Forum's [go-ipfs 0.4.10 release thread](https://discuss.ipfs.io/t/ipfs-0-4-10-release/687). For bugs, please open an issue in [ipfs/go-ipfs/issues](https://github.com/ipfs/go-ipfs/issues). diff --git a/src/_blog/017-js-ipfs-0.25/README.md b/src/_blog/017-js-ipfs-0.25/README.md new file mode 100644 index 00000000..367e87a9 --- /dev/null +++ b/src/_blog/017-js-ipfs-0.25/README.md @@ -0,0 +1,48 @@ +--- +date: 2017-07-12 +url: /28-js-ipfs-0-25/ +title: js-ipfs 0.25.0 released +description: +author: David Dias +header_image: js-ipfs-placeholder.png +--- + +Today, we've released js-ipfs 0.25.0. This release is mostly maintenance, bug fixing and bringing some of the internal components up to their latest versions. + + + + +# 🔦 Highlights + +### 🏮 ipfs-repo is now 🐲 free + +The IPFS Repo Class went through [some careful refactoring](https://github.com/ipfs/js-ipfs-repo/pull/140). Now it is easier to understand its internals and to support different backend storage adapters. + +To create a js-ipfs node with your own custom repo, you can now: + +```JavaScript +const node = new IPFS({repo: }) +``` + +If you are curious, you can learn about what are the default storage adapters in the IPFS Repo itself, namely: + +- Node.js - https://github.com/ipfs/js-ipfs-repo/blob/master/src/default-options.js +- Browser - https://github.com/ipfs/js-ipfs-repo/blob/master/src/default-options-browser.js + +### ⬢ libp2p is now used directly and the bundles live inside the js-ipfs repo + +The JavaScript implementation of libp2p received a lot of love recently, including the addition of Tutorials. You can consult all the details on the Log entry of libp2p's Captain.log - https://github.com/libp2p/js-libp2p/issues/6#issuecomment-313970615 + +### 🏎 SPDY is out of the mix and there goes browserify-zlib special shimming. + +SPDY has been removed from the default browser bundle in favor of supporting `libp2p-multiplex` only. SPDY was the Stream Muxer of js-ipfs since almost the beginning, but since go-ipfs never got a complete implementation of SPDY, we ended up switching to `libp2p-multiplex` to guarantee interop between implementations. What this means is that you will continue to see the interop, but now your browser bundle will be significantly lighter. + +### 📞 wrtc, the WebRTC module for Node.js is now optional + +`wrtc`, a module that enables js-ipfs Node.js nodes to speak WebRTC, has been excluded from the default list of modules so that Linux users can have a better time when using js-ipfs natively. You can still bring it back and now not only use `wrtc` but you can also use `electron-webrtc`, the other WebRTC module for Node.js See how to achieve that in the project's README - https://github.com/ipfs/js-ipfs#advanced-options-when-creating-an-ipfs-node. + +Note, this doesn't change the behavior in the browser. Browser nodes will still continue to use WebRTC by default. + +If you run into any hurdles, please open an issue on [ipfs/js-ipfs/issues](https://github.com/ipfs/js-ipfs). + +Thank you for your attention, I bid you a good day! diff --git a/src/_blog/018-js-ipfs-pubsub/README.md b/src/_blog/018-js-ipfs-pubsub/README.md new file mode 100644 index 00000000..e0799990 --- /dev/null +++ b/src/_blog/018-js-ipfs-pubsub/README.md @@ -0,0 +1,72 @@ +--- +date: 2017-07-29 +url: /29-js-ipfs-pubsub/ +title: Distributed pubsub primitives for js-ipfs in the Browser +description: +author: Pedro Teixeira +--- + +IPFS pubsub was first introduced in September 2016 behind an experimental flag. This initial implementation allowed [orbit](https://orbit.chat/), a chat application built on top of IPFS, to become fully distributed. [@haadcode](https://github.com/haadcode) presented that work at [DEVCON2](https://www.youtube.com/watch?v=vQrbxyDPSXg). Later, [the IPFS team announced that pubsub ](https://ipfs.io/blog/25-pubsub) was ready for the whole community to use. + +In this post I'll show you how to use pubsub with the [JavaScript implementation of IPFS](https://github.com/ipfs/js-ipfs). I start by using the pubsub primitives available in `js-ipfs` and end with a new module [plus video tutorial](https://youtu.be/Nv_Teb--1zg) of how to use it. Make sure to read to the end! + +## Using pubsub on js-ipfs + +IPFS is not just a filesystem. It's a complete stack for decentralized applications. With pubsub, an IPFS node can show interest in a topic (a string representing a pubsub channel) and is able to listen and send messages on that topic in a way that is decentralized -- it does not rely on any mediating server or special node. + +With [js-ipfs](https://github.com/ipfs/js-ipfs), this code works today in any modern browser. By instantiating an IPFS node in JavaScript and activating the pubsub feature, you can send and receive messages between nodes. + +Here we include the [js-ipfs](https://github.com/ipfs/js-ipfs) library (which you need to have previously installed) and created an IPFS that has the experimental pubsub feature enabled: + +```js +const IPFS = require('ipfs') + +// create IPFS node +const ipfs = new IPFS({ + EXPERIMENTAL: { + pubsub: true, // required, enables pubsub + }, +}) + +ipfs.once('ready', () => { + // node is ready +}) +``` + +Now we're ready to receive messages on a topic: + +```js +ipfs.pubsub.subscribe('topic-name-here', (message) => { + console.log('got message from ' + message.from) + + // data is a buffer. Here we're converting it into a string + + const data = message.data.toString() + console.log('containing data: ' + data) +}) +``` + +And we can also send messages: + +```js +// data should be a buffer +const data = Buffer.from('some message content here') + +ipfs.pubsub.publish('topic-name-here', data, (err) => { + if (err) { + console.error('error publishing: ', err) + } else { + console.log('successfully published message') + } +}) +``` + +Even though [the js-IPFS pubsub API](https://github.com/ipfs/interface-ipfs-core/tree/master/API/pubsub#pubsub-api) is very simple to use, you will need some additional functionality for most uses. If you want to be able to deal with strings, send private messages to a specific peer and be notified of subscription changes (nodes that are interested in the topic), take a look at the `ipfs-pubsub-room` package. + +# Enter `ipfs-pubsub-room` + +[`ipfs-pubsub-room`](https://github.com/ipfs-shipyard/ipfs-pubsub-room) is a room-oriented take on the pubsub API for IPFS. It's being built in the [`ipfs-shipyard`](https://github.com/ipfs-shipyard). See the full tutorial below: + + + +Happy decentralized messaging! 🎉 diff --git a/src/_blog/019-js-ipfs-crdts/README.md b/src/_blog/019-js-ipfs-crdts/README.md new file mode 100644 index 00000000..0896958f --- /dev/null +++ b/src/_blog/019-js-ipfs-crdts/README.md @@ -0,0 +1,37 @@ +--- +date: 2017-08-01 +url: /30-js-ipfs-crdts/ +title: Decentralized Real-Time Collaborative Documents - Conflict-free editing in the browser using js-ipfs and CRDTs +description: +author: Pedro Teixeira +--- + +With the introduction of [IPFS PubSub](https://ipfs.io/blog/25-pubsub/), it became possible for IPFS nodes to declare shared _pubsub_ topics, broadcasting updates in real-time to other nodes in the network that have subscribed to the topic. The pubsub pattern is a powerful construct but it does not guarantee delivery of messages and does not guarantee message order. Enter [CRDTs, Conflict-Free Replicated Data Types](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type), a higher level data structure that allows us to overcome these shortcomings. + +## Enter CRDTs, Conflict-Free Replicated Data Types + +CRDTs are one of the hot interesting topics in distributed systems. They provide a conflict-free manner of replicating data across multiple nodes without ever having to elect a leader or use another type of centralized authority to reach consensus. They even allow nodes to reach the same state without being connected to the network at the same time. + +[CRDTs were first introduced in 2011](https://link.springer.com/chapter/10.1007%2F978-3-642-24550-3_29) by Carlos Baquero, Nuno Preguiça, Marek Zawirski and Marc Shapiro. You can learn more about CRDTs in the [IPFS research collaborative notebook on CRDTs](https://github.com/ipfs/research-CRDT). + +By forming ad-hoc sets of nodes (ie. using pubsub) and using CRDTs, nodes can come in and out of a cluster and participate in a higher level protocol. + +## Use case: Collaborative Text Editor + +One set of use cases for CRDTs is when nodes need to collaboratively write to a shared data structure. In the past, this has been achieved by relying on a centralized service to coordinate updates. This centralized approach encourages the wordlwide web to grow in a way that relies on a few private entities to control the the content and delivery of the web. This is neither safe nor scalable. We must move away from centralized services, instead relying on truly distributed peer-to-peer systems that are not controlled by a single entity. + +In [this 10-minute video](https://www.youtube.com/watch?v=-kdx8rJd8rQ) I show you how we can use the [js-ipfs](https://github.com/ipfs/js-ipfs) library and conflict-free replicated data types (CRDTs) to build a simple text editor that allows several peers to collaborate in real-time. The resulting interactions between the nodes are conflict-free, support offline use, and allow nodes to come in and out of the network while continuously converging data to a single state in all the nodes. + +[![https://www.youtube.com/watch?v=-kdx8rJd8rQ](https://user-images.githubusercontent.com/1211152/28122513-4cbdaabc-6716-11e7-8626-ad8154687fe1.png)](https://www.youtube.com/watch?v=-kdx8rJd8rQ) + +## Final remarks + +Real-time collaborative applications are in their infancy but in the future they will be the norm. Achieving this will be a huge challenge since, in reality, the majority of the devices on the internet are poorly connected, relying on (often mobile) networks that offer little to no reliability. + +Any node should be able to perform changes in a shared data structure even if the underlying network is not reliable. The system should be able to converge these changes into all participating nodes. Nodes should be able to enter and leave the network (either by their own will or because of network conditions) while the system ensures that this does not lead to losing data or threatening convergence. + +What protocols and data structures will allow participating users and their nodes to form ad-hoc networks for spontaneous or planned real-time collaboration without any centralized coordination? + +Peer-to-peer networks can rely on special replicated data types that are distributed and conflict-free, and were built specially for these scenarios. + +If you're interested in this subject and / or would like to learn more, I invite you [to join the conversation in the research-CRDT repository](https://github.com/ipfs/research-CRDT), poke around in the available articles and lectures and contribute. diff --git a/src/_blog/020-js-ipfs-0.26/README.md b/src/_blog/020-js-ipfs-0.26/README.md new file mode 100644 index 00000000..908f91d3 --- /dev/null +++ b/src/_blog/020-js-ipfs-0.26/README.md @@ -0,0 +1,129 @@ +--- +date: 2017-09-13 +url: /30-js-ipfs-0-26/ +title: js-ipfs 0.26.0 released +description: +author: David Dias +header_image: js-ipfs-placeholder.png +--- + +Today, we've released js-ipfs 0.26.0. This release brings bug fixes, performance improvements, git support, http gateway and more! + + + + +# 🔦 Highlights + +Here are some of the highlights for this new js-ipfs release. There were plenty more bug fixes, tiny performance improvements, doc improvements and others all across the js-ipfs module ecosystem. A really BIG THANK YOU to everyone that has been contributing with code, tests, examples and also bug reports! They help us identify situations that we miss without tests. + +### New InterPlanetary Infrastructure + +You might have noticed some hiccups a couple of weeks ago. That was due to a revamp and improvement in our infrastructure that separated Bootstraper nodes from Gateway nodes. We've now fixed that by ensuring that a js-ipfs node connects to all of them. More nodes on https://github.com/ipfs/js-ipfs/issues/973 and https://github.com/ipfs/js-ipfs/pull/975. Thanks @lgierth for improving IPFS infra and for setting up all of those DNS websockets endpoints for js-ipfs to connect to :) + +### Now js-ipfs packs the IPFS Gateway as well + +You read it right! Now, js-ipfs packs the IPFS Gateway and launches it when you boot a daemon (`jsipfs daemon`). With this, you can use js-ipfs to access content in the browser just like you use to do in go-ipfs or use js-ipfs as a complete solution to add content in the network and preview it without leaving JS land. It is great for tooling. This was an [awesome contribution from @ya7ya and @harshjv](https://github.com/ipfs/js-ipfs/pull/968) who spent a lot of time adjusting and iterating on the implementation to make sure it would fit with the structure of js-ipfs, 👏🏽👏🏽👏🏽👏🏽. + +### Huge performance and memory improvement + +With reports such as https://github.com/ipfs/js-ipfs/issues/952, we started investigating what were the actual culprits for such memory waste that would lead the browser to crash. It turns out that there were two and we got one fixed. The two were: + +- browserify-aes - @dignifiedquire identified that there were a lot of Buffers being allocated in browserify-aes, the AES shim we use in the browser (this was only a issue in the browser) and promptly came with a fix https://github.com/crypto-browserify/browserify-aes/pull/48 👏🏽👏🏽👏🏽👏🏽 +- WebRTC - WebRTC is really cpu+mem hungry and our combination of opening multiple connections without limits + the constant switch between transport and routing at the main thread, leads to some undesirable situations where the browser simply crashes for so much thrashing. We are actively working on this with [Connection Closing](https://github.com/ipfs/js-ipfs/issues/962). + +That said, situations such as https://github.com/ipfs/js-ipfs/issues/952 are now fixed. Happy file browser sharing! :) + +### Now `git` is also one of the IPLD supported formats by js-ipfs + +Now js-ipfs supports [ipld-git](https://github.com/ipld/js-ipld-git)! This is huge, it means that you can traverse through git objects using the same DAG API that you use for Ethereum, dag-pb and dag-cbor. This feature came in with an [example, go check out how to traverse a git repo](https://github.com/ipfs/js-ipfs/tree/master/examples/traverse-ipld-graphs). 👏🏽👏🏽 to @magik6k for shipping this in record time. + +### The libp2p-webrtc-star multiaddrs have been fixed + +@diasdavid (me) and @lgierth had a [good convo and reviewed a bunch of stuff over Coffee ☕️, it was great!](https://github.com/ipfs/pm/blob/master/meeting-notes/2017-08-30--coffee-lars-david.md). During that chat, we figured that `libp2p-webrtc-star` multiaddrs have been implemented incorrectly and figured out the migration path to the correct version. + +You can learn more what this endeavour involved here https://github.com/ipfs/js-ipfs/issues/981. Essentially, there are no more `/libp2p-webrtc-star/dns4/star-signal.cloud.ipfs.team/wss`, instead we use `/dns4/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star` which signals the proper encapsulation you expect from a multiaddr. + +### New example showing how to stream video using hls.js + +@moshisushi developed a video streamer on top of js-ipfs and shared an example with us. You can now find that example as part of the examples set in this repo. Check https://github.com/ipfs/js-ipfs/tree/master/examples/browser-video-streaming, it is super cool 👏🏽👏🏽👏🏽👏🏽. + +> HLS (Apple's HTTP Live Streaming) is one of the several protocols currently available for adaptive bitrate streaming. + +### webcrypto-ossl was removed from the dependency tree + +We've purged webcrypto-ossl from the dependency tree. It was only used to generate RSA keys faster (significantly faster) but at the same time, it caused a lot of hurdles to being a native dependency. + +There is an [open issue on the Node.js project to expose the RSA key generation primitive](https://github.com/nodejs/node/issues/15116), if you have a use case for it please do share it in that thread. This would enable js-ipfs to use the native crypto module, have the same (or better) perf of webcrypto-ossl and not have to deal with an external native dependency. + +### PubSub tutorial published + +@pgte published an amazing tutorial on how to use PubSub with js-ipfs and in the browser! Read it on the [IPFS Blog https://ipfs.io/blog/29-js-ipfs-pubsub/](https://ipfs.io/blog/29-js-ipfs-pubsub/). + +# 🌱 Future + +We have so much stuff in the pipeline. Some of it almost got into this release but we eventually decided to defer it to a next release and make sure everyone would have access to the goodies in the _highlights_ section. That said, expect the following and more to come in a future release. + +### Circuit Relay + +Circuit Relay is almost here. @dryajov showed us a demo of it working on the last IPFS All Hands and you can watch it on the uploaded recording in YouTube https://youtu.be/chAXj_vsR2s?t=25m01s. Since then, @dryajov @stebalian and @vyzo have been working on making sure interop is fully tested. + +Follow the development on the _Awesome Endeavour PR_ - https://github.com/ipfs/js-ipfs/pull/830 + +### Delegated Routing + +One of the results from the [Coffee Chat ☕️](https://github.com/ipfs/pm/blob/master/meeting-notes/2017-08-30--coffee-lars-david.md) was the decision to move forward with Delegated Routing. This was a long one coming and one that will enable js-ipfs nodes to leverage the already established presence of bootstrapers and gateway to find the Peers that have the content on the network, saving time and resources. Track the dev here https://github.com/libp2p/js-libp2p/issues/120 + +### Expanded top level API for Streaming Calls + +We will expose a pull-streams interface to js-ipfs in the next minor version (0.27). pull-streams are light and more performance than Node.js streams giving users a considerable perf boost (example: https://github.com/ipfs/js-ipfs/pull/988). + +We will keep the Node.js Streams (Readable Stream) interface as well. Track dev here: +https://github.com/ipfs/interface-ipfs-core/issues/126#issuecomment-326991583 + +### New AEgir (v12) + +@dignifiedquire got the chance to spend some time giving love to [AEgir](https://github.com/ipfs/aegir), our custom build assets and release tool we use for all the JS projects in the IPFS ecosystem. + +The new version of AEgir adds a lot of the features and needed refactor that has been requested for a while, however, we are still polishing it and will start using in js-ipfs [once we get the integration complete](https://github.com/ipfs/js-ipfs/pull/961). + +Today you can see AEgir 12 already being used in some IPFS modules, including [ipfs-api](https://github.com/ipfs/js-ipfs-api/pull/585)! + +### New libp2p Transport, libp2p-websocket-star + +@mkg20001 created a new libp2p Transport! [libp2p-websocket-star](https://github.com/libp2p/js-libp2p-websocket-star). This new transport will work similarly to [libp2p-webrtc-star](https://github.com/libp2p/js-libp2p-webrtc-star), but using WebSockets (less cpu+mem hungry) than WebRTC. Track the development here: https://github.com/libp2p/js-libp2p/pull/122 + +If you run into any hurdles, please open an issue on [ipfs/js-ipfs/issues](https://github.com/ipfs/js-ipfs/issues). + +# 🎉 How can I contribute? + +I'm glad you asked! + +![](https://camo.githubusercontent.com/2820cc493393fa993bef64b044c6d3ce1d4b56a4/68747470733a2f2f63646e2e7261776769742e636f6d2f6a62656e65742f636f6e747269627574652d697066732d6769662f6d61737465722f696d672f636f6e747269627574652e676966) + +We keep curating and updating our [Waffle Board](https://waffle.io/ipfs/js-ipfs) to ensure it signals what is actively being worked on and what is next. We also review issues and tag them with difficulty and a [`help wanted`](https://waffle.io/ipfs/js-ipfs?search=help%20wanted) label, so that it is easy to find place where you can contribute to the project. + +If you are looking to contribute to a larger endeavour, we do have some areas of focus where we would love some more help. + +### Performance profiling + +We know that there are some low and medium hanging fruits to be grabbed and give js-ipfs huge performance boosts. We need as a project to create a more sistematic way of finding where these issues are and ensuring that tests will prevent us from causing regressions. @pgte went ahead and created a testing harness to benchmark js-ipfs and go-ipfs against each other and in different runtimes which is an excellent starting point. Find it [here](https://github.com/ipfs/ipfs-performance-profiling). + +### Documentation + +Although our best efforts, there is still a lot to get proper documentation. Documentation can be in the form of examples, function signatures and description, tutorials, videos, tests and so on. + +Right now we are looking into expanding [interface-ipfs-core](https://github.com/ipfs/interface-ipfs-core) to every single call that IPFS support, adding the function signature and an example per call. We welcome everyone to help us on this task. + +### Runtime support + +js-ipfs runs today in Node.js, Chrome, Firefox and Electron's renderer process. We want to expand that to: + +- [Electron Main Process](https://github.com/ipfs/js-ipfs/issues/843) +- [Cordova](https://github.com/ipfs/js-ipfs/issues/834) +- [Safari](https://github.com/ipfs/js-ipfs/issues/995) +- [Windows](https://github.com/ipfs/js-ipfs/issues/861) +- [Ionic](https://github.com/ipfs/js-ipfs/issues/802) + +If you have experience using one of these runtimes and would love to see js-ipfs, consider contributing to these threads, either with knowledge or code, we appreciate both. + +That is all for this post. Thank you for your attention, I bid you a good day! diff --git a/src/_blog/021-js-ipfs-0.27/README.md b/src/_blog/021-js-ipfs-0.27/README.md new file mode 100644 index 00000000..ec4bdcdb --- /dev/null +++ b/src/_blog/021-js-ipfs-0.27/README.md @@ -0,0 +1,87 @@ +--- +date: 2017-12-02 +url: /32-js-ipfs-0-27/ +title: js-ipfs 0.27.0 released +description: +author: David Dias +header_image: js-ipfs-placeholder.png +--- + +I'm happy to announce that js-ipfs v0.27.0 has been released! This release brings a new transport to the libp2p family, perf improvements and stability (add files with 10x the size!), Windows support, bug fixes and more! + + + + +# 🔦 Highlights + +### 🗂 The Files API has been upgraded with a new Streaming + Buffered interface + +Now you can add and fetch Files from IPFS using your favorite streams library, Readable Streams (aka Node.js Streams) or Pull Stream, you pick! Also, if you don't need to handle large files or if you are ok with buffering the whole thing, you can also use the Callback or Promises API for simplicity. + +See function signatures, descriptions and examples at: https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md + +Ref: + +- https://github.com/ipfs/interface-ipfs-core/pull/162 +- https://github.com/ipfs/js-ipfs/issues/557 + +### 🌟 New transport! websocket-star + +js-ipfs has a new WebSockets relayed transport, a similar transport to webrtc-star but more stable (less memory hungry). With this addition, we disable webrtc by default and added instructions on how to enabled it to our FAQ so that you can pick the best transport (webrtc-star vs websocket-star) for your needs. + +Big thank you to @mkg20001 for creating websocket-star in the first place! :) + +### 📦 You are now able to add any directory size and depth to IPFS with the new multipart stream builder + +`js-ipfs-api` got a big update with https://github.com/ipfs/js-ipfs-api/pull/629, upgrading the way we constructed multipart streams to send large amounts of Files to an IPFS daemon. Thanks to this, now js-ipfs CLI can any any directory size to IPFS. + +Thanks to @pgte for shipping it in a flash! + +### 🏡 Windows Support + +Yeeaaas! js-ipfs now supports Windows -- https://github.com/ipfs/js-ipfs/issues/1017#issuecomment-343568369 --!! Please send a huge hi5 to @richardschneider for slaying all the dragons on this one. + +### 🦁 Safari Support (both Mobile and Desktop) + +This is not necessarily a 0.27 update, but it is something you can do now! What this means is that now there are two mobile browsers that can run your Distributed Applications! (Chrome on Android and Safari on iOS) + +### 🚥 More interop tests, including PubSub + +Out set of interoperability tests is growing to make sure that JS and Go IPFS stay compatible at all times. The biggest new addition were PubSub tests, see these and more at https://github.com/ipfs/js-ipfs/tree/master/test/interop + +### 👢 Bootstraper tests + +Quick bootstraper tests were added -- https://github.com/ipfs/js-ipfs/pull/899 -- so that our Infrastructure team can always check that js-ipfs is able to contact the Bootstraper and Gateways after a configuration change. This should mitigate downtime issues we observer in the past. + +### ✨ `ipfs.ls` is now implemented! + +This was a long time coming. Thank you to @pgte for shipping this one. + +### 💫 `ipfs file ls` is now implemented too! + +You know when they say that an implementation of S3 is bug by bug compatible? Well, in our case, js-ipfs is getting command by command compatible with go-ipfs so that any app uses go-ipfs as a daemon can use js-ipfs too. This one was shipped by @richardschneider, thank you! + +### 📶 Progress bar! + +You can now get progress reports while adding a file to IPFS, both through the CLI (progress bar) or through the API, see how here: https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#add + +Thank you @dryajov for shipping this! + +### 🎢 Performance and Memory Improvements with pull-block + +@beanow improved the performance of pull-block, one of the js-ipfs-unixfs-engine dependencies, reducing vastly its memory fingerprint. What this translates too is to a faster and less memory hungry ipfs.add. I've successfully managed to added multiple files of 750Mb to a browser application using js-ipfs, this is more than a 10x improvement over previous reports!! + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. + +That is all for this post. Thank you for being part of the community. I bid you a good day! diff --git a/src/_blog/022-js-ipfs-0.28/README.md b/src/_blog/022-js-ipfs-0.28/README.md new file mode 100644 index 00000000..b371d4d9 --- /dev/null +++ b/src/_blog/022-js-ipfs-0.28/README.md @@ -0,0 +1,81 @@ +--- +date: 2018-03-16 +url: /33-js-ipfs-0-28/ +title: js-ipfs 0.28.0 released +description: +author: David Dias +header_image: js-ipfs-placeholder.png +--- + +Excited to share with you all today that js-ipfs v0.28.0 has been released! This release brings a panoply of bug fixes, perf improvements, testing improvements and new features. Upgrading to this version should be smooth. + + + + +# 🔦 Highlights + +### Spawn IPFS daemons, JS or Go, easier than ever with brand new IPFS Factory (ipfsd-ctl) + +The ipfsd-ctl module got a big upgrade and now is capable of spawning JS and Go IPFS Daemons using only JavaScript! The documentation was also updated. We use it for all our tests on js-ipfs, js-ipfs-api and ipfs/interop. + +Learn how to use it at https://github.com/ipfs/js-ipfsd-ctl. + +Thanks to @dryajov, @richardschneider for helping make this happen and everyone else that participated in the review of the new API. + +### 📣 PubSub is now a 1st class API of libp2p as well + +Now both IPFS and libp2p nodes expose the same PubSub API. This enables other applications that want to use the networking stack of IPFS only, including PubSub. + +Check the updated example in the js-libp2p repo at https://github.com/libp2p/js-libp2p/tree/master/examples/pubsub. + +### 💻 Multiple jsipfs CLI updates + +The jsipfs has been receiving a lot of love lately, updates include: + +- `jsipfs ls -r`List directories recursively +- `jsipfs version` supports all flags now +- Other bug fixes + +To test it out, [install it globally in your machine with npm: `npm install ipfs --global`](https://github.com/ipfs/js-ipfs#through-command-line-tool). + +Thanks @JonKrone and @vmx for shipping this! + +### 📖 New example - Add multiple files as a directory in the Browser + +You asked and @achingbrain shipped it! A new example to show how virtual directories can be added to IPFS from the Browser. Check it out at: https://github.com/ipfs/js-ipfs/tree/master/examples/browser-add-readable-stream + +### 🔌 jsipfs shutdown -- stop your daemon remotely + +You now can call `jsipfs shutdown` to turn off your js-ipfs daemon. This comes in handy when you want to stop a remote node and do not have access to the terminal and/or you are running in Windows and interrupt signals don't work in the same way as in Linux. + +### 💱 IPLD support for Bitcoin and Zcash + +The DAG Api now can resolve through Bitcoin and Zcash blocks in the same way that it can resolve through Ethereum blocks thanks to https://github.com/ipld/js-ipld-bitcoin and https://github.com/ipld/js-ipld-zcash. Thanks to @vmx for adding support. + +### ⏩ Testing is now faster with Jenkins, lot faster + +@VictorBjelkholm put a bunch of work and now we have super fast test set up for js-ipfs and its modules (remaining modules still being updated). Now when you submit a PR, you will see "Jenkins". The Jenkins service is running on a beefy machine and has no wait queues! No more waiting for Travis for 6 hours! + +### 🕶 libp2p-mplex is official and has a spec! + +Our interoperable Stream Multiplexer has graduated, it has a spec -- https://github.com/libp2p/mplex -- and an updated module -- https://github.com/libp2p/js-libp2p-mplex. + +### ⒿⓈ⚡️ js-ipfs Dev Team Weekly Sync 🙌🏽 + +The js-ipfs Dev Team has brought back the Weekly Sync ups! These are designed to be short meetings, focused in the work at hand identify what are the top priorities and everyone's focus for the week. Everyone is welcome to join, either as a contributor or just as a listener. Read more about it at https://github.com/ipfs/js-ipfs/issues/1179. + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- **NEW** Join the [ⒿⓈ⚡️ js-ipfs Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/js-ipfs/issues/1179) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. + +That is all for this post. Thank you for being part of the community. I bid you a good day! diff --git a/src/_blog/023-go-ipfs-0.4.14/README.md b/src/_blog/023-go-ipfs-0.4.14/README.md new file mode 100644 index 00000000..a45006f7 --- /dev/null +++ b/src/_blog/023-go-ipfs-0.4.14/README.md @@ -0,0 +1,73 @@ +--- +date: 2018-03-26 +url: /34-go-ipfs-0.4.14/ +title: go-ipfs 0.4.14 released +description: +author: whyrusleeping & victorbjelkholm +--- + +[go-ipfs 0.4.14](https://dist.ipfs.io/#go-ipfs) has been released today. Not +only have we improved memory and CPU usage but we also managed to fix a lot of +bugs, ship a major improvement to IPNS performance and lots of refactoring! \o/ + +- [Refactoring](#refactoring) +- [IPNS Improvements](#ipns-improvements) +- [Resource Usage Improvements](#resource-usage-improvements) +- [IPFS Core API](#ipfs-core-api) +- [Note Regarding Insecure Hash Functions](#note-regarding-insecure-hash-functions) + +# Refactoring + +The release took longer than expected due to our refactoring and extracting of +our [commands library](https://github.com/ipfs/go-ipfs-cmds). This refactor had +two stages. The first round of the refactor disentangled the commands code from +core go-ipfs code, allowing us to move it out into a separate repository. The +code was previously very entangled with the go-ipfs codebase and not usable for +other projects. The second round of the refactor had the goal of fixing several +major issues around streaming outputs, progress bars, and error handling. It +also paved the way for us to more easily provide an API over other transports, +such as websockets and unix domain sockets. It took a while to flush out all +the kinks on such a massive change. We're pretty sure we've got most of them, +but if you notice anything weird, +[please let us know](https://github.com/ipfs/go-ipfs/issues/new). + +# IPNS Improvements + +Beyond that, we've added a new experimental way to use IPNS. With the new +pubsub IPNS resolver and publisher, you can subscribe to updates of an IPNS +entry, and the owner can publish out changes in real time. With this, IPNS can +become nearly instantaneous. To make use of this, simply start your go-ipfs +daemon with the `--enable-namesys-pubsub` option, and all IPNS resolution and +publishing will use pubsub. Note that resolving an IPNS name via pubsub without +someone publishing it via pubsub will result in a fallback to using the DHT. +Please give this a try and let us know how it goes! + +# Resource Usage Improvements + +Memory and CPU usage should see a noticeable improvement in this release. We +have spent considerable time fixing excess memory usage throughout the codebase +and down into go-libp2p. Fixes in peer tracking, bitswap allocation, pinning, +and many other places have brought down both peak and average memory usage. An +upgraded hashing library, base58 encoding library, and improved allocation +patterns all contribute to overall lower CPU usage across the board. + +# IPFS Core API + +This release also brings the beginning of the go-ipfs 'Core API'. Once +finished, the Core API will be the primary way to interact with go-ipfs using +go. Both embedded nodes and nodes accessed over the HTTP API will have the same +interface. Stay tuned for future updates and documentation. + +# Note Regarding Insecure Hash Functions + +This release of go-ipfs disallows the usage of insecure hash functions and +lengths. go-ipfs does not create these insecure objects for any purpose, but +it did allow manually creating them and fetching them from other peers. If you +currently have objects using insecure hashes in your local go-ipfs repo, please +remove them before updating. + +# Full Changelog + +As always, you can find the full changelog over at ipfs/go-ipfs's Github +repository: +https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#0414-2018-03-22 diff --git a/src/_blog/024-ipfs-companion-2.2.0/README.md b/src/_blog/024-ipfs-companion-2.2.0/README.md new file mode 100644 index 00000000..bf2c370e --- /dev/null +++ b/src/_blog/024-ipfs-companion-2.2.0/README.md @@ -0,0 +1,78 @@ +--- +date: 2018-04-10 +url: /35-ipfs-companion-2-2-0/ +title: IPFS Companion 2.2.0 brings window.ipfs to your Browser +description: +author: lidel +--- + +We are pleased to announce to everyone in our community that a new version of our +browser extension has been released! + +![demo of v2.2.0](https://ipfs.io/ipfs/QmdJTmCxwcpoGbEVfT6b9j4RZJWNcF2GQG1Ajf9XB6XtVP) + +# 🔦 Highlights + +### Your node is exposed as `window.ipfs` on every webpage + +The API aims to be compatible with [interface-ipfs-core](https://github.com/ipfs/interface-ipfs-core/), +which means websites can now detect if the property exists in window context +and opt-in to use it instead of creating their own [js-ipfs](https://github.com/ipfs/js-ipfs) node. +It saves system resources and battery (on mobile), avoids the overhead of peer +discovery/connection, enables shared repository access and more! + +

+ +

+ +Make sure to read our [notes on exposing IPFS API as window.ipfs](https://github.com/ipfs-shipyard/ipfs-companion/blob/master/docs/window.ipfs.md), +where we explain it in-depth and provide examples on how to use it your own dapp. + +You can also play with simple demo apps that take advantage of `window.ipfs`: + +- [IPFS Peer Map](https://github.com/tableflip/ipfs-peer-map-example) provides a visualization of `ipfs.swarm.peers` +- [PeerID-to-QRCode](https://github.com/hacdias/ipfs-id-qr-codes) creates QR Codes based on `ipfs.id` +- and obligatory [TODO App](https://github.com/hacdias/ipfs-todo), uses `ipfs.files` for storage + +### Embedded js-ipfs Node + +The Browser Action menu provides a toggle for switching between external IPFS +node accessed over HTTP API and embedded, in-memory instance of js-ipfs. + +The embedded node is great for quickly sharing files with someone, or for +testing a dapp that uses `window.ipfs` without having to install and start up +your own IPFS daemon. +Power users can provide own config (eg. to enable experimental pubsub) via _Preferences_. + +**Note:** The embedded node _does not run_ when external node is selected. +Every time you switch back to the embedded node, a new instance is created +on-demand. It can take [a few seconds](https://user-images.githubusercontent.com/157609/38493690-4a77bd9e-3bf3-11e8-85da-ba06fd94cdbf.gif) +for a brand-new node to find peers. + +### …and more! + +For a longer walkthrough of new features see [Release Notes for v2.2.0](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.2.0). + +# Install it today! + +| Firefox | Chrome / Chromium | +| ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [![Get the add-on](https://ipfs.io/ipfs/QmSX44XockQifmxE8Wdevkaa6vaqTXtGdH9t9aHWXZkuJq)](https://addons.mozilla.org/addon/ipfs-companion/) | [![Install](https://ipfs.io/ipfs/QmPinSJKFYCMuTDh484dLk5Av4HpZRzBRR1KPv7TM7CBVF)](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch) | + +# Want to contribute? + +Would you like to contribute to the IPFS browser extension and don't know how? Well, there are a few places you can get started: + +- Opt-in for builds from [beta channel](https://github.com/ipfs-shipyard/ipfs-companion#beta-channel) and [create a new Issue](https://github.com/ipfs/ipfs-companion/issues/new) if you notice a bug or room for improvement +- Check [the issues with the `help wanted` label](https://github.com/ipfs-shipyard/ipfs-companion/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) and see if you can grab something +- See if there are any _Open Questions_ at the end of latest [Release Notes](https://github.com/ipfs-shipyard/ipfs-companion/releases/latest) +- Improve accessibility by working on [translations](https://github.com/ipfs-shipyard/ipfs-companion/blob/master/docs/localization-notes.md) +- Hack with IPFS and [show us what you made](https://github.com/ipfs/awesome-ipfs), especially with newly added `window.ipfs`! + +# Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can +do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also +available at the `#ipfs` channel on Freenode. + +That is all for this post. Thank you for being part of the community. Have a great day! diff --git a/src/_blog/025-a-look-at-windows/README.md b/src/_blog/025-a-look-at-windows/README.md new file mode 100644 index 00000000..c4b1c2f9 --- /dev/null +++ b/src/_blog/025-a-look-at-windows/README.md @@ -0,0 +1,88 @@ +--- +date: 2018-04-23 +url: /36-a-look-at-windows/ +title: A look at go-ipfs on Windows +description: +author: Dominic Della Valle +--- + +`go-ipfs` is built on top of [Golang](https://golang.org/), which allows for some cross platform compatibility. However, it doesn't cover everything. Over the past few weeks, we've fine-tuned several aspects of the Windows experience to fix errors and remove inconsistencies. +In this post, we'll be taking a closer look at these issues and what we've done to resolve them before the next release of `go-ipfs` (v0.4.15). (CORRECTION: "Log output" and "File output names" have been pushed back to v0.4.16, everything else will be included in v0.4.15) + +If you're not a Windows or `go-ipfs` user, you may still be interested in seeing where we encountered problem points, and our resolution plans for them. Issue [#4808 (Windows initiative 2018)](https://github.com/ipfs/go-ipfs/issues/4808) in particular may give you a head start if you plan on porting `go-ipfs` to a new platform, or are encountering inconsistent behavior in one of your own projects. It offers a more in-depth look at how we discovered, discussed, and dealt with platform problems. + +--- + +### Log output + +![log-before](img/log-before.png) +Issue: +The output on Windows was filled with non-native [control characters](https://en.wikipedia.org/wiki/Control_character). This made our output hard to read, both for users and developers (when malformed logs were shared with us). + +![log-after](img/log-after.png) +Resolution: +We've added a method of translating these characters into native equivalents. There should be no more oddities related to character color or cursor placement, text should be clear and lines shouldn't overlap anymore. This should make everyone a little bit happier. + +### Building + +![build](img/build.gif) +Issue: +Building the Windows binary, on Windows itself, had multiple problems: silent failures, lack of respect for user supplied arguments, inconsistent handling of dependencies, and more. + +Resolution: +Multiple fixes had to be applied to `go-ipfs`, `gx`, some of our first and third party dependencies, and even Golang itself. The building experience should now be consistent with other platforms. In addition, the [documentation has been rewritten](https://github.com/ipfs/go-ipfs/blob/master/docs/windows.md) to clarify the process and add a section that covers Windows specific concerns and how to deal with them. + +### Temporary file access errors + +![garbage](img/garbage.png) +Issue: +When trying to move data-blocks from a temporary location, the destination address was getting corrupted. This led to "Access Denied" errors and the unexpected creation of garbage files in the working directory. + +Resolution: +[An audit is in progress](https://github.com/ipfs/go-ipfs/issues/4485), directed at finding areas where memory corruption is possible. We've detected and resolved the Windows specific issue above. Operations should now succeed as expected. + +### File output names + +Issue: +No filters were being applied to file paths during extraction (IPFS -> other file systems). This caused multiple issues when using `ipfs get`. + +1. #### Extracting content from IPFS could fail due to native file system restrictions + + ![File names](img/filenames.png) + FAT32, NTFS, ReFS, and Windows itself, all impose their own path limitations. If a hash contained a non-legal path, operations like `ipfs get` would fail. In the image above, the [XKCD archive ](https://github.com/ipfs/archives/issues/21) could not be downloaded on Windows because the directory "1031 - s keyboard leopard " ends in a space. + +2. #### Hashes that contained malicious file paths would be extracted + ![overwrite 1](img/overwrite%201.png) + ![overwrite 2](img/overwrite%202.png) + It was possible for users to craft specific hashes that could escape the extraction root and overwrite files (if the target file's location was known in advance and users had write permissions for the files). + +Resolution: +We now account for these limitations and translate path-names into platform legal paths, which are restricted to their hash-root. + +### `stdio` + +![pipe](img/pipe.png) +Issue: +stdin support was explicitly disabled in `go-ipfs`, preventing basic [IPC](https://en.wikipedia.org/wiki/Inter-process_communication) with other applications. +Resolution: +stdin support has been added to the Windows version of go-ipfs which allows you to place ipfs anywhere in a [pipeline](). + +## And more... + +There’s still more to be done to enhance the experience of `go-ipfs` on Windows. As well as address portability concerns in general. We plan to keep making progress in these areas going forward. +If you’re interested in contributing (or just keeping an eye on progress), feel free to check out issue [#4808 (Windows initiative 2018)](https://github.com/ipfs/go-ipfs/issues/4808). + +--- + +# Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - +- Join an IPFS All Hands call, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- The All Hands call is also the perfect venue for demos, join in and show us what you built! +- Join the discussion at + +# Do you have questions? + +The best place to ask your questions about IPFS, how it works, and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the [#ipfs](irc://freenode.net/ipfs) channel on Freenode. diff --git a/src/_blog/026-ipfs-conf-dev-meetings-and-user-registry/README.md b/src/_blog/026-ipfs-conf-dev-meetings-and-user-registry/README.md new file mode 100644 index 00000000..c7cbeb8c --- /dev/null +++ b/src/_blog/026-ipfs-conf-dev-meetings-and-user-registry/README.md @@ -0,0 +1,37 @@ +--- +date: 2018-05-19 +url: /37-ipfs-conf-dev-meetings-and-user-registry/ +title: 'Announcements: IPFS Conf, Developer Meetings for IPFS & libp2p and a User Registry' +description: +author: flyingzumwalt +--- + +> **Update** The target timeline for IPFS Conf has been changed to 2019. The original post listed a tentative date of November 2018. + +We’re very excited to announce two events that have been in the making for a long time. In ~~(tentatively) November~~ 2019 we will host a public **IPFS Conf** in Lisbon. To prepare for that event, in July we will convene small **IPFS and libp2p Developer Meetings** in Berlin. All of these events will be loosely inspired by PyCon and Docker Conf — events where community members play a very active role in shaping the agenda, and where a large portion of time is allocated to working meetings where Working Groups and product teams make the most of being together in-person. + +# IPFS Conf in November + +IPFS Conf will be a large, open-registration event for the extended ecosystem of people and projects that touch IPFS, libp2p, IPLD and multiformats. We are aiming to host that event in Lisbon in ~~November 2018~~ 2019. The event is open to all. To pre-register for IPFS Conf, use the [pre-registration form](https://goo.gl/forms/0Pu6VZzG8pRAmrrv2). + +# IPFS and libp2p Developer Meetings in July + +The IPFS Developer Meeting (9-11 July) in Berlin will be a small, 3-day working summit for IPFS maintainers, contributors and the people who are most actively engaged in the evolution of IPFS. It will be followed by 2-day libp2p Developer Meeting (12-13 July) specifically focused on libp2p and its users. + +As a distributed project with contributors spread all over the world, we do most of our work and decision making remotely. In fact, even some of the core maintainers have never met in person. We embrace the distributed nature of this ecosystem, but we also appreciate the power of spending time in the same physical space with like-minded people. As we poise for explosive growth in this ecosystem we have been setting up Working Groups to play an increasingly prominent role in driving the work that we do. These developer meetings will be an opportunity to establish shared context and working relationships, so that the members of these working groups can become better leaders of the communities that grow around them. + +Participants must apply to attend the Developer Meetings. The deadline for submitting applications is May 28th. Our priority for these meetings is to get all of the maintainers, many of the active contributors, and a strong sampling of people who have committed real time and effort to building software on IPFS and libp2p. Participants at the meetings will address key unresolved technical and community challenges while co-creating a sense of membership, shared ownership, and responsibility for the ecosystem and all its pieces. They will leave the meetings with more responsibilities than they had when they arrived. + +To be eligible to attend either of the Developer Meetings you must either be an active contributor on GitHub or you must submit information about your work to the IPFS User Registry (more info about this below). Participants will be chosen based their directly-relevant responsibilities, the contributions they've made to the ecosystem, and the impact of their work. + +If you want to attend either of the developer meetings, fill out the [IPFS Developer Meeting Application form](https://goo.gl/forms/sVRjrW1CA61FTwl12), the [libp2p Developer Meeting application form](https://goo.gl/forms/8YpFQ7D00s5gC3hw2) or both. If you want to attend both meetings, you should fill out both forms. We will accept applications on a rolling basis. **The deadline for applications is May 28th.** After that deadline we can't guarantee that your application will be reviewed. + +# User Registry + +As maintainers of the IPFS project and coordinators of its surrounding ecosystem, we have a view into the huge array of people who are building tools, libraries and products on our protocols. We have not done enough to feature those people, the projects they’ve launched, the software they’ve created, and the communities of users who they’re serving. We intend to change that, giving everyone a view into the ever-growing and continually-evolving ecosystem of people around the world using IPFS, libp2p, IPLD, multiformats, etc. To do this, we are creating an Registry of IPFS and libp2p users which anyone can submit their projects to and, once submitted, can update the registry as their projects evolve. + +We hope that this registry will help people to make crosswise connections, find new tools to use, people to collaborate with, inspiring ideas, etc. + +The User Registry allows you to opt into the public listing of IPFS and libp2p users. By default the information you enter will only be visible to the core working group, Working Group captains and PMs who lead IPFS, libp2p and IPLD, so even if you don't want to be listed publicly please use the User Registry to tell us about your project. For example, if you're using IPFS privately, or if you're just exploring or evaluating IPFS but aren't ready to tell the world about it you can still put information about your project in the User Registry for us to see internally. + +To add your project, or projects, to the User Registry, fill out the [User Registry Entry Form](https://goo.gl/forms/1dxAwv809VY2zeNC3). diff --git a/src/_blog/027-js-ipfs-0.29/README.md b/src/_blog/027-js-ipfs-0.29/README.md new file mode 100644 index 00000000..5bb77b32 --- /dev/null +++ b/src/_blog/027-js-ipfs-0.29/README.md @@ -0,0 +1,90 @@ +--- +date: 2018-05-29 +url: /38-js-ipfs-0-29/ +title: js-ipfs 0.29.0 released +description: +author: David Dias +header_image: js-ipfs-placeholder.png +--- + + + + +# 🔦 Highlights + +### 🏎 Bitswap is 30% faster + +Bitswap is now 30%, thanks to fixing a bug on [js-ipfs-bitswap](https://github.com/ipfs/js-ipfs-bitswap/pull/175#issuecomment-390957244) that was causing every message to be sent individually. + +### 👓 js-ipfs now works with uglify-es just fine + +The duck typing throughout js-ipfs has been improved and that means that now you can use uglify-es again to minify your js-ipfs code. The result is that the js-ipfs bundled version is now back to its minified size as well. + +### ☎️ Circuit Relay was merged in + +Circuit Relay enables connectivity between any two nodes through a third relay node. This ensures connectivity in almost every scenario, that is, as long as peers can connect to some public IP node. Learn how to use it [here](https://github.com/ipfs/js-ipfs/tree/master/examples/circuit-relaying). This was one of the two features that js-ipfs was missing to get full connectivity. + +### 🗑 S3 backend for IPFS + +Ever wished you could use an external storage backend to store all your IPFS blocks? Now you do and we got a tutorial for you! See how to configure a repo at https://github.com/ipfs/js-ipfs/tree/master/examples/custom-ipfs-repo and if you want to learn how to use S3 as your external backend, then consult https://github.com/ipfs/js-datastore-s3/tree/master/examples/full-s3-repo. + +### 📜 README Overhaul + +The js-ipfs README keeps improving, now with 40% more information about the multiple arguments you can pass to IPFS. Read all the options at https://github.com/ipfs/js-ipfs#api + +### 🎷 Project Tracking + +If you haven't already, I welcome you to check how the js-ipfs team tracks their work at https://github.com/ipfs/js-ipfs/blob/master/MGMT.md. It is fun to see the issues fly through the [waffle board](https://waffle.io/ipfs/js-waffle). + +### ✅ Config validation and config reuse fix + +In addition to better documentation on how to configure your node, you now get some config validation in case you mistype something. Also as a bonus, you can now spin multiple nodes in the same process without them getting confused and using the same config. + +### 📖 interface-ipfs-core keeps getting more API calls documented and tested + +Make yourself familiar with the IPFS Core API at https://github.com/ipfs/interface-ipfs-core/tree/master/SPEC. New additions include files.add --wrapWithDirectory, --onlyHash and others. + +### 📊 Bandwidth stats now available + +Bandwidth statistics for your IPFS node from the `libp2p` layer are now exposed and available to query for the whole node, per peer or per protocol. You can also use Node streams or pull streams to get a continuous feed of that tasty statistical juice. + +### 📡 Fully Async PubSub API + +The PubSub API has been updated to expose Async calls (with Callbacks and Promises). This was necessary as some nodes exist behind an HTTP API and using a fake sync API would create race conditions. Make sure to update your use of PubSub, you can see the API changes below. + +### 🛎 Ping API implemented + +JS IPFS now has API calls for pinging other peers. Fun fact, this was actually the first thing a js-ipfs node did, but it got lost in a massive refactor and now it is back and not only in js-ipfs core, it is also available through the CLI and HTTP API + +### ⚛️ Electron Main Process support with Electron 2.0 + +As a good surprise, Electron 2.0 has better support for Native Modules and with that, js-ipfs can run on the Main process mode. This concludes the [full support for IPFS in electron](https://github.com/ipfs/notes/issues/256). + +# 🏗 API Changes + +1. Argument order for `pubsub.subscribe` has changed: + - Old: `pubsub.subscribe(topic, [options], handler, [callback]): Promise` + - New: `pubsub.subscribe(topic, handler, [options], [callback]): Promise` +2. The `pubsub.unsubscribe` method has become async meaning that it now takes a callback or returns a promise: + - Old: `pubsub.unsubscribe(topic, handler): undefined` + - New: `pubsub.unsubscribe(topic, handler, [callback]): Promise` +3. Property names on response objects for `ping` are now lowered: + - Old: `{ Success, Time, Text }` + - New: `{ success, time, text }` +4. In the CLI, `jsipfs object data` no longer returns a newline after the end of the returned data + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [ⒿⓈ⚡️ js-ipfs Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/js-ipfs/issues/1179) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. + +That is all for this post. Thank you for being part of the community. I bid you a good day! diff --git a/src/_blog/028-go-libp2p-6.0.0/README.md b/src/_blog/028-go-libp2p-6.0.0/README.md new file mode 100644 index 00000000..5e5fb5d4 --- /dev/null +++ b/src/_blog/028-go-libp2p-6.0.0/README.md @@ -0,0 +1,307 @@ +--- +date: 2018-06-15 +url: /39-go-libp2p-6-0-0/ +title: go-libp2p 6.0.0 released +description: +author: Steven Allen +--- + +# 🔦 go-libp2p 6.0.0 release notes + +We're pleased to announce go-libp2p 6.0.0. This release includes a massive +refactor of go-libp2p that paves the way for new transports such as QUIC. +Unfortunately, as it is broad sweeping, there are some breaking changes, +_especially_ for maintainers of custom transports. + +Below, we cover the changes you'll likely care about. For convenience, we've +broken this into a section for users and transport authors/maintainers. However, +transport maintainers should really read both sections. + +## 💁 For Users + +Libp2p users should be aware of a few major changes. + +- Guarantees and performance concerning connect/disconnect notification + processing have improved. +- Handling of half-closed streams has changed (READ THIS SECTION). +- Some constructors and method signatures have changed slightly. + +### Dialing And Source Addresses + +We've improved the logic that selects the source address when dialing. In the +past, you may have run into an issue where you couldn't dial non-local nodes +when listening on 127.0.0.1 as opposed to 0.0.0.0. This happened because +go-libp2p would randomly pick the source address from the set of addresses on +which the node was listening. We did this to ensure that the other end could +dial us back at the same address. Unfortunately, one can't use 127.0.0.1 as a +source address when dialing any non-local address so outbound dials failed. + +go-libp2p now tries to be smarter about this and avoids picking source addresses +that have no route to the destination address. + +### Bandwidth Metrics + +To start out on an unhappy note, bandwidth metrics are now less accurate. In the +past, transports returned "minimal" connections (e.g., a TCP connection) so we +could wrap these transport connections in "metrics" connections that counted +every byte sent and received. + +Unfortunately, now that we've moved encryption and multiplexing down into the +transport layer, the connection we're wrapping has significantly more +under-the-covers overhead. + +However, we do hope to improve this and get even _better_ bandwidth metrics than +we did before. See [libp2p/go-libp2p-transport#31][] for details. + +[libp2p/go-libp2p-transport#31]: https://github.com/libp2p/go-libp2p-transport/issues/31 + +### Notifications + +This release brings performance improvements and simple ordering guarantees for connect/disconnect events: + +1. For any given connection/stream, libp2p will wait for all connect/open event + handlers to finish exit before triggering a disconnect/close event for the + connection/stream. +2. When a user calls the `Close` (or `Reset`) method on a connection or stream, + go-libp2p will process the close event asynchronously (i.e., not block the + call to `Close`). Otherwise, a call to `Close` from within a connect event + handler would deadlock. +3. Unless otherwise noted, events will be handled in parallel. + +What does this mean for end users? Well: + +1. Reference counting connections to a peer using connect/disconnect events + should "just work" and should never go negative. +2. Under heavy connect/disconnect loads, connecting to new peers should be + faster (usually). + +For those interested in the history of this issue, ... + +In the past, (dis)connect and stream open/close notifications have been a bit of +a pain point. For a long time, they were fired off in parallel and one could, for +example, process a disconnect notification before a connect notification (we had +to support _negative_ ref-counts in several places to account for this). + +After no end of trouble, we finally "fixed" this by synchronizing notification +delivery. We still delivered notifications to all notifiees in parallel, we just +processed the events in series. + +Unfortunately, under heavy connect/disconnect load, new connections could easily +get stuck on open behind a queue of connect events all being handled in series. +In theory, these events should have been handled quickly but in practice, it's +very hard to avoid locks _entirely_ (bitswap's event handlers were especially +problematic). + +Worse, this serial delivery guarantee didn't actually provide us with an +_in-order_ delivery guarantee as it was still possible for a disconnect to +happen before we even _started_ to fire the connect event. The situation was +slightly better than before because the events couldn't overlap but still far +from optimal. + +However, this has all been resolved now. From now on, you'll never receive a +disconnect event before a connect event. + +### Conn.GetStreams Signature Change + +The signature of the `GetStreams` method on `go-libp2p-net.Conn` has changed from: + +```go +GetStreams() ([]Stream, error) +``` + +To: + +```go +GetStreams() []Stream +``` + +Listing the streams on an open connection should never involve IO or do anything +that can fail so we removed this error to improve usability. + +### Libp2p Constructor + +If you're not already doing so, you should be using the `libp2p.New` constructor +to make your libp2p nodes. This release brings quite a few new options to the +libp2p constructor so if it hasn't been flexible enough for you in the past, I +recommend that you try again. A simple example can be found in the +[echo][example:echo] example. + +Given this work and in an attempt to consolidate all of our configuration logic +in one place, we've removed all default transports from go-libp2p-swarm. + +TL;DR: Please use the libp2p constructor. + +### Zombie Streams + +From this release on, when you're done with a stream, you must either call +`Reset` on it (in case of an error) or close it and read an EOF (or some other +error). Otherwise, libp2p can't determine if the stream is _actually_ closed and +will hang onto it indefinitely. + +To make properly closing streams a bit easier, we've added two methods to +[go-libp2p-net][]: `AwaitEOF` and `FullClose`. + +- `AwaitEOF(stream)` tries to read a single byte from the stream. If `Read` + returns an EOF, `AwaitEOF` returns success. Otherwise, if `Read` either reads + some data or returns some other error, `AwaitEOF` resets the stream and returns + an error. To avoid waiting indefinitely, `AwaitEOF` resets the stream + unconditionally after 1 minute. +- `FullClose(stream)` is a convenience function that closes the stream and then + calls `AwaitEOF` on it. + +Like with libp2p notifications, this issue has a bit of history... + +In the beginning, libp2p assumed that calling `Close` on a stream would close +the stream for both reading and writing. Unfortunately, _none_ of our stream +multiplexers actually behaved this way. In practice, `Close` always closed the +stream for writing. + +After realizing this, we made two changes: + +1. We accepted the fact that `Close` only closed the stream for writing. +2. We added a `Reset` method for killing the stream (closing it in both + directions, throwing away any buffered data). + +However, we ran into a bit of a snag because we try to track open streams and +need some way to tell when a stream has been closed. In the past this was easy: +when the user calls `Close` on the stream, stop tracking it. However, now that +`Close` only closes the stream for writing, we still _technically_ needed to +track it until the _other_ end closed the stream as well. Unfortunately, without +actually reading from the stream, we have no way of knowing about this. +Therefore, if the user calls `Close` on a stream and then walks away, we'd have +to hang onto the stream indefinitely. + +Our solution was to simply stop tracking streams once they were closed for +writing. This wasn't the _correct_ behavior but it avoided leaking memory in the +common case: + +1. The user calls `Close` and drops all references to the stream. +2. The other end calls `Close` without writing any additional data. +3. The stream multiplexer observes both closes and drops _its_ reference to the stream. +4. The garbage collector garbage collects the stream. + +However, this meant that: + +1. The list of "open" streams was technically incomplete. +2. If the other side either failed to call `Close` or tried to send data before + closing, the stream would remain "open" (until the connection was closed). + +In this release, we've changed this behavior. Now, when you `Close` a stream for +writing, libp2p _continues_ to track it. We only stop tracking it when either: + +1. You call `Reset` (throwing away the stream). +2. You finish reading any data off of it and observe either an EOF or an error. + +This way, we never "forget" about open streams or leave them in a half-forgotten +state. + +In the future, I'd like to add a `CloseAndForget` method to streams that: + +1. Closes the stream (sends an EOF). +2. Tells the swarm to stop tracking the stream. +3. Tells the stream muxer to stop tracking the stream and throw away any data + the other side may send (possibly resetting the stream on unexpected data). + +However: + +1. This would likely require modifying our stream muxers which may not be + feasible. +2. Explicitly waiting for an EOF is still the correct thing to do unless you + really don't care if the operation succeeded. + +## 📞 For Transport Maintainers + +For transport maintainers, quite a bit has changed. Before this change, +transports created simple, unencrypted, stream connections and it was the job of +the libp2p Network (go-libp2p-swarm) to negotiate security, multiplexing, etc. + +However, when attempting to add support for the QUIC protocol, we realized that +this was going to be a problem: QUIC already handles authentication and +encryption (using TLS1.3) and multiplexing. After much debate, we inverted our +current architecture and made transports responsible for encrypting/multiplexing +their connections (before returning them). + +To make this palatable, we've also introduced a new ["upgrader" +library][go-libp2p-transport-upgrader] for upgrading go-multiaddr-net +connections/listeners to full libp2p transport connections/listeners. Transports +that don't support encryption/multiplexing out of the box can expect to have an +upgrader passed into the constructor. + +To get a feel for how this new transport system works, take a look at the TCP +and WebSocket transports and the transport interface documentation: + +- [TCP Transport][go-tcp-transport] +- [WebSocket Transport][go-ws-transport] +- [Transport Interface][doc:go-libp2p-transport] + +### Deprecated Packages + +This release sees the deprecation of a few packages: + +- [go-peerstream][] has been deprecated and all functionality has been merged + into [go-libp2p-swarm][]. [go-peerstream][] was written as a general-purpose + (not libp2p specific) listener, connection, and stream manager. However, this + package caused more problems than it solved and was incompatible with the new + transport interface. +- [go-libp2p-interface-conn][] has been deprecated. These interfaces to bridge + the gap between transport-level connections and [go-libp2p-net][] connections + however, now that transport connections are fully multiplexed/encrypted, this + is no longer needed. +- [go-libp2p-conn][] has also been deprecated and most of the functionality has + been moved to [go-libp2p-transport-upgrader][]. This package used to provide + connection "upgrade" logic for upgrading transport-level connections to + [go-libp2p-interface-conn][] connections however, transport-level connections + now provide the required functionality out of the box. + +### Testing + +We've moved `GenSwarmNetwork` in [go-libp2p-netutil][] to `GenSwarm` in +[go-libp2p-swarm/testing][] because: + +1. The swarm duplicated this exact function for its own tests. +2. The swarm couldn't depend on [go-libp2p-netutil][] because + [go-libp2p-netutil][] depends on [go-libp2p-swarm][]. + +We've also added a new transport test suit +[go-libp2p-transport/test][]. If you implement a new transport, please consider +testing against these suite. If you find a bug in an existing transport, please +consider adding a test to this suite. + +### go-addr-util + +In go-addr-util, we've removed the `SupportedTransportStrings` and +`SupportedTransportProtocols` transport registries and the associated +`AddTransport` function. These registries were updated by `init` functions in +packages providing transports and were used to keep track of known transports. + +However, _importing_ a transport doesn't mean any libp2p nodes have been +configured to actually _use_ that transport. Therefore, in the new go-libp2p, +it's go-libp2p-swarm's job to keep track of which transports are supported +(i.e., which transports have been registered with the swarm). + +We've also removed the associated `AddrUsable`, `FilterUsableAddrs`, and +`AddrUsableFunc` functions. + +### Pluggable Security Transports + +This release brings a new pluggable security transport framework. Implementing a +new security framework is now as simple as: + +1. Implement the interfaces defined in [go-conn-security][]. +2. Pass it into the libp2p constructor using the `Security` option. + +[go-conn-security]: https://github.com/libp2p/go-conn-security +[go-libp2p-conn]: https://github.com/libp2p/go-libp2p-conn +[go-libp2p-interface-conn]: https://github.com/libp2p/go-libp2p-interface-conn +[go-libp2p-net]: https://github.com/libp2p/go-libp2p-net +[go-libp2p-netutil]: https://github.com/libp2p/go-libp2p/go-libp2p-netutil +[go-libp2p-swarm]: https://github.com/libp2p/go-libp2p/go-libp2p-swarm +[go-libp2p-swarm/testing]: https://github.com/libp2p/go-libp2p/go-libp2p-swarm/testing +[go-libp2p-transport]: https://github.com/libp2p/go-libp2p-transport +[go-libp2p-transport/test]: https://github.com/libp2p/go-libp2p-transport/test +[go-libp2p-transport-upgrader]: https://github.com/libp2p/go-libp2p-transport-upgrader +[go-peerstream]: https://github.com/libp2p/go-peerstream +[go-tcp-transport]: https://github.com/libp2p/go-tcp-transport +[go-ws-transport]: https://github.com/libp2p/go-ws-transport +[example:echo]: https://github.com/libp2p/go-libp2p/tree/master/examples/echo +[doc:go-libp2p-transport]: https://godoc.org/github.com/libp2p/go-libp2p-transport diff --git a/src/_blog/029-js-ipfs-0.30/README.md b/src/_blog/029-js-ipfs-0.30/README.md new file mode 100644 index 00000000..75404c91 --- /dev/null +++ b/src/_blog/029-js-ipfs-0.30/README.md @@ -0,0 +1,68 @@ +--- +date: 2018-07-09 +url: /40-js-ipfs-0-30/ +title: js-ipfs 0.30.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +Feature parity with go-ipfs just got a whole lot closer! + + + + +# 🔦 Highlights + +## 🔀 Mutable File System (MFS) + +MFS, the mutable file system is finally here in js-ipfs. The [MFS API](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#mutable-file-system) allows you to use IPFS like a regular Unix file system. Add, edit, move, copy, rename and delete your files while keeping all that content addressable, Merkle DAGgy goodness. + +## 📌 Pin API implemented + +Ever wanted to keep the things you add to IPFS? Well now you can! Pinning a hash in IPFS land tells your node to keep the data around in your local repo until you decide to unpin it. No amount of garbage collection will take it! Next stop, implement garbage collection 😝 + +## 🤝 libp2p connection manager added + +The new libp2p connection manager gives you the power to disconnect peers when you have too many or when certain bandwidth restrictions are reached. Really useful for preserving resources on resource constrained devices such as mobile phones or IoT. + +See the options at: https://github.com/libp2p/js-libp2p-connection-manager#create-a-connectionmanager + +## 📇 bitswap improvements + +Swapping your bits has never been so easy to keep track of. You can now inspect the "wantlist" (the list of hashes currently wanted by various peers) on a per peer basis, and you can manually "unwant" hashes in your own list. + +## ☯️ Content hashes interop + +If you add a file to go-ipfs and also add it to js-ipfs then you might get a different hash. It doesn't mean the hash is wrong, just that the layout of the DAG nodes that were created for your file was different. Good news folks, we fixed that. You should now get the same hash whether you add your file to go-ipfs or js-ipfs. Hooray \o/. + +## 🙅 Node.js 10 support + +Now you can run your js-ipfs node on the latest and greatest Node.js yet. + +# 🏗 API Changes + +- libp2p configuration property names for custom modules has changed + - old: `libp2p.modules.discovery` + - new: `libp2p.modules.peerDiscovery` +- Custom libp2p modules you provide now _replace_ default modules +- Pin API added ([spec](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/PIN.md)) +- `bitswap.wantlist` peer ID parameter added ([spec](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/BITSWAP.md#bitswapwantlist)) +- `bitswap.unwant` implemented ([spec](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/BITSWAP.md#bitswapunwant)) +- MFS API added ([spec](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#mutable-file-system)) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. + +That is all for this post. Thank you for being part of the community. I bid you a good day! diff --git a/src/_blog/030-js-libp2p-0.23/README.md b/src/_blog/030-js-libp2p-0.23/README.md new file mode 100644 index 00000000..44ab9ef7 --- /dev/null +++ b/src/_blog/030-js-libp2p-0.23/README.md @@ -0,0 +1,72 @@ +--- +date: 2018-07-27 +url: /41-js-libp2p-0-23/ +title: js-libp2p 0.23.0 released +description: +author: David Dias +--- + + + + +# 🔦 Highlights + +> This is an informative release that js-libp2p is here, it does a lot of amazing things and everyone should check it out today. The list of Highlights contain some of latest achievements and new ones coming out with this release. It sets the tone for future releases of js-libp2p. + +### 🔐 Private Networks + +This is one of the latest features of libp2p. With Private Networks and Network Protectors, you can create entirely disjoint networks from the main net and be sure that only the peers that have access to a secret can join. + +### 🌐 Use it on the Browser! + +The number 1 design goal, have a network stack that can overcome the resource and runtime constraints imposed by the browser and enable P2P protocols to work 100% in their browser implementations. This is possible with libp2p, learn how in [Browser example](https://github.com/libp2p/js-libp2p/tree/master/examples/libp2p-in-the-browser). + +### 🚚 Support for multiple Transports - TCP, WebSockets, WebRTC and more + +Use one of the already supported Transports or build your own! libp2p is the perfect platform for innovation. Learn more at [Transports](https://github.com/libp2p/js-libp2p/tree/master/examples/transports). + +### ⚡️ Protocol & Stream Multiplexing + +One of the specialties of libp2p is solving the bane of protocol discovery and handshake between machines. With libp2p you don't need to assign ports before hand and you don't even need to think about ports at all since all the protocol handshaking happens in the wire! [Learn how](https://github.com/libp2p/js-libp2p/tree/master/examples/protocol-and-stream-muxing). + +### 🔒 End-to-End Encryption + +Connections in libp2p are E2E encrypted and authenticated. This should be a default setting for every interaction happening in Public Networks. [Learn More](https://github.com/libp2p/js-libp2p/tree/master/examples/encrypted-communications). + +### 💬 PubSub + +libp2p nodes can create network topologies based on topics of interest to broadcast events in Realtime. [Check out the PubSub Tutorial](https://github.com/libp2p/js-libp2p/tree/master/examples/pubsub). + +### 🛣 Peer & Content Routing + +Peer & Content Routing (aka DHTs) is part of the stack too! Find other peers in the network or who is storing a specific piece of content through these primitives. [Learn how in the full example](https://github.com/libp2p/js-libp2p/tree/master/examples/peer-and-content-routing). + +### 📖 API Documentation + +Check the full API documentation on the [README of the js-libp2p repo](https://github.com/libp2p/js-libp2p). + +### 📦 All the libp2p modules in one place + +Check out the [Packages Table](https://github.com/libp2p/js-libp2p#packages) to learn about all the js-libp2p pieces and their status. + +# 🏗 API Changes + +This is an informative release, no new API changes have been introduced + +# 🙌🏽Want to contribute? + +Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/libp2p/js-libp2p?label=help%20wanted +- Join an IPFS/libp2p All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with libp2p and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽 ](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about libp2p, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #libp2p channel on Freenode. + +That is all for this post. Thank you for being part of the community. + +I bid you a good day! diff --git a/src/_blog/031-js-ipfs-0.31/README.md b/src/_blog/031-js-ipfs-0.31/README.md new file mode 100644 index 00000000..ad41916a --- /dev/null +++ b/src/_blog/031-js-ipfs-0.31/README.md @@ -0,0 +1,55 @@ +--- +date: 2018-07-29 +url: /42-js-ipfs-0-31/ +title: js-ipfs 0.31.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +Restoring IPFS magic one alakazam at a time...no we're not talking pokemon. + + + + +# 🔦 Highlights + +## 🧚 Connectivity Magic + +Recent infrastructure changes to the nodes IPFS runs as gateways meant that they couldn't be used as bootstrapper nodes. This was bad news bears for `js-ipfs` since it doesn't yet have a DHT to discover content. So not being able to connect to the nodes that have a lot of the content meant the chances of `js-ipfs` finding content on the network took a turn for the worse. + +Good news though! Brand new dedicated nodes have been provisioned that are connected to the gateway nodes and can be used by `js-ipfs` to bootstrap itself as well as, get this, preload content you add to IPFS! That's right, when you add stuff to your IPFS, the preload nodes are prompted to slerp it up automatically so that it can be shared instantly with other IPFS nodes on the network. + +## 🌿 Raw Leaves + +Raw leaves are much healthier for you because they don't lose their vitamins during the cooking process. Seriously though. They're great if you want to stream raw data (like video) out of your IPFS without the overhead of unpacking protobufs. They're also useful when you need to put your data in a data store that only deals with raw data, like a URL. + +We have these now! Just pass `--raw-leaves=true` when adding content to IPFS and leaves of the DAG(s) you create will contain just the raw data. + +# 🏗 API Changes + +- A new configuration property `preload` has been added to the options provided to the IPFS constructor. Content added to IPFS using the following APIs will be automatically preloaded on a set of IPFS nodes. To lean more about how to configure this feature, check the [IPFS constructor docs](https://github.com/ipfs/js-ipfs#ipfs-constructor). + - `dag.put` + - `block.put` + - `object.new` + - `object.put` + - `object.patch.*` + - `files.add*` + - `files.write` + - `files.mv` + - `files.cp` +- The `--raw-leaves` option has been enabled for `files.add` + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. diff --git a/src/_blog/032-js-ipfs-0.32/README.md b/src/_blog/032-js-ipfs-0.32/README.md new file mode 100644 index 00000000..4dd3628b --- /dev/null +++ b/src/_blog/032-js-ipfs-0.32/README.md @@ -0,0 +1,57 @@ +--- +date: 2018-09-11 +url: /43-js-ipfs-0-32/ +title: js-ipfs 0.32.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +A pinch of IPNS, some chunking of files and you'll have a delicious IPFS stew for supper. + + + + +# 🔦 Highlights + +## 📛 IPNS locally + +IPNS has it's foot in the door, and it's coming in! In this release IPNS works for your local node. It means you can now [publish](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/NAME.md#namepublish) records to your local repo and [read](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/NAME.md#nameresolve) them back. There's still some way to go but you know the saying right, "from small beginnings comes great IPNS"? + +## 🕵️‍♀️ Partial `ipfs.resolve` + +In preparation for IPNS landing, we've rolled out a partial implementation of the [`resolve`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/MISCELLANEOUS.md#resolve) command. The idea of the resolve command is to figure out the underlying hash of the content referred to by an IPNS name or an IPFS path. + +The new resolve command can resolve paths like `/ipfs/QmRootHash/path/to/file` to `/ipfs/QmFileHash` and will soon be able to deal with IPNS names in an upcoming release. + +## 📦 libp2p bundle function + +We made it even easier to create your libp2p bundle! If you're looking to create a completely custom libp2p bundle then you can now pass a [function in place of your libp2p config](https://github.com/ipfs/js-ipfs#optionslibp2p) which should return your libp2p bundle. It's passed useful information like the IPFS node peer ID so you should be able to build your bundle exactly the way you want! You're welcome 😁 + +## 🥒 Support for chunking algorithm + +Slice and dice your DAG nodes the way _you_ want™️. When adding data to your IPFS node you can now specify the size of the chunks it creates from your data or even use [`rabin` fingerprinting](https://en.wikipedia.org/wiki/Rabin_fingerprint) to create some fancy variable length chunks for better deduping. + +[Rabin](https://www.npmjs.com/package/rabin) is a native module and must be compiled on your system when you run `npm install ipfs`. Native modules depend on specific [languages and tools](https://github.com/nodejs/node-gyp#installation) to be pre-installed on your computer and because of this has been made an [optional dependency](https://docs.npmjs.com/files/package.json#optionaldependencies). That means that it's 👌 if it fails to install, it just won't be available to use in IPFS. If you're thinking of using rabin chunking then be sure to check that it installed properly in your install logs. + +Check out the docs for the [`files.add` `chunker` option](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#filesadd) for more. + +# 🏗 API Changes + +- Added `ipfs.name.publish` and `ipfs.name.resolve`. This only works on your local node for the moment until the DHT lands. [API docs can be found here](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/NAME.md). +- Added `ipfs.resolve` API. Note that this is a partial implementation allowing you to resolve IPFS paths like `/ipfs/QmRootHash/path/to/file` to `/ipfs/QmFileHash`. It does not support IPNS yet. +- `ipfs.files.add*` now supports a `chunker` option, see [the API docs](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#filesadd) for details + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. diff --git a/src/_blog/033-ipld-explorer-cli-0.14/README.md b/src/_blog/033-ipld-explorer-cli-0.14/README.md new file mode 100644 index 00000000..0cff6ba5 --- /dev/null +++ b/src/_blog/033-ipld-explorer-cli-0.14/README.md @@ -0,0 +1,61 @@ +--- +date: 2018-09-12 +url: /44-ipld-explorer-cli-0-14/ +title: ipld-explorer-cli 0.14 released +description: +author: Alan Shaw +--- + +There's a new version of the [ipld-explorer-cli](http://npm.im/ipld-explorer-cli) tool for exploring [IPLD](https://ipld.io/) data! Let's break down those acronyms and explain why I'm so excited about this. + +[IPLD (Inter Planetary Linked Data)](https://ipld.io/) is the underlying data structure used by IPFS that allows it to store, retrieve and traverse through any type of content-addressed data. Recently, our team created the awesome new [IPLD Explorer](https://explore.ipld.io) so you can visually explore IPLD objects. If you haven't already checked it out, hop over and explore everything from [git repos](https://explore.ipld.io/#/explore/z8mWaJHXieAVxxLagBpdaNWFEBKVWmMiE) to [ethereum blocks](https://explore.ipld.io/#/explore/z43AaGEvwdfzjrCZ3Sq7DKxdDHrwoaPQDtqF4jfdkNEVTiqGVFW) to [historic photo archives of the lunar landings](https://explore.ipld.io/#/explore/QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D) to your own IPLD data. + +The IPLD Explorer also comes with a command-line interface ([ipld-explorer-cli](https://www.npmjs.com/package/ipld-explorer-cli)) so you can explore with your keyboard. I was inspired to give it an upgrade so that it could resolve IPLD formats other than `dag-pb` and `dag-cbor`, like `git-raw` and `ethereum-block`. It also now works with a `js-ipfs` daemon if you have one running (you’ll need to update the API address using the "config" command). + +Here's a quick demo video: + +

+ +

+ +### Installing and using the new CLI + +Ensure you have at least: + +- [Node.js](https://nodejs.org/en/download/) + +Install the module globally: + +``` +$ npm i -g ipld-explorer-cli +``` + +Then, launch the interactive shell: + +``` +$ ipld-explorer +``` + +You'll see instructions to explore sample datasets and begin traversing the Merkle forest 🌲🌲🌲. You can also start a [js-ipfs daemon](https://github.com/ipfs/js-ipfs#ipfs-daemon) to explore your own data. Enjoy! + +# 💬 Feedback or bugs? + +Do you have feedback for us, or bugs to report? Please open an issue: https://github.com/tableflip/ipld-explorer-cli/issues + +# 🙌🏽 Want to contribute to this CLI tool? + +Check out the issues marked `good first issue` and let us know where you would like to begin! https://github.com/tableflip/ipld-explorer-cli/issues + +# 🙌🏽 Want to contribute to IPFS? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. diff --git a/src/_blog/034-js-ipfs-0.33/README.md b/src/_blog/034-js-ipfs-0.33/README.md new file mode 100644 index 00000000..ba65f1ec --- /dev/null +++ b/src/_blog/034-js-ipfs-0.33/README.md @@ -0,0 +1,63 @@ +--- +date: 2018-11-01 +url: /51-js-ipfs-0-33/ +title: js-ipfs 0.33.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +All new Web UI - Check on your node stats, explore the IPLD powered Merkle forest, see peers around the world and manage your files, without needing to touch the CLI. + + + + +# 🔦 Highlights + +## 🕹 Web UI 2.0 + +The IPFS Web UI has been given a HUGE revamp and is now 10x, no, 100x better than before! 😄 + +- **Check the status** of your node, it's Peer ID and connection info, the network traffic and the number of connected peers +- Easily **manage files** in your IPFS repo. You can drag and drop to add files, move and rename them, delete, share or download them +- You can **explore IPLD data** that underpins how IPFS works +- See all of your **connected peers**, geolocated by their IP address +- **Review the settings** for your IPFS node, and update them to better suit your needs + +![Screenshot of the status page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-status.png) + +| Files | Explore | Peers | Settings | +| ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| ![Screenshot of the file browser page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-files.png) | ![Screenshot of the IPLD explorer page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-explore.png) | ![Screenshot of the swarm peers map](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-peers.png) | ![Screenshot of the settings page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-settings.png) | + +## 🛠 CID tool + +A command line tool for converting, formatting and discovering properties of CIDs. + +In the near future IPFS will be switching it's [**default** CID version for added content to version 1 and will use base 32 encoding for serialized CIDs](https://github.com/ipfs/go-ipfs/issues/4143). This tool gives you the power to inspect and learn about CIDs as well as convert any CIDs you've been using from whatever base they're encoded in to a different base! + +- [Documentation](https://github.com/ipfs-shipyard/js-cid-tool) +- [Demo video](https://youtu.be/SMhy99yUVGk?t=299) + +# 🏗 API Changes + +- Added CLI command `ipfs cid [sub-command]` + - View the help with `ipfs cid --help` or view the [documentation online](https://github.com/ipfs-shipyard/js-cid-tool) +- `ipfs.types.dagCBOR` and `ipfs.types.dagPB` have been removed + - See [#1626](https://github.com/ipfs/js-ipfs/pull/1626) and [#374](https://github.com/ipfs/interface-ipfs-core/pull/374#pullrequestreview-164611060) for more information +- `dag-cbor` nodes retrieved from `ipfs.dag.get` now represent links as [CID](https://github.com/ipld/js-cid) instances not `{"/": "base-encoded-cid"}` objects + - See [#1668](https://github.com/ipfs/js-ipfs/pull/1668) for more information + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. diff --git a/src/_blog/035-go-ipfs-0-4-18/README.md b/src/_blog/035-go-ipfs-0-4-18/README.md new file mode 100644 index 00000000..9541ad88 --- /dev/null +++ b/src/_blog/035-go-ipfs-0-4-18/README.md @@ -0,0 +1,319 @@ +--- +date: 2018-11-07 +url: /53-go-ipfs-0-4-18/ +title: go-ipfs 0.4.18 released +description: +author: Steven Allen and Erik Ingenito +--- + +[go-ipfs 0.4.18](https://dist.ipfs.io/#go-ipfs) has been released! This is one of largest go-ipfs releases to date; 3 months in the making. _Thanks to all our contributors for your awesome work!_ + +## ✨ Highlights + +The headline features this release are: + +- **[Experimental QUIC support](#quic)** - for faster and more efficient peer connections, better handling of lossy + networks and improved NAT traversal. + +- **[Gossipsub pubsub routing algorithm](#pubsub)** - dramatically more efficient pubsub on IPFS, along with signed + messages + +- **[Updated WebUI](#webui)** - a big update to the IPFS WebUI with expanded features and information across the board + +- **[Enhanced `p2p`, `cid` and `add`](#commands-changes)** - refactors and new features to a number of IPFS + commands. + +- **[Performance](#performance)** - numerous performance and efficiency improvements in a number of IPFS subsystems. + IPFS is faster, smaller and more reliable. + +- **[And a lot more!](#refactors-and-endeavors)** + +## 🏃 QUIC + +First up, on the networking front, this release introduced experimental +support for the QUIC protocol. QUIC is a new UDP-based network transport that +solves many of the long standing issues with TCP. + +For us, this means (eventually): + +- **Fewer local resources** - TCP requires a file-descriptor per connection while + QUIC (and most UDP based transports) can share a single file descriptor + between all connections. This should allow us to dial faster and keep more + connections open. +- **Faster connection establishment** - When client authentication is included, QUIC + has a three-way handshake like TCP. However, unlike TCP, this handshake brings + us all the way from 0 to a fully encrypted, authenticated, and + multiplexed connection. In theory (not yet in practice), this should + significantly reduce the latency of DHT queries which will improve a number of IPFS operations like adding and + getting large volumes of data. +- **Behaves better on lossy networks** - When multiplexing multiple requests over a + single TCP connection, a single dropped packet will bring the entire + connection to a halt while the packet is re-transmitted. However, because QUIC + handles multiplexing internally, dropping a single packets affects only the + related stream. +- **Better NAT traversal** - NAT hole-punching is significantly easier and, in + many cases, more reliable with UDP than with TCP. + +However, we still have a long way to go. While we encourage users to test this, +the IETF QUIC protocol is still being actively developed and _will_ change. You can find instructions for enabling it [here](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#QUIC). + +## 📨 Pubsub + +go-ipfs now supports the [gossipsub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) routing algorithm and message signing. + +The gossipsub routing algorithm is _significantly_ more efficient than the +current floodsub routing algorithm. Even better, it's fully backwards compatible +so you can enable it and still talk to nodes using the floodsub algorithm. You +can find instructions to enable gossipsub in go-ipfs +[here](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#gossipsub). + +Messages are now **signed by their authors**. While signing is now +enabled by default, strict signature verification has not been and will not be +for at least one release (probably multiple) to avoid breaking existing +applications. You can read about how to configure this feature +[here](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#message-signing). + +## 🎛 Commands Changes + +In terms of new toys, this release introduces 1) the`ipfs cid` subcommand for +working with CIDs, 2) a completely refactored `ipfs p2p` command, 3) streaming name +resolution, and 4) inline block support. + +#### 1. `ipfs cid` + +The new `ipfs cid` command allows users to both inspect CIDs and convert them +between various formats and versions. Here are some examples: + +```sh +# Print out the CID metadata (prefix) +> ipfs cid format -f %P QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +cidv0-protobuf-sha2-256-32 + +# Get the hex sha256 hash from the CID. +> ipfs cid format -b base16 -f '0x%D' QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +0x46d44814b9c5af141c3aaab7c05dc5e844ead5f91f12858b021eba45768b4c0e + +# Convert a base58 v0 CID to a base32 v1 CID. +> ipfs cid base32 QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +bafybeicg2rebjoofv4kbyovkw7af3rpiitvnl6i7ckcywaq6xjcxnc2mby +``` + +#### 2. `ipfs p2p` + +The refactored `ipfs p2p` command allows forwarding TCP streams through two IPFS +nodes from one host to another. It's `ssh -L` but for IPFS. +**It's still experimental** but we don't expect too many breaking changes after this +point (it will very likely be stabilized in the next release). + +Here's a quick summary of the breaking changes in this release: + +- We don't stop listening for local (forwarded) connections after accepting a + single connection. +- `ipfs p2p stream ls` output now returns more useful output, first address is + always the initiator address. +- `ipfs p2p listener ls` is renamed to `ipfs p2p ls` +- `ipfs p2p listener close` is renamed to `ipfs p2p close` +- Protocol names have to be prefixed with `/x/` and are now just passed to + libp2p as handler name. Previous version did this 'under the hood' and with + `/p2p/` prefix. There is a `--allow-custom-protocol` flag which allows you + to use any libp2p handler name. +- `ipfs p2p listener open` was renamed to `ipfs p2p listen` +- `ipfs p2p stream dial` got renamed to `ipfs p2p forward` + +You can find documentation [here](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#ipfs-p2p), +but here's a quick example of connecting the WebUI of a remote IPFS node: + +```sh +# On the 'remote' IPFS host +> ipfs id -f "\n" +QmSiXjrYwLmDhRvAb3vK2TUP8W2pTDd34MhgCwpanVjdNT + +# Configure the p2p listener on the remote IPFS instance: +> ipfs p2p listen /x/kickass/1.0 /ip4/127.0.0.1/tcp/5001 + +# On the 'local' IPFS host +# Configure the p2p forwarder on the local host: +> ipfs p2p forward /x/kickass/1.0 /ip4/127.0.0.1/tcp/5551 /ipfs/QmSiXjrYwLmDhRvAb3vK2TUP8W2pTDd34MhgCwpanVjdNT + +# Voila - point your browser at http://localhost:5551/webui to inspect your remote +``` + +#### 3. `ipfs name resolve` streaming response + +There is now a new flag for `ipfs name resolve` - `--stream`. When the command +is invoked with the flag set, it will start returning results as soon as they +are discovered in the DHT and other routing mechanisms. This enables certain +applications to start prefetching/displaying data while the discovery is still +running. Note that this command will likely return many outdated records +before it finding and returning the latest. However, it will always return +_valid_ records (even if a bit stale). + +#### 4. `ipfs add` block inlining + +In the previous release, we added support for extracting blocks inlined +into CIDs. In this release, we've added support for creating these CIDs. You can +now run `ipfs add` with the `--inline` flag to inline blocks less than or equal +to 32 bytes in length into a CID, instead of writing an actual block. This +should significantly reduce the size of filesystem trees with many empty +directories and tiny files. + +## 🌐 WebUI + +This release includes the latest, very shiny [updated webui](https://github.com/ipfs-shipyard/ipfs-webui). You can view it by +installing go-ipfs and visiting http://localhost:5001/webui. It deserves its own release note - oh look, it [got +one](./51-js-ipfs-0-33/#web-ui-2-0)! Here's a peek: + +![Screenshot of the status page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-status.png) + +| Files | Explore | Peers | Settings | +| ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| ![Screenshot of the file browser page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-files.png) | ![Screenshot of the IPLD explorer page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-explore.png) | ![Screenshot of the swarm peers map](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-peers.png) | ![Screenshot of the settings page](https://raw.githubusercontent.com/ipfs-shipyard/ipfs-webui/master/docs/screenshots/ipfs-webui-settings.png) | + +Kudos and thanks to the webui team! 👏 + +## ⚡️ Performance + +This release includes some significant performance improvements, both in terms of resource utilization and speed particularly when transferring lots of small files (or blocks). This section will go into some technical details so feel free to skip it if you're just looking for shiny new features. + +### Resource Utilization + +In this release, we've (a) fixed a slow memory leak in libp2p and (b) +significantly reduced the allocation load. Together, these should improve both +memory and CPU usage. How much you ask? Glad you asked. + +![gc-latency](img/gc-latency.png) + +Above is a graph of time our IPFS gateway nodes spend in GC. See the awesome looking light blue line at the bottom? That's the node running 0.4.18. IKR? + +![cpu-load](img/cpu-load.png) + +This graph of time spent in execution has greater variability but the improvement is still pretty clear. You want the +light blue one. + +#### Datastructures + +We've changed two of our most frequently used datastructures, CIDs and +Multiaddrs, to reduce allocation load. + +First, we now store CIDs _encoded_ as strings, instead of decoded in structs +(behind pointers). In addition to being more compact, our `Cid` type is now a +valid `map` key so we no longer have to encode CIDs every time we want to use +them in a map/set. Allocations when inserting CIDs into maps/sets was showing up +as a significant source of allocations under heavy load so this change should +improve memory usage. + +Second, we've changed many of our multiaddr parsing/processing/formatting +functions to allocate less. Much of our DHT related-work includes processing +multiaddrs so this should reduce CPU utilization when heavily using the DHT. + +#### Streams and Yamux + +Streams have always plagued us in terms of memory utilization. This was +partially solved by introducing the connection manager, keeping our maximum +connection count to a reasonable number but they're still a major memory sink. + +This release sees two improvements on this front: + +1. A memory [leak in identify](https://github.com/libp2p/go-libp2p/issues/419) + has been fixed. This was slowly causing us to leak connections (locking up + the memory used by the connections' streams). +2. Yamux streams now use a buffer-pool backed, auto shrinking read buffer. + Before, this read buffer would grow to its maximum size (a few megabytes) and + never shrink, but **now** these buffers shrink as they're emptied and **free up space efficiently**. + +### Bitswap Performance + +Bitswap will now pack _multiple_ small blocks into a single message thanks to +[ipfs/go-bitswap#5](https://github.com/ipfs/go-bitswap/pull/5). While this won't +help when transferring large files (with large blocks), this should help when +transferring many tiny files. + +## 🛠 Refactors and Endeavors + +This release saw yet another commands-library refactor, work towards the +CoreAPI, and the first step towards reliable base32 CID support. + +### Commands Lib + +We've completely refactored our commands library (again). While it still needs +quite a bit of work, it now requires significantly less boilerplate and should +be significantly more robust. The refactor immediately found two broken tests +and probably fixed quite a few bugs around properly returning and handling +errors. + +### CoreAPI + +CoreAPI is a new way to interact with IPFS from Go. While it's still not +final, most things you can do via the CLI or HTTP interfaces can now be done +through the new API. + +Currently only the Go implementation exists, but there are plans to expose the new API via HTTP soon. +We are also looking into creating an RPC interface to this API which could help performance in some use cases. + +You can track progress in https://github.com/ipfs/go-ipfs/issues/4498 + +### CIDv1/Base32 Migration + +We're continuing work to upgrade our default CID format to Base32 while preserving compatibility with existing CIDs. We +need this change to improve the security of IPFS content in browsers. Currently, IPFS is usually used in browsers by browsing to `https://SOME_GATEWAY/ipfs/CID/...`. There are two significant drawbacks to this approach: + +1. From a browser security standpoint, all IPFS "sites" will live under the same + origin (SOME_GATEWAY). +2. From a UX standpoint, this doesn't feel very "native" (even if the gateway is + a local IPFS node). + +To fix the security issue, we intend to switch IPFS gateway links +`https://ipfs.io/ipfs/CID` to `https://CID.ipfs.dweb.link`. This way, the CID +will be a part of the +["origin"](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin) so +each IPFS website will get a separate security origin. + +To fix the UX issue, we've been working on adding support for `ipfs://CID/...` +to web browsers through our +[ipfs-companion](https://github.com/ipfs/ipfs-companion/) add-on and some new, +experimental extension APIs from Mozilla. This has the same effect of putting +the CID in the URL origin but has the added benefit of looking "native". + +Unfortunately, origins must be _case insensitive_. Currently, the most common CIDs +are _CIDv0_ CIDs (those starting with `Qm`) which are _always_ base58 +encoded and are therefore case-sensitive. + +Fortunately, CIDv1 (the latest CID format) supports arbitrary bases using the +[multibase](https://github.com/multiformats/multibase/) standard. Unfortunately, +IPFS has always treated equivalent CIDv0 and CIDv1 CIDs as distinct. This means +that files added with CIDv0 CIDs (the default) can't be looked up using the +equivalent CIDv1. + +This release makes some significant progress towards solving this issue by +introducing two features: + +(1) The previous mentioned `ipfs cid base32` command for converting a CID to a +case insensitive encoding required by domain names. This command converts an existing base58 CIDv0 to +a CIDv1 encoded using base32. + +(2) A hack to allow locally looking up blocks associated with a CIDv0 CID using +the equivalent CIDv1 CID (or the reverse). This hack will eventually +be replaced with a multihash indexed blockstore, which is agnostic to both the +CID version and multicodec content type. + +## 📋 Full Changelog + +As always, you can find the full (massive) changelog over at ipfs/go-ipfs's Github +repository: +https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#go-ipfs-changelog-1 + +## 🙌 Contributing + +Would you like to help contribute to the go-ipfs project? + +- Join us on Github at https://github.com/ipfs/go-ipfs where you can find out more about the project. +- Check the issues with the help wanted label at the Ready column in our waffle board - https://waffle.io/ipfs/go-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute or any cool demos of what you've built - https://github.com/ipfs/pm/#all-hands-call +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [Go Core Dev Team Weekly Sync](https://github.com/ipfs/pm/issues/674) 🙌🏽 and be part of the Sprint action! + +## ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it, is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. + +Thanks! diff --git a/src/_blog/036-js-libp2p-0.24/README.md b/src/_blog/036-js-libp2p-0.24/README.md new file mode 100644 index 00000000..96d73bca --- /dev/null +++ b/src/_blog/036-js-libp2p-0.24/README.md @@ -0,0 +1,46 @@ +--- +date: 2018-11-16 +url: /55-js-libp2p-0-24/ +title: js-libp2p 0.24.0 released +description: +author: Jacob Heun +--- + + + + +# 🔦 Highlights + +## 🚦 Custom Content/Peer Routing Support + +Libp2p will now support custom content and peer routers, which will enable users to better customize their DHT experience. The new release allows for using the new [Delegated Peer Routing](https://github.com/libp2p/js-libp2p-delegated-peer-routing) and [Delegated Content Routing](https://github.com/libp2p/js-libp2p-delegated-content-routing) modules to leverage an external node's DHT instead of or in conjunction with their own. This enables nodes in more resource restricted environments to use an external DHT instead of running their own, which can be very resource intensive. + +## 🔌 Relay enabled by default + +In an effort to improve default connectivity, circuit relay is now enabled by default. Hop is still disabled by default to prevent relaying traffic for other nodes out of the box, as this is expensive for the node. By enabling circuit relay by default, nodes will now be able to accept and dial to other circuit relay nodes. This improves a nodes default ability to communicate in isolated environments. + +## 🤖 State Machine + +Libp2p is now a state machine. When starting and stopping the node you can now listen for the `stop` and `start` events. Libp2p also exposes a new method, `dialFSM`, which calls back with a [Connection State Machine](https://github.com/libp2p/js-libp2p-switch#connection-state-machine). This gives users the ability to listen to more events on individual connections. You can find out more about these events in [libp2p-switch readme](https://github.com/libp2p/js-libp2p-switch#connection-state-machine). + +# 🏗 API Changes + +- Added method `dialFSM(peer, protocol, callback)` which allows users to hook into more connection level activity. You can read more about it in the [readme](https://github.com/libp2p/js-libp2p#libp2pdialfsmpeer-protocol-callback). +- Libp2p now emits `start` and `stop` events on node start and stop respectively. + - Callbacks for `.start()` and `.stop()` are now optional. You can instead listen to the `error`, `start`, and `stop` events. + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/libp2p/js-libp2p?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽 ](https://github.com/ipfs/team-mgmt/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about libp2p, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #libp2p channel on Freenode. + +That's all for now! diff --git a/src/_blog/037-http-client-rename/README.md b/src/_blog/037-http-client-rename/README.md new file mode 100644 index 00000000..4c2fe62b --- /dev/null +++ b/src/_blog/037-http-client-rename/README.md @@ -0,0 +1,19 @@ +--- +date: 2018-12-03 +url: /58-http-client-rename/ +title: The HTTP client libraries are being renamed! +description: +author: Alan Shaw +--- + +👋 hey everyone! If you're using one of the many HTTP client libraries for IPFS then this blog post is for you! + +The important news is that we're renaming the HTTP client libraries from `ipfs-api` to `ipfs-http-client`. I know, it's longer. BUT, and hear me out - it's SOOO much better at describing what the module is. + +In the past people have been baffled and outraged thinking `ipfs-api` is THE implementation of IPFS, when it's not, it's just a client to the HTTP API that IPFS exposes. We finally said, "Enough is enough! The people have been confused for far too long and we must change the name! We owe them this much!", and with the utterance of those fabled words the gears were set in motion and this very blog post was committed to ~~stone~~ Github. + +The JS module is DONE! You can still install `ipfs-api` with npm, but you'll get a deprecation notice and no further updates will be published under that name. + +Use `npm install ipfs-http-client` from now on! Don't delay ⏰, update your `package.json`'s today! + +You can also check on the progress over at https://github.com/ipfs/ipfs/issues/374 diff --git a/src/_blog/038-js-ipfs-0.34/README.md b/src/_blog/038-js-ipfs-0.34/README.md new file mode 100644 index 00000000..7f8b9d96 --- /dev/null +++ b/src/_blog/038-js-ipfs-0.34/README.md @@ -0,0 +1,312 @@ +--- +date: 2019-01-17 +url: /64-js-ipfs-0-34/ +title: js-ipfs 0.34.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +> Speed and flexibility, new IPFS for a new year! + + + + +# 🔦 Highlights + +## 🏎 Reading Protobuf DAG nodes is super fast + +Reading Protobuf DAG nodes just got a serious speed boost as well as a memory reduction. Previously Protobuf DAG nodes (dag-pb nodes for short) carried a multihash property (a [CIDv0](https://docs.ipfs.io/guides/concepts/cid/#version-0)) with them. This used up loads of CPU time calculating the hash for a given node as it was retrieved from storage and with the advent of [CIDv1](https://docs.ipfs.io/guides/concepts/cid/#version-1) there was no guarantee the hashing algorithm and length were correct. + +So, we removed it! 🦖 ...but that had the unfortunate consequence of making the object API a whole lot less useful when writing data - the DAG nodes you got back were basically the data you put in. Hence the object API was refactored to return CIDs instead of DAG nodes for write operations...and we all lived happily ever after. + +## 🚤 Adding content is blazingly fast + +We found a bottleneck that meant the bigger the file you added to IPFS, the longer it would take - oh no 😭! Good news folks, we've seen the speed of adding large files increase by 50% or more in some cases! 💥 + +Read all about it in [the pull request notes](https://github.com/ipfs/js-ipfs-unixfs-importer/pull/10). + +## 🎄 HAMT support added to MFS + +We're putting the whole of npm on IPFS! These days npm is like 5.3 terabytes of data and it's all going in [MFS](https://docs.ipfs.io/guides/concepts/mfs/). This is super rad, but we needed a good sharding strategy because 5TB is a lorra lorra files. + +If you're curious about npm on IPFS, check out the [project here](https://github.com/ipfs-shipyard/npm-on-ipfs). + +## 📣 IPNS over pubsub and DHT + +Get informed of [IPNS](https://docs.ipfs.io/guides/concepts/ipns/) record updates and read and publish your IPNS records to the DHT. It's all there and it's all awesome. For those of you new to IPNS, let me give you the lowdown - IPNS puts the mutable in immutable 🤣 It's an age old problem, content addressing is rad and all that, but if I change something the hash changes - 👎 boo...but wait, IPNS solves this, you get a permenant address for changeable content - hooray \o/. + +IPNS over pubsub gets the word out quicker to peers that are interested when an IPNS record changes. IPNS over DHT allows peers to find and resolve your IPNS address to some content in the first place! In the next JS IPFS release (0.35) the DHT will be enabled by default and it's going to be epic. + +## ⚾️ CID handling improvements + +Smoosh your CIDs into whatever version you like - you can now add data under a version 0 CID and get it back using a version 1 CID and vice versa. Now that you have this freedom you can encode them with whatever multibase encoding you like. Version 0 CIDs are all base58btc but if you convert to a version 1 CID you can encode it with base2, base32, base64url or whatever: + +```console +# base2 +010111000000010010001000000100011011010100010010000001010010111001110001011010111100010100000111000011101010101010101101111100000001011101110001011110100001000100111010101101010111111001000111110001001010000101100010110000001000011110101110100100010101110110100010110100110000001110 +# base32 +bafybeicg2rebjoofv4kbyovkw7af3rpiitvnl6i7ckcywaq6xjcxnc2mby +# base58btc +QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o +# base64url +uAXASIEbUSBS5xa8UHDqqt8BdxehE6tX5HxKFiwIeukV2i0wO +``` + +This is all work to smooth out the eventual transition to base32 CIDv1 by default - a move to allow CIDs to be used as valid URL origins. Have a [read of this for more](https://blog.ipfs.io/53-go-ipfs-0-4-18/#cidv1-base32-migration). + +To help you craft your artisanal CIDs we've introduced a `--cid-base` option to a bunch of CLI commands (and `?cid-base` option to a bunch of HTTP API endpoints). Check it out: + +```sh +jsipfs add file.txt --cid-base=base32 +added bafybeibns4lrebrxaymvyshgmki5biwh6cd53idxfpen6ysomzrywtsm44 file.txt +``` + +## 💪 Deps got upgrades! + +We got you covered with [WebUI 2.3](https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v2.2.0) (quic support, responsive navbar, and a language selector), [libp2p 0.24](https://blog.ipfs.io/55-js-libp2p-0-24/) and many other upgrades giving you a faster and smaller JS IPFS. + +# 🏗 API Changes + +- Object API methods that write DAG nodes now return a [CID](https://www.npmjs.com/package/cids) instead of a DAG node. Affected methods: + - `ipfs.object.new` + - `ipfs.object.patch.addLink` + - `ipfs.object.patch.appendData` + - `ipfs.object.patch.rmLink` + - `ipfs.object.patch.setData` + - `ipfs.object.put` + - [More info](https://github.com/ipfs/js-ipfs-api/pull/896) +- `DAGNode` instances, which are part of the IPLD dag-pb format have been refactored. These instances no longer have `multihash`, `cid` or `serialized` properties. This effects the following API methods that return these types of objects: + - `ipfs.object.get` + - `ipfs.dag.get` + - [More info](https://github.com/ipld/js-ipld-dag-pb/pull/99) +- Files API methods `add*`, `cat*`, `get*` have moved from `files` to the root namespace. Specifically, the following changes have been made: + - `ipfs.files.add` => `ipfs.add` + - `ipfs.files.addPullStream` => `ipfs.addPullStream` + - `ipfs.files.addReadableStream` => `ipfs.addReadableStream` + - `ipfs.files.cat` => `ipfs.cat` + - `ipfs.files.catPullStream` => `ipfs.catPullStream` + - `ipfs.files.catReadableStream` => `ipfs.catReadableStream` + - `ipfs.files.get` => `ipfs.get` + - `ipfs.files.getPullStream` => `ipfs.getPullStream` + - `ipfs.files.getReadableStream` => `ipfs.getReadableStream` +- New core files API methods added: + - [`ipfs.addFromStream`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#addfromstream) + - [`ipfs.addFromUrl`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#addfromurl) + - [`ipfs.addFromFs`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#addfromfs) +- DHT API methods renamed and return types changed + - `ipfs.dht.findprovs` renamed to `ipfs.dht.findProvs` and returns an array of [PeerInfo](https://github.com/libp2p/js-peer-info) + - `ipfs.dht.findpeer` renamed to `ipfs.dht.findPeer` and returns a [PeerInfo](https://github.com/libp2p/js-peer-info) + - `ipfs.dht.query` now returns an array of [PeerInfo](https://github.com/libp2p/js-peer-info) + - [More info](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/DHT.md) +- A new option is available in the CLI, HTTP API and core that will allow the multibase encoding to be specified for any CIDs that are returned as strings. + - A `--cid-base` option has been added to the following **CLI commands**: + - `jsipfs bitswap stat` + - `jsipfs bitswap unwant` + - `jsipfs bitswap wantlist` + - `jsipfs block put` + - `jsipfs block stat` + - `jsipfs add` + - `jsipfs ls` + - `jsipfs object get` + - `jsipfs object links` + - `jsipfs object new` + - `jsipfs object patch add-link` + - `jsipfs object patch append-data` + - `jsipfs object patch rm-link` + - `jsipfs object patch set-data` + - `jsipfs object put` + - `jsipfs object stat` + - `jsipfs pin add` + - `jsipfs pin ls` + - `jsipfs pin rm` + - `jsipfs resolve` + - Note: these two MFS commands _already_ implement the `--cid-base` option: + - `jsipfs files ls` + - `jsipfs files stat` + - A `?cid-base=` query option has been added to the following **HTTP endpoints**: + - `/api/v0/bitswap/wantlist` + - `/api/v0/bitswap/stat` + - `/api/v0/bitswap/unwant` + - `/api/v0/block/put` + - `/api/v0/block/stat` + - `/api/v0/add` + - `/api/v0/ls` + - `/api/v0/object/new` + - `/api/v0/object/get` + - `/api/v0/object/put` + - `/api/v0/object/stat` + - `/api/v0/object/links` + - `/api/v0/object/patch/append-data` + - `/api/v0/object/patch/set-data` + - `/api/v0/object/patch/add-link` + - `/api/v0/object/patch/rm-link` + - `/api/v0/pin/ls` + - `/api/v0/pin/add` + - `/api/v0/pin/rm` + - `/api/v0/resolve` + - A `cidBase` option has been added to the following **core functions**: + - `resolve` + - **NOTE** Using the CID base option in `bitswap`, `dag` and `object` APIs **WILL NOT** auto upgrade your CID to v1 if it is a v0 CID and **WILL NOT** apply the encoding you specified. This is because these APIs return IPLD objects with links and changing the version of the links would result in a different hash for the node if you were to re-add it. Also, the CID you used to retrieve the node wouldn't actually refer to the node you got back any longer. [Read this](https://github.com/ipfs/go-ipfs/issues/5349#issuecomment-445104823) for further context. +- All API methods that returned [`big.js`](https://github.com/MikeMcl/big.js/) instances now return [`bignumber.js`](https://github.com/MikeMcl/bignumber.js/) instances. + +# ❤️ Huge thank you to everyone that made this release possible + +By alphabetical order, here are all the humans that contributed to the release: + +- [Aakil Fernandes](https://github.com/aakilfernandes) (1 comment) +- [Alan Shaw](https://github.com/alanshaw) (54 PRs, 12 issues, 115 reviews, 203 comments) +- [Aleksey Bykhun](https://github.com/caffeinum) (1 issue, 1 comment) +- [Alex Knol](https://github.com/Elexy) (1 issue) +- [Alex North](https://github.com/anorth) (1 comment) +- [Alex Potsides](https://github.com/achingbrain) (43 PRs, 7 issues, 41 reviews, 96 comments) +- [André Cruz](https://github.com/satazor) (1 PR, 2 issues, 5 comments) +- [ANUDAVIS](https://github.com/ANUDAVIS) (1 comment) +- [Arkadiy Kukarkin](https://github.com/parkan) (1 issue, 6 comments) +- [Artem Smirnov](https://github.com/uluhonolulu) (1 PR, 1 comment) +- [Arthur Zhuk](https://github.com/ug02fast) (1 PR) +- [AT1452](https://github.com/AT1452) (1 issue) +- [Bazaar Dog](https://github.com/BazaarDog) (1 comment) +- [Beeno Tung](https://github.com/beenotung) (1 issue, 1 review, 2 comments) +- [Billy](https://github.com/WilliamKatz) (1 comment) +- [birbird](https://github.com/birbird) (4 issues, 1 comment) +- [Blake Byrnes](https://github.com/blakebyrnes) (1 PR, 1 issue, 11 comments) +- [Bo](https://github.com/bohendo) (1 comment) +- [Brian Parma](https://github.com/bj0) (1 comment) +- [Cam Stuart](https://github.com/camstuart) (1 comment) +- [Camilo Rodriguez Cuaran](https://github.com/thEpisode) (1 comment) +- [Chang Liu](https://github.com/fluency03) (1 issue, 1 comment) +- [Chris Aslanoglou](https://github.com/chris-asl) (1 PR, 3 issues, 4 comments) +- [Christian Maniewski](https://github.com/chmanie) (2 comments) +- [Daniel Maricic](https://github.com/woss) (2 comments) +- [Daniela Borges Matos de Carvalho](https://github.com/sericaia) (1 comment) +- [David Ammouial](https://github.com/davux) (1 issue, 1 comment) +- [David Dahl](https://github.com/daviddahl) (1 issue) +- [David Dias](https://github.com/daviddias) (9 PRs, 10 issues, 42 reviews, 113 comments) +- [Dean Vaessen](https://github.com/deanvaessen) (1 issue, 1 comment) +- [Diogo Silva](https://github.com/fsdiogo) (4 PRs, 15 reviews) +- [dirkmc](https://github.com/dirkmc) (2 PRs, 3 issues, 3 reviews, 11 comments) +- [Dmitriy Ryajov](https://github.com/dryajov) (2 PRs, 3 comments) +- [Donald Tsang](https://github.com/DonaldTsang) (1 issue) +- [dsmith3210](https://github.com/dsmith3210) (3 comments) +- [eefahy](https://github.com/eefahy) (1 comment) +- [Enrico Fasoli](https://github.com/fazo96) (1 comment) +- [EZ](https://github.com/Nanofortress) (1 comment) +- [Francis Gulotta](https://github.com/reconbot) (2 PRs, 1 issue, 4 comments) +- [Friedel Ziegelmayer](https://github.com/dignifiedquire) (3 reviews, 1 comment) +- [Fuling](https://github.com/Elvenisboy) (1 comment) +- [Giovanni T. Parra](https://github.com/fiatjaf) (1 comment) +- [gitGksgk](https://github.com/gitGksgk) (1 issue) +- [Glenn Vandeuren](https://github.com/VandeurenGlenn) (1 comment) +- [Gorka Ludlow](https://github.com/AquiGorka) (1 comment) +- [Gregory Markou](https://github.com/GregTheGreek) (1 comment) +- [Haad](https://github.com/haadcode) (2 comments) +- [halley801](https://github.com/halley801) (1 issue) +- [Hank Stoever](https://github.com/hstove) (1 comment) +- [Henri S](https://github.com/sternhenri) (1 comment) +- [Henrique Dias](https://github.com/hacdias) (1 issue, 2 comments) +- [Hugo Dias](https://github.com/hugomrdias) (30 PRs, 1 issue, 36 reviews, 41 comments) +- [Hushino](https://github.com/hushino) (4 comments) +- [Irakli Gozalishvili](https://github.com/Gozala) (1 issue) +- [Jaco Greeff](https://github.com/jacogr) (1 comment) +- [Jacob Greenway](https://github.com/Tryptophan) (2 comments) +- [Jacob Heun](https://github.com/jacobheun) (24 PRs, 7 issues, 67 reviews, 114 comments) +- [Jikku Jose](https://github.com/JikkuJose) (4 comments) +- [John Hiesey](https://github.com/jhiesey) (1 PR, 1 issue, 19 reviews, 5 comments) +- [Jonathan Underwood](https://github.com/junderw) (1 comment) +- [Joseph Krug](https://github.com/joeykrug) (1 comment) +- [Juan Esteban Cepeda](https://github.com/Juanchobanano) (1 issue, 2 comments) +- [Juan Perez](https://github.com/Juanperezc) (2 issues, 8 comments) +- [Justin Chase](https://github.com/justinmchase) (1 comment) +- [Kevin Atkinson](https://github.com/kevina) (1 comment) +- [klueq](https://github.com/klueq) (5 issues, 8 comments) +- [Koutaro Chikuba](https://github.com/mizchi) (1 comment) +- [Kyle Drake](https://github.com/kyledrake) (3 comments) +- [Le Hong Son](https://github.com/tomnyson) (1 comment) +- [Leena](https://github.com/leenabhandari) (1 comment) +- [Leon Prouger](https://github.com/leonprou) (1 comment) +- [LiMoMoMo](https://github.com/LiMoMoMo) (1 issue, 3 comments) +- [Lorenzo Setale ](https://github.com/koalalorenzo) (2 issues, 6 comments) +- [lukas2005](https://github.com/lukas2005) (1 issue, 1 comment) +- [Łukasz Magiera](https://github.com/magik6k) (1 review, 1 comment) +- [luojia](https://github.com/JiaJiaJiang) (1 comment) +- [Maciej Krüger](https://github.com/mkg20001) (6 PRs, 3 issues, 1 review, 37 comments) +- [Marcin Rataj](https://github.com/lidel) (3 PRs, 2 issues, 1 review, 10 comments) +- [Marcin Tojek](https://github.com/mtojek) (1 PR, 1 comment) +- [Marcus](https://github.com/marcusnewton1) (3 comments) +- [Mark Robert Henderson](https://github.com/aphelionz) (2 issues, 6 comments) +- [Marten Seemann](https://github.com/marten-seemann) (1 comment) +- [Matt Joiner](https://github.com/anacrolix) (2 issues) +- [Matt Ober](https://github.com/obo20) (1 comment) +- [Matteo Collina](https://github.com/mcollina) (3 PRs, 9 issues, 1 review, 22 comments) +- [Mauricio Cano Giraldo](https://github.com/maooricio) (1 issue, 1 comment) +- [Mauricio Melo](https://github.com/mauriciomelo) (1 comment) +- [mccoysc](https://github.com/mccoysc) (5 issues, 11 comments) +- [Mikeal Rogers](https://github.com/mikeal) (2 issues, 12 comments) +- [Mikerah](https://github.com/Mikerah) (2 issues, 1 comment) +- [Mitra Ardron](https://github.com/mitra42) (1 issue, 6 comments) +- [Mosin Pathan](https://github.com/mosinms7711) (1 issue) +- [Mukundan Senthil](https://github.com/Mukundan314) (1 comment) +- [naure](https://github.com/naure) (1 comment) +- [nikor](https://github.com/nikor) (3 PRs, 3 comments) +- [noot](https://github.com/noot) (1 PR, 1 issue, 4 reviews, 6 comments) +- [Notim Portant](https://github.com/lifeBCE) (2 issues, 6 comments) +- [Oli Evans](https://github.com/olizilla) (7 PRs, 1 issue, 2 reviews, 12 comments) +- [oneEdoubleD](https://github.com/oneEdoubleD) (1 comment) +- [Paul Marlow](https://github.com/sweetpalma) (1 PR, 2 comments) +- [pawankhadpe](https://github.com/pawankhadpe) (1 issue, 3 comments) +- [Pedro Santos](https://github.com/PedroMiguelSS) (1 PR, 1 review) +- [Pedro Teixeira](https://github.com/pgte) (1 PR, 2 issues, 4 reviews, 13 comments) +- [Pierfrancesco Soffritti](https://github.com/PierfrancescoSoffritti) (1 issue, 2 comments) +- [popmanhe](https://github.com/popmanhe) (1 PR) +- [Portia Burton](https://github.com/pkafei) (2 PRs, 2 reviews, 4 comments) +- [Prince Sinha](https://github.com/princesinha19) (3 comments) +- [raduiliescu83](https://github.com/raduiliescu83) (1 issue) +- [Raoul Millais](https://github.com/raoulmillais) (2 PRs, 12 comments) +- [Richard Schneider](https://github.com/richardschneider) (1 issue, 5 comments) +- [Rkrushanovskij](https://github.com/Rkrushanovskij) (1 comment) +- [Robert Misiorowski](https://github.com/rmisio) (2 issues, 7 comments) +- [Robin Monjo](https://github.com/robinmonjo) (1 comment) +- [ron litzenberger](https://github.com/litzenberger) (3 comments) +- [Ross Bulat](https://github.com/rossbulat) (2 comments) +- [Santiago Cammi](https://github.com/scammi) (2 comments) +- [Scott](https://github.com/sprusr) (1 PR, 2 comments) +- [Seshachalam Malisetti](https://github.com/mseshachalam) (1 issue, 1 comment) +- [Snorre Lothar von Gohren Edwin](https://github.com/vongohren) (1 issue, 1 comment) +- [Sri Harsha](https://github.com/sriharrsha) (6 comments) +- [Stanislaw Baranski](https://github.com/stasbar) (1 issue, 2 comments) +- [Steven Allen](https://github.com/Stebalien) (1 PR, 5 issues, 1 review, 13 comments) +- [th3kave](https://github.com/th3kave) (2 issues, 2 comments) +- [TIM](https://github.com/tim-coin) (1 issue) +- [Tomoaki Sato](https://github.com/TOMOAKI12345) (1 comment) +- [Trond Arne Bråthen](https://github.com/tabrath) (1 PR) +- [Vasco Santos](https://github.com/vasco-santos) (49 PRs, 4 issues, 102 reviews, 52 comments) +- [Victor Bjelkholm](https://github.com/victorb) (4 comments) +- [Vishal Kuo](https://github.com/vishalkuo) (1 comment) +- [vitriol-co](https://github.com/vitriol-co) (1 issue, 3 comments) +- [Volker Mische](https://github.com/vmx) (22 PRs, 6 issues, 50 reviews, 79 comments) +- [waliguder](https://github.com/waliguder) (1 issue) +- [Whyrusleeping](https://github.com/whyrusleeping) (1 comment) +- [Willem Wyndham](https://github.com/willemneal) (1 issue) +- [X5 Engine](https://github.com/x5engine) (1 issue, 1 comment) +- [xxyao123](https://github.com/xxyao123) (1 issue, 1 comment) +- [yueleiMaster](https://github.com/yueleiMaster) (1 issue) +- [yuwiggin](https://github.com/yuwiggin) (1 issue) +- [Zack](https://github.com/schollz) (1 PR, 1 comment) +- [Zane Starr](https://github.com/zcstarr) (2 comments) +- [Zhiyuan Lin](https://github.com/edsgerlin) (1 PR) +- [李小明](https://github.com/alx696) (1 issue) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/team-mgmt/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/039-london-hack-week-report/README.md b/src/_blog/039-london-hack-week-report/README.md new file mode 100644 index 00000000..5f6efb21 --- /dev/null +++ b/src/_blog/039-london-hack-week-report/README.md @@ -0,0 +1,59 @@ +--- +date: 2019-01-24 +url: /65-london-hack-week-report/ +tags: hack week +title: 2018 Q4 London Hack Week Summary +description: +author: David Dias +--- + +Back in October last year, the Go Core Dev Team for the IPFS, IPLD and libp2p projects spent some quality time together in London for a Hack Week. The overall feeling was excitment as it was the first time that many of the core contributors got the chance to meet in person. + +Together, we explored our goals for the projects, along with the users needs and who is pushing for them. It was a great gathering and we wanted to make sure to share the results and the recordings with you. + +The week format was really interesting and one that could almost go into the Async Team Management books (as a way to create sync time for distributed teams). A simplified overview of what happened is: + +- **Monday** - Collaboratively surface the top priorities for the project. We defined them clearly and worked with the IPFS Project Working Group to prioritize them with the IPFS roadmap in mind. +- **Tuesday** - A ton of hacking and design discussions. Let the Hackers be free! +- **Wednesday** - Objectives and Key Results (OKR) check in. We went from a "top down" (few to many) OKR approach to a "divide and conquer". The 3 main areas of focus were identified (Data Exchange, Datastore & Providers) and the big go-ipfs team was divided into 3 groups that worked independently for 60 minutes to review and came up with great improvements to the original OKRs that had been defined before we met. +- **Thursday** - We had a [SHOW ME WHAT YOU GOT 🗿](https://www.youtube.com/watch?v=LEUGPEVRDmU) session (links below) & hosted the [IPFS London Meetup](https://www.meetup.com/london-ipfs/). More details on how the meetup went in a blog soon™. +- **Friday** - Final review of the OKRs. As a prize for our very successful week, we all went to the British Museum to check out the Rosetta stone among many other cool things. + +In the end we ran a retrospective and asked "When is the next one! 😄" + +## Results from [SHOW ME WHAT YOU GOT 🗿](https://www.youtube.com/watch?v=LEUGPEVRDmU) + +This is an IPFS Community favorite. A moment to report back all the great successes from the week! We do this report in lighting talk format. [Full playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ). Talks list: + +- [Bitswap/GraphSync Improvements and Module Architecture, Erik Ingenito](https://www.youtube.com/watch?v=6GKKwcG630M&index=8&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ) +- [Datastore Benchmarks, Eric Myhre](https://www.youtube.com/watch?v=3PlN0Xcjckk&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ&index=7) +- [IPLD Selectors & GraphSync, Juan Benet](https://www.youtube.com/watch?v=NhAQEKtPxHw&index=6&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ) +- [Offline First, Molly Mackinlay](https://www.youtube.com/watch?v=f1YUXacAuP0&index=9&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ) +- [Community Contributing Guidelines, David Dias](https://www.youtube.com/watch?v=rq2d-41nC44&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ&index=2&t=0s) + + + +- [Provider Strategies, Michael Avila & Jan Winkelmann](https://www.youtube.com/watch?v=6AsEhn3a5jE&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ&index=10) +- [Scalable PubSub with GossipSub, Dimitris Vyzovitis](https://www.youtube.com/watch?v=mlrf1058ENY&index=3&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ) + + + +- [The RFC RFC, Eric Myhre](https://www.youtube.com/watch?v=9m6VMnCTRhQ&index=2&list=PLuhRWgmPaHtRPl3Itt_YdHYA0g0Eup8hQ) + +## IPFS London Meetup - Show & Tell + +The fun would not be complete without an IPFS London Meetup. There were great talks and a surprise show-and-tell by Juan Benet himself, who demo'd a p2p chess game, built on [peer-base](https://github.com/peer-base/peer-base) while meetup was happening! + +![david-n-juan-p2p-chess](https://ipfs.io/ipfs/QmaCqVctWQULN3WGR3UztxwrSPegwBs58qcKywvUzT5PjS) + +A post with the recorings will be published soon. Meanwhile, you can see the photos and join the IPFS London meet up here https://www.meetup.com/london-ipfs/photos/29361158/ + +--- + +Thank you to @858Heather, @jamiejn, @angiemaguire, @olizilla and @alanshaw for helping us putting this amazing hack week and IPFS London Meetup! + +This is it, it was a great success! Thank you all that joined and I'm sorry for those who couldn't come this time. See you all on the next Hack Week!! + +I bid you all a good day! + +David Dias diff --git a/src/_blog/040-crdt-research-meetup/README.md b/src/_blog/040-crdt-research-meetup/README.md new file mode 100644 index 00000000..cf72fd8e --- /dev/null +++ b/src/_blog/040-crdt-research-meetup/README.md @@ -0,0 +1,54 @@ +--- +date: 2019-03-22 +url: /67-crdt-research-meetup/ +tags: crdt research meetup videos ipfs +title: 2018 CRDT Research Meetup - Lisbon +description: +author: Pedro Teixeira +--- + +We hosted the first Lisbon CRDT Research Meetup on April 2018. It was a brilliant event with the presence of many of the authors of the CRDT research literature and representatives from the Labs it originated, namely: [HASLab](https://haslab.uminho.pt/), [NOVA-LINCS](http://nova-lincs.di.fct.unl.pt/), [FCT](https://www.fct.unl.pt/), [UMinho](https://uminho.pt/), [UNL](https://www.unl.pt/). + +[CRDT](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) stand for Conflict-free Replicated Data Types and are a mathematical framework and building block that allows different replicas to cooperate without requiring coordination, making them very useful for creating eventually consistent data layers over intermittent and unreliable networks. For instance, CRDTs make sure that, no matter the order of the messages exchanged, all the peers eventually converge to the same state. + +You can find a panoply of CRDT learning materials in the [Research CRDT Repo](https://github.com/ipfs/research-CRDT) + +We believe that CRDTs are one fundamental building block for building completely Decentralized, Distributed, Offline First Web Applications and the [IPFS Dynamic Data & Capabilities Working Group](http://github.com/ipfs/dynamic-data-and-capabilities) has been spearheading the development and pushing IPFS and libp2p with projects such as: [PeerPad](http://peerpad.net/), [PeerBase](https://github.com/peer-base), [Discussify](https://github.com/ipfs-shipyard/discussify-browser-extension) and the [Sandboxed Identity Manager Project](https://github.com/ipfs-shipyard/pm-idm). + +If you didn't have the chance to attend this meetup in person, you can now follow what happened by checking the talks below, or browsing through [this playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTVkko1ZTn-qcGb-n6EqHff). Enjoy! + +## Vitor Enes - Borrowing an Identity for a Distributed Counter + +[![Watch video](img/video1.png)](https://www.youtube.com/watch?v=rGfbcu7UkGk) + +In this presentation, Vitor Enes, a PhD student from HasLab, presented a design he co-authored for avoiding the identity explosion in state-based CRDTs. + +After a quick introduction to the need for CRDTs (replication, availability and latency), Vitor dives down in the implementation of a distributed counter, while explaining the need for keeping track of the replica identity inside the CRDT state. + +Having an entry per replica in the system does not scale, because the state will forever be poisoned with the replica identity. Unless we do something about it… + +## Nuno Preguiça - AntidoteDB and more + +[![Play video](img/video2.png)](https://www.youtube.com/watch?v=-v_1aJJujdg) + +When using geo-replicated databases, there is a first wave of databases that are eventually consistent (like Cassandra and Riak) that offer high availability but little automation to deal with concurrency. Lately, second-generation DBMSs like Spanner and CosmosDB offer strong consistency guarantees, but at the necessary expense of availability in the face of network partitions. + +AntidoteDB aims to be highly available while still provide strong consistency semantics. For operations that span into multiple data operations, AntidoteDB implements highly available transactions by using snapshot reads and atomic updates, guaranteeing that clients always see consistent states. Also, AntidoteDB can provide causal consistency without requiting coordination between replicas. + +What about numeric invariants? How can you guarantee, for instance, that, in a given bank account, the global balance can never be less than 0? Typically, in eventually consistent databases this would not be possible, as it would require coordination between replicas. A solution for this that AntidoteDB implements is a bounded counter where coordination can happen outside of the transaction execution path and without requiring global coordination. + +## Ali Shoker - As Secure as Possible Eventual Consistency + +[![play video](img/video3.png)](https://www.youtube.com/watch?v=ip2XhudTEGE) + +CRDTs and Strong Eventual Consistency gives us the guarantee that all replicas will eventually converge, but this may only be true depending on your fault model. If, for instance, a replica fails to apply an operation (due to a bug, a hardware failure or malicious code, for instance), the system is not guaranteed to converge. + +By providing a Byzantine Fault Tolerant (BFT) Cluster to which you push the CRDT operations from the multiple replicas, this cluster can be used to reach consensus on the state and produce a certificate of that state to the client, without compromising availability or the strong eventual consistency guarantees. + +Clients can then opt into using the more secure BFT certificate (with the compromises on availability) or simply continue using the eventually consistent model that has better availability guarantees (but compromises on security). + +## Evan Miyazono - Protocol Labs RFP Program + +[![play video](img/video4.png)](https://www.youtube.com/watch?v=PkjfwmFe75s) + +Evan Miyazono, captain of the research team at Protocol Labs (PL), provides an overview of the PL approach to external research, and describes the PL Request For Proposals (RFP) and grant program. diff --git a/src/_blog/041-ann-ipfs-camp/README.md b/src/_blog/041-ann-ipfs-camp/README.md new file mode 100644 index 00000000..816f8826 --- /dev/null +++ b/src/_blog/041-ann-ipfs-camp/README.md @@ -0,0 +1,34 @@ +--- +date: 2019-02-28 +url: /72-ann-ipfs-camp/ +tags: event, camp, community +title: Announcing, the 1st ever 🌌 IPFS Camp, Jun 27-30 🏕 +description: +author: David Dias, Angie Maguire, Chris Waring and Jamie Nicholson +--- + +
+ +### The IPFS Project is thrilled to invite you to a new event we’ve been baking for the IPFS Community, the **🌌 IPFS Camp 🏕**. A three day hacker retreat for the builders of the Distributed Web that will happen between June 27th to 30th. + +
+ + + +
+ +The Camp will bring together the Core Developers and Contributors to the IPFS project, Community Leaders, Builders on of the Distributed Web and you! The event will build on top of the successful IPFS Developer Meetings in Berlin last year and add a full immersive experience for its attendees and contributors. + +Join us on 27-30th June at the beautiful Campus La Mola in Barcelona for an action-packed program of workshops, talks and deep dives on everything IPFS. + +![](https://ipfs.io/ipfs/QmUiucP3oRVnqvuM6hnrF9D5H6tRSeVhyWk6ggkhf4ebEH) + +Registration is a 2-step process. The 1st step is an application were you can tell us why you are excited to attend the camp and what you would like to share with the other attendees. The next step is a review and selection of the best applications by the IPFS team. If you’re application is selected we’ll send you a link to register by April 30th. IPFS Camp is limited to 150 hackers. + +Learn more about the camp and apply to attend **https://camp.ipfs.io/register**. + +Put your space boots on and get ready for a very unique InterPlanetary Adventure! Follow [camp.ipfs.io](https://camp.ipfs.io) and [@ipfsbot](https://twitter.com/ipfsbot) for future updates. diff --git a/src/_blog/042-lisbon-hack-week/README.md b/src/_blog/042-lisbon-hack-week/README.md new file mode 100644 index 00000000..0cb4cfc0 --- /dev/null +++ b/src/_blog/042-lisbon-hack-week/README.md @@ -0,0 +1,31 @@ +--- +date: 2019-03-25 +url: /74-lisbon-hack-week/ +tags: hack week ipfs libp2p community researchers +title: 2018 IPFS Hack Week in Lisbon +description: +author: André Cruz +--- + +In the week of May 21, 2018, we hosted one more Hack Week in the sunny city of Lisbon. + +The week was great for core developers, contributors and researchers to spend quality time together and work in a fast paced synchronous format towards solving concrete problems. It was incredible to see ideas and solutions flourishing for open problems we've been thinking for a while. The hacker spirit was strong throughout the entire week, culminating in a "Show Me What You Got" presentation to report back on decisions and demos. + +The majority of discussions and collaborations were around IPFS, libp2p and applications built on top of them, but we also hosted a [CRDT Research meetup](https://blog.ipfs.io/67-crdt-research-meetup) on the second day - check out the video playlist [here](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTVkko1ZTn-qcGb-n6EqHff). + +Didn't have a chance to attend? No worries, we got your back. Many of the report-back presentations were recorded so that you can learn about what got developed, designed and decided. We have compiled them into a [YouTube playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtR1hDEAKYXtUguNBkg2qceQ) for your viewing pleasure. You can see them all here: + +- [**Aegir Browser** - Hugo Dias](https://youtu.be/SxYx6IiigIc) +- [**Building a dApp** - André Cruz, André Sousa](https://youtu.be/wKoLS_8pFb0) +- [**Demo of Rust-libp2p** - Pierre Krieger](https://youtu.be/cMCy7ZfxOtQ) +- [**Files Exchange Example** - Diogo Silva](https://youtu.be/WartUw3dD5U) +- [**Flow Types for IPFS** - Volker Mische](https://youtu.be/YPt28cHQwkg) +- [**libp2p Project Early Observations** - Mike Goelzer](https://youtu.be/WWOZrP-QMXQ) +- [**Preview: IPLD Explorer v1** - Oli Evans](https://youtu.be/P9HnZslts6Q) +- [**P2P Testing** - Mathias Buus](https://youtu.be/rOFHwifVH-I) +- [**Peer-Pad: Authentification with Ethereum** - Pedro Teixeira, Joao Santos](https://youtu.be/yc10xRifTmQ) +- [**Prop Tests** - Yoshua Wuyts](https://youtu.be/EPgtvKMF7VQ) +- [**RGA @ -CRDT** - Pedro Teixeira](https://youtu.be/ON_L_B7OJZM) +- [**Service Worker Gateway (IPFS Node Inside a Service Worker)** - Vasco Santos](https://youtu.be/yg1yvylXEC0) + +We hope you enjoy and see you in future Hack Weeks! diff --git a/src/_blog/043-ipfs-2019-roadmap/README.md b/src/_blog/043-ipfs-2019-roadmap/README.md new file mode 100644 index 00000000..b5a17713 --- /dev/null +++ b/src/_blog/043-ipfs-2019-roadmap/README.md @@ -0,0 +1,39 @@ +--- +date: 2019-04-05 +url: /78-ipfs-2019-roadmap/ +title: 'Achievement Unlocked: The 2019 IPFS Roadmap' +description: +author: Molly Mackinlay +--- + +In Q4 2018, we undertook a new planning process for the IPFS project to more clearly define our [vision](https://github.com/ipfs/roadmap#ipfs-mission-statement), [goals](https://github.com/ipfs/roadmap#2019-goal-expanded), and [roadmap](https://github.com/ipfs/roadmap#2019-epics) for the year. Our motivation was to improve coordination between our expanding working groups and to focus our efforts for the year on some larger-scale improvements to the IPFS network around scalability, performance, and usability to unlock the next tiers of adoption and usage. 😇 + +To ground our thinking about the next year, we first had to zoom out to the core mission of the IPFS project in the long-term. We take on many efforts and support many groups in our open source community, but it is all driven by the aim to make the internet more accessible, empowering, and useful for many years to come. With much wordsmithing, we condensed this into our first (written) [mission statement](https://github.com/ipfs/roadmap#ipfs-mission-statement)! 👏 + +![IPFS Mission Statement](img/mission-statement.png) + +This mission is reflected in our goals for IPFS - what we hope to tangibly achieve in the world. So far, we've identified **SIXTEEN** ranging over the next 5-10 years of work. These include launching the [Interplanetary Web](https://github.com/ipfs/roadmap#-interplanetary-web---mars-2024-d3-e3-i4), making the memex a reality with the [Personal Web](https://github.com/ipfs/roadmap#-personal-web-d3-e4-i2), snapshotting all human knowledge with the [Self-Archiving Web](https://github.com/ipfs/roadmap#-self-archiving-web-d4-e4-i4), and even merging the web and the OS with [WebOS](https://github.com/ipfs/roadmap#-webos-d5-e2-i3) among others. While there are assuredly many that we haven’t explored yet, 16 is a good start - and far more than we could possibly work on this year. Mission "Plan 2019" was underway! 🚀 + +![IPFS Goals](img/goals.png) + +To narrow in on where we should begin, we ranked the goals on a number of factors to create an ordered list. We sorted first in terms of low difficulty or "delta" (i.e. minimal additional requirements and fewer dependencies from the capabilities IPFS has now), then high ecosystem growth (growing our community and resources to help us gravity assist and accelerate our progress), and finally high importance (to ensure IPFS has a strong, positive impact on the world). This [sorting function](https://github.com/ipfs/roadmap#2019-priority) gave us a ranked list of goals to work towards to achieve our mission - where completing earlier goals brought us closer to the technical requirements and resources to achieve later goals. 🤩 + +Our [top-ranked goal](https://github.com/ipfs/roadmap#2019-goal-expanded) in this list is supporting the needs of package manager communities to bring the content-addressing, peer-to-peer, decentralized, and offline capabilities of IPFS to these critical components of the computing ecosystem. This goal in particular is close from a delta perspective, given there are already working demos experimenting with IPFS for package distribution like [npm-on-ipfs](https://github.com/ipfs-shipyard/npm-on-ipfs). The package manager community is also a strategic community to learn from and build bridges with as we continue to grow our ecosystem and contributor base. Package managers play an immensely important role in the development of new game-changing technologies, so augmenting their tooling, sustainability, and support can unlock huge benefits for both the IPFS community and the world. 🌍 + +Improving IPFS for package managers also has the added benefit of diagnosing and driving resolution of pain-points felt by many other IPFS users. IPFS aims to achieve internet-scale adoption - and beyond! To reach that goal, we need to support communities with significant scalability, performance, and reliability needs to stress-test and drive improvements to core protocols and infrastructure. It also gives us the targeted feedback-loops to improve usability and documentation for a specific use case - creating good habits about _landing_ protocol improvements end-to-end. 🙌 + +Identifying our [top priority for the year](https://github.com/ipfs/roadmap#2019-priority) was an important achievement, but it was still just the beginning. Next, we needed to break that goal down into milestones so we could incrementally add features, performance improvements, and educational guides to make “IPFS for package managers” a reality. We did this in two stages. First, individual IPFS working groups drafted feature and performance milestones of the work they saw as most important to achieve our goal. After a quick cross-working group feedback loop for asks and alignment, we “merged” across all working group roadmaps to create a unified project-level roadmap. You can see the results of this in our [2019 Epics](https://github.com/ipfs/roadmap#2019-epics). 👀 + +![IPFS 2019 Epics](img/2019-epics.png) + +When taking on Package Managers as a top use case and priority, we realized there was still much we didn’t know about the needs and requirements to support this community - so learning more was our first step. We spun up a new [Package Managers Working Group](https://github.com/ipfs/package-managers) in early Q1, which has been focused on research, knowledge-sharing, and stress-testing the protocol with demos and experiments to target our efforts for the rest of the year. The team has already identified a bunch of low hanging fruit around usability and performance. Want to get involved? [Check out this list of known issues and feature requests!](https://github.com/ipfs/package-managers/blob/master/blockers.md) _(We'd also love to hear about your ideas, experiments, and pain points - add them here!)_ 💪 + +Another part of those 2019 epics is [IPFS Camp](https://camp.ipfs.io/), the first public conference we're hosting to bring together the builders of the distributed web/tooling. Join us in Barcelona June 27-30 for an action packed weekend of hacking, activities, workshops, and more. Tickets are all inclusive (food, activities, accommodation, etc) - and going fast! [**Register today!**](https://camp.ipfs.io/register) 🏕 + +When we started out with 2019 planning, we actually took on **THREE** top-level priorities instead of one - so you may notice that [working group roadmaps](https://github.com/ipfs/roadmap#2019-working-groups-roadmaps) are a little out of date. It became clear shortly into Q1 that _three_ goals were far too many to focus on. There was lots of overlap between the needs of package managers and large files, but where the goals didn’t overlap it was splitting our focus and resources. Our “decentralized web” goal was also a year (or more) of work in itself - and largely dependent on all the underlying work we were doing to support package managers. Our initial roadmap was too optimistic to achieve in a single year! 🧐 + +Given this realization, we made the hard choice to descope those goals for 2019 and focus our energies on supporting package managers. However, we’d already finalized our Q1 OKRs and much of the prioritized work was still aligned and valuable for our narrowed priority. Therefore, we decided to pause any additional re-planning until the end-of-quarter mark. Not to fear, Q2 brings lots of fresh package-manager-focused improvements built on all of our great Q1 learnings. Curious what the working groups are picking up and how you can help out? Check out the [IPFS Q2 OKRs](https://docs.google.com/spreadsheets/d/1YSeyWqXh3ImanRrTkYQHHkCofiORn68bYqM_KTLBlsA/edit) and associated planning issues [here](https://github.com/ipfs/team-mgmt/issues/902). 🤗 + +![IPFS 2019 Q2 OKRs](img/q2-okrs.png) + +Since the [IPFS Alpha release](https://github.com/ipfs/ipfs/blob/master/README.md#alpha-distribution) in February 2015, the IPFS project has grown significantly - including releasing our [Data Model (IPLD)](http://ipld.io/) and [Networking Stack (libp2p)](https://libp2p.io/) as standalone projects, amongst many other [exciting updates recentrly](https://filecoin.io/blog/update-2018-q3-q4/#9-ipfs-update-for-filecoin). The past 4 years have brought huge improvements to the protocol, but we’re most excited about the path to come and all the awesome new capabilities described in our [working group roadmaps](https://github.com/ipfs/roadmap#2019-working-groups-roadmaps). We hope you’ll join us on that quest - whether it’s suggesting usability improvements, writing performance benchmarks, helping optimize our [new apt-on-ipfs experiment](https://github.com/ipfs/package-managers/issues/18) (or contribute your own!), or any other new endeavors you propose. Onwards! 🤝 diff --git a/src/_blog/044-js-ipfs-0.35/README.md b/src/_blog/044-js-ipfs-0.35/README.md new file mode 100644 index 00000000..77068c4e --- /dev/null +++ b/src/_blog/044-js-ipfs-0.35/README.md @@ -0,0 +1,252 @@ +--- +date: 2019-04-12 +url: /80-js-ipfs-0-35/ +title: js-ipfs 0.35.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +> Small, acyclic and flexible, just the way you like it + +# 🔦 Highlights + +## ✂️ Huge bundle size cuts! + +One of the biggest goals for JS IPFS is to enable the distributed web in the browser. Part of that is being a good web citizen and minimising the amount of code we ship, to ensure IPFS downloads quicker, `npm install`'s quicker, loads quicker and utilizes fewer resources. It's especially important on resource constrained mobiles and IoT devices. + +The good news you want to hear is that we've now chopped around **50%** off the bundle size of JS IPFS since 0.33, that's a reduction of nearly _half_ of the code we were previously shipping! This is an amazing improvement and a great reason to upgrade. + +## 🌳 DAG HTTP API + +The HTTP API now has endpoints for DAG operations like `get`, `put` and `resolve`. Hooray! It was actually super easy so we just decided to do it spontaneously. I know, we're so zany. + +On a more serious note, this brings JS IPFS another step closer to feature parity with Go IPFS. We're pushing forwards with this in _every_ release 🚀 - stay tuned! + +## 🙉 Multiple address listening for API and Gateway servers + +The HTTP API and the HTTP Gateway started by your IPFS node can now listen on multiple addresses. It's a backward compatible change, all you have to do is change the value of `Addresses.API` or `Addresses.Gateway` in your JSON config file to be an _array_ of [multiaddrs](https://github.com/multiformats/multiaddr/) instead of a single string multiaddr. Here's an example: + +```json +{ + "Addresses": { + "API": ["/ip4/127.0.0.1/tcp/5001", "/ip6/::1/tcp/5002"], + "Gateway": ["/ip4/127.0.0.1/tcp/8080", "/ip6/::1/tcp/8080"] + } +} +``` + +## 🔭 Recursive DNS link lookups + +[DNS link](http://dnslink.io/) TXT records like `dnslink=/ipns/domain.com` can now be recursively resolved until they hit an IPFS hash like `/ipfs/QmHash`. Even better, that's the new default. 👌 + +# 🏗 API Changes + +- CLI + - The global flag `--local` was renamed to `--offline` + - Added flag `--enable-preload` to `jsipfs daemon` command to allow users to enable or disable content preloading +- Core + + - `ipfs.util.isIPFS` and `ipfs.util.crypto` have moved to static exports and should now be accessed like: + + ```js + const { isIPFS, crypto } = require('ipfs') + ``` + + - `ipfs.types.*` have moved to static exports and should now be accessed like: + + ```js + const { + Buffer, + CID, + multiaddr, + multibase, + multihash, + PeerId, + PeerInfo, + } = require('ipfs') + ``` + + - `ipfs.resolve` now supports resolving to the middle of an IPLD block instead of erroring. Given: + + ```js + b = { c: 'some value' } + a = { b: { '/': cidOf(b) } } + ``` + + `ipfs resolve /ipld/cidOf(a)/b/c` should return `/ipld/cidOf(b)/c`. That is, it resolves the path as much as it can. Previously it would simply fail with an error. + + - `ipfs.dns` now resolves recursively by default, set the `recursive` options to `false` to prevent this behaviour + +- HTTP API + - Added the following DAG endpoints: + - `/api/v0/dag/put` + - `/api/v0/dag/get` + - `/api/v0/dag/resolve` + +# ❤️ Huge thank you to everyone that made this release possible + +In alphabetical order, here are all the humans that contributed to the release: + +- [a1300](https://github.com/a1300) (1 comment) +- [Aarnav](https://github.com/R9295) (1 issue) +- [Adam Gall](https://github.com/adamgall) (1 comment) +- [Adam Uhlíř](https://github.com/AuHau) (1 PR, 2 issues, 4 reviews, 10 comments) +- [Aditya Bose](https://github.com/adbose) (1 PR) +- [Alan Shaw](https://github.com/alanshaw) (82 PRs, 11 issues, 114 reviews, 235 comments) +- [Alberto Elias](https://github.com/AlbertoElias) (3 PRs, 3 issues, 1 review, 13 comments) +- [Alex North](https://github.com/anorth) (1 PR, 1 comment) +- [Alex Potsides](https://github.com/achingbrain) (18 PRs, 2 issues, 43 reviews, 35 comments) +- [André Cruz](https://github.com/satazor) (1 issue, 6 comments) +- [Andrej Novikov](https://github.com/shroomist) (1 comment) +- [Andrew Nesbitt](https://github.com/andrew) (7 PRs) +- [Andrius Bacianskas](https://github.com/Bacis) (1 comment) +- [Angelo](https://github.com/langelog) (1 comment) +- [Arkadiy Kukarkin](https://github.com/parkan) (9 comments) +- [ask03](https://github.com/ask03) (1 issue) +- [Ayush Gupta](https://github.com/AK-007) (1 comment) +- [Barry G](https://github.com/bgits) (1 issue, 6 comments) +- [Baruch Velez](https://github.com/baruchvlz) (1 comment) +- [Beeno Tung](https://github.com/beenotung) (1 PR, 3 comments) +- [Benjamín Vázquez](https://github.com/bazquezero) (1 issue) +- [Blake Byrnes](https://github.com/blakebyrnes) (3 reviews, 2 comments) +- [Brendan Miller](https://github.com/bmiller59) (1 comment) +- [Brian](https://github.com/ethericsol) (1 issue, 9 comments) +- [Chad Retz](https://github.com/cretz) (2 comments) +- [Chance Hudson](https://github.com/JChanceHud) (1 PR, 1 issue, 4 reviews) +- [CHEVALAY JOSSELIN](https://github.com/josselinchevalay) (1 PR, 1 issue, 5 comments) +- [Chris Anderson](https://github.com/jchris) (1 PR, 3 reviews) +- [Chris de Jong](https://github.com/platoscave) (1 comment) +- [Christian Couder](https://github.com/chriscool) (1 comment) +- [cloudbitsum](https://github.com/cloudbitsum) (1 issue, 1 comment) +- [comntr](https://github.com/comntr) (3 issues, 2 comments) +- [Daniel Krech](https://github.com/eikeon) (1 PR, 1 comment) +- [David](https://github.com/multikatt) (1 PR) +- [David Ammouial](https://github.com/davux) (1 comment) +- [David Dias](https://github.com/daviddias) (1 PR, 1 issue, 28 reviews, 23 comments) +- [Davit Barbakadze](https://github.com/jayarjo) (1 issue, 3 comments) +- [Despoinis](https://github.com/Despoinis) (1 issue, 2 comments) +- [Diogo Silva](https://github.com/fsdiogo) (3 PRs, 1 review, 1 comment) +- [dirkmc](https://github.com/dirkmc) (17 PRs, 24 reviews, 14 comments) +- [Dmitriy Ryajov](https://github.com/dryajov) (1 comment) +- [Dustin](https://github.com/Duske) (1 comment) +- [edoo](https://github.com/ookangzheng) (1 PR) +- [Elad](https://github.com/justelad) (1 comment) +- [Federico Luzzi](https://github.com/luzzif) (2 issues) +- [Filip Š](https://github.com/filips123) (1 PR, 2 comments) +- [Francis Gulotta](https://github.com/reconbot) (4 comments) +- [Franck Royer](https://github.com/D4nte) (1 comment) +- [Friedel Ziegelmayer](https://github.com/dignifiedquire) (2 reviews, 9 comments) +- [Georgios Rassias](https://github.com/grassias) (1 PR, 4 comments) +- [Gorka Ludlow](https://github.com/AquiGorka) (1 comment) +- [Grant Herman ](https://github.com/grantlouisherman) (4 PRs, 1 issue, 3 reviews, 12 comments) +- [Guilherme Gervasio](https://github.com/gil-air-may) (1 issue, 1 comment) +- [Guy Sviry](https://github.com/guysv) (1 issue, 1 comment) +- [Haywirez](https://github.com/haywirez) (1 comment) +- [hazae41](https://github.com/hazae41) (1 issue, 3 comments) +- [Henrique Dias](https://github.com/hacdias) (1 review, 8 comments) +- [Henry Rodrick](https://github.com/moshisushi) (1 review, 1 comment) +- [heqimagic](https://github.com/iheqi) (1 issue, 1 comment) +- [Huberto Kaiser Filho](https://github.com/hubertokf) (2 issues, 4 comments) +- [Hugo Dias](https://github.com/hugomrdias) (16 PRs, 3 issues, 29 reviews, 48 comments) +- [Hunter Trujillo](https://github.com/cryptoquick) (1 issue, 2 comments) +- [Irakli Gozalishvili](https://github.com/Gozala) (6 PRs, 16 issues, 14 reviews, 50 comments) +- [isan_rivkin](https://github.com/Isan-Rivkin) (2 PRs, 5 comments) +- [IwraStudios](https://github.com/IwraStudios) (1 issue) +- [Jacob Heun](https://github.com/jacobheun) (26 PRs, 5 issues, 67 reviews, 86 comments) +- [Jakub Sztandera](https://github.com/Kubuxu) (5 comments) +- [James Cullum (Pseudonym)](https://github.com/JamesCullum) (1 comment) +- [JamesYin](https://github.com/elantion) (4 comments) +- [João Antunes](https://github.com/JGAntunes) (1 PR, 2 issues, 4 comments) +- [John Hiesey](https://github.com/jhiesey) (1 comment) +- [Jon](https://github.com/Schwartz10) (1 comment) +- [Jon Chiang](https://github.com/bingge1) (1 comment) +- [Jonathan Gaillard](https://github.com/gaillard) (1 issue, 2 comments) +- [jzstern](https://github.com/jzstern) (1 comment) +- [kesavananbu](https://github.com/kesavananbu) (1 comment) +- [klueq](https://github.com/klueq) (1 comment) +- [kwakwaa](https://github.com/kwakwaa) (2 issues, 1 comment) +- [lanmower](https://github.com/lanmower) (1 issue) +- [LifeBCE](https://github.com/lifeBCE) (2 issues, 3 comments) +- [Lorenzo Setale ](https://github.com/koalalorenzo) (1 comment) +- [LuffySmile](https://github.com/LuffySmile) (1 issue) +- [Łukasz Magiera](https://github.com/magik6k) (5 reviews, 4 comments) +- [Maciej Krüger](https://github.com/mkg20001) (4 reviews, 26 comments) +- [Marcin Czenko](https://github.com/marcinczenko) (1 issue, 1 comment) +- [Marcin Rataj](https://github.com/lidel) (6 PRs, 7 issues, 9 reviews, 16 comments) +- [Mark Robert Henderson](https://github.com/aphelionz) (3 issues, 9 comments) +- [Martín Acosta](https://github.com/tinchoz49) (1 issue) +- [Martin Heidegger](https://github.com/martinheidegger) (1 issue) +- [Matt Joiner](https://github.com/anacrolix) (1 comment) +- [Matt Ober](https://github.com/obo20) (2 issues, 4 comments) +- [Matteo Collina](https://github.com/mcollina) (2 comments) +- [Michael Muré](https://github.com/MichaelMure) (1 PR) +- [Mikeal Rogers](https://github.com/mikeal) (1 PR, 6 issues, 7 reviews, 36 comments) +- [Mikerah](https://github.com/Mikerah) (1 PR, 1 comment) +- [Mitra Ardron](https://github.com/mitra42) (3 comments) +- [Mounish Sai](https://github.com/pvsmounish) (1 PR) +- [Nate Foss](https://github.com/npfoss) (1 comment) +- [Nick Poulden](https://github.com/nick) (1 comment) +- [nijynot](https://github.com/nijynot) (1 comment) +- [Nitin Patel](https://github.com/niinpatel) (10 PRs, 5 issues, 7 reviews, 13 comments) +- [noot](https://github.com/noot) (1 review, 1 comment) +- [Oli Evans](https://github.com/olizilla) (9 PRs, 2 issues, 6 reviews, 16 comments) +- [Olivier Sarrouy](https://github.com/osarrouy) (1 issue, 2 comments) +- [ondratra](https://github.com/ondratra) (1 issue, 2 comments) +- [Patrick Bay](https://github.com/monicanagent) (1 issue) +- [Pedro Gomes](https://github.com/pedrouid) (1 issue, 4 comments) +- [Pedro Teixeira](https://github.com/pgte) (2 issues, 1 review, 9 comments) +- [Perry Kundert](https://github.com/pjkundert) (2 PRs) +- [Pius Nyakoojo](https://github.com/PiusNyakoojo) (1 PR) +- [Portia Burton](https://github.com/pkafei) (1 PR, 3 comments) +- [postables](https://github.com/postables) (1 issue) +- [Prabhat](https://github.com/jollysean) (3 comments) +- [pranav maheshwari](https://github.com/pranavdaa) (1 issue, 2 comments) +- [projectoblio](https://github.com/projectoblio) (1 issue, 2 comments) +- [Rafael Matias](https://github.com/skylenet) (1 PR) +- [Raúl Kripalani](https://github.com/raulk) (2 issues, 9 comments) +- [Richard Schneider](https://github.com/richardschneider) (1 comment) +- [Robert Kiel](https://github.com/robertkiel) (1 PR, 1 comment) +- [Robert Misiorowski](https://github.com/rmisio) (4 issues, 7 comments) +- [Rod Vagg](https://github.com/rvagg) (1 PR, 9 reviews, 6 comments) +- [Rômulo Alves](https://github.com/romuloalves) (2 comments) +- [rori4](https://github.com/rori4) (1 issue, 2 comments) +- [Sam Strauch](https://github.com/SamTS) (1 issue) +- [Sameer Puri](https://github.com/sameer) (2 PRs, 2 reviews, 4 comments) +- [Steven Allen](https://github.com/Stebalien) (2 PRs, 2 comments) +- [Taaliman](https://github.com/taaliman) (1 issue, 1 comment) +- [Teri Chadbourne](https://github.com/terichadbourne) (1 issue, 4 comments) +- [Theo Gravity](https://github.com/theogravity) (1 comment) +- [Thomas Eizinger](https://github.com/thomaseizinger) (3 PRs, 1 issue, 8 comments) +- [Tim Schuppener](https://github.com/ultraschuppi) (1 issue, 2 comments) +- [Tyler van der Hoeven](https://github.com/tyvdh) (1 comment) +- [ukrocks007](https://github.com/ukrocks007) (1 issue) +- [useaquestion](https://github.com/useaquestion) (1 issue, 2 comments) +- [UtopiaCreatorX](https://github.com/UtopiaCreatorX) (1 issue, 2 comments) +- [vasa](https://github.com/vasa-develop) (1 issue, 3 comments) +- [Vasco Santos](https://github.com/vasco-santos) (26 PRs, 7 issues, 83 reviews, 43 comments) +- [Victor Bjelkholm](https://github.com/victorb) (1 review, 1 comment) +- [Vincent Martin](https://github.com/vincepmartin) (2 comments) +- [Vishal1010101](https://github.com/Vishal1010101) (1 comment) +- [Volker Mische](https://github.com/vmx) (30 PRs, 3 issues, 65 reviews, 76 comments) +- [w3cshare](https://github.com/w3cshare) (1 comment) +- [Whyrusleeping](https://github.com/whyrusleeping) (1 issue) +- [X5 Engine](https://github.com/x5engine) (1 issue, 4 comments) +- [xialvjun](https://github.com/xialvjun) (1 issue) +- [Yusef Napora](https://github.com/yusefnapora) (2 PRs, 1 comment) +- [yuwiggin](https://github.com/yuwiggin) (1 issue, 1 comment) +- [Zane Starr](https://github.com/zcstarr) (2 PRs, 2 reviews) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/ipfs/js-ipfs?label=help%20wanted +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/team-mgmt/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #ipfs channel on Freenode. diff --git a/src/_blog/045-js-libp2p-0.25/README.md b/src/_blog/045-js-libp2p-0.25/README.md new file mode 100644 index 00000000..b52158ca --- /dev/null +++ b/src/_blog/045-js-libp2p-0.25/README.md @@ -0,0 +1,126 @@ +--- +date: 2019-04-12 +url: /81-js-libp2p-0-25/ +title: js-libp2p 0.25.0 released +description: +author: Jacob Heun +header_image: 045-js-libp2p-0.25.png +--- + +> Save the routers, save the world. + +# 🔦 Highlights + +Libp2p 0.25 is already in the new [js-ipfs 0.35 release](https://github.com/ipfs/js-ipfs/issues/1826). If you're using js-ipfs, you'll get these changes immediately if you upgrade there! + +## ☎️ Auto Dial + +Libp2p will now auto dial to discovered peers by default. This can be disabled in configuration if you need to do any specialized dialing. Discovered peers will only be dialed if we are under our min peers threshold, which is configured for the Connection Manager. You can read more about [Peer Discovery and Auto Dial here](https://github.com/libp2p/js-libp2p/blob/v0.25.0/PEER_DISCOVERY.md). + +## ✂️ Better Connection Management + +We fixed an issue with Libp2p Switch that resulted in the Connection Manager thinking there were far fewer connections than there actually were. The Connection Manager is back to keeping your router safe and your connection count within its [configured range](https://github.com/libp2p/js-libp2p-connection-manager/tree/v0.1.0#create-a-connectionmanager). + +## 📔 Blacklisting Undialable Nodes + +Libp2p will now blacklist nodes that aren't dialable. The blacklisting includes an exponential backoff with a random jitter. This along with auto dial, helps to ensure libp2p is spending its connection resources wisely. You can read more about the configuration options in the [libp2p-switch readme](https://github.com/libp2p/js-libp2p-switch/tree/v0.42.9#create-a-libp2p-switch). + +## 🔢 Dial Queues + +Libp2p Switch now has better queuing for dials! Previously, the only limiting of dials was done per peer. Now, all dials will enter a global queue so that we can better manage connection attempts. The current default limit is 100 parallel dials, but you can configure this to your needs. If a peer is already connected, any calls to `.dial()` or `.dialProtocol()` skip the line and will be executed immediately. Any dials done as a result of Auto Dial will take a back seat. + +## ⚖️ Smaller than ever + +Since the 0.24 release, libp2p has dropped some weight. The bundle size is now **~42%** smaller! + +# 🏗 API Changes + +- Auto Dial is enabled by default. Applications that previously dialed on peer discovery should either stop doing so, or turn off Auto Dial. We recommend using Auto Dial if you're not customizing your dialing logic when peers are discovered. +- The DHT no longer lives under EXPERIMENTAL in the config. It is enabled directly in it's own config options. Check out the [Peer and Content Routing example](https://github.com/libp2p/js-libp2p/tree/v0.25.0/examples/peer-and-content-routing) to see how to configure a basic Libp2p node with the DHT on. +- Pubsub now supports unsubscribe all. Check out [interface-js-ipfs-core docs](https://github.com/ipfs/interface-js-ipfs-core/blob/v0.99.2/SPEC/PUBSUB.md#pubsubunsubscribe) if you want to be able to unsubscribe all listeners for a topic. + +# ❤️ Huge thank you to everyone that made this release possible + +In alphabetical order, here are all the humans that contributed to the release: + +- [a1300](https://github.com/a1300) (1 comment) +- [Adam Gall](https://github.com/adamgall) (1 comment) +- [Aditya Bose](https://github.com/adbose) (1 PR) +- [Alan Shaw](https://github.com/alanshaw) (10 PRs, 4 issues, 13 reviews, 12 comments) +- [Alberto Elias](https://github.com/AlbertoElias) (3 PRs, 2 issues, 1 review, 12 comments) +- [Alex Potsides](https://github.com/achingbrain) (1 issue) +- [André Cruz](https://github.com/satazor) (1 issue, 4 comments) +- [Andrej Novikov](https://github.com/shroomist) (1 comment) +- [Andrew Nesbitt](https://github.com/andrew) (2 PRs) +- [Beeno Tung](https://github.com/beenotung) (1 PR, 3 comments) +- [Blake Byrnes](https://github.com/blakebyrnes) (1 PR, 3 reviews, 4 comments) +- [Chris Anderson](https://github.com/jchris) (1 PR) +- [Chris Aslanoglou](https://github.com/chris-asl) (1 issue) +- [Daniel Krech](https://github.com/eikeon) (1 PR) +- [David Dias](https://github.com/daviddias) (10 reviews, 7 comments) +- [Davit Barbakadze](https://github.com/jayarjo) (1 issue, 3 comments) +- [dirkmc](https://github.com/dirkmc) (12 PRs, 8 reviews, 10 comments) +- [Dmitriy Ryajov](https://github.com/dryajov) (4 comments) +- [Donald Tsang](https://github.com/DonaldTsang) (1 issue) +- [Elad](https://github.com/justelad) (1 comment) +- [Franck Royer](https://github.com/D4nte) (1 comment) +- [Friedel Ziegelmayer](https://github.com/dignifiedquire) (2 reviews, 9 comments) +- [Georgios Rassias](https://github.com/grassias) (1 comment) +- [Gregory Markou](https://github.com/GregTheGreek) (1 comment) +- [Henrique Dias](https://github.com/hacdias) (2 comments) +- [Huberto Kaiser Filho](https://github.com/hubertokf) (2 issues, 4 comments) +- [Hugo Dias](https://github.com/hugomrdias) (6 PRs, 14 reviews, 15 comments) +- [Hunter Trujillo](https://github.com/cryptoquick) (1 comment) +- [Irakli Gozalishvili](https://github.com/Gozala) (5 issues) +- [isan_rivkin](https://github.com/Isan-Rivkin) (1 PR, 1 comment) +- [IwraStudios](https://github.com/IwraStudios) (1 issue) +- [Jaco Greeff](https://github.com/jacogr) (1 comment) +- [Jacob Heun](https://github.com/jacobheun) (23 PRs, 6 issues, 66 reviews, 79 comments) +- [João Antunes](https://github.com/JGAntunes) (1 PR, 1 issue, 1 comment) +- [John Hiesey](https://github.com/jhiesey) (1 comment) +- [Lorenzo Setale ](https://github.com/koalalorenzo) (3 comments) +- [Maciej Krüger](https://github.com/mkg20001) (3 PRs, 2 issues, 2 reviews, 32 comments) +- [Marcin Rataj](https://github.com/lidel) (1 PR, 1 comment) +- [Mark Robert Henderson](https://github.com/aphelionz) (1 issue, 3 comments) +- [Martín Acosta](https://github.com/tinchoz49) (1 issue) +- [Martin Heidegger](https://github.com/martinheidegger) (1 issue) +- [Matt Joiner](https://github.com/anacrolix) (1 issue, 1 comment) +- [Matteo Collina](https://github.com/mcollina) (1 issue, 1 review) +- [Mikeal Rogers](https://github.com/mikeal) (1 PR, 4 issues, 5 comments) +- [Mikerah](https://github.com/Mikerah) (1 PR, 2 issues, 2 comments) +- [nikor](https://github.com/nikor) (3 PRs, 3 comments) +- [noot](https://github.com/noot) (1 review, 3 comments) +- [Oli Evans](https://github.com/olizilla) (3 PRs) +- [Patrick Bay](https://github.com/monicanagent) (1 issue) +- [Pedro Teixeira](https://github.com/pgte) (1 review, 5 comments) +- [Perry Kundert](https://github.com/pjkundert) (2 PRs) +- [raduiliescu83](https://github.com/raduiliescu83) (1 issue) +- [Rafael Matias](https://github.com/skylenet) (1 PR) +- [Raúl Kripalani](https://github.com/raulk) (2 issues, 9 comments) +- [Richard Schneider](https://github.com/richardschneider) (1 comment) +- [Robert Kiel](https://github.com/robertkiel) (1 PR, 1 comment) +- [Robert Misiorowski](https://github.com/rmisio) (1 issue) +- [Rod Vagg](https://github.com/rvagg) (1 PR, 1 review) +- [ron litzenberger](https://github.com/litzenberger) (3 comments) +- [Sam Strauch](https://github.com/SamTS) (1 issue) +- [Taaliman](https://github.com/taaliman) (1 issue, 1 comment) +- [Theo Gravity](https://github.com/theogravity) (1 comment) +- [Thomas Eizinger](https://github.com/thomaseizinger) (3 PRs, 1 issue, 8 comments) +- [Vasco Santos](https://github.com/vasco-santos) (22 PRs, 6 issues, 59 reviews, 35 comments) +- [Victor Bjelkholm](https://github.com/victorb) (1 review, 1 comment) +- [Volker Mische](https://github.com/vmx) (1 PR, 5 reviews, 4 comments) +- [Yusef Napora](https://github.com/yusefnapora) (2 PRs, 1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [libp2p repo](https://github.com/libp2p/js-libp2p/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽 ](https://github.com/ipfs/team-mgmt/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about libp2p, how it works and what you can do with it is at [discuss.libp2p.io](https://discuss.libp2p.io). We are also available at the #libp2p channel on Freenode. diff --git a/src/_blog/046-go-ipfs-0.4.20/README.md b/src/_blog/046-go-ipfs-0.4.20/README.md new file mode 100644 index 00000000..1e083751 --- /dev/null +++ b/src/_blog/046-go-ipfs-0.4.20/README.md @@ -0,0 +1,532 @@ +--- +date: 2019-04-16 +url: /83-go-ipfs-0-4-20/ +title: go-ipfs 0.4.20 released +description: +author: Steven Allen +--- + +We're excited to release go-ipfs 0.4.20, trail-blazing the way to the distributed web. This release includes some critical +performance and stability fixes so all users should upgrade ASAP! As of release four-twenty, the CLI should be more usable due to improved commands, Bitswap should be more reliable, and the relays should be much more performant. Enjoy! + +This is also the first release to use the budding go modules system instead of GX. While GX has +been a great way to dogfood an IPFS-based package manager, building and +maintaining a custom package manager is a _lot_ of work and we haven't been able +to dedicate enough time to bring the user experience of gx to an acceptable +level. You can read [#5850](https://github.com/ipfs/go-ipfs/issues/5850) for +some discussion on this matter. + +# 🔦 Highlights + +## ⛴ Docker + +As of this release, it's now much easier to run arbitrary IPFS commands within +the docker container: + +```bash +> docker run --name my-ipfs ipfs/go-ipfs:v0.4.20 config profile apply server # apply the server profile +> docker start my-ipfs # start the daemon +``` + +This release also [reverts](https://github.com/ipfs/go-ipfs/pull/6040) a change that +caused some significant trouble in 0.4.19. If you've been running into Docker +permission errors in 0.4.19, please upgrade. + +## 🕸 WebUI + +This release contains a major +[WebUI](https://github.com/ipfs-shipyard/ipfs-webui) release with some +significant improvements to the file browser and new opt-in, privately hosted, +anonymous usage analytics. + +## 🕹 Commands + +As usual, we've made several changes and improvements to our commands. The most +notable changes are listed in this section. + +### New: `ipfs version deps` + +This release includes a new command, `ipfs version deps`, to list all +dependencies (with versions) of the current go-ipfs build. This should make it +easy to tell exactly how go-ipfs was built when tracking down issues. + +### New: `ipfs add URL` + +The `ipfs add` command has gained support for URLs. This means you can: + +1. Add files with `ipfs add URL` instead of downloading the file first. +2. Replace all uses of the `ipfs urlstore` command with a call to `ipfs add --nocopy`. The `ipfs urlstore` command will be deprecated in a future + release. + +### Changed: `ipfs swarm connect` + +The `ipfs swarm connect` command has a few new features: + +It now marks the newly created connection as "important". This should ensure +that the connection manager won't come along later and close the connection if +it doesn't think it's being used. + +It can now resolve `/dnsaddr` addresses that _don't_ end in a peer ID. For +example, you can now run `ipfs swarm connect /dnsaddr/bootstrap.libp2p.io` to +connect to one of the bootstrap peers at random. NOTE: This could connect you to +an _arbitrary_ peer as DNS is not secure (by default). Please do not rely on +this except for testing or unless you know what you're doing. + +Finally, `ipfs swarm connect` now returns _all_ errors on failure. This should +make it much easier to debug connectivity issues. For example, one might see an +error like: + +``` +Error: connect QmYou failure: dial attempt failed: 6 errors occurred: + * --> (/ip4/127.0.0.1/tcp/4001) dial attempt failed: dial tcp4 127.0.0.1:4001: connect: connection refused + * --> (/ip6/::1/tcp/4001) dial attempt failed: dial tcp6 [::1]:4001: connect: connection refused + * --> (/ip6/2604::1/tcp/4001) dial attempt failed: dial tcp6 [2604::1]:4001: connect: network is unreachable + * --> (/ip6/2602::1/tcp/4001) dial attempt failed: dial tcp6 [2602::1]:4001: connect: network is unreachable + * --> (/ip4/150.0.1.2/tcp/4001) dial attempt failed: dial tcp4 0.0.0.0:4001->150.0.1.2:4001: i/o timeout + * --> (/ip4/200.0.1.2/tcp/4001) dial attempt failed: dial tcp4 0.0.0.0:4001->200.0.1.2:4001: i/o timeout +``` + +### Changed: `ipfs bitswap stat` + +`ipfs bitswap stat` no longer lists bitswap partners unless the `-v` flag is +passed. That is, it will now return: + +``` +> ipfs bitswap stat +bitswap status + provides buffer: 0 / 256 + blocks received: 0 + blocks sent: 79 + data received: 0 + data sent: 672706 + dup blocks received: 0 + dup data received: 0 B + wantlist [0 keys] + partners [197] +``` + +Instead of: + +``` +> ipfs bitswap stat -v +bitswap status + provides buffer: 0 / 256 + blocks received: 0 + blocks sent: 79 + data received: 0 + data sent: 672706 + dup blocks received: 0 + dup data received: 0 B + wantlist [0 keys] + partners [203] + QmNQTTTRCDpCYCiiu6TYWCqEa7ShAUo9jrZJvWngfSu1mL + QmNWaxbqERvdcgoWpqAhDMrbK2gKi3SMGk3LUEvfcqZcf4 + QmNgSVpgZVEd41pBX6DyCaHRof8UmUJLqQ3XH2qNL9xLvN + ... omitting 200 lines ... +``` + +### Changed: `ipfs repo stat --human` + +The `--human` flag in the `ipfs repo stat` command now intelligently picks a +size unit instead of always using MiB. + +### Changed: `ipfs resolve` (`ipfs dns`, `ipfs name resolve`) + +All of the resolve commands now: + +1. Resolve _recursively_ (up to 32 steps) by default to better match user + expectations (these commands used to be non-recursive by default). To turn + recursion off, pass `-r false`. +2. When resolving non-recursively, these commands no longer fail when partially + resolving a name. Instead, they simply return the intermediate result. + +### Changed: `ipfs files flush` + +The `ipfs files flush` command now returns the CID of the flushed file. + +## Performance And Reliability + +This release has the usual collection of performance and reliability +improvements. + +### 🐺 Badger Memory Usage + +Those of you using the badger datastore should notice reduced memory usage in +this release due to some upstream changes. Badger still uses significantly more +memory than the default datastore configuration, but it is also much faster, and memory usage will hopefully continue +to improve. + +### 🔁 Bitswap + +We fixed some critical CPU utilization regressions in bitswap for this release. +If you've been noticing CPU _regressions_ in go-ipfs 0.4.19, especially when +running a public gateway, upgrading to 0.4.20 will likely fix them. + +### 🏃‍ Relays + +After AutoRelay was introduced in go-ipfs 0.4.19, the number of peers connecting +through relays skyrocketed to over 120K concurrent peers. This highlighted some +performance issues that we've now fixed in this release. Specifically: + +- We've significantly reduced the amount of memory allocated per-peer. +- We've fixed a bug where relays might, in rare cases, try to actively dial a + peer to relay traffic. By default, relays only forward traffic between peers + already connected to the relay. +- We've fixed quite a number of performance issues that only show up when + rapidly forming new connections. This will actually help _all_ nodes but will + especially help relays. + +If you've enabled relay _hop_ (`Swarm.EnableRelayHop`) in go-ipfs 0.4.19 and it +hasn't burned down your machine yet, this release should improve things +significantly. However, relays are still under heavy load so running an open +relay will continue to be resource intensive. + +We're continuing to investigate this issue and have a few more patches on the +way that, unfortunately, won't make it into this release. + +### 😱 Panics + +We've fixed two notable panics in this release: + +- We've fixed a frequent panic in the DHT. +- We've fixed an occasional panic in the experimental QUIC transport. + +## 📖 Content Routing + +IPFS announces and finds content by sending and retrieving content routing +("provider") records to and from the DHT. Unfortunately, sending out these +records can be quite resource intensive. + +This release has two changes to alleviate this: 1. a reduced number of initial +provide workers and 2. a persistent provider queue. + +We've reduced the number of parallel initial provide workers (workers that send +out provider records when content is initially added to go-ipfs) from 512 to 6, to avoid additional performance overhead from simultaneous provide requests. +Currently, due to some issues in our DHT, each provide request tries to +establish hundreds of connections, significantly impacting the performance of +go-ipfs and [crashing some +routers](https://github.com/ipfs/go-ipfs/issues/3320). + +We've introduced a new persistent provider queue for files added via `ipfs add` +and `ipfs pin add`. When new directory trees are added to go-ipfs, go-ipfs will +add the root/final CID to this queue. Then, in the background, go-ipfs will walk +the queue, sequentially sending out provider records for each CID. + +This ensures that root CIDs are sent out as soon as possible and are sent even +when files are added when the go-ipfs daemon isn't running. + +By example, let's add a directory tree to go-ipfs: + +```bash +> # We're going to do this in "online" mode first so let's start the daemon. +> ipfs daemon & +... +Daemon is ready +> # Now, we're going to create a directory to add. +> mkdir foo +> for i in {0..1000}; do echo do echo $i > foo/$i; done +> # finally, we're going to add it. +> ipfs add -r foo +added QmUQcSjQx2bg4cSe2rUZyQi6F8QtJFJb74fWL7D784UWf9 foo/0 +... +added QmQac2chFyJ24yfG2Dfuqg1P5gipLcgUDuiuYkQ5ExwGap foo/990 +added QmQWwz9haeQ5T2QmQeXzqspKdowzYELShBCLzLJjVa2DuV foo/991 +added QmQ5D4MtHUN4LTS4n7mgyHyaUukieMMyCfvnzXQAAbgTJm foo/992 +added QmZq4n4KRNq3k1ovzxJ4qdQXZSrarfJjnoLYPR3ztHd7EY foo/993 +added QmdtrsuVf8Nf1s1MaSjLAd54iNqrn1KN9VoFNgKGnLgjbt foo/994 +added QmbstvU9mnW2hsE94WFmw5WbrXdLTu2Sf9kWWSozrSDscL foo/995 +added QmXFd7f35gAnmisjfFmfYKkjA3F3TSpvUYB9SXr6tLsdg8 foo/996 +added QmV5BxS1YQ9V227Np2Cq124cRrFDAyBXNMqHHa6kpJ9cr6 foo/997 +added QmcXsccUtwKeQ1SuYC3YgyFUeYmAR9CXwGGnT3LPeCg5Tx foo/998 +added Qmc4mcQcpaNzyDQxQj5SyxwFg9ZYz5XBEeEZAuH4cQirj9 foo/999 +added QmXpXzUhcS9edmFBuVafV5wFXKjfXkCQcjAUZsTs7qFf3G foo +``` + +In 0.4.19, we would have sent out provider records for files `foo/{0..1000}` +_before_ sending out a provider record for `foo`. If you were to ask a friend to +download /ipfs/QmUQcSjQx2bg4cSe2rUZyQi6F8QtJFJb74fWL7D784UWf9, they would +(baring other issues) be able to find it pretty quickly as this is the first CID +you'll have announced to the network. However, if you ask your friend to +download /ipfs/QmXpXzUhcS9edmFBuVafV5wFXKjfXkCQcjAUZsTs7qFf3G/0, they'll have to +wait for you to finish telling the network about every file in `foo` first. + +In 0.4.20, we _immediately_ tell the network about +`QmXpXzUhcS9edmFBuVafV5wFXKjfXkCQcjAUZsTs7qFf3G` (the `foo` directory) as soon +as we finish adding the directory to go-ipfs _without_ waiting to finish +announcing `foo/{0..1000}`. This is especially important in this release +because we've drastically reduced the number of provide workers. + +The second benefit is that this queue is persistent. That means go-ipfs won't +forget to send out this record, even if it was offline when the content was +initially added. NOTE: go-ipfs _does_ continuously _re_-send provider records in +the background twice a day, it just might be a while before it gets around to +sending out any specific one. + +## 🔂 Bitswap Reliability + +Bitswap now periodically re-sends its wantlist to connected peers. This should +help work around some race conditions we've seen in bitswap where one node wants +a block but the other doesn't know for some reason. + +You can track this issue here: https://github.com/ipfs/go-ipfs/issues/5183. + +## 🤠 Improved NAT Traversal + +While NATs are still p2p enemy #1, this release includes slightly improved +support for traversing them. + +Specifically, this release now: + +1. Better detects the "gateway" NAT, even when multiple devices on the network + _claim_ to be NATs. +2. Better guesses the external IP address when port mapping, even when the + gateway lies. + +## 📡 Reduced AutoRelay Boot Time + +The experimental AutoRelay feature can now detect NATs _much_ faster as we've +reduced initial NAT detection delay to 15 seconds. There's still room for +improvement, but this should make nodes that have enabled this feature dialable +earlier on start. + +# ❤️ Contributors + +We'd like to thank all the users who contributed to this release including +contributors to ipfs, ipld, libp2p, and multiformats. + +| Contributor | Commits | Lines ± | Files Changed | +| ------------------- | ------- | ----------- | ------------- | +| Raúl Kripalani | 60 | +5489/-1104 | 163 | +| Jakub Sztandera | 55 | +4891/-514 | 145 | +| Steven Allen | 130 | +2075/-1563 | 246 | +| vyzo | 63 | +474/-268 | 92 | +| Michael Avila | 13 | +458/-74 | 22 | +| Matt Joiner | 14 | +323/-172 | 32 | +| hannahhoward | 5 | +158/-130 | 6 | +| Łukasz Magiera | 10 | +120/-167 | 19 | +| Anton Petrov | 4 | +135/-4 | 8 | +| Andrew Nesbitt | 3 | +57/-64 | 4 | +| Yusef Napora | 14 | +63/-49 | 14 | +| Marten Seemann | 3 | +24/-78 | 11 | +| tg | 1 | +82/-15 | 5 | +| jmank88 | 4 | +88/-4 | 6 | +| Richard Littauer | 3 | +64/-1 | 3 | +| whyrusleeping | 2 | +55/-9 | 3 | +| Kevin Atkinson | 3 | +34/-1 | 5 | +| aschmahmann | 1 | +33/-0 | 1 | +| Evgeniy Kulikov | 2 | +7/-17 | 3 | +| Anatoliy Basov | 1 | +11/-6 | 1 | +| Bob Potter | 1 | +3/-10 | 1 | +| Lars Gierth | 1 | +1/-9 | 1 | +| Dominic Della Valle | 1 | +5/-2 | 1 | +| Leonhard Markert | 1 | +2/-2 | 1 | +| gukq | 2 | +2/-2 | 2 | +| Alex Browne | 1 | +1/-1 | 1 | +| Hector Sanjuan | 1 | +1/-1 | 1 | +| Tomas Virgl | 1 | +1/-1 | 1 | +| lnykww | 1 | +1/-1 | 1 | +| monotone | 1 | +1/-1 | 1 | + +We'd also like to thank users who've reported and helped diagnose bugs and all +those community members who've helped out on the forums and IRC. + +# 📜 Changelog + +For those of you who like to look through the PRs that went into this release, +here is the complete changelog. + +- github.com/ipfs/go-ipfs: + - gitattributes: avoid normalizing known binary files ([ipfs/go-ipfs#6209](https://github.com/ipfs/go-ipfs/pull/6209)) + - gitattributes: default to LF ([ipfs/go-ipfs#6198](https://github.com/ipfs/go-ipfs/pull/6198)) + - Fix level db panic ([ipfs/go-ipfs#6186](https://github.com/ipfs/go-ipfs/pull/6186)) + - Dockerfile: Remove 2 year old deprecation warning ([ipfs/go-ipfs#6188](https://github.com/ipfs/go-ipfs/pull/6188)) + - align output for the command ipfs object stat ([ipfs/go-ipfs#6189](https://github.com/ipfs/go-ipfs/pull/6189)) + - provider queue: don't repeatedly retry the same item if we fail ([ipfs/go-ipfs#6187](https://github.com/ipfs/go-ipfs/pull/6187)) + - test: remove version/deps from ro commands test ([ipfs/go-ipfs#6185](https://github.com/ipfs/go-ipfs/pull/6185)) + - feat: add version deps command [modversion] ([ipfs/go-ipfs#6115](https://github.com/ipfs/go-ipfs/pull/6115)) + - readme: update for go modules ([ipfs/go-ipfs#6180](https://github.com/ipfs/go-ipfs/pull/6180)) + - Switch to Go 1.12 ([ipfs/go-ipfs#6144](https://github.com/ipfs/go-ipfs/pull/6144)) + - ci: avoid interleaving output from different sharness tests ([ipfs/go-ipfs#6175](https://github.com/ipfs/go-ipfs/pull/6175)) + - fix two bugs where the repo may not properly be closed ([ipfs/go-ipfs#6176](https://github.com/ipfs/go-ipfs/pull/6176)) + - fix error check in swarm connect ([ipfs/go-ipfs#6174](https://github.com/ipfs/go-ipfs/pull/6174)) + - feat(coreapi): tag all explicit connect requests in the connection manager ([ipfs/go-ipfs#6171](https://github.com/ipfs/go-ipfs/pull/6171)) + - chore: remove CODEOWNERS ([ipfs/go-ipfs#6172](https://github.com/ipfs/go-ipfs/pull/6172)) + - feat: update to IPFS Web UI 2.4.4 ([ipfs/go-ipfs#6169](https://github.com/ipfs/go-ipfs/pull/6169)) + - fix add error handling ([ipfs/go-ipfs#6156](https://github.com/ipfs/go-ipfs/pull/6156)) + - chore: remove waffle ([ipfs/go-ipfs#6157](https://github.com/ipfs/go-ipfs/pull/6157)) + - chore: fix a bunch of issues caught by golangci-lint ([ipfs/go-ipfs#6140](https://github.com/ipfs/go-ipfs/pull/6140)) + - docs/experimental-features.md: link to ipfs-ds-convert ([ipfs/go-ipfs#6154](https://github.com/ipfs/go-ipfs/pull/6154)) + - interrupt: fix send on closed ([ipfs/go-ipfs#6147](https://github.com/ipfs/go-ipfs/pull/6147)) + - docs: document Gateway.Writable not Gateway.Writeable ([ipfs/go-ipfs#6151](https://github.com/ipfs/go-ipfs/pull/6151)) + - Fuse fixes ([ipfs/go-ipfs#6135](https://github.com/ipfs/go-ipfs/pull/6135)) + - Remove duplicate blockstore from the package list ([ipfs/go-ipfs#6138](https://github.com/ipfs/go-ipfs/pull/6138)) + - Query for provider head/tail ([ipfs/go-ipfs#6125](https://github.com/ipfs/go-ipfs/pull/6125)) + - Remove dead link from ISSUE_TEMPLATE.md ([ipfs/go-ipfs#6128](https://github.com/ipfs/go-ipfs/pull/6128)) + - coreapi: remove Unixfs.Wrap ([ipfs/go-ipfs#6123](https://github.com/ipfs/go-ipfs/pull/6123)) + - coreapi unixfs: change Wrap logic to make more sense ([ipfs/go-ipfs#6019](https://github.com/ipfs/go-ipfs/pull/6019)) + - deps: switch back to jbenet go-is-domain ([ipfs/go-ipfs#6119](https://github.com/ipfs/go-ipfs/pull/6119)) + - command repo stat: add human flag tests to t0080-repo.sh ([ipfs/go-ipfs#6116](https://github.com/ipfs/go-ipfs/pull/6116)) + - gc: fix a potential deadlock ([ipfs/go-ipfs#6112](https://github.com/ipfs/go-ipfs/pull/6112)) + - fix config options in osxfuse error messages ([ipfs/go-ipfs#6105](https://github.com/ipfs/go-ipfs/pull/6105)) + - Command repo stat: improve human flag behavior ([ipfs/go-ipfs#6106](https://github.com/ipfs/go-ipfs/pull/6106)) + - Provide root node immediately on add and pin add ([ipfs/go-ipfs#6068](https://github.com/ipfs/go-ipfs/pull/6068)) + - gomod: Update Dockerfile, remove Dockerfile.fast ([ipfs/go-ipfs#6100](https://github.com/ipfs/go-ipfs/pull/6100)) + - Return CID from 'ipfs files flush' ([ipfs/go-ipfs#6102](https://github.com/ipfs/go-ipfs/pull/6102)) + - resolve: fix recursion ([ipfs/go-ipfs#6087](https://github.com/ipfs/go-ipfs/pull/6087)) + - fix(swarm): add dnsaddr support in swarm connect ([ipfs/go-ipfs#5535](https://github.com/ipfs/go-ipfs/pull/5535)) + - make in-memory datastore thread-safe ([ipfs/go-ipfs#6085](https://github.com/ipfs/go-ipfs/pull/6085)) + - Update package table to remove broken jenkins links ([ipfs/go-ipfs#6084](https://github.com/ipfs/go-ipfs/pull/6084)) + - mk: fix maketarball to work with gomod ([ipfs/go-ipfs#6078](https://github.com/ipfs/go-ipfs/pull/6078)) + - fix ls command to use the new coreinterface types ([ipfs/go-ipfs#6051](https://github.com/ipfs/go-ipfs/pull/6051)) + - mk: remove install_unsupported, leave a note ([ipfs/go-ipfs#6063](https://github.com/ipfs/go-ipfs/pull/6063)) + - mk: change git-hash command to include information about modifications ([ipfs/go-ipfs#6060](https://github.com/ipfs/go-ipfs/pull/6060)) + - mk: fix make install by not setting GOBIN ([ipfs/go-ipfs#6059](https://github.com/ipfs/go-ipfs/pull/6059)) + - go: require Golang 1.11.4 ([ipfs/go-ipfs#6057](https://github.com/ipfs/go-ipfs/pull/6057)) + - yamux: increase yamux window size to 8MiB. ([ipfs/go-ipfs#6049](https://github.com/ipfs/go-ipfs/pull/6049)) + - Introduce go modules [yey] ([ipfs/go-ipfs#6038](https://github.com/ipfs/go-ipfs/pull/6038)) + - cleanup daemon online logic ([ipfs/go-ipfs#6050](https://github.com/ipfs/go-ipfs/pull/6050)) + - ci: test on 32bit os ([ipfs/go-ipfs#5429](https://github.com/ipfs/go-ipfs/pull/5429)) + - feat/cmds: hide peers info default in bitswap stat ([ipfs/go-ipfs#5820](https://github.com/ipfs/go-ipfs/pull/5820)) + - Improve CLI help pages ([ipfs/go-ipfs#6013](https://github.com/ipfs/go-ipfs/pull/6013)) + - Close #6044 ([ipfs/go-ipfs#6045](https://github.com/ipfs/go-ipfs/pull/6045)) + - commands(dht): return final error ([ipfs/go-ipfs#6034](https://github.com/ipfs/go-ipfs/pull/6034)) + - Revert "Really run as non-root user in docker container" ([ipfs/go-ipfs#6040](https://github.com/ipfs/go-ipfs/pull/6040)) +- github.com/ipfs/go-bitswap: + - feat(messagequeue): rebroadcast wantlist ([ipfs/go-bitswap#106](https://github.com/ipfs/go-bitswap/pull/106)) + - reduce provide workers to 6 ([ipfs/go-bitswap#93](https://github.com/ipfs/go-bitswap/pull/93)) + - Reduce memory allocation ([ipfs/go-bitswap#103](https://github.com/ipfs/go-bitswap/pull/103)) + - refactor(messagequeue): remove dead code ([ipfs/go-bitswap#98](https://github.com/ipfs/go-bitswap/pull/98)) + - fix: limit use of custom context type ([ipfs/go-bitswap#89](https://github.com/ipfs/go-bitswap/pull/89)) + - fix: remove non-error log message ([ipfs/go-bitswap#91](https://github.com/ipfs/go-bitswap/pull/91)) + - fix(messagequeue): Remove second run loop ([ipfs/go-bitswap#94](https://github.com/ipfs/go-bitswap/pull/94)) +- github.com/ipfs/go-blockservice: + - Revert "Remove verifcid as it is handled in go-cid" ([ipfs/go-blockservice#25](https://github.com/ipfs/go-blockservice/pull/25)) + - Remove verifcid as it is handled in go-cid ([ipfs/go-blockservice#23](https://github.com/ipfs/go-blockservice/pull/23)) +- github.com/ipfs/go-datastore: + - cleanup and optimize naive query filters ([ipfs/go-datastore#125](https://github.com/ipfs/go-datastore/pull/125)) + - Fix – sorted limited offset mount queries ([ipfs/go-datastore#124](https://github.com/ipfs/go-datastore/pull/124)) + - Fix function comments based on best practices from Effective Go ([ipfs/go-datastore#122](https://github.com/ipfs/go-datastore/pull/122)) + - remove ThreadSafeDatastore ([ipfs/go-datastore#120](https://github.com/ipfs/go-datastore/pull/120)) + - Splinter TTLDatastore interface into TTL + Datastore ([ipfs/go-datastore#118](https://github.com/ipfs/go-datastore/pull/118)) +- github.com/ipfs/go-ds-badger: + - tweak the default options ([ipfs/go-ds-badger#52](https://github.com/ipfs/go-ds-badger/pull/52)) + - remove thread-safe assertion ([ipfs/go-ds-badger#55](https://github.com/ipfs/go-ds-badger/pull/55)) + - make memory-safe against concurrent closure/operations ([ipfs/go-ds-badger#53](https://github.com/ipfs/go-ds-badger/pull/53)) + - make badger use our logging framework ([ipfs/go-ds-badger#50](https://github.com/ipfs/go-ds-badger/pull/50)) +- github.com/ipfs/go-ds-flatfs: + - remove thread-safe assertion ([ipfs/go-ds-flatfs#53](https://github.com/ipfs/go-ds-flatfs/pull/53)) +- github.com/ipfs/go-ds-leveldb: + - Fast reverse query ([ipfs/go-ds-leveldb#28](https://github.com/ipfs/go-ds-leveldb/pull/28)) + - remove thread-safe assertion ([ipfs/go-ds-leveldb#27](https://github.com/ipfs/go-ds-leveldb/pull/27)) +- github.com/ipfs/go-ipfs-cmdkit: + - Extract files package ([ipfs/go-ipfs-cmdkit#31](https://github.com/ipfs/go-ipfs-cmdkit/pull/31)) +- github.com/ipfs/go-ipfs-cmds: + - sync: add yet another sync error ([ipfs/go-ipfs-cmds#161](https://github.com/ipfs/go-ipfs-cmds/pull/161)) + - Removed broken link from readme ([ipfs/go-ipfs-cmds#159](https://github.com/ipfs/go-ipfs-cmds/pull/159)) + - Fix broken link in readme ([ipfs/go-ipfs-cmds#160](https://github.com/ipfs/go-ipfs-cmds/pull/160)) + - set WebFile fpath to URL base ([ipfs/go-ipfs-cmds#158](https://github.com/ipfs/go-ipfs-cmds/pull/158)) + - Handle stdin name in cli/parse ([ipfs/go-ipfs-cmds#157](https://github.com/ipfs/go-ipfs-cmds/pull/157)) + - support url paths as files.WebFile ([ipfs/go-ipfs-cmds#154](https://github.com/ipfs/go-ipfs-cmds/pull/154)) + - typed encoder: improve pointer reflection ([ipfs/go-ipfs-cmds#155](https://github.com/ipfs/go-ipfs-cmds/pull/155)) + - cli: don't sync output to NUL on Windows ([ipfs/go-ipfs-cmds#153](https://github.com/ipfs/go-ipfs-cmds/pull/153)) +- github.com/ipfs/go-ipfs-files: + - return url as AbsPath from WebFile to implement FileInfo ([ipfs/go-ipfs-files#13](https://github.com/ipfs/go-ipfs-files/pull/13)) + - fix the content disposition header ([ipfs/go-ipfs-files#14](https://github.com/ipfs/go-ipfs-files/pull/14)) + - go format ([ipfs/go-ipfs-files#15](https://github.com/ipfs/go-ipfs-files/pull/15)) + - simplify content type checking ([ipfs/go-ipfs-files#9](https://github.com/ipfs/go-ipfs-files/pull/9)) + - remove extra webfile test code ([ipfs/go-ipfs-files#12](https://github.com/ipfs/go-ipfs-files/pull/12)) +- github.com/ipfs/go-merkledag: + - add function to marshal raw nodes to json ([ipfs/go-merkledag#36](https://github.com/ipfs/go-merkledag/pull/36)) + - fix some performance regressions when reading protobuf nodes ([ipfs/go-merkledag#34](https://github.com/ipfs/go-merkledag/pull/34)) +- github.com/ipfs/go-metrics-interface: + - update the counter interface to match prometheus ([ipfs/go-metrics-interface#2](https://github.com/ipfs/go-metrics-interface/pull/2)) +- github.com/ipfs/go-mfs: + - Return node from FlushPath ([ipfs/go-mfs#72](https://github.com/ipfs/go-mfs/pull/72)) + - Wire up context to FlushPath ([ipfs/go-mfs#70](https://github.com/ipfs/go-mfs/pull/70)) +- github.com/ipfs/interface-go-ipfs-core: + - don't close the top-level addr ([ipfs/interface-go-ipfs-core#25](https://github.com/ipfs/interface-go-ipfs-core/pull/25)) + - fix a bunch of small test "bugs" ([ipfs/interface-go-ipfs-core#24](https://github.com/ipfs/interface-go-ipfs-core/pull/24)) + - remove Wrap ([ipfs/interface-go-ipfs-core#21](https://github.com/ipfs/interface-go-ipfs-core/pull/21)) + - Unixfs.Wrap Fixes ([ipfs/interface-go-ipfs-core#10](https://github.com/ipfs/interface-go-ipfs-core/pull/10)) + - tweak the Ls interface ([ipfs/interface-go-ipfs-core#14](https://github.com/ipfs/interface-go-ipfs-core/pull/14)) +- github.com/libp2p/go-buffer-pool: + - Enable tests ([libp2p/go-buffer-pool#6](https://github.com/libp2p/go-buffer-pool/pull/6)) +- github.com/libp2p/go-flow-metrics: + - Just repair spelling mistake ([libp2p/go-flow-metrics#3](https://github.com/libp2p/go-flow-metrics/pull/3)) +- github.com/libp2p/go-libp2p: + - Deprecate gx in readme & link to workspace repo ([libp2p/go-libp2p#591](https://github.com/libp2p/go-libp2p/pull/591)) + - Respect nodial option in routed host ([libp2p/go-libp2p#590](https://github.com/libp2p/go-libp2p/pull/590)) + - fix panic in observed address activation check ([libp2p/go-libp2p#586](https://github.com/libp2p/go-libp2p/pull/586)) + - Improve observed address handling ([libp2p/go-libp2p#585](https://github.com/libp2p/go-libp2p/pull/585)) + - identify: avoid parsing/printing multiaddrs ([libp2p/go-libp2p#583](https://github.com/libp2p/go-libp2p/pull/583)) + - move things outside of the lock in obsaddr ([libp2p/go-libp2p#582](https://github.com/libp2p/go-libp2p/pull/582)) + - identify: be more careful about the addresses we store ([libp2p/go-libp2p#577](https://github.com/libp2p/go-libp2p/pull/577)) + - relay: turn autorelay into a service and always filter out relay addresses ([libp2p/go-libp2p#578](https://github.com/libp2p/go-libp2p/pull/578)) + - chore: fail in the libp2p constructor if we fail to store the key ([libp2p/go-libp2p#576](https://github.com/libp2p/go-libp2p/pull/576)) + - Fix broken link in README.md ([libp2p/go-libp2p#580](https://github.com/libp2p/go-libp2p/pull/580)) + - Link to docs & discuss in readme ([libp2p/go-libp2p#571](https://github.com/libp2p/go-libp2p/pull/571)) + - Reduce autorelay boot delay and correctly handle private->public transition ([libp2p/go-libp2p#570](https://github.com/libp2p/go-libp2p/pull/570)) + - reduce nat error level ([libp2p/go-libp2p#568](https://github.com/libp2p/go-libp2p/pull/568)) + - relay: simplify declaration of multiaddr var ([libp2p/go-libp2p#563](https://github.com/libp2p/go-libp2p/pull/563)) + - Fix UDP listen on a Unspecified Address and Dial from the Unspecified Address ([libp2p/go-libp2p#561](https://github.com/libp2p/go-libp2p/pull/561)) + - Remove jenkins column from package table ([libp2p/go-libp2p#562](https://github.com/libp2p/go-libp2p/pull/562)) + - Fix typos in p2p/net/README.md ([libp2p/go-libp2p#555](https://github.com/libp2p/go-libp2p/pull/555)) + - better nat mapping ([libp2p/go-libp2p#549](https://github.com/libp2p/go-libp2p/pull/549)) +- github.com/libp2p/go-libp2p-autonat: + - fully close the autonat client stream ([libp2p/go-libp2p-autonat#21](https://github.com/libp2p/go-libp2p-autonat/pull/21)) + - parallelize dialbacks ([libp2p/go-libp2p-autonat#20](https://github.com/libp2p/go-libp2p-autonat/pull/20)) + - Pacify the race detector ([libp2p/go-libp2p-autonat#17](https://github.com/libp2p/go-libp2p-autonat/pull/17)) +- github.com/libp2p/go-libp2p-autonat-svc: + - full close the autonat stream ([libp2p/go-libp2p-autonat-svc#20](https://github.com/libp2p/go-libp2p-autonat-svc/pull/20)) + - reduce dialback timeout to 15s ([libp2p/go-libp2p-autonat-svc#17](https://github.com/libp2p/go-libp2p-autonat-svc/pull/17)) +- github.com/libp2p/go-libp2p-circuit: + - use buffer pool in newDelimitedReader ([libp2p/go-libp2p-circuit#71](https://github.com/libp2p/go-libp2p-circuit/pull/71)) + - Use NoDial option when opening hop streams for non-active relays ([libp2p/go-libp2p-circuit#70](https://github.com/libp2p/go-libp2p-circuit/pull/70)) + - use io.CopyBuffer with explicitly allocated buffers ([libp2p/go-libp2p-circuit#69](https://github.com/libp2p/go-libp2p-circuit/pull/69)) + - docs and nits ([libp2p/go-libp2p-circuit#66](https://github.com/libp2p/go-libp2p-circuit/pull/66)) +- github.com/libp2p/go-libp2p-kad-dht: + - dialQueue: start the control loop later ([libp2p/go-libp2p-kad-dht#312](https://github.com/libp2p/go-libp2p-kad-dht/pull/312)) + - make it work in wasm ([libp2p/go-libp2p-kad-dht#310](https://github.com/libp2p/go-libp2p-kad-dht/pull/310)) + - Revert "GoModules: Checksum mismatch:" ([libp2p/go-libp2p-kad-dht#309](https://github.com/libp2p/go-libp2p-kad-dht/pull/309)) + - defer dialqueue action until initial peers have been added ([libp2p/go-libp2p-kad-dht#301](https://github.com/libp2p/go-libp2p-kad-dht/pull/301)) +- github.com/libp2p/go-libp2p-nat: + - switch to libp2p's go-nat fork ([libp2p/go-libp2p-nat#16](https://github.com/libp2p/go-libp2p-nat/pull/16)) + - remove all uses of multiaddrs ([libp2p/go-libp2p-nat#14](https://github.com/libp2p/go-libp2p-nat/pull/14)) +- github.com/libp2p/go-libp2p-net: + - fix WithNoDial to return the context ([libp2p/go-libp2p-net#43](https://github.com/libp2p/go-libp2p-net/pull/43)) + - NoDial context option ([libp2p/go-libp2p-net#42](https://github.com/libp2p/go-libp2p-net/pull/42)) +- github.com/libp2p/go-libp2p-peer: + - Let ID implement encoding.Binary[Un]Marshaler and encoding.Text[Un]Marshaler ([libp2p/go-libp2p-peer#44](https://github.com/libp2p/go-libp2p-peer/pull/44)) +- github.com/libp2p/go-libp2p-peerstore: + - keep temp addresses for 2 minutes ([libp2p/go-libp2p-peerstore#67](https://github.com/libp2p/go-libp2p-peerstore/pull/67)) + - migrate to multiformats/go-base32 ([libp2p/go-libp2p-peerstore#61](https://github.com/libp2p/go-libp2p-peerstore/pull/61)) +- github.com/libp2p/go-libp2p-protocol: + - update readme ([libp2p/go-libp2p-protocol#6](https://github.com/libp2p/go-libp2p-protocol/pull/6)) + - Enable standard Travis CI tests. ([libp2p/go-libp2p-protocol#5](https://github.com/libp2p/go-libp2p-protocol/pull/5)) + - Fix go get address. ([libp2p/go-libp2p-protocol#4](https://github.com/libp2p/go-libp2p-protocol/pull/4)) + - Add MIT license ([libp2p/go-libp2p-protocol#3](https://github.com/libp2p/go-libp2p-protocol/pull/3)) + - Standardized Readme ([libp2p/go-libp2p-protocol#2](https://github.com/libp2p/go-libp2p-protocol/pull/2)) +- github.com/libp2p/go-libp2p-pubsub-router: + - gx publish 0.5.17 ([libp2p/go-libp2p-pubsub-router#26](https://github.com/libp2p/go-libp2p-pubsub-router/pull/26)) +- github.com/libp2p/go-libp2p-quic-transport: + - update quic-go to v0.11.0 ([libp2p/go-libp2p-quic-transport#54](https://github.com/libp2p/go-libp2p-quic-transport/pull/54)) +- github.com/libp2p/go-libp2p-routing-helpers: + - fix(put): fail if any router fails ([libp2p/go-libp2p-routing-helpers#19](https://github.com/libp2p/go-libp2p-routing-helpers/pull/19)) +- github.com/libp2p/go-libp2p-swarm: + - Add context option to disable dialing when opening a new stream ([libp2p/go-libp2p-swarm#116](https://github.com/libp2p/go-libp2p-swarm/pull/116)) + - return all dial errors if dial has failed ([libp2p/go-libp2p-swarm#115](https://github.com/libp2p/go-libp2p-swarm/pull/115)) + - Differentiate no addresses error from no good addresses ([libp2p/go-libp2p-swarm#113](https://github.com/libp2p/go-libp2p-swarm/pull/113)) +- github.com/libp2p/go-libp2p-transport: + - tests: constrain concurrency with race detector. ([libp2p/go-libp2p-transport#47](https://github.com/libp2p/go-libp2p-transport/pull/47)) + - pick test timeout from env var if available. ([libp2p/go-libp2p-transport#46](https://github.com/libp2p/go-libp2p-transport/pull/46)) + - increase test timeout. ([libp2p/go-libp2p-transport#45](https://github.com/libp2p/go-libp2p-transport/pull/45)) +- github.com/libp2p/go-msgio: + - Improve test coverage ([libp2p/go-msgio#10](https://github.com/libp2p/go-msgio/pull/10)) +- github.com/libp2p/go-reuseport: + - fix: add wasm build tag to wasm module ([libp2p/go-reuseport#70](https://github.com/libp2p/go-reuseport/pull/70)) +- github.com/libp2p/go-reuseport-transport: + - don't set linger to 0 ([libp2p/go-reuseport-transport#14](https://github.com/libp2p/go-reuseport-transport/pull/14)) +- github.com/libp2p/go-tcp-transport: + - set linger to 0 for both inbound and outbound connections ([libp2p/go-tcp-transport#36](https://github.com/libp2p/go-tcp-transport/pull/36)) +- github.com/libp2p/go-ws-transport: + - modernize request handling ([libp2p/go-ws-transport#41](https://github.com/libp2p/go-ws-transport/pull/41)) diff --git a/src/_blog/047-js-ipfs-0.36/README.md b/src/_blog/047-js-ipfs-0.36/README.md new file mode 100644 index 00000000..e30cba85 --- /dev/null +++ b/src/_blog/047-js-ipfs-0.36/README.md @@ -0,0 +1,180 @@ +--- +date: 2019-05-22 +url: /89-js-ipfs-0-36/ +title: js-ipfs 0.36.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +> URL safe CIDs, refs commands, DOM File support and more! + + + + +# 🔦 Highlights + +## 🧬 Base32 encoding for v1 CIDs + +As a stepping stone towards switching to CIDv1 by default for all CIDs, we're shipping a small change to v1 CIDs that means their string form is `base32` encoded instead of `base58btc`. So, instead of: + +```console +$ jsipfs add --cid-version 1 guardian.jpg +added zb2rhk6GMPQF3hfzwXTaNYFLKomMeC6UXdUt6jZKPpeVirLtV guardian.jpg +``` + +You'll now get back a `base32` encoded CID: + +```console +$ jsipfs add --cid-version 1 guardian.jpg +added bafkreibu6pkzh33dfwfa3bg3twih7uiohu6d6cr34txljekdn3cvwoujiu guardian.jpg +``` + +You can [read more about this change here](https://github.com/ipfs/js-ipfs/issues/1995). + +PR: https://github.com/ipfs/js-ipfs/pull/2050 + +## 👉 Added refs and refs local commands + +We've added the `refs` and `refs local` commands to the core, CLI and HTTP API. These commands allow you to list out all the CIDs referenced by a given DAG node or all the CIDs in your local repo. You can even choose the display format. + +PR: https://github.com/ipfs/js-ipfs/pull/2004 + +## 🗄 Support for adding DOM File objects + +Finally! You can just add a [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) to IPFS without having to jump through hoops converting it to a `Buffer` first. Sensational! + +A `File`, by the way, is what you'll get back from a `` or the drag and drop API, so being able to easily take that file and add it to IPFS makes onboarding new frontend devs way easier (as well as way more convenient for all you old frontend devs 😜). + +PR: https://github.com/ipfs/js-ipfs/pull/2013 + +## 🔬 MDNS discovery compatibility + +The libp2p discovery module for finding IPFS nodes over MDNS has been updated so that your JS IPFS node is now able to find Go IPFS nodes on the local network too. It's a backwards compatible change so older nodes will still be able to find your node and you'll still be able to find them. + +PR: https://github.com/libp2p/js-libp2p-mdns/pull/80 + +## 🚤 28% faster stream multiplexing + +We switched the multiplexing implementation to one that's simpler, smaller and faster. We're estimating it to be [around 28% faster than the old implementation](https://github.com/libp2p/pull-mplex/pull/8#issue-254730751). + +PR: https://github.com/ipfs/js-ipfs/pull/1884 + +## ⛩ Gateway improvements + +The IPFS HTTP gateway that JS IPFS exposes when run as a daemon in Node.js has been upgraded to support a number of HTTP features like conditional requests, byte range requests as well as getting some bug fixes, mini features and other improvements. There's too much to list here but check out the PR for and in depth description of what's changed. + +PR: https://github.com/ipfs/js-ipfs/pull/1989 + +## 🔏 Pubsub message signing + +Messages sent over Pubsub will now be automatically signed by the initial publisher, and included as a signature property on each Pubsub message. IPFS and Libp2p will be verifying the signatures of Pubsub messages by default in future releases, which will enable us to verify the authenticity of all messages sent over the network before they are processed. Verification is not yet required by default, but it will be in future releases, and all unsigned messages will not be processed or forwarded. + +PR: https://github.com/libp2p/js-libp2p/pull/362 + +# 🏗 API Changes + +1. **BREAKING**: The default string encoding for version 1 CIDs has changed to `base32` +1. **BREAKING**: IPLD formats have been updated to the latest versions. IPLD nodes returned by `ipfs.dag` and `ipfs.object` commands have significant breaking changes. If you are using these commands in your application you are likely to encounter the following changes to `dag-pb` nodes (the default node type that IPFS creates): + - `DAGNode` properties have been renamed as follows: + - `data` => `Data` + - `links` => `Links` + - `size` => `size` (Note: no change) + - Additionally, the `Links` property of a `DAGNode` now returns plain JS objects with `Hash`, `Name` and `Tsize` properties, **NOT** `DAGLink` instances + - `DAGLink` properties have been renamed as follows: + - `cid` => `Hash` + - `name` => `Name` + - `size` => `Tsize` + - See CHANGELOGs for each IPLD format for it's respective changes, you can read more about the [`dag-pb` changes in the CHANGELOG](https://github.com/ipld/js-ipld-dag-pb/blob/master/CHANGELOG.md#0160-2019-05-08) +1. Commands `refs` and `refs local` have been added to core, the CLI and the HTTP API + - [Core API docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/REFS.md) + - [HTTP API docs](https://docs.ipfs.io/reference/api/http/#api-v0-refs) + - [CLI API docs](https://docs.ipfs.io/reference/api/cli/#ipfs-refs) +1. Support for DOM [File](https://developer.mozilla.org/en-US/docs/Web/API/File) objects has been added to [`ipfs.add`](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#add) + +# ❤️ Huge thank you to everyone that made this release possible + +In alphabetical order, here are all the humans that contributed to the release: + +- [Adam Uhlíř](https://github.com/AuHau) (1 PR, 3 issues, 1 review, 1 comment) +- [Agent of User](https://github.com/agentofuser) (5 comments) +- [Alan Shaw](https://github.com/alanshaw) (21 PRs, 5 issues, 59 reviews, 126 comments) +- [Alex Potsides](https://github.com/achingbrain) (16 PRs, 7 issues, 14 reviews, 14 comments) +- [André Cruz](https://github.com/satazor) (1 comment) +- [André Medeiros](https://github.com/andremedeiros) (1 comment) +- [Arie Trouw](https://github.com/arietrouw) (1 issue) +- [Beeno Tung](https://github.com/beenotung) (2 comments) +- [bleonard252](https://github.com/bleonard252) (1 comment) +- [bruinxs](https://github.com/bruinxs) (1 issue, 1 comment) +- [David Dias](https://github.com/daviddias) (5 comments) +- [Davit Barbakadze](https://github.com/jayarjo) (5 comments) +- [Despoinis](https://github.com/Despoinis) (2 issues, 3 comments) +- [Dietrich Ayala](https://github.com/autonome) (1 PR, 2 issues, 2 comments) +- [Diogo Silva](https://github.com/fsdiogo) (1 PR) +- [dirkmc](https://github.com/dirkmc) (5 PRs, 3 issues, 46 reviews, 60 comments) +- [edoo](https://github.com/ookangzheng) (1 comment) +- [Francis Gulotta](https://github.com/reconbot) (1 comment) +- [Friedel Ziegelmayer](https://github.com/dignifiedquire) (1 review) +- [Gopalakrishna Palem](https://github.com/KrishnaPG) (3 PRs, 1 issue, 3 reviews, 5 comments) +- [Guilherme Gervasio](https://github.com/gil-air-may) (1 comment) +- [Guo Liu](https://github.com/guoliu) (1 issue, 1 comment) +- [Guy Sviry](https://github.com/guysv) (2 PRs, 2 issues, 15 comments) +- [Henrique Dias](https://github.com/hacdias) (1 PR) +- [Hugo Dias](https://github.com/hugomrdias) (5 PRs, 4 issues, 6 reviews, 17 comments) +- [Irakli Gozalishvili](https://github.com/Gozala) (1 PR, 3 reviews, 3 comments) +- [Ishan Joshi](https://github.com/ishanjoshi02) (1 issue) +- [Jacob Heun](https://github.com/jacobheun) (12 PRs, 3 issues, 55 reviews, 66 comments) +- [Jake Hemmerle](https://github.com/jakehemmerle) (3 comments) +- [Jared Wright](https://github.com/jawerty) (1 issue) +- [Jonybang](https://github.com/Jonybang) (1 PR, 3 issues, 8 comments) +- [jzstern](https://github.com/jzstern) (1 comment) +- [Kavanaugh Latiolais](https://github.com/kav) (3 comments) +- [Keith Smith](https://github.com/KeithSSmith) (2 issues) +- [kumavis](https://github.com/kumavis) (9 PRs, 16 issues, 8 reviews, 53 comments) +- [Lorenzo Setale ](https://github.com/koalalorenzo) (2 comments) +- [Łukasz Magiera](https://github.com/magik6k) (1 review, 1 comment) +- [Maciej Krüger](https://github.com/mkg20001) (1 review, 11 comments) +- [Marcin Rataj](https://github.com/lidel) (2 PRs, 4 issues, 11 reviews, 13 comments) +- [Mark Robert Henderson](https://github.com/aphelionz) (2 issues) +- [Mars Robertson](https://github.com/marsrobertson) (1 issue) +- [Matt Ober](https://github.com/obo20) (1 issue, 2 comments) +- [Michael Bradley](https://github.com/michaelsbradleyjr) (1 PR, 1 issue, 5 comments) +- [Michael Muré](https://github.com/MichaelMure) (2 comments) +- [Mikeal Rogers](https://github.com/mikeal) (1 issue, 8 reviews, 1 comment) +- [Mikerah](https://github.com/Mikerah) (1 comment) +- [Mitra Ardron](https://github.com/mitra42) (2 issues, 2 comments) +- [MonarthS](https://github.com/MonarthS) (1 issue) +- [Nate Foss](https://github.com/npfoss) (1 issue, 1 comment) +- [nijynot](https://github.com/nijynot) (1 PR) +- [Nikhil-Bathula](https://github.com/Nikhil-Bathula) (1 issue, 3 comments) +- [Oli Evans](https://github.com/olizilla) (1 review, 15 comments) +- [Pedro Teixeira](https://github.com/pgte) (2 reviews) +- [pinanklakhani](https://github.com/pinanklakhani) (1 issue) +- [pldespaigne](https://github.com/pldespaigne) (1 issue, 1 comment) +- [Portia Burton](https://github.com/pkafei) (1 review) +- [pruflyos](https://github.com/pruflyos) (1 issue) +- [reasv](https://github.com/reasv) (2 issues, 2 comments) +- [Rod Vagg](https://github.com/rvagg) (76 reviews, 8 comments) +- [sachaaaaa](https://github.com/sachaaaaa) (1 PR) +- [ShareTheWorld](https://github.com/ShareTheWorld) (1 issue, 2 comments) +- [Shivam Rawat](https://github.com/ShivamRawat0l) (1 PR) +- [Steven Allen](https://github.com/Stebalien) (1 PR, 1 review, 4 comments) +- [Vasco Santos](https://github.com/vasco-santos) (16 PRs, 5 issues, 24 reviews, 26 comments) +- [Volker Mische](https://github.com/vmx) (17 PRs, 3 issues, 23 reviews, 49 comments) +- [William LeGate](https://github.com/wlegate) (3 comments) +- [X5 Engine](https://github.com/x5engine) (2 comments) +- [李小明](https://github.com/alx696) (1 issue, 4 comments) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/team-mgmt/issues/650) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/048-ipfs-dev-meetings-2018/README.md b/src/_blog/048-ipfs-dev-meetings-2018/README.md new file mode 100644 index 00000000..d21b871a --- /dev/null +++ b/src/_blog/048-ipfs-dev-meetings-2018/README.md @@ -0,0 +1,97 @@ +--- +date: 2019-06-07 +url: /91-ipfs-2018-dev-meetings/ +tags: dev meetings ipfs libp2p community researchers +title: July 2018 IPFS Developer Meetings +description: +author: Molly Mackinlay +--- + +![](https://ipfs.io/ipfs/QmQnUstaKTPA92XAkCj2cxBACX1nMyfjYeTHSawejGxASW) + +Last July we hosted the first ever IPFS and Libp2p developer meetings to bring together a small group of core developers and major users of the protocols. They were a huge success! We are incredibly thankful for everyone's participation, energy, enthusiasm - and for sharing their knowledge with the whole group. + +![](https://media.giphy.com/media/iCivRRnqS1SsadMjme/giphy.gif) + +The week was great for core developers, contributors and researchers to spend time together diving deep on open design problems, demoing exciting new tools and products being built on or around IPFS and Libp2p, and exploring the path forward for the protocols and working groups. Check out the [jam-packed schedule](https://developersmeetingsberlin2018.sched.com/) to see what we discussed. + +Much of the rich knowledge was shared in lightning talks, deep dives, poster sessions, and project presentations that we’re excited to now share with the world! Learn about the Projects’ vision, get updated on what the projects were working on in mid 2018, and explore the ecosystem of demos, tools, apps, and exciting improvements to the core protocol in [this YouTube playlist](https://www.youtube.com/watch?v=ctjvfX1EoWY&list=PLuhRWgmPaHtRT7ZLH_NmdfJhjubdOiTVr). You can also see the full list below. + +## Project Updates + +- [Welcome to the IPFS & libp2p Developers Meeting - Matt Zumwalt](https://www.youtube.com/watch?v=ctjvfX1EoWY) +- [Introduction to libp2p - David Dias](https://www.youtube.com/watch?v=CRe_oDtfRLw) +- [libp2p in 2018 - Juan Benet](https://www.youtube.com/watch?v=KVMiFA_nMTY) +- [DEX - Smart File Importing - Juan Benet](https://www.youtube.com/watch?v=NIu2t21QA7Y) +- [JS- IPFS 0.30 Release - David Dias](https://www.youtube.com/watch?v=2mP7CklfLMs) +- [DDC Working Group 2018 Updates - André Cruz](https://www.youtube.com/watch?v=BU_E5vmjxDU) +- [Decentralized Data Stewardship - Matt Zumwalt](https://www.youtube.com/watch?v=ycFbrSFN8qA) +- [Decentralized Identifiers - jonnycrunch](https://youtu.be/9YKckPpZufs) +- [IPFS Cluster Update - Hector Sanjuan](https://www.youtube.com/watch?v=Ggdz-u0Fy1g) +- [IPFS in Web Browsers - Marcin Rataj](https://www.youtube.com/watch?v=-UmFRm_z_xo) +- [IPLD Overview & 2018 Update - Steven Allen](https://www.youtube.com/watch?v=Iyu0fywcrjU) +- [JS Core Dev Q1+Q2 2018 Update - David Dias](https://www.youtube.com/watch?v=COTDQgXSAK8) +- [libp2p and IPFS Overview - Matt Zumwalt](https://www.youtube.com/watch?v=SMfAw9cfm4Y) +- [Peer Star Status Update - André Cruz](https://www.youtube.com/watch?v=jDO2AbyBIwk) +- [Protocol Labs Research Overview - Evan Miyazono](https://youtu.be/FuSMNIkIrIo) + +## Lightning Demos + +- [Demo - libp2p Network Visualization Tool - Juan Benet](https://www.youtube.com/watch?v=w944sFTjLq8) +- [Demo - libp2p Interfaces - Juan Benet](https://youtu.be/eQOBRbYwUo0) +- [Demo - libp2p Interfaces Part 2 - David Dias](https://www.youtube.com/watch?v=scd3_Aq3EHc) +- [Lightning Demos - Exchange Files in IPFS - Diogo Silva](https://www.youtube.com/watch?v=-lTWYFxm1rk) +- [Lightning Demos - Data Security in IPFS - Dr. Ian Preston](https://www.youtube.com/watch?v=SgQBYW2u8n4) +- [Lightning Demos - Files and IPFS Companion - Marcin Rataj](https://youtu.be/OCv5PvLnk-Y) +- [Lightning Demos - IPFS & p2p - Steven Allen](https://www.youtube.com/watch?v=qQbgQd8Glhg) +- [Lightning Demos - IPFS Graphs - Juan Benet](https://www.youtube.com/watch?v=j-f809nStv4) +- [Lightning Demos - IPFS-SENC - Juan Benet](https://www.youtube.com/watch?v=8DjIDFtSpN4) +- [Lightning Demos - MFS Fuse - Alan Shaw](https://www.youtube.com/watch?v=FmSlQ2Qyflk) +- [Lightning Demos - OpenBazaar - Chris Pacia](https://www.youtube.com/watch?v=EjaN2S7IiyY) +- [Lightning Demos - Peer Bandwidth Chart - Alan Shaw](https://www.youtube.com/watch?v=2Eu1PGw6OI0) +- [Lightning Demos - Peer Maps - Alan Shaw](https://www.youtube.com/watch?v=a7RiLr0_4Zw) +- [Lightning Demos - pServer - Wei Yang](https://youtu.be/DGCyGv_1VB8) +- [Lightning Demos - Textile - Andrew Hill](https://www.youtube.com/watch?v=FIgmiRJ6itY) +- [Lightning Demos - PEERGOS - Dr. Ian Preston](https://www.youtube.com/watch?v=Z_tOw1mUyLE) +- [Lightning Demos - Private Networks GO and JS-IPFS - Jacob Heun](https://www.youtube.com/watch?v=VyGqaPjKoZ8) +- [Lightning Demos - QRI - Brendan O' Brien](https://www.youtube.com/watch?v=nhAdRancHyU) +- [Lightning Demos - Rabin - Juan Benet](https://www.youtube.com/watch?v=x0WIDz1bWjI) +- [Lightning Demos - Service Worker Gateway - Vasco Santos](https://www.youtube.com/watch?v=-ToV4wmz0mY) +- [Lightning Demos - VRQ Recovery - jonnycrunch](https://youtu.be/4jO79aBXIAM) +- [Lightning Demos - window.IPFS - Alan Shaw](https://youtu.be/FB-nmNq3IG0) +- [Lightning Demos - IPLD Explorer CLI - Alan Shaw](https://youtu.be/2Ate_h4IjhE) +- [Live Keynotes - Peer Discovery Protocols - Juan Benet](https://youtu.be/zDL-jhKFAvQ) + +## [Poster Sessions](https://www.youtube.com/playlist?list=PLuhRWgmPaHtQrb8rpywj8r0dwYvUzJhoJ) + +- [Poster Session - DHT](https://youtu.be/JfjpwKzulhE) +- [Poster Session - Functional encryption](https://youtu.be/D-_2JhlxN9k) +- [Poster Session - IPNS](https://youtu.be/Ga-RyAbtPHQ) +- [Poster Session - IPRS](https://youtu.be/md7O4eHNfzY) +- [Poster Session - Peer Routing](https://youtu.be/no5WldtLJCk) +- [Poster Session - Rendezvous](https://youtu.be/4XPS_50KU54) +- [Poster Session - Secio](https://youtu.be/WYmhEA2dABI) +- [Poster Report - Bitswap](https://youtu.be/xTBm1skAfiY) +- [Poster Report - DHT](https://youtu.be/yLFsTpyZC8c) +- [Poster Report - DWEB Addressing](https://youtu.be/CtIvqMf0Gi8) +- [Poster Report - Floodsub](https://youtu.be/i0gFQO4kSfc) +- [Poster Report - IPLD](https://youtu.be/2H5dP1hAqZM) +- [Poster Report - IPNS](https://youtu.be/PYlRzbtVCZ0) +- [Poster Report - Mutable File System](https://youtu.be/TwYAGDGKDOw) +- [Poster Report - Multi Key](https://youtu.be/NEHb8SiQMIE) +- [Poster Report - Peer Pad](https://youtu.be/QsE28NhEloU) +- [Poster Report - UNIXFX](https://youtu.be/Cvv_8cpoB6k) +- [Poster Report - libp2p scaling for live broadcast](https://youtu.be/sc5D_yYFO3Y) + +## Deep Dives + +- [Protocol Design Sessions - Multistream Select - Steven Allen](https://youtu.be/-67kZOu7YSM) +- [Protocol Design Sessions - DHT Scaling - Jacob Heun, jonnycrunch](https://youtu.be/8xA9-cCvzyc) +- [Protocol Design Sessions - Circuit Relay - Jeromy Johnson](https://youtu.be/vl86YmPQMEg) +- [Protocol Design Sessions - Simulating networks - Brendan O'Brian, Adrian Lanzafame](https://youtu.be/jF8wt9pt4h8) +- [Deep Dive Debrief - Private DHT - Steven Allen](https://youtu.be/gnCJotMbEjw) +- [Deep Dive Debrief - Integration Testing - Alex Potsides](https://youtu.be/-ITqkgQFm58) +- [Deep Dive Debrief - Building Sustainable Modules - Rob Brackett](https://youtu.be/-JT-FBQ_jbM) +- [Deep Dive Debrief - DAG Sharding - Hector Sanjuan, Adrian Lanzafame](https://youtu.be/g_4cm5sOVEw) + +Looking forward to seeing you at our next event, [IPFS Camp](https://camp.ipfs.io)! We promise we'll be even faster at getting our videos out next time. 😜 diff --git a/src/_blog/049-go-ipfs-0.4.21/README.md b/src/_blog/049-go-ipfs-0.4.21/README.md new file mode 100644 index 00000000..85a3997c --- /dev/null +++ b/src/_blog/049-go-ipfs-0.4.21/README.md @@ -0,0 +1,352 @@ +--- +date: 2019-06-06 +url: /93-go-ipfs-0.4.21/ +title: go-ipfs 0.4.21 released +description: +author: Molly Mackinlay +--- + +> Key bug fixes, experimental TLS1.3 support, reduced memory usage, base32 CIDv1 CIDs and more! + + + + +# 🔦 Highlights + +We're happy to announce go-ipfs 0.4.21. This release has some critical bug fixes and a handful of new features so every user should upgrade. + +Key bug fixes: + +- Too many open file descriptors/too many peers ([#6237](https://github.com/ipfs/go-ipfs/issues/6237)). +- Adding multiple files at the same time doesn't work ([#6254](https://github.com/ipfs/go-ipfs/pull/6255)). +- CPU utilization spikes and then holds at 100% ([#5613](https://github.com/ipfs/go-ipfs/issues/5613)). + +Key features: + +- Experimental TLS1.3 support (to eventually replace secio). +- OpenSSL support for SECIO handshakes (performance improvement). + +**IMPORTANT:** This release fixes a bug in our security transport that could potentially drop data from the channel. Note: This issue affects neither the privacy nor the integrity of the data with respect to a third-party attacker. Only the peer sending us data could trigger this bug. + +‼️**ALL USERS MUST UPGRADE.**‼️ We intended to introduce a feature this release that, unfortunately, [reliably triggered this bug][secio-bug]. To avoid partitioning the network, we've decided to postpone this feature for a release or two. + +Specifically, we're going to provide a minimum _one month_ upgrade period. After that, we'll start testing the impact of deploying the proposed changes. + +👉 If you're running the mainline go-ipfs, please upgrade ASAP. If you're building a separate app or working on a forked go-ipfs, make sure to upgrade github.com/libp2p/go-libp2p-secio to _at least_ v0.0.3. + +[secio-bug]: https://github.com/libp2p/go-libp2p/issues/644 + +### 🐛 Bug Fixes And Enhancements + +This release includes quite a number of critical bug fixes and performance/reliability enhancements. + +#### Error when adding multiple files 🗂 + +The last release broke the simple command `ipfs add file1 file2`. It turns out we simply lacked a test case for this. Both of these issues (the bug and the lack of a test case) have now been fixed. + +#### SECIO 🔏 + +As noted above, we've fixed a bug that could cause data to be dropped from a SECIO connection on read. Specifically, this happens when: + +1. The capacity of the read buffer is greater than the length. +2. The remote peer sent more than the length but less than the capacity in a single secio "frame". + +In this case, we'd fill the read buffer to it's capacity instead of its length. + +#### Too many open files, too many peers, etc 😵 + +Go-ipfs automatically closes the least useful connections when it accumulates too many connections. Unfortunately, some relayed connections were blocking in `Close()`, halting the entire process. + +#### Out of control CPU usage 🔥 + +Many users noted out of control CPU usage this release. This turned out to be a long-standing issue with how the DHT handled provider records (records recording which peers have what content): + +1. It wasn't removing provider records for content until the set of providers completely emptied. +2. It was loading every provider record into memory whenever we updated the set of providers. + +Combined, these two issues were trashing the provider record cache, forcing the DHT to repeatedly load and discard provider records. + +#### More Reliable Connection Management 🙌 + +Go-ipfs has a subsystem called the "connection manager" to close the least-useful connections when go-ipfs runs low on resources. + +Unfortunately, other IPFS subsystems may learn about connections _before_ the connection manager. Previously, if some IPFS subsystem tried to mark a connection as useful before the connection manager learned about it, the connection manager would discard this information. We believe this was causing [#6271](https://github.com/ipfs/go-ipfs/issues/6271). [It no longer does that](https://github.com/libp2p/go-libp2p-connmgr/pull/39). + +#### Improved Bitswap Connection Management 🤝 + +Bitswap now uses the connection manager to mark all peers downloading blocks as important (while downloading). Previously, it only marked peers from which _it_ was downloading blocks. + +#### Reduced Memory Usage 🧠 + +The most noticeable memory reduction in this release comes from fixing connection closing. However, we've made a few additional improvements: + +- Bitswap's "work queue" no longer remembers every peer it has seen indefinitely. +- The peerstore now interns protocol names. +- The per-peer goroutine count has been reduced. +- The DHT now wastes less memory on idle peers by pooling buffered writers and returning them to the pool when not actively using them. + +#### Increased File Descriptor Limit 📝 + +The default file descriptor limit has been raised to 8192 (from 2048). Unfortunately, go-ipfs behaves poorly when it runs out of file descriptors and it uses a _lot_ of file descriptors. + +Luckily, most modern kernels can handle thousands of file descriptors without any difficulty. + +#### Decreased Connection Handshake Latency ⏱ + +Libp2p now shaves off a couple of round trips when initiating connections by beginning the protocol negotiation before the remote peer responds to the initial handshake message. + +In the optimal case (when the target peer speaks our preferred protocol), this reduces the number of handshake round-trips from 6 to 4 (including the TCP handshake). + +### 📢 Commands + +This release brings no new commands but does introduce a few changes, bugfixes, and enhancements. This section is hardly complete but it lists the most noticeable changes. + +Take note: this release also introduces a few breaking changes. + +#### [DEPRECATION] The URLStore Command Deprecated + +The experimental `ipfs urlstore` command is now deprecated. Please use `ipfs add --nocopy URL` instead. + +#### [BREAKING] The DHT Command Base64 Encodes Values + +When responding to an `ipfs dht get` command, the daemon now encodes the returned value using base64. The `ipfs` command will automatically decode this value before returning it to the user so this change should only affect those using the HTTP API directly. + +Unfortunately, this change was necessary as DHT records are arbitrary binary blobs which can't be directly stored in JSON strings. + +#### [BREAKING] Base32 Encoded v1 CIDs By Default + +Both js-ipfs and go-ipfs now encode CIDv1 CIDs using base32 by default, instead of base58. Unfortunately, base58 is case-sensitive and doesn't play well with browsers (see [#4143](https://github.com/ipfs/go-ipfs/issues/4143). + +#### Human Readable Numbers + +The `ipfs bitswap stat` and and `ipfs object stat` commands now support a `--humanize` flag that formats numbers with human-readable units (GiB, MiB, etc.). + +#### Improved Errors + +This release improves two types of errors: + +1. Commands that take paths/multiaddrs now include the path/multiaddr in the error message when it fails to parse. +2. `ipfs swarm connect` now returns a detailed error describing which addresses were tried and why the dial failed. + +#### Ping Improvements + +The ping command has received some small improvements and fixes: + +1. It now exits with a non-zero exit status on failure. +2. It no longer succeeds with zero successful pings if we have a zombie but non-functional connection to the peer being pinged ([#6298](https://github.com/ipfs/go-ipfs/issues/6298)). +3. It now prints out the average latency when canceled with `^C` (like the unix `ping` command). + +#### Improved Help Text + +Go-ipfs now intelligently wraps help text for easier reading. On an 80 character wide terminal, + +**Before** + +``` +USAGE + ipfs add ... - Add a file or directory to ipfs. + +SYNOPSIS + ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=] [ +--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent] [--progress | -p] [--t +rickle | -t] [--only-hash | -n] [--wrap-with-directory | -w] [--chunker= | -s] [--pin=false] [--raw-leaves] [--nocopy] [--fscache] [--cid-version=] [--hash=] [--inline] [--inline-limit=] [--] +... + +ARGUMENTS + + ... - The path to a file to be added to ipfs. + +OPTIONS + + -r, --recursive bool - Add directory paths recursive +ly. + --dereference-args bool - Symlinks supplied in argument +s are dereferenced. + --stdin-name string - Assign a name if the file sou +rce is stdin. + -H, --hidden bool - Include files that are hidden +. Only takes effect on recursive add. + -q, --quiet bool - Write minimal output. + -Q, --quieter bool - Write only final hash. + --silent bool - Write no output. + -p, --progress bool - Stream progress data. + -t, --trickle bool - Use trickle-dag format for da +g generation. + -n, --only-hash bool - Only chunk and hash - do not +write to disk. + -w, --wrap-with-directory bool - Wrap files with a directory o +bject. + -s, --chunker string - Chunking algorithm, size-[byt +es] or rabin-[min]-[avg]-[max]. Default: size-262144. + --pin bool - Pin this object when adding. +Default: true. + --raw-leaves bool - Use raw blocks for leaf nodes +. (experimental). + --nocopy bool - Add the file using filestore. + Implies raw-leaves. (experimental). + --fscache bool - Check the filestore for pre-e +xisting blocks. (experimental). + --cid-version int - CID version. Defaults to 0 un +less an option that depends on CIDv1 is passed. (experimental). + --hash string - Hash function to use. Implies + CIDv1 if not sha2-256. (experimental). Default: sha2-256. + --inline bool - Inline small blocks into CIDs +. (experimental). + --inline-limit int - Maximum block size to inline. + (experimental). Default: 32. + +``` + +**After** + +``` +USAGE + ipfs add ... - Add a file or directory to ipfs. + +SYNOPSIS + ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=] + [--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent] + [--progress | -p] [--trickle | -t] [--only-hash | -n] + [--wrap-with-directory | -w] [--chunker= | -s] [--pin=false] + [--raw-leaves] [--nocopy] [--fscache] [--cid-version=] + [--hash=] [--inline] [--inline-limit=] [--] + ... + +ARGUMENTS + + ... - The path to a file to be added to ipfs. + +OPTIONS + + -r, --recursive bool - Add directory paths recursively. + --dereference-args bool - Symlinks supplied in arguments are + dereferenced. + --stdin-name string - Assign a name if the file source is stdin. + -H, --hidden bool - Include files that are hidden. Only takes + effect on recursive add. + -q, --quiet bool - Write minimal output. + -Q, --quieter bool - Write only final hash. + --silent bool - Write no output. + -p, --progress bool - Stream progress data. + -t, --trickle bool - Use trickle-dag format for dag generation. + -n, --only-hash bool - Only chunk and hash - do not write to + disk. + -w, --wrap-with-directory bool - Wrap files with a directory object. + -s, --chunker string - Chunking algorithm, size-[bytes] or + rabin-[min]-[avg]-[max]. Default: + size-262144. + --pin bool - Pin this object when adding. Default: + true. + --raw-leaves bool - Use raw blocks for leaf nodes. + (experimental). + --nocopy bool - Add the file using filestore. Implies + raw-leaves. (experimental). + --fscache bool - Check the filestore for pre-existing + blocks. (experimental). + --cid-version int - CID version. Defaults to 0 unless an + option that depends on CIDv1 is passed. + (experimental). + --hash string - Hash function to use. Implies CIDv1 if + not sha2-256. (experimental). Default: + sha2-256. + --inline bool - Inline small blocks into CIDs. + (experimental). + --inline-limit int - Maximum block size to inline. + (experimental). Default: 32. +``` + +### ✨ Features + +This release is primarily a bug fix release but it still includes two nice features from libp2p. + +#### 🤫 Experimental TLS1.3 support + +Go-ipfs now has experimental TLS1.3 support. Currently, libp2p (IPFS's networking library) uses a custom TLS-like protocol we call SECIO. However, the conventional wisdom concerning custom security transports is "just don't" so we are working on replacing it with TLS1.3 + +To choose this protocol by default, set the `Experimental.PreferTLS` config variable: + +```bash +> ipfs config --bool Experimental.PreferTLS true +``` + +Why TLS1.3 and not X (noise, etc.)? + +1. Libp2p allows negotiating transports so there's no reason not to add noise support to libp2p as well. +2. TLS has wide language support which should make implementing libp2p for new languages significantly simpler. + +#### 👂 OpenSSL Support + +Go-ipfs can now (optionally) be built with OpenSSL support for improved performance when establishing connections. This is primarily useful for nodes receiving multiple inbound connections per second. + +To enable openssl support, rebuild go-ipfs with: + +```bash +> make build GOFLAGS=-tags=openssl +``` + +### 🎛 CoreAPI + +The CoreAPI refactor is still underway and we've made significant progress towards a usable ipfs-as-a-library constructor. Specifically, we've integrated the [fx](https://go.uber.org/fx) dependency injection system and are now working on cleaning up our initialization logic. This should make it easier to inject new services into a go-ipfs process without messing with the core internals. + +### Build: `GOCC` Environment Variable + +The build system now uses the `GOCC` environment variable allowing for use of specific go versions during builds. + +# ❤️ Huge thank you to everyone that made this release possible + +Shout-out to all contributors that participated in this release (including contributions to ipld, libp2p, and multiformats): + +| Contributor | Commits | Lines ± | Files Changed | +| -------------------------- | ------- | ----------- | ------------- | +| Steven Allen | 220 | +6078/-4211 | 520 | +| Łukasz Magiera | 53 | +5039/-4557 | 274 | +| vyzo | 179 | +2929/-1704 | 238 | +| Raúl Kripalani | 44 | +757/-1895 | 134 | +| hannahhoward | 11 | +755/-1005 | 49 | +| Marten Seemann | 16 | +862/-203 | 44 | +| keks | 10 | +359/-110 | 12 | +| Jan Winkelmann | 8 | +368/-26 | 16 | +| Jakub Sztandera | 4 | +361/-8 | 7 | +| Adrian Lanzafame | 1 | +287/-18 | 5 | +| Erik Ingenito | 4 | +247/-28 | 8 | +| Reid 'arrdem' McKenzie | 1 | +220/-20 | 3 | +| Yusef Napora | 26 | +98/-130 | 26 | +| Michael Avila | 3 | +116/-59 | 8 | +| Raghav Gulati | 13 | +145/-26 | 13 | +| tg | 1 | +41/-33 | 1 | +| Matt Joiner | 6 | +41/-30 | 7 | +| Cole Brown | 1 | +37/-25 | 1 | +| Dominic Della Valle | 2 | +12/-40 | 4 | +| Overbool | 1 | +50/-0 | 2 | +| Christopher Buesser | 3 | +29/-16 | 10 | +| myself659 | 1 | +38/-5 | 2 | +| Alex Browne | 3 | +30/-8 | 3 | +| jmank88 | 1 | +27/-4 | 2 | +| Vikram | 1 | +25/-1 | 2 | +| MollyM | 7 | +17/-9 | 7 | +| Marcin Rataj | 1 | +17/-1 | 1 | +| requilence | 1 | +11/-4 | 1 | +| Teran McKinney | 1 | +8/-2 | 1 | +| Oli Evans | 1 | +5/-5 | 1 | +| Masashi Salvador Mitsuzawa | 1 | +5/-1 | 1 | +| chenminjian | 1 | +4/-0 | 1 | +| Edgar Lee | 1 | +3/-1 | 1 | +| Dirk McCormick | 1 | +2/-2 | 2 | +| ia | 1 | +1/-1 | 1 | +| Alan Shaw | 1 | +1/-1 | 1 | + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [go-ipfs repo](https://github.com/ipfs/go-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [Go Core Dev Team Weekly Sync 🙌🏽](https://github.com/ipfs/team-mgmt/issues/674) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/050-ipfs-camp-recap/README.md b/src/_blog/050-ipfs-camp-recap/README.md new file mode 100644 index 00000000..8e218b75 --- /dev/null +++ b/src/_blog/050-ipfs-camp-recap/README.md @@ -0,0 +1,93 @@ +--- +date: 2019-07-08 +url: /2019-07-08-ipfs-camp-recap/ +tags: IPFS, IPFS Camp +title: 2019 IPFS Camp Recap +description: +author: David Dias +--- + +Greetings InterPlanetary Community! + +The InterPlanetary Space Training Camp is over and now that we are all back to Earth, I have the joy of sharing the news and learnings with you. + +If you aren't familiar with the [InterPlanetary Space Training Camp](https://camp.ipfs.io/) (IPFS Camp for short), it was a 3 day Hacker retreat for the Builders of the DWeb. Attendees travelled through a [space portal](https://twitter.com/ChrisPacia/status/1144291810874920967) to get to the Space Training Station in another Galaxy (Star coordinates yet undisclosed). Throughout the Camp, attendees had the chance to participate in: + +#### [**👩🏽‍🏫 Core & Elective Courses**](https://github.com/ipfs/camp#-core--elective-courses) + +> Specialized and focused trainings on building for the DWeb. + +![](https://user-images.githubusercontent.com/618519/60863680-52754080-a1d6-11e9-84f2-b38fab97c8f3.png) + +Catch up on all the recordings and materials at 📼 👩🏽‍🏫 [https://github.com/ipfs/camp#-core--elective-courses](https://github.com/ipfs/camp#-core--elective-courses) + +#### [**📃 Poster Projects**](https://github.com/ipfs/camp#-poster-projects) + +> Collaborate in Groups to understand, explain and present how multiple parts of the DWeb Stack work + +![](https://user-images.githubusercontent.com/618519/60864383-4c805f00-a1d8-11e9-963d-0146b85b0353.png) + +Catch up on all the recordings & notes at 📼 📒 [https://github.com/ipfs/camp#-poster-projects](https://github.com/ipfs/camp#-poster-projects) + +#### [**🐋 Deep Dives**](https://github.com/ipfs/camp#-deep-dives) + +> Form small teams to understand, research and come up with solutions to one of the many open problems + +![](https://user-images.githubusercontent.com/618519/60865105-2b207280-a1da-11e9-9046-d38af5543ba2.png) + +Catch up on all the recordings & notes at 📼 📒 [https://github.com/ipfs/camp#-deep-dives](https://github.com/ipfs/camp#-deep-dives) + +#### [**⚡️ Lightning Talks**](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks) - Learn what is the latest from multiple projects in the IPFS ecosystem + +![](https://user-images.githubusercontent.com/618519/60863676-5012e680-a1d6-11e9-9775-2a8fc1b014a3.png) + +Catch up on all the recordings at 📼 [https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks) + +#### [**🧬 Sci-Fi Fair**](https://github.com/ipfs/camp#-sci-fi-fair) + +> Get blown away by huge Sci-Fi experiments, soon to be seen in a Network close to you + +![](https://user-images.githubusercontent.com/618519/60863667-4db08c80-a1d6-11e9-9c9b-cf153977ac7f.png) + +Catch up on all the interviews at 📼 [https://github.com/ipfs/camp#-sci-fi-fair](https://github.com/ipfs/camp#-sci-fi-fair) + +#### [**🧩 Unconf**](https://github.com/ipfs/camp#-unconf) + +> Gather folks around shared topics of interest and discuss collaborations. + +![](https://user-images.githubusercontent.com/618519/60865107-2cea3600-a1da-11e9-9287-22587bfdf9cd.png) + +Catch up on all the artefacts at 📒 [https://github.com/ipfs/camp#-unconf](https://github.com/ipfs/camp#-unconf) + +### IPFS Camp `Success` is `defined` by the number of `friendships`, `conversations`, `collaborations` and `new projects` that get started. + +And it was a blast. Here is a quick video recap as a souvenir for everyone that was there, and a postcard for everyone that didn't get a chance this time around: + +[![](./ipfs-camp-youtube-preview.jpg)](https://youtu.be/kc_dxO-V8YM) + +However, the IPFS Camp spirit doesn't stop here, now it is all about continuing the dialog that got started and taking all the learnings and materials to local IPFS Communities, showing and teaching more folks how to build on the P2P Web. All the content produced can be found in the IPFS Camp Repo -- http://github.com/ipfs/camp. We will be posting all the recordings soon as well. + +Last, but definitely not the least, a huge THANK YOU ❤️ to everyone that contributed to the event. IPFS Camp wouldn't be possible if it werent for: + +- The **160 Attendees** coming from over **22 Countries**! +- The [**67 Content Creators**](https://camp.ipfs.io/team) that produced all the training and talk material for the camp attendees +- An outstanding [Production Team](https://camp.ipfs.io/team) that created the phenomenal experience for everyone +- The over 4000 IPFS Community members that have been building this project with us since the beginning + +[![](https://media.giphy.com/media/mGW5xq4SwlqnSTxwtb/giphy.gif)](./camp-gif.gif) + +On behalf of the whole IPFS Project, thank you all for being part of this project and community, such an ambitious goal couldn't be achieved without all your energy, passion and dedication to make it happen. Onwards! + +David Dias & The IPFS Team + +`Extra:` As a closing gift, here are some random interesting facts about Camp: + +- 😸 IPFS Camp was the 1st time the Laser Cat bot became [**P2P Laser Cat bot**](https://github.com/gorhgorh/ipfscatremote) +- 🍦 All you can eat fruit ice cream made all attendees very happy. +- 👋🏽 Textile created a [**P2P Tag Game**](https://github.com/textileio/advanced-react-native-boilerplate/blob/ipfs-tag/README.md). I believe the last person to be "it" is still looking for the next person to tag, so look out at future events! +- 👕 The first **SWAG Trading Post** was established, an eco-responsible way of attendees picking the item of swag they love the most or trade for others, avoiding the regular Conference waste and making sure everyone can optimize. +- 📶 The Wifi worked! Well, almost, we are sorry for that one morning hiccup. Thank you everyone (especially the course trainers!) for coming prepared with ways to make everything work offline and distributed ❤️ +- 📦 The **whole NPM was crammed into a box** for the first time, an homage to Jen from the IT Crowd. +- 🔌 The power cut out for a bit, but the Space Training Station continued to operate! Offline first FTW! +- 🤝 Many people organically found and recommended people to find at camp using [The Gathering](https://gthr.io). +- 💻 IPFS Camp content is over **[4200 lines - created through 269 commits from 63 individual Github Accounts](https://github.com/ipfs/camp/pulse/monthly)** - and these numbers keep growing. WOW! diff --git a/src/_blog/050-ipfs-camp-recap/camp-gif.gif b/src/_blog/050-ipfs-camp-recap/camp-gif.gif new file mode 100644 index 00000000..9c170f11 Binary files /dev/null and b/src/_blog/050-ipfs-camp-recap/camp-gif.gif differ diff --git a/src/_blog/050-ipfs-camp-recap/ipfs-camp-youtube-preview.jpg b/src/_blog/050-ipfs-camp-recap/ipfs-camp-youtube-preview.jpg new file mode 100644 index 00000000..73a81f4c Binary files /dev/null and b/src/_blog/050-ipfs-camp-recap/ipfs-camp-youtube-preview.jpg differ diff --git a/src/_blog/051-ipfs-camp-content-first-batch/README.md b/src/_blog/051-ipfs-camp-content-first-batch/README.md new file mode 100644 index 00000000..0e08e2e5 --- /dev/null +++ b/src/_blog/051-ipfs-camp-content-first-batch/README.md @@ -0,0 +1,85 @@ +--- +date: 2019-07-20 +url: /2019-07-22-ipfs-camp-content-first-batch/ +tags: IPFS, IPFS Camp +title: 2019 IPFS Camp 1st batch of recordings are out! +description: +author: David Dias +--- + +You read it right, the recordings from IPFS Camp are starting to get out, grab them while they are HAWT 🔥 + +For this batch we have: + +- [⚡️ Lightning Talks](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks) +- [📃 Poster Projects](https://github.com/ipfs/camp#-poster-projects) + +## [⚡️ Lightning Talks](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks) + +| Presenter | Name & GitHub handle | Topic | Slides | Recording | +| ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| | Justin Maier ([@justmaier](https://github.com/JustMaier)) and Victor Rortvedt ([@twoirtter](https://github.com/vrortvedt)) | Introducing The Gathering, a web app built with Libp2p to improve in-person networking at conferences and gatherings | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-thegathering.pdf) | [Video](https://youtu.be/pt1RtMzSEIg) | +| | Alex Potsides ([@achingbrain](https://github.com/achingbrain)) | npm on IPFS: Using IPFS to install your JavaScript dependencies 📦 | [HTML](https://achingbrain.github.io/npm-on-ipfs-talk/) | [Video](https://youtu.be/PLbIsYZDOTM) | +| | Shokunin ([@leshokunin](https://github.com/leshokunin)) | Building a Dropbox replacement on IPFS and Textile | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-dropboxreplacement.pdf) | [Video](https://youtu.be/uTk12jnIboY) | +| | Makoto Inoue ([@makoto](https://github.com/makoto)) | ENS + IPFS: Using ENS as a naming system for IPFS | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-ensipfs.pdf) | [Video](https://youtu.be/3AS2BD22DZg) | +| | Benjamin Kampmann ([@gnunicorn](https://github.com/gnunicorn)) | Changing the record: Using substrate to add a custom blockchain to your IPFS dweb app | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/IPFSCamp%202019%20Lightning%20Talk_%20_Changing%20the%20record_%20Using%20substrate%20to%20add%20a%20custom%20blockchain%20to%20your%20IPFS%20dweb%20app_.pdf) - [Google Slides](https://docs.google.com/presentation/d/14bC3t4BxV4raYG-HyFuYcxcuv5leciX36lc0B98WAvs/edit?usp=sharing) | [Video](https://youtu.be/dpe3MeH3I5k) | +| | Andrew Nesbitt ([@andrew](https://github.com/andrew)) | Republishing a project's npm dependencies to IPFS as a micro-registry 📦 | N/A (video talk) | [Video](https://drive.google.com/a/protocol.ai/file/d/1ExdN_t7xV2mEldjri5WXNDPU5hL4wa4q/view?usp=sharing) | +| | Blake Joyce ([@bjoyce3](https://github.com/bjoyce3)) | Who wins in a fight: Superman, HTTPS, or IPFS? | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-whowins.pdf) | [Video](https://youtu.be/uhAkb9FgTBg) | +| | Pierre Neidhardt ([@ambrevar](https://github.com/ambrevar)) | Package distribution using IPFS on Guix 📦 | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-guix.pdf) | [Video](https://youtu.be/RxMSJ8YfjB8) | +| | Adrian Lanzafame ([@lanzafame](https://github.com/Lanzafame)) | A quick look into the Pinning API proposal | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-pinningapi.pdf) | [Video](https://youtu.be/zdAvXTpBIfc) | +| | Dmitry Starodubcev ([@xhipster](https://github.com/xhipster)) | CYB: Your personal robot on the Great Web | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/cyb.pdf) | [Video](https://youtu.be/YEQy_qcmARQ) | +| | Eric Myhre ([@warpfork](https://github.com/warpfork)) | Solving the distributed naming problem (!) in the applied cases of package management 📦 | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-distributednaming.pdf) | [Video](https://youtu.be/z7VKDD0pbJU) | +| | Héctor Sanjuán ([@hsanjuan](https://github.com/hsanjuan)) | go-ds-crdt: CRDT KV stores arrive in go-land | [HTML](https://hector.link/presentations/go-ds-crdt-ligthning/) | [Video](https://youtu.be/kGB0VtfSMWs) | +| | Brendan O'Brien ([@b5](https://github.com/b5)) | Using dsync for point-to-point DAG transfer | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-dsync.pdf) | [Video](https://youtu.be/JIA661e8oO8) | +| | Andrew Hill ([@andrewxhill](https://github.com/andrewxhill)) | Content addressing and personal data sovereignty | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/Andrew_Hill_IPFS_Personal_data_ownership.pdf) | [Video](https://youtu.be/0pXiyXuPUZM) | +| | Kinuko Yasuda ([@kinu](https://github.com/kinu)) and Jim Pick ([@jimpick](https://github.com/jimpick)) | Signed exchanges in Chrome | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-signedexchangeschrome.pdf) | [Video](https://youtu.be/zYjsVe4s1JA) | +| | Edgar Lee ([@hinshun](https://github.com/hinshun)) | Containerd meets IPFS | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-containerd.pdf) | [Video](https://youtu.be/nvO1MMRxu1Q) | +| | Antoine Eddi ([@aeddi](https://github.com/aeddi)) | Implementing libp2p over Bluetooth Low Energy | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-bluetoothle.pdf) | [Video](https://youtu.be/aaSFHxpwm9A) | +| | Irakli Gozalishvili ([@gozala](https://github.com/gozala)) | Inter Planetary Data Feed (IPDF) | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-ipdf.pdf) | [Video](https://youtu.be/KBwR0I7i4Wg) | +| | Gonçalo Pestana ([@gpestana](https://github.com/gpestana)) | Privacy in P2P networks: DHTs and IPFS | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-privacyp2p.pdf) | [Video](https://youtu.be/lGk6OErtDFY) | +| | Victor Grishchenko ([@gritzko](https://github.com/gritzko)) | An overview of RON | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-ron.pdf) | [Video](https://youtu.be/KJTGv1h-nUM) | +| | Rüdiger Klaehn ([@rklaehn](https://github.com/rklaehn)) | Actyx's experiences on building with IPFS | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-actyx.pdf) | [Video](https://youtu.be/Qzu0xtCT-R0) | +| | Jonathan Budd ([@cesarosum](https://github.com/cesarosum)) | Peergos: E2E encrypted storage and social network on IPFS | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-peergos.pdf) | [Video](https://youtu.be/MBHsJlx7knA) | +| | André Cruz ([@satazor](https://github.com/satazor)) | Introducing Nomios | [Website](https://nomios.io/) | [Video](https://youtu.be/EEIq6Eu9ug4) | +| | Alexandre Trottier ([@postables](https://github.com/postables)) | Why open source matters and how individuals can further the movement | [PDF](https://github.com/ipfs/camp/blob/master/LIGHTNING_TALKS/ipfscamp2019-lightningtalk-opensource.pdf) | [Video](https://youtu.be/usa796ebEnI) | +| | Andrew Hill ([@andrewxhill](https://github.com/andrewxhill)) | Textile | SLIDES | [Video](https://youtu.be/uI9eEZQZpfw) | +| | Matt Ober ([@obo20](https://github.com/obo20)) | IPFS Industry Trends | SLIDES | [Video](https://youtu.be/LumqUfWd6g0) | +| | Zhanna Sharipova ([@sharipova](https://github.com/sharipova)) | Anytype | SLIDES | [Video](https://youtu.be/NAF-4AFSqIo) | + +## [📃 Poster Projects](https://github.com/ipfs/camp#-poster-projects) + +| Topic | Owner | Description | Recording | +| :------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | +| [HTTP gateways](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-HTTP-gateways.md) | autonome
[@autonome](https://github.com/autonome) | An IPFS Gateway acts as a bridge between traditional web browsers and IPFS. | [Video](https://youtu.be/uoI39GpwxVI) | +| [The intricacies of DWeb Addressing](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-dweb-addressing.md) | lidel
[@lidel](https://github.com/lidel) | Systems like IPFS use hashes of data to reference content by itself, rather than by an arbitrary location/name. With this comes compatability and human concerns around referencing data. | [Video](https://youtu.be/Qm-ekNHIYcs) | +| [IPLD Selectors](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-IPLD-selectors.md) | maparent
[@maparent](https://github.com/maparent) | IPLD Selectors are expressions that identify ("select") a subset of nodes in an IPLD dag. i.e. subsets of IPLD objects. | [Video](https://youtu.be/ywGgBbydkwU) | +| [Graphsync](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-graphsync.md) | b5
[@b5](https://github.com/b5) | A protocol to synchronize graphs across peers. | [Video](https://youtu.be/dHN3JwrwUZg) | +| [KeyStore](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-keystore.md) | gozala
[@gozala](https://github.com/gozala) | A secure and simple way of storing and managing keypairs (for IPFS services). | [Video](https://youtu.be/lJmUPXJYEpM) | +| [NPM-on-IPFS](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-NPM-on-IPFS.md) | achingbrain
[@achingbrain](https://github.com/achingbrain) | Let's take NPM and put it on IPFS. | [Video](https://youtu.be/Yck2LimWcAY) | +| [DAG walking facilities in IPLD](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-DAG-walking-in-IPLD.md) | warpfork
[@warpfork](https://github.com/warpfork) | The goal of IPLD is to enable decentralized data-structures that are universally addressable and linkable. | [Video](https://youtu.be/sTPNcET5k20) | +| [IPFS/libp2p PubSub](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-pubsub.md) | whyrusleeping
[@whyrusleeping](https://github.com/whyrusleeping) | Publish-Subscribe, called ‘pubsub’ for short, is a pattern often used to handle events in large-scale networks. | [Video](https://youtu.be/mY-VXRu14vk) | +| [CRDTs](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-CRDT.md) | parkan
[@parkan](https://github.com/parkan) | A "Conflict-free replicated data type" is a data structure which can be replicated across multiple computers in a network, without conflicts! | [Video](https://youtu.be/aljPiArs0Pw) | +| [IPFS Nodes](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-IPFS-node.md) | carsonfarmer
[@carsonfarmer](https://github.com/carsonfarmer) | A general overview of what it means to be/implement an IPFS node. | [Video](https://youtu.be/bMNOopHhDiE) | +| [IPFS DHT](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-IPFS-DHT.md) | gpestana
[@gpestana](https://github.com/gpestana) | IPFS uses a Distributed Hash Table (DHT) to keep track of various types of data, such as content provider records. | [Video](https://youtu.be/DeR9xbWP3uk) | +| [Mutable File System (MFS)](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-MFS.md) | leshokunin
[@leshokunin](https://github.com/leshokunin) | Mutable File System (MFS) is a tool built into IPFS that lets you treat files like you would a normal name-based filesystem. | [Video](https://youtu.be/qwDiBLE3jBk) | +| [Bitswap](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-bitswap.md) | jacobheun
[@jacobheun](https://github.com/jacobheun) | Bitswap is the data trading module for IPFS. Its purpose is to request blocks from and send blocks to other peers in the network. | [Video](https://youtu.be/ImYoVprEg5E) | +| [PeerPad internals](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-peerpad.md) | jimpick
[@jimpick](https://github.com/jimpick) | PeerPad is a decentralized editor that allows concurrent writing of text. | [Video](https://youtu.be/mSkJIsK1jvI) | +| [go-ipfs Infrastructure](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-go-ipfs-infra.md) | stebalien
[@stebalien](https://github.com/stebalien) | This topic should cover what it takes to initialize a go-IPFS node, and connect it to a public P2P network. | [Video](https://youtu.be/U2c8Mvowj2Q) | +| [IPFS Cluster](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-cluster.md) | meiqimichelle
[@meiqimichelle](https://github.com/meiqimichelle) | IPFS Cluster is a stand-alone application and a CLI client that allocates, replicates, and tracks pins across a cluster of IPFS daemons. | [Video Part-1](https://youtu.be/5q4Zl4JQh3Y)
[Video Part-2](https://youtu.be/SZbHBgYARHI) | +| [Textile internals](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-textile.md) | andrewxhill
[@andrewxhill](https://github.com/andrewxhill) | Textile is a set of tools and trust-less infrastructure for building censorship resistant and privacy preserving applications. | [Video](https://youtu.be/oTsM2qkdcJ4) | +| [The design of the IPFS Repo](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-IPFS-repo.md) | dignifiedquire
[@dignifiedquire](https://github.com/dignifiedquire) | A repo is the storage repository of an IPFS node. It is the subsystem that actually stores the data IPFS nodes use. | [Video](https://youtu.be/oA4P47elw6w) | +| [IPFS/Libp2p content routing](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-content-provider-records.md) | bigs
[@bigs](https://github.com/bigs) | The IPFS routing system utilizes "content provider records" hosted on a distributed key-value store to resolve content providers. | [Video](https://youtu.be/XNNuSg5SCTg) | +| [Circuit Relay](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-circuit-relay.md) | ianopolous
[@ianopolous](https://github.com/ianopolous) | The circuit relay is a means to establish connectivity between libp2p nodes (e.g. IPFS nodes) that wouldn't otherwise be able to establish a direct connection to each other. | [Video](https://youtu.be/YiKAawnpgEs) | +| [Swarming (concept)](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-swarming.md) | mburns
[@mburns](https://github.com/mburns) | Swarming is a software method that takes advantage of multiple peers (the "swarm") to fulfill a task which may be easily distributed. | [Video](https://youtu.be/1yboo0T16IU) | +| [IPNS](https://github.com/ipfs/camp/blob/master/POSTER_PROJECTS/topic-IPNS.md) | aschmahmann
[@aschmahmann](https://github.com/aschmahmann) | IPNS is a system for creating and updating mutable links to IPFS content. | [Video](https://youtu.be/51eacKgZjak) | + +## There are more to come, keep posted! + +If you are interested in receiving an update when the next calls are out, you can do this in one of the following ways: + +- Watch and Star the [ipfs/camp repo](https://github.com/ipfs/camp/blob/master/README.md), where all the content will live ad-eternum. +- Subscribe to the [RSS feed of this blog](https://blog.ipfs.io/index.xml). +- Subscribe to the [IPFS Weekly Newsletter](https://tinyletter.com/ipfsnewsletter) if you are interested in general IPFS updates. +- Subscribe to the [IPFS Events Newsletter](https://protocol.us20.list-manage.com/subscribe?u=62e1eb7f68461b5a2ab5c52e6&id=f3fed9af1d) if you are interested in IPFS events. + +Enjoy all the recordings and have a great week! diff --git a/src/_blog/051-new-ipfs-release-process/README.md b/src/_blog/051-new-ipfs-release-process/README.md new file mode 100644 index 00000000..9f88edf6 --- /dev/null +++ b/src/_blog/051-new-ipfs-release-process/README.md @@ -0,0 +1,241 @@ +--- +date: 2019-08-14 +url: /2019-08-14-ipfs-release-process/ +tags: IPFS, go-ipfs, release process, +title: Improving the IPFS Release Process +description: +author: Steven Allen, Alan Shaw, David Dias, Molly Mackinlay, Eric Ronne, Agata Krych +--- + +**go-ipfs is introducing a new release cycle and process to ensure more reliable and frequent releases!** + +![go-ipfs-release-process-illustration](https://user-images.githubusercontent.com/618519/62986422-653fee00-bdf0-11e9-8f61-197117b61da2.png) + +IPFS is growing and maturing. We're seeing many more users in our network and +have recognised the need to level up our release process to deliver a more +production-ready product, on a regular schedule. We're doing this because we shipped +an unusual number of critical regressions in the last three releases (since +fixed). We don't want that to happen again, so we're putting safeguards +in place to maximize our chances of catching a regression before it reaches production. + +Here's what happened: + +- **go-ipfs 0.4.19** had multiple regressions when used under heavy load: + 1. A regression in the docker container (introduced by + [#6040](https://github.com/ipfs/go-ipfs/pull/6040)) that would have been + caught by testing the go-ipfs docker image in more production environments. + 2. A CPU utilization regression in bitswap only seen under very high load. This + would have been caught by testing under production loads. + 3. Panics in the DHT and QUIC modules that only showed up under heavy load. +- **go-ipfs 0.4.20** had a regression where adding multiple independent files in the same + add command didn't work ([#6254](https://github.com/ipfs/go-ipfs/pull/6255)). + A regression test has since been added, but this _also_ would have been caught + with better cross-application testing. +- **go-ipfs 0.4.21** had two performance regressions in bitswap: + 1. A throughput regression that should have been caught by regression testing + (now tested) but almost certainly would have been noticed by downstream + users given a longer release-testing process. + 2. A CPU utilization regression that only shows up with >10000 peers. Something + that only really shows up in certain production systems under heavy load. + +We found two root causes: + +1. An uptick in development pace with respect to previous quarters without + matching improvements to our testing practices. Several large refactors + touching key but poorly tested subsystems landed this year. +2. A significant increase in the network size and production demands on go-ipfs + without large-scale testing or network simulation infrastructure. In + the past all production scale testing has been done by deploying a custom + go-ipfs build to a bootstrapper or gateway and watching how it behaves. + +To address these concerns, we've paused all non-bugfix go-ipfs releases +as we improve our testing practices and build out our testing and network +simulation infrastructure. This is important to ensure improved testing doesn't +become a secondary concern in the face of new features and pressing performance +improvements. + +However, even with our current testing practices, these regressions should have +been caught by rigorous pre-release testing. A better release process (e.g. +the ability to cut patch releases) would also have enabled us to quickly release +fixes for these regressions, and would have enabled our users to quickly deploy +these fixes without worrying about the potential impact of additional unrelated +changes. + +Therefore, in addition to improving our testing, we're introducing a new release +process (🙏🙌🎉) to ensure that releases have been tested in as many environments as we +can, and that we can quickly release bug fixes without waiting an entire release +cycle. + +## Release Process Changes + +We've made three specific changes to the release process: + +1. To address the stability issues, we've introduced a new release process that + involves extensively testing releases in a wide variety of production + environments - including with [early testers](https://github.com/ipfs/go-ipfs/blob/master/docs/EARLY_TESTERS.md). +2. To address the issue of slow releases, we've introduced a 6 week release + cycle. +3. To address the issue of slow bug fixes, we've switched to semver and + introduced patch releases. The first patch release will be 0.4.22 and the + next _feature_ release will be 0.5.0. + +### New Release Process + +The new release process includes 5 stages: + +0. Automated Testing - go-ipfs CI Passes. +1. Internal Testing - go-ipfs is tested against IPFS infrastructure, internal + testing and simulation tools, and + [Shipyard](https://github.com/ipfs-shipyard) applications. +2. Community Dev Testing - go-ipfs is tested by the community in dev + environments. +3. Community Prod Testing - go-ipfs is tested by the community in production + environments. +4. Release - go-ipfs is released. + +If we merge any non-trivial fixes during the release process, we'll start over +at stage 0 with a compressed release process for the stages that have already +been completed once. + +We expect stages 1-3 to take a week each, on average - suggesting a 3 week period between cutting and launching a new release. + +#### Stage 0 - Automated Testing + +While we strive to keep master green, issues do occasionally slip through +(usually due to faulty tests or unnoticed issues with CI). Before we even branch +off a release, we expect master to be green. + +This is the stage where we branch off a release candidate. + +#### Stage 1 - Internal Testing + +The first real stage of this process is internal testing. In this stage, the +IPFS team will test the release candidate against applications in the [IPFS +Shipyard](https://github.com/ipfs-shipyard), on some new testing and simulation +infrastructure we're in the process of building, and on a subset of the IPFS +project's production infrastructure (bootstrappers and gateways). + +This stage allows us to rapidly find, diagnose, and fix issues within a +constrained sphere of control before asking the wider community to begin +testing. + +#### Stage 2 - Community Dev Testing + +At this stage, we announce the impending release to the community and ask for +beta testers. This stage exists to give a new IPFS release candidate some +low-stakes testing on as many environments as possible. + +This is also the first stage where we involve members of the early testers +program. Here, we ask them to test the go-ipfs release in their _dev_ +infrastructure and work with us to resolve any issues. + +#### Stage 3 - Community Prod Testing + +Once the go-ipfs release candidate has been thoroughly tested in dev +environments, we ask members of the early testers program to deploy the release +candidate to a subset of their production environment. This stage gives us a +chance to test on production workloads while retaining the ability to quickly +roll back changes and fix any issues that might arise before the final release. + +#### Stage 4 - Release + +At stage 4, we make sure all the documentation has been updated, cut the final +release, and announce it to the community. + +### Early Testers Program + +We're introducing an early testers program that allows groups using go-ipfs in production to +self-volunteer to help with testing `go-ipfs` release candidates in development +and production environments. While we invite the _entire_ community to help test +releases, members of the early testers program participate directly and actively +in every release. + +Early testers will deploy release candidates to dev and prod environments, +giving us quick feedback on any regressions or performance changes they notice. +This means we can get some quick feedback from heavy users before we cut the +official release and these heavy users can work with us to make sure the new +release doesn't introduce any regressions into their systems. + +This program currently includes: + +- [Infura](https://infura.io/) +- [Textile](https://textile.io/) +- [Pinata](https://pinata.cloud/) +- [RTrade (Temporal)](https://temporal.cloud/) +- [QRI](https://qri.io/) +- [Siderus](https://siderus.io/) + +### Release Cycle + +Baring any feature freezes, go-ipfs will now cut a new release approximately +every 6 weeks. Specifically, we will aim to branch off a new release every 6 weeks and +then run through the release process in an expected 3 weeks. + +If the release process runs under or over the expected 3 weeks, the next release +will aim to branch at the 6 week mark, regardless. That way, even if we don't +release on schedule, we can still maintain a 6 week release cadence. + +### Patch Releases + +Given the increased structure and extensive testing in this release process, we need a way +to quickly release fixes for critical regressions, should they arise. If we fix +a critical regression in a go-ipfs release, we will create a _patch_ release for +this regression based on the current stable release. + +This patch release will still undergo an abbreviated release testing process, but we expect +it to take 2-3 days, rather than weeks: + +1. Less than a day for internal testing. +2. 1-2 days for production testing by members of the early testers program. + +Note: This release process _does not_ introduce long term support releases. +Patches will only be applied to the latest release and will not be backported. +Furthermore, the next feature release will likely include additional bug fixes not deemed critical to fix in +a patch release. + +### Semver + +This release process finally switches go-ipfs over to +[semver](https://semver.org/). Like many pre-1.0 project, go-ipfs has reserved +MINOR releases for large breaking changes or significant milestones. However, +this means we can't distinguish between true patch releases (bug fixes applied +to the previous release) and feature releases (minor releases). + +This means that until go-ipfs reaches 1.0: + +- Minor releases will no longer signal significant milestones or large breaking + changes. Instead, minor releases will be normal feature releases. +- Patch releases will now be just that: patches on the previous stable release. + +As an historical tidbit, we held a somewhat romantic hope that 0.5.0 +would mark feature completeness ("beta") and that the next non-patch release +after that would be 1.0. However, the next feature release, 0.5.0, does not mean +anything special, and will not be a major milestone. + +## Communication + +We have several communication points in this process: + +- When we cut each RC, we will create an associated [GitHub + release](https://github.com/ipfs/go-ipfs/releases). You can follow along by + either: + - Subscribing to the [RSS feed](https://github.com/ipfs/go-ipfs/releases.atom). + - Subscribing to release email notifications on the go-ipfs repository. +- At stage 0, we will create an issue with a copy of the [release + checklist](https://github.com/ipfs/go-ipfs/blob/master/docs/RELEASE_ISSUE_TEMPLATE.md). +- At stage 2, we will announce the release candidate on IRC/Matrix. +- At stage 3, we will announce the release candidate on IRC/Matrix and Twitter for a wider audience. +- At stage 4, we will continue to publish a blog post announcing the highlights in the release + +## Where To Learn More + +If you're interested in seeing this release process in action, we trialed the +_full_ (not patch) release process for the latest patch release (0.4.22): +[#6506](https://github.com/ipfs/go-ipfs/issues/6506). + +If you'd like to read through the official release process, you can find it in +[docs/releases.md](https://github.com/ipfs/go-ipfs/blob/master/docs/releases.md). + +Finally, if you're using go-ipfs in production and would like to join the the +Early Testers program, please read +[docs/EARLY_TESTERS.md](https://github.com/ipfs/go-ipfs/blob/master/docs/EARLY_TESTERS.md) and submit a PR to join if interested. diff --git a/src/_blog/052-operation-task-force/README.md b/src/_blog/052-operation-task-force/README.md new file mode 100644 index 00000000..4dc14841 --- /dev/null +++ b/src/_blog/052-operation-task-force/README.md @@ -0,0 +1,43 @@ +--- +date: 2019-07-31 +url: /2019-07-31-operation-task-force/ +tags: IPFS, Project +title: IPFS Project Q3 Priorities & Working Groups +description: +author: Dietrich Ayala +--- + +IPFS is growing! This year we've grown immensely in network size, number of apps building with IPFS, number of end-users of IPFS-powered apps, and the number of developers contributing to the codebase. + +![ecosystem diagram edited](https://user-images.githubusercontent.com/618519/62986295-b8657100-bdef-11e9-9d0b-db7a08568d15.png) + +Along with that growth, we've also experienced some challenges: + +- The HTTP to IPFS gateways [didn’t keep up](https://github.com/ipfs/go-ipfs/issues/6385) with the needs of our growing community +- The public IPFS network (via the DHT) was [slow and sometimes unreliable](https://github.com/ipfs/go-ipfs/issues/6383) +- We shipped some bugs and performance regressions in our releases ([0.4.19](https://github.com/ipfs/go-ipfs/releases/tag/v0.4.20) & [0.4.20](https://github.com/ipfs/go-ipfs/releases/tag/v0.4.21)) +- Our documentation and websites were poorly maintained and [fell out of date](https://github.com/ipfs/docs/#ipfs-docs-q3-2019-update) + +Last month in Barcelona we got together and hammered out a plan to make IPFS performant, stable, high quality and updated regularly - and ready to grow even more! Check out the [Q3 OKR planning issue](https://github.com/ipfs/team-mgmt/issues/995) that documents our analysis and next steps. + +We're switching things up this quarter, remixing the IPFS working groups and forming ourselves (Voltron-like) into a set of new teams focused on these high priority challenges. Meet our new working groups for Q3: + +- **[Team Bifrost](https://docs.google.com/spreadsheets/d/1AiNUL7vK5Jp8aa839UaMaI_AlBU5r6Bor-A40179I2A/edit#gid=1439867466)** (aka IPFS Infra as a Service) - Improve performance and stability of gateways and pinning, and provide public observability of services. +- **[Test Infrastructure](https://docs.google.com/spreadsheets/d/1AiNUL7vK5Jp8aa839UaMaI_AlBU5r6Bor-A40179I2A/edit#gid=96566767)** - Improve our confidence that every release improves the previous one through testing infrastructure designed to evaluate IPFS and libp2p at scale - from single node performance to overall network health and efficiency - tightly integrated with our software engineering pipeline. +- **[Project Operations](https://github.com/ipfs/project-operations)** - Ship core go and js implementations with reliable rigor, systematize community communications and collaborations, and spin up IPFS research to meet future project needs. +- **[Package Managers](https://github.com/ipfs/package-managers)** - Improve performance of import and update of large filesystems to support file-system-based package managers. +- **[Documentation & Developer UX](https://github.com/ipfs/docs#ipfs-docs-q3-2019-update)** - Overhaul our documentation platform and content based on audits, research and community needs assessment to make IPFS more accessible to developer users. + +This new set of problem-oriented working groups will remain in place as long as needed to set IPFS on a stable course for achieving the broader vision for the project. Some might live for one or two quarters to be replaced by new focus areas we identify, while others might continue on as long as they're useful to the project. These changes are live in the [IPFS Project Teams, Roles & Structures document](https://github.com/ipfs/team-mgmt/blob/master/TEAMS_ROLES_STRUCTURES.md). + +Your feedback is a large part of identifying these challenges, evaluating how we're doing at addressing them, and assessing whether your needs (or your users' needs!) are being met by IPFS! You can find ways to participate and make your voice heard on the [IPFS Github repository](https://github.com/ipfs/ipfs#project-and-community). + +These new working groups meet regularly, and you can join them to help us achieve these goals! Check the [IPFS community calendar](https://github.com/ipfs/community/blob/master/README.md#calendar) for times and connection information, or watch the meetings at your leisure on the [IPFS Youtube channel](https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew). + +The work these teams are doing will require a number of different skillsets, and could use your help! If you're interested and have bandwidth to help out - jump on a community call or Github issue and share your time and expertise! Looking for fulltime roles to help out on these and other IPFS challenges? Check the IPFS Weekly Newsletter for [IPFS-focused job opportunities](https://blog.ipfs.io/weekly-51/#open-positions-working-on-ipfs)! + +## How does this work affect you? + +- **As an IPFS user**: The HTTP to IPFS gateways used to get started with IPFS should be more reliable and responsive. Projects built on IPFS will begin performing better. If you have problems getting up and running with IPFS, you'll have access to more and better documentation for helping you troubleshoot. +- **As a developer building things with IPFS**: You can begin to count on a reliable release process. New releases will have better test coverage, so are less likely to contain performance or functional regressions. New features, as well as existing features and topics that we know can be tricky, will be better documented to help you get moving faster. +- **As a core contributor**: Depending on which part of the project you're contributing to, you may see more or less activity. Your tests might start running much faster. Projects that are not critical to the initiatives above might take longer to review your pull-request or answer your question. You may be encouraged and empowered to better document improvements you make for everyone to take advantage of. diff --git a/src/_blog/053-js-ipfs-0.37/README.md b/src/_blog/053-js-ipfs-0.37/README.md new file mode 100644 index 00000000..e9b4680a --- /dev/null +++ b/src/_blog/053-js-ipfs-0.37/README.md @@ -0,0 +1,220 @@ +--- +date: 2019-08-06 +url: /2019-08-06-js-ipfs-0-37/ +title: js-ipfs 0.37.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +> New constructor, better DNSLink support and delegated routing! + +# 🔦 Highlights + +## 👷‍♂️ Brand new constructor + +We're in the middle of [converting IPFS, libp2p and IPLD modules to using async/await and async iterators](https://github.com/ipfs/js-ipfs/issues/1670) instead of callbacks. This will eventually bubble up to the JS IPFS programmatic API where there will likely be some changes that will effect your application. To ease the transition when that happens we're encouraging new and existing developers away from using our callback based APIs, towards Promise based APIs. You'll see the change reflected in our [API docs](https://github.com/ipfs/js-ipfs#core-api) soon. For now, there's no breaking changes, all existing APIs continue to work as usual with callbacks. + +In this release there's a new way to construct an IPFS node using promises: + +```js +const IPFS = require('ipfs') +const node = await IPFS.create() +// Done, ready to use! +``` + +All the usual options you'd normally pass to the constructor can be passed to [`create`](https://github.com/ipfs/js-ipfs#ipfs-constructor). Did we mention that it's completely backwards compatible? Well yeah, it is. No breaking changes here 😜 - you can still use `new IPFS()` and wait for the [`ready`](https://github.com/ipfs/js-ipfs#events) event as you used to. Or, alternatively, you can still use the constructor and `await` on the new "ready" promise like so: + +```js +const IPFS = require('ipfs') +const node = new IPFS() +await node.ready +// Done, ready to use! +``` + +More details in the [IPFS constructor docs](https://github.com/ipfs/js-ipfs#ipfs-constructor). + +## 🌎 Support for DNSLink IPNS name resolution + +JS IPFS can finally resolve a [DNSLink](http://dnslink.io/) IPNS path. It means that `jsipfs name resolve /ipns/ipfs.io` will now query DNS for a `dnslink` TXT record and return `/ipfs/QmRq5rhjnfFHYFYbYXoqPpcJQHKu3SUuHADzSzX9ECN5eM` (for example). + +It also works recursively, so your DNSLink TXT record could return another IPNS path to resolve and it would keep going. Turtles all the way down 🐢. Cowabunga! + +Bonus 🎁 this also works on the gateway so `http://127.0.0.1:8080/ipns/ipfs.io` will resolve and display the ipfs.io website. Hooray 😁! + +## 🧭 Delegated peer and content routing + +JS IPFS now supports delegating peer and content routing to another node on the network. + +What does that mean though? Well, when you delegate, you get someone else to do something. In delegated peer and content routing we get a different IPFS node to find a piece of content or another peer on the network. + +Delegation allows JS IPFS to make use of the routing abilities of other nodes. Typically we delegate to IPFS nodes that have unrestricted access to a DHT. This is useful for IPFS nodes running in the browser, or even for nodes running in resource constrained environments. + +IPFS nodes running in Node.js that are behind NATs or that are not running a DHT will also benefit from leveraging delegate routers. If you are running a DHT, the delegate will be used as a fallback router. + +We've setup 2 delegate nodes you can use for development and testing, check the docs for [configuring delegate routers](https://github.com/ipfs/js-ipfs#configuring-delegate-routers) in JS IPFS and the [libp2p delegated routing example](https://github.com/libp2p/js-libp2p/tree/master/examples/delegated-routing) for even more info! + +## ✨ Web UI with revamped Files & Peers + +The Web UI got a whole new lease of life in version 2.5! + +We've introduced a help system designed for new users, with explanations for each section. + +The Peers page now allows you to connect to a specific peer via 'Add Connection'. We also have a revamped peers table with sorting, identicons for each peer, a simplified location, a new protocol & transport column and latency! + +On the Files side, you can now look at any files in the wild. But what does that mean? You can now see your pins, remove pins, add new pins, navigate to any `/ipfs/QmHash` or `/ipns/domain.com` path and explore the IPFS world like you never did before. + +# 🏗 API Changes + +- New constructor. The recommended way of creating an IPFS node programmatically is now `await IPFS.create()`. This change is backwards compatible 😅 + - See [constructor documentation](https://github.com/ipfs/js-ipfs#ipfs-constructor) +- (BREAKING) Gateway now implicitly responds with the contents of `/index.html` when accessing a directory `/` instead of redirecting to `/index.html` +- Support added for `/ipns/` paths on HTTP Gateway + - e.g. http://127.0.0.1:9090/ipns/tr.wikipedia-on-ipfs.org/wiki/Anasayfa.html +- Support added for `ipfs name resolve /ipns/` +- (BREAKING) `ipfs name resolve` is now recursive by default, set the `recursive` option to `false` to disable + +# ❤️ Huge thank you to everyone that made this release possible + +In alphabetical order, here are the 126 humans that made 2091 contributions to this release: + +- [Abraham Elmahrek](https://github.com/generalpiston) (1 PR, 1 issue, 2 comments) +- [Adam Uhlíř](https://github.com/AuHau) (4 PRs, 1 issue, 5 reviews, 5 comments) +- [AkshitV](https://github.com/AkshitV) (1 issue, 1 comment) +- [Alan Shaw](https://github.com/alanshaw) (77 PRs, 18 issues, 125 reviews, 219 comments) +- [Alessandro Ricottone](https://github.com/ricott1) (2 PRs, 1 issue, 2 comments) +- [Alex Potsides](https://github.com/achingbrain) (18 PRs, 6 issues, 59 reviews, 43 comments) +- [Anarkrypto](https://github.com/anarkrypto) (3 issues) +- [André Cruz](https://github.com/satazor) (1 PR, 3 issues, 10 comments) +- [AndrewH](https://github.com/andrewheadricke) (1 issue, 1 comment) +- [Andy Hin](https://github.com/whydna) (1 issue, 1 comment) +- [antemortem](https://github.com/suzakinishi) (1 issue) +- [area](https://github.com/area) (1 comment) +- [arminsal1](https://github.com/arminsal1) (4 comments) +- [Arve Knudsen](https://github.com/aknuds1) (5 PRs, 1 issue, 3 reviews, 17 comments) +- [Asutosh](https://github.com/asutosh05) (1 comment) +- [b-rohit](https://github.com/b-rohit) (2 comments) +- [Barnyard](https://github.com/BarneyChambers) (2 issues, 1 comment) +- [Bora M. Alper](https://github.com/boramalper) (1 PR) +- [Carson Farmer](https://github.com/carsonfarmer) (1 issue, 3 comments) +- [Carsten Munk](https://github.com/stskeeps) (1 comment) +- [Chirag Shinde](https://github.com/chirag-shinde) (2 PRs, 5 comments) +- [Christopher Joel](https://github.com/cdata) (1 PR, 1 comment) +- [Clemens Brunner](https://github.com/cle1000) (1 PR, 3 comments) +- [Codecov](https://github.com/codecov-io) (1 comment) +- [Cody Eilar](https://github.com/AcidLeroy) (2 issues, 4 comments) +- [Dan Shields](https://github.com/NukeManDan) (2 PRs) +- [Daniel Constantin](https://github.com/0x6431346e) (1 comment) +- [David Dias](https://github.com/daviddias) (1 PR, 12 issues, 14 reviews, 42 comments) +- [dependabot-preview](undefined) (59 PRs, 38 comments) +- [Dietrich Ayala](https://github.com/autonome) (1 issue, 3 comments) +- [Diogo Silva](https://github.com/fsdiogo) (1 PR, 2 reviews) +- [dirkmc](https://github.com/dirkmc) (16 PRs, 7 issues, 117 reviews, 73 comments) +- [Dominic Della Valle](https://github.com/djdv) (1 PR) +- [Dzmitry Afanasenka](https://github.com/dzmitryafanasenka) (1 issue) +- [Dzmitry Bachko](https://github.com/dbachko) (1 PR) +- [Filip Š](https://github.com/filips123) (2 PRs, 1 issue, 4 comments) +- [Florian](https://github.com/sinnlosername) (1 issue) +- [Frederik Batuna](https://github.com/freddi301) (1 issue) +- [Friedel Ziegelmayer](https://github.com/dignifiedquire) (1 PR, 2 comments) +- [ghbjklhv](https://github.com/ghbjklhv) (1 issue) +- [Glenn Vandeuren](https://github.com/VandeurenGlenn) (1 issue) +- [Gopalakrishna Palem](https://github.com/KrishnaPG) (2 issues, 7 comments) +- [Gorka Ludlow](https://github.com/AquiGorka) (1 comment) +- [Gregg Altschul](https://github.com/threejeez) (1 comment) +- [Guilherme Cunha](https://github.com/guicunha) (1 issue) +- [hapsody](https://github.com/hapsody) (1 PR, 2 issues, 5 comments) +- [Harris Levine](https://github.com/pynchmeister) (4 comments) +- [Henrique Dias](https://github.com/hacdias) (3 PRs, 1 issue, 1 comment) +- [hhfeng](https://github.com/hhfeng) (2 issues, 3 comments) +- [Hugo Dias](https://github.com/hugomrdias) (17 PRs, 3 issues, 47 reviews, 45 comments) +- [Irakli Gozalishvili](https://github.com/Gozala) (10 comments) +- [Isaac Jacobs](https://github.com/didlie) (1 issue, 3 comments) +- [Jacob Heun](https://github.com/jacobheun) (23 PRs, 6 issues, 59 reviews, 141 comments) +- [Jakub](https://github.com/jakubgs) (1 PR) +- [Jesho Carmel](https://github.com/jeshocarmel) (1 comment) +- [Jim Pick](https://github.com/jimpick) (1 comment) +- [João Antunes](https://github.com/JGAntunes) (1 comment) +- [John Hiesey](https://github.com/jhiesey) (4 comments) +- [John Wehr](https://github.com/wehriam) (1 issue, 8 comments) +- [John_Suu](https://github.com/suutaku) (5 comments) +- [Jonybang](https://github.com/Jonybang) (1 PR, 1 issue, 4 comments) +- [Jordan Last](https://github.com/lastmjs) (2 comments) +- [Jorropo](https://github.com/Jorropo) (3 PRs, 3 comments) +- [Joseph Krug](https://github.com/joeykrug) (1 comment) +- [Juan Benet](https://github.com/jbenet) (1 comment) +- [Justin Maier](https://github.com/JustMaier) (1 PR, 1 issue, 8 comments) +- [Kia](https://github.com/mistakia) (1 issue, 3 comments) +- [ksvirsky](https://github.com/ksvirsky) (1 issue, 1 comment) +- [KuhnChris](https://github.com/kuhnchris) (1 PR, 2 issues, 4 comments) +- [kumavis](https://github.com/kumavis) (3 PRs, 11 reviews, 16 comments) +- [Lennart Grahl](https://github.com/lgrahl) (2 comments) +- [Leo](https://github.com/leoherzog) (1 issue, 1 comment) +- [LeonFangCN](https://github.com/LeonFangCN) (1 issue, 1 comment) +- [lin onetwo](https://github.com/linonetwo) (2 comments) +- [Lukasz Juraszek](https://github.com/elluck91) (1 comment) +- [Maciej Krüger](https://github.com/mkg20001) (2 PRs, 3 issues, 2 reviews, 23 comments) +- [Mahipatsinh Jadav](https://github.com/mhjadav-plivo) (1 comment) +- [Mapiac](https://github.com/Mapiac) (1 comment) +- [Marcin Rataj](https://github.com/lidel) (12 PRs, 7 issues, 25 reviews, 32 comments) +- [Marnee Dearman (KG7SIO)](https://github.com/MarneeDear) (1 issue) +- [Mars Robertson](https://github.com/marsrobertson) (1 comment) +- [Matt Ober](https://github.com/obo20) (2 PRs, 1 review, 11 comments) +- [Matteo Collina](https://github.com/mcollina) (3 comments) +- [Max Graey](https://github.com/MaxGraey) (6 comments) +- [Michael Avila](https://github.com/michaelavila) (1 review, 3 comments) +- [Michael Bradley](https://github.com/michaelsbradleyjr) (1 comment) +- [Michael Burns](https://github.com/mburns) (3 comments) +- [Michael FIG](https://github.com/michaelfig) (1 PR) +- [Michiel De Backker](https://github.com/backkem) (1 comment) +- [Mikeal Rogers](https://github.com/mikeal) (1 PR, 3 issues, 15 comments) +- [Mikerah](https://github.com/Mikerah) (1 comment) +- [Mikhail Ivantsov](https://github.com/darkrain) (1 issue, 2 comments) +- [Mitra Ardron](https://github.com/mitra42) (3 issues) +- [MollyM](https://github.com/momack2) (1 comment) +- [Nate Foss](https://github.com/npfoss) (1 PR, 5 issues, 5 comments) +- [Nick Popeka](https://github.com/npopeka) (1 comment) +- [Nick Poulden](https://github.com/nick) (1 PR, 2 comments) +- [ohager](https://github.com/ohager) (2 comments) +- [Oli Evans](https://github.com/olizilla) (1 PR, 3 issues, 1 review, 6 comments) +- [Pat White](https://github.com/patwhite) (1 comment) +- [Pedro Teixeira](https://github.com/pgte) (2 comments) +- [Péter Huba](https://github.com/peterhuba) (1 comment) +- [Peter Occil](https://github.com/peteroupc) (1 comment) +- [pldespaigne](https://github.com/pldespaigne) (2 comments) +- [Prabhakar Poudel](https://github.com/Prabhakar-Poudel) (9 PRs, 4 reviews, 22 comments) +- [Qmstream](https://github.com/Qmstream) (3 PRs, 1 issue, 2 comments) +- [Raul](https://github.com/rdig) (1 comment) +- [rayj00](https://github.com/rayj00) (2 issues) +- [Richard Schneider](https://github.com/richardschneider) (1 comment) +- [Robert Kiel](https://github.com/robertkiel) (1 comment) +- [Robert Misiorowski](https://github.com/rmisio) (1 issue, 1 comment) +- [Rod Vagg](https://github.com/rvagg) (9 reviews, 1 comment) +- [Saquib ul hassan](https://github.com/IamSaquib) (1 issue, 1 comment) +- [shamb0t](https://github.com/shamb0t) (1 issue, 1 comment) +- [sigmatics](https://github.com/sigma67) (1 comment) +- [Steven Allen](https://github.com/Stebalien) (1 PR, 1 issue, 1 review, 5 comments) +- [Tapasweni Pathak](https://github.com/tapaswenipathak) (2 PRs, 7 comments) +- [Teri Chadbourne](https://github.com/terichadbourne) (5 PRs, 4 comments) +- [thanusreemohan](https://github.com/thanusreemohan) (1 issue, 3 comments) +- [Topper Bowers](https://github.com/tobowers) (1 issue) +- [Vasco Santos](https://github.com/vasco-santos) (20 PRs, 4 issues, 75 reviews, 45 comments) +- [Volker Mische](https://github.com/vmx) (22 PRs, 2 issues, 9 reviews, 40 comments) +- [warlockD](https://github.com/warlockdn) (1 issue) +- [Whymarrh Whitby](https://github.com/whymarrh) (1 comment) +- [yuwiggin](https://github.com/yuwiggin) (1 comment) +- [zthomas](https://github.com/zthomas) (1 issue) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/054-go-ipfs-0.4.22/README.md b/src/_blog/054-go-ipfs-0.4.22/README.md new file mode 100644 index 00000000..e04d4d31 --- /dev/null +++ b/src/_blog/054-go-ipfs-0.4.22/README.md @@ -0,0 +1,46 @@ +--- +date: 2019-08-13 +url: /054-go-ipfs-0.4.22/ +title: go-ipfs 0.4.22 released +description: +author: Steven Allen +--- + +**We've released a PATCH version of go-ipfs based on 0.4.21 containing some critical fixes.** + +The IPFS network has scaled to the point where small changes can have a wide-reaching impact on the entire network. To keep this situation from escalating, we've put a hold on releasing new features until we can improve our [release process](https://github.com/ipfs/go-ipfs/blob/master/docs/releases.md) (which we've trialed in this release) and [testing procedures](https://github.com/ipfs/go-ipfs/issues/6483). + +You can read more about the new release process in the [release process blog post](/blog/2019-08-14-ipfs-release-process/). + +This release includes fixes for the following regressions: + +1. A major bitswap throughput regression introduced in 0.4.21 ([ipfs/go-ipfs#6442](https://github.com/ipfs/go-ipfs/issues/6442)). +2. High bitswap CPU usage when connected to many (e.g. 10,000) peers. See [ipfs/go-bitswap#154](https://github.com/ipfs/go-bitswap/issues/154). +3. The local network discovery service sometimes initializes before the networking module, causing it to announce the wrong addresses and sometimes complain about not being able to determine the IP address ([ipfs/go-ipfs#6415](https://github.com/ipfs/go-ipfs/pull/6415)). + +It also includes fixes for: + +1. Pins not being persisted after `ipfs block add --pin` ([ipfs/go-ipfs#6441](https://github.com/ipfs/go-ipfs/pull/6441)). +2. Panic due to concurrent map access when adding and listing pins at the same time ([ipfs/go-ipfs#6419](https://github.com/ipfs/go-ipfs/pull/6419)). +3. Potential pin-set corruption given a concurrent `ipfs repo gc` and `ipfs pin rm` ([ipfs/go-ipfs#6444](https://github.com/ipfs/go-ipfs/pull/6444)). +4. Build failure due to a deleted git tag in one of our dependencies ([ipfs/go-ds-badger#64](https://github.com/ipfs/go-ds-badger/pull/65)). + +Thanks to: + +- [@hannahhoward](https://github.com/hannahhoward) for fixing both bitswap issues. +- [@sanderpick](https://github.com/sanderpick) for catching and fixing the local discovery bug. +- [@campoy](https://github.com/campoy) for fixing the build issue. + +# ❤️ Contributors + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [go-ipfs repo](https://github.com/ipfs/go-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at [discuss.ipfs.io](https://discuss.ipfs.io/) and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode, which is also [accessible through our Matrix bridge](https://riot.im/app/#/room/#freenode_#ipfs:matrix.org). diff --git a/src/_blog/054-great-calamity-circumvention-assembly-at-ipfs-camp/README.md b/src/_blog/054-great-calamity-circumvention-assembly-at-ipfs-camp/README.md new file mode 100644 index 00000000..21e205a0 --- /dev/null +++ b/src/_blog/054-great-calamity-circumvention-assembly-at-ipfs-camp/README.md @@ -0,0 +1,72 @@ +--- +date: 2019-08-12 +url: /2019-08-12-great-calamity-circumvention-assembly-at-ipfs-camp/ +tags: IPFS, IPFS Camp +title: The Great Calamity Circumvention Assembly at IPFS Camp 2019 +description: +author: Alan Shaw +--- + +> This is the story of the Deep Dive sessions at IPFS Camp 2019 as told from the perspective of a DWeb historical researcher in the far future. + +In 2019, the intergalactic dweb uprising began. The pillars of what had become the foundations of human civilisation started to crack under their own weight and the very beginnings of a new empire began emerging from the shadows. An empire forged in the flames of discontent of central servers and "do-no-evil" monopoly. Peer to peer communications - the heart of the dweb - slowly formed efficient and autonomous networks that expanded beyond the reach of the blue planet and far into the galaxy, the likes of which the old world order had never seen before. + +The uprising began modestly as a "space camp" in the ALPHA region 5P4-1N. From fear of ambush the exact coordinates were only divulged to the heroes that enlisted. What happened at that camp laid the foundations for the world as we know it today, but between then and now, many battles took place and we will forever honour the unbeknown dragon slayers that emerged from camp to lead the uprising and shape our new world. + +This story attempts to recount a small part of camp, what was referred to back then as "Deep Dives" but what we later came to know as The Great Calamity Circumvention Assembly. + +At this time the uprising was in its infancy. Incredible progress had already been made expanding peer to peer communications, content addressing and information permanence, but as unbelievable as it sounds, the dweb had still not yet expanded beyond the reach of the blue planet (what we once referred to as "Earth"). + +Networks in those days were siloed and inaccessible. Data was equally unavailable and fragile and temporary. The transition from analogue to digital was still in living memory and appropriate steps had not yet been taken to ensure human history was permanently recorded. The worldwide data erosion seen in the Global Electromagnetic Fire Disaster of 2027 (just a handful of years after camp) proved this point and some estimates suggest that over 83% of all human history for that period was wiped out. + +As you can imagine, there were a great many problems the dweb uprising was facing at that time. The Calamity Circumvention Assembly ("Deep Dives") was formed at camp to address as many of those issues as possible. + +Around 160 space rangers formed somewhere in the region of 30 splinter groups to focus on specific open problems around IPFS. As you know, IPFS - the InterPlanetary File System is one of the biggest proponents of the dweb and is currently the most widely used file system across the universe, used by over 31,000 known alien races. It was one of just a handful of dweb technologies at the time and later went on to play a monumental part in the dweb uprising. + +The plan was to come up with new and inventive solutions to these problems. The enlisted space rangers were vetted to ensure they were experts in the dweb field and were suitably well placed to solve the issues at hand. In just 1 hour and 30 minutes (that's 1000 [hexsec](https://en.wikipedia.org/wiki/Hexadecimal_time)s in our time) the splinter groups intensely discussed their assigned topics and documented a wealth of knowledge, ideas and observations that are still referenced in academia today. + +The outcomes from each splinter group's discussions were "pull requested" to the camp repository (A "pull request" was a term used at that time to submit additions/deletions or changes to a set of files). The following day splinter groups presented their solutions to the assembly for intergalactic approval. + +Transcripts and videos from The Great Calamity Circumvention Assembly were salvaged from the Global Electromagnetic Fire Disaster of 2027 and we've transcoded them into formats appropriate for today's dweb browsers. Enjoy! + +| Topic | Owner | Description | Recording | +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------ | +| [Scaling up the DHT 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/02-scaling-up-the-dht.md) | Kubuxu | What can we do to optimise the performance of our DHT? Are there alternatives? | [Video](https://youtu.be/b2dtKOR_cn0) | +| [IPID - Master key security and user-experience 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/05-ipid-master-key-ux.md) | satazor | [IDM](https://github.com/ipfs-shipyard/pm-idm) (Identity Manager) aims to support several [DIDs](https://w3c-ccg.github.io/did-spec/) methods and [IPID](https://did-ipid.github.io/ipid-did-method) was chosen as the first DID method to be integrated. | [Video](https://youtu.be/hLE08nQigx8) | +| [Package Managers: What Now, What Next? 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/09-package-managers-what-now-what-next.md) | jessicaschilling | Community evaluation and ideation session to recap the current (as of late June) state of the IPFS-enabled package manager landscape, discuss happiness and pain points, and do some ideation/co-creation around the direction of our next rounds of package manager efforts. | [Video](https://youtu.be/yWR8vbEIt8Q) | +| [IPFS on Mobile](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/10-ipfs-on-mobile.md) | carsonfarmer | Increasingly, everyday computing is happening in mobile environments. At the same time, many features of IPFS and related technologies work best on an 'always-connected' network that simply doesn't exist in the mobile world. In this deep dive, we will explore the issues inherent to p2p systems operating in mobile environments, discuss some existing solutions, and hopefully outline a research/development agenda that will help catalyze a wave of new IPFS-based mobile solutions. | [Video](https://youtu.be/RfXRn8RTLh4) | +| [Private content on IPFS 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/11-private-content-on-ipfs.md) | ianopolous | Can we have a private group chat implemented on IPFS? | [Video](https://youtu.be/oiEhyw17_OI) | +| [Building the IPFS Community](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/12-building-the-ipfs-community.md) | stefanhans | Community, evangelism, engagement, on ramp. | [Video](https://youtu.be/R81ePQQ2pqA) | +| [IPFS for websites (static, dynamic, search, etc)](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/13-ipfs-for-websites-static-dynamic-search-etc.md) | dietrich | What are the best practices and open questions for using IPFS for static / dynamic websites? What about indexing and searching? | [Video](https://youtu.be/K8dHuZEL3Q0) | +| [Revocation/Rotating of IPNS Keys](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/16-revocation-rotating-of-ipns-keys.md) | aschmahmann | The idea of using a public key to identify mutable data is cool, but what happens when that key becomes compromised? | Presenter Opted Out of Recording | +| [How can IPFS support sharding 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/20-how-can-ipfs-support-sharding.md) | hsanjuan | How to best pin an arbitrary part of a DAG. | [Video](https://youtu.be/tMejHAZVT-I) | +| [Replication protocol 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/24-replication-protocol.md) | hannahhoward | How can we more quickly sync a DAG or part of a DAG between two nodes? A compliment to bitswap, affectionately overloaded as GraphSync | [Video](https://youtu.be/6Mwa3AMEPYc) | +| [Do not replicate lists - DNR](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/25-do-not-replicate-lists-dnr.md) | olizilla | How to stop your node from replicating content due to take down notices or other reasons | [Video](https://youtu.be/XpwmB-44zPI) | +| [Fast IPNS 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/26-fast-ipns.md) | hugomrdias | How to increase the IPNS resolution speed | Moved to Lightning Talk | +| [IPFS Education and Documentation](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/30-ipfs-education-and-documentation.md) | meiqimichelle | What are the biggest improvements we can make to documentation for IPFS? | [Video](https://youtu.be/SlD3eL8js80) | +| [Mounting an IPFS filesystem 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/31-mounting-an-ipfs-filesystem.md) | djdv | Is there a way to efficiently mount IPFS as a filesystem? FUSE support is [here](https://github.com/ipfs/go-ipfs/blob/v0.4.21-rc3/docs/fuse.md). What are current limitations, challenges? What needs to happen to enable mounting of MFS? [WebDAV](https://github.com/ipfs/in-web-browsers/issues/146) is often used in network storage drives, and mainstream operating systems come with native support for mounting WebDAV as drives. It could supersede Writable Gateway and create a surface for interop with apps that provide built-in client-side support for WebDAV. | [Video](https://youtu.be/lucNzPhIDUU) | +| [IPNS link rot](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/34-ipns-link-rot.md) | alanshaw | Right now, IPNS needs to be refreshed by original publisher every day, otherwise it stops working. There should be a way to pin IPNS address so that other peers keep refreshing the last valid entry when original node goes offline, keeping the last version alive even if the original publisher disappears forever. | [Video](https://youtu.be/7urDcbLnpTc) | +| [Deterministic CIDs! Reproducible File Imports! Verifable HTTP Gateways!](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/35-deterministic-cids-reproducible-file-imports-verifiable-http-gateways.md) | lidel | How to deterministically get the same CID for the same data, even if default parameters of `ipfs.add` change? How to validate data read via HTTP Gateway without running full IPFS node? | [Video](https://youtu.be/w5vPvccOstg) | +| [IPFS in Web Workers](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/37-ipfs-in-web-workers.md) | gozala | Where we are, limitations, known problems. | [Video](https://youtu.be/SA8dl98X3Yk) | +| [UnixFS v2 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/38-unixfs-v2.md) | mikeal | [Latest spec iteration](https://github.com/ipfs/unixfs-v2/pull/27) and [implementation work](https://github.com/ipld/js-unixfsv2/pull/3) | [Video](https://youtu.be/Sy8IUtPJH3w) | +| [Using CRDTs to build real-time collaborative DApps](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/39-using-crdts-to-build-real-time-collaborative-dapps.md) | jimpick | What are the hurdles to using CRDTs in dapps with IPFS? How can we make peer-base easier to understand and use? | [Video](https://youtu.be/j_vdp3Rzms0) | +| [Better NAT traversal so that Relay servers are a last (not first) resort](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/40-better-nat-traversal-so-that-relay-servers-are-a-last-not-first-resort.md) | raulk | The current cost of running relay servers for IPFS is unsustainable. We need to implement better NAT hole punching mechanisms in libp2p to reduce the usage of relay servers by NAT’d hosts. TCP hole punching has a success rate of ~60%, so we should be preferentially hole punching. TCP simultaneous open is one example. STUN servers are another example; yet another is making every non-NATed host in a libp2p network a relay node. | [Video](https://youtu.be/Q-uRlotUzcc) | +| [libp2p message orientation](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/42-libp2p-message-orientation.md) | bigs | libp2p is currently stream-oriented. We want to enable message-oriented communication (e.g. UDP). Help us envision what the APIs would look like, and how an application could simultaneously hold stream-based and message-based conversations with peers in the world via libp2p. | Did not Present | +| [IPFS metrics and usage statistics 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/43-ipfs-metrics-and-usage-statistics.md) | lanzafame | How to collect telemetry like application metrics and usage in a distributed world | [Video](https://youtu.be/pp817bm3wek) | +| [Decentralized Data Processing](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/44-decentralized-data-processing.md) | alari | How could we process large amounts of data in permissionless networks? Use cases, verifiable state transitions, aggregations and bulk updates, etc. | [Video](https://youtu.be/DmKE79pwkps) | +| [Building Dynamic P2P Applications](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/45-building-dynamic-p2p-applications.md) | jkarni | IPFS and its associated technologies are mostly static. Radicle is an attempt to build a dynamic P2P web on top of IPFS; one which can host applications with the same abilities of the centralized servers of today to receive inputs from various people or sources. | [Video](https://youtu.be/yboQAMwvtVs) | +| [Better file chunking 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/46-better-file-chunking.md) | mib-kd743naq | Within the IPFS stack/ecosystem, just as within computing as a whole, an uncompressed stream of untagged octets is a fundamental unit of exchange. As a general-purpose data storage system IPFS needs to handle an unbounded variety of content represented by such streams. Handling the maximum amount of this variety efficiently ( ideally by default ) would likely have an outsized impact on the future adoption of IPFS as a long-term data interchange medium/format. | [Video](https://youtu.be/_cw4jx2jJrY) | +| [Dynamic DAG traversal](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/47-dynamic-dag-traversal.md) | maparent | Extend IPLD to cross between immutable and mutable references | [Video](https://youtu.be/W3Kz3QSVRlY) | +| [Design Patterns for DWeb Apps](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/48-design-patterns-for-dweb-apps.md) | leshokunin | Most IPFS apps have UX issues. We will pick a feature of an existing app, and improve its UX by simplifying how to interact with it, how it works. Textile.io lowered the permission and roles system from ~15 methods to 2 this way! | [Video](https://youtu.be/w07JvGVeHpM) | +| [IPFS and Guix 📦](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/49-ipfs-and-guix.md) | ambrevar | Exploration into existing or potential issues with integrating IPFS with Guix | [Video](https://youtu.be/ZvJYYZ1aEDU) | + +## There are more to come, keep posted! + +More content from IPFS Camp is being salvaged and transcoded. + +If you are interested in receiving an update when the next batch of videos are available, you can do this in one of the following ways: + +- Watch and Star the [ipfs/camp repo](https://github.com/ipfs/camp/blob/master/README.md), where all the content will live, in addition to other other locations (IPFS 😄) shielded from the Global Electromagnetic Fire Disaster of 2027 +- Subscribe to the [RSS feed of this blog](https://blog.ipfs.io/index.xml). +- Subscribe to the [IPFS Weekly Newsletter](https://tinyletter.com/ipfsnewsletter) if you are interested in general IPFS updates. +- Subscribe to the [IPFS Events Newsletter](https://protocol.us20.list-manage.com/subscribe?u=62e1eb7f68461b5a2ab5c52e6&id=f3fed9af1d) if you are interested in IPFS events. diff --git a/src/_blog/055-js-libp2p-0.26/README.md b/src/_blog/055-js-libp2p-0.26/README.md new file mode 100644 index 00000000..f7144ad4 --- /dev/null +++ b/src/_blog/055-js-libp2p-0.26/README.md @@ -0,0 +1,135 @@ +--- +date: 2019-08-07 +url: /2019-08-07-js-libp2p-0-26/ +title: js-libp2p 0.26.0 released +description: +author: Jacob Heun +header_image: 055-js-libp2p-0.26.png +--- + +> Gossipsub support and Promisify API + +# 🔦 Highlights + +## 🗣 Gossipsub + +Thanks to the awesome work of the [ChainSafe](https://github.com/ChainSafe) team, [Gossipsub](https://github.com/ChainSafe/gossipsub-js) is here! Gossipsub is a much more efficient pubsub router than Floodsub. Intead of broadcasting to all of its peers, it broadcasts to a controlled subset of peers. To learn more about how Gossipsub works and where it differs from Floodsub, check out the [Spec](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub). + +If you are using Pubsub you can now switch to using Gossipsub instead of Floodsub. Have old peers you need to flood stuff to? Don't worry, Gossipsub will automatically fallback to Floodsub for peers that don't support it. See the API Changes section below for how to migrate your config over to using Gossipsub. + +## 🚉 Promisify + +As we migrate to [async/await](https://github.com/ipfs/js-ipfs/issues/1670) we are promisifying the Libp2p public methods. Several lower level libraries are currently leveraging libp2p for testing. Their transition to full async/await will be greatly helped by promisifying the libp2p API. Once the async/await changes are propagated up, we will remove Promisify in a future update, along with callback support, as libp2p will have full async/await support at that time. See the API Changes below to check out the Breaking Changes. + +# 🏗 API Changes + +## BREAKING CHANGES + +### Configuration + +#### Switch Options + +Configuration for `libp2p-switch` has changed. `blacklistTTL` and `blackListAttempts` have been changed to `denyTTL` and `denyAttempts` respectively. You can set these as follows: + +```js +const libp2p = new Libp2p({ + switch: { + denyTTL: 120e3, + denyAttempts: 5, + } + ... +}) +``` + +#### Pubsub + +**Subscribe**: To comply with the [pubsub interface](https://github.com/ipfs/interface-js-ipfs-core/blob/v0.109.1/SPEC/PUBSUB.md), the order of params for `libp2p.pubsub.subscribe` have been reordered. They were previously `topic, options, handler, callback`, and are now `topic, handler, options, callback`. If your implementation does not use `options` you should be able to ignore this change. + +**Config**: Pubsub was previously enabled via the `EXPERIMENTAL` config. You must now specify your pubsub implementation (Gossipsub or Floodsub), and enable/disable it via it's own configuration. Setting pubsub will automatically enable it. You can disable it by explicitly setting enabled to false in the configuration . + +```js +const libp2p = new Libp2p({ + modules: { + pubsub: require('libp2p-gossipsub'), + ... + }, + config: { + pubsub: { + enabled: true + }, + ... + } + ... +}) +``` + +## Promisify + +All libp2p public methods have been promisified, so callbacks can be omitted in favor of promise based usage, including async/await. For example, `start` can be used as: + +```js +libp2p.start(onStart) +// or +await libp2p.start() +``` + +## Gossipsub + +Gossipsub is integrated into the existing [`libp2p.pubsub` API](https://github.com/ipfs/interface-js-ipfs-core/blob/v0.109.1/SPEC/PUBSUB.md). Once Gossipsub has been supplied as your pubsub implementation, you will be able to use it just as Floodsub was previously used. See the section above for pubsub configuration changes. + +# ❤️ Huge thank you to everyone that made this release possible + +In alphabetical order, here are the 38 humans that made 429 contributions to this release: + +- [Abraham Elmahrek](https://github.com/generalpiston) (1 PR, 1 issue, 2 comments) +- [Alan Shaw](https://github.com/alanshaw) (1 PR, 6 reviews, 5 comments) +- [Alex Potsides](https://github.com/achingbrain) (1 PR, 1 review) +- [Cayman](https://github.com/wemeetagain) (4 PRs, 2 issues, 26 reviews, 10 comments) +- [Cody Eilar](https://github.com/AcidLeroy) (2 issues, 4 comments) +- [David Dias](https://github.com/daviddias) (6 issues, 8 comments) +- [dirkmc](https://github.com/dirkmc) (4 reviews, 1 comment) +- [Filip Š](https://github.com/filips123) (1 PR, 1 comment) +- [Gregory Markou](https://github.com/GregTheGreek) (4 PRs, 18 reviews, 17 comments) +- [hapsody](https://github.com/hapsody) (1 comment) +- [Henrique Dias](https://github.com/hacdias) (1 issue, 1 comment) +- [Hugo Dias](https://github.com/hugomrdias) (1 review) +- [Isaac Jacobs](https://github.com/didlie) (1 issue, 7 comments) +- [Jacob Heun](https://github.com/jacobheun) (14 PRs, 3 issues, 31 reviews, 37 comments) +- [Jakub](https://github.com/jakubgs) (1 PR) +- [John_Suu](https://github.com/suutaku) (2 comments) +- [Jorropo](https://github.com/Jorropo) (2 PRs) +- [Justin Maier](https://github.com/JustMaier) (1 comment) +- [kumavis](https://github.com/kumavis) (1 review) +- [laubsauger](https://github.com/laubsauger) (1 issue) +- [Maciej Krüger](https://github.com/mkg20001) (2 PRs, 1 issue, 2 reviews, 20 comments) +- [Marcin Rataj](https://github.com/lidel) (1 review) +- [Marin Petrunić](https://github.com/mpetrunic) (1 issue, 5 reviews, 1 comment) +- [Michael FIG](https://github.com/michaelfig) (1 PR) +- [Michiel De Backker](https://github.com/backkem) (1 comment) +- [Mikeal Rogers](https://github.com/mikeal) (1 comment) +- [Mikerah](https://github.com/Mikerah) (2 PRs, 7 reviews, 18 comments) +- [Nate Foss](https://github.com/npfoss) (1 PR, 1 issue, 2 comments) +- [ohager](https://github.com/ohager) (2 comments) +- [Pat White](https://github.com/patwhite) (1 comment) +- [Qmstream](https://github.com/Qmstream) (2 PRs, 2 comments) +- [Raúl Kripalani](https://github.com/raulk) (1 comment) +- [Richard Schneider](https://github.com/richardschneider) (1 comment) +- [Saquib ul hassan](https://github.com/IamSaquib) (1 issue, 1 comment) +- [Steven Allen](https://github.com/Stebalien) (1 PR) +- [Tapasweni Pathak](https://github.com/tapaswenipathak) (1 PR, 1 comment) +- [Vasco Santos](https://github.com/vasco-santos) (17 PRs, 4 issues, 59 reviews, 36 comments) +- [zthomas](https://github.com/zthomas) (1 issue) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [libp2p repo](https://github.com/libp2p/js-libp2p/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.libp2p.io/ and help users finding their answers. +- Join the [⚡️Libp2p Team Sync 🙌🏽 ](https://github.com/libp2p/team-mgmt/issues/16) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about libp2p, how it works and what you can do with it is at [discuss.libp2p.io](https://discuss.libp2p.io). We are also available at the #libp2p channel on Freenode. diff --git a/src/_blog/056-pubsub-in-the-browser/README.md b/src/_blog/056-pubsub-in-the-browser/README.md new file mode 100644 index 00000000..126999f0 --- /dev/null +++ b/src/_blog/056-pubsub-in-the-browser/README.md @@ -0,0 +1,29 @@ +--- +date: 2019-08-29 +url: /2019-08-29-pubsub-in-the-browser/ +title: PubSub in the browser with the JS IPFS HTTP API client +description: +author: Alan Shaw +--- + +> EXCELLENT NEWS! You can now pubsub with the JS IPFS HTTP API client in the BROWSER! + +Due to [boring technical reasons](https://github.com/ipfs/js-ipfs-http-client/issues/518) it’s previously not been possible to support [pubsub](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) over the [HTTP API](https://docs.ipfs.io/reference/api/http/) in the browser. Now that the [fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) supports cancelation, and has done so for a while, pubsub support has arrived! Hooray \o/ + +There’s also a brand new example application that you can play with showing how to use pubsub in the browser: + +[github.com/ipfs/js-ipfs-http-client/examples/browser-pubsub](https://github.com/ipfs/js-ipfs-http-client/tree/master/examples/browser-pubsub) + +![Screenshot of PubSub in the browser example app](/056-pubsub-in-the-browser/demo-screenshot.png) + +This was made possible by the experimentation done in a [“lite” http client](https://github.com/ipfs-shipyard/js-ipfs-http-client-lite) I was working on, which was originally meant to be just really really small (it’s currently ~13kb gzipped vs ~200kb for the regular client). To make it small we needed to switch to using the fetch API but I soon realized that this opened up a bunch of other opportunities, like enabling pubsub. We also get easily cancelable requests, request timeouts, custom fetch implementations and a switch to async/await and async iterators. + +I originally demoed it in the lite client here: + +[![Watch video](/056-pubsub-in-the-browser/ipfs-pubsub-in-browser-video.jpg)](https://www.youtube.com/watch?v=NZb6ybkAYWs) + +The lite client has been a great proving ground for ensuring the “hard parts” of the API are now possible using browser native APIs. I’ll be applying more of the learnings from there to the regular http client in the near future, which should hopefully result in a smaller bundle size, as well as more cool new features like this one. + +Version 34 of `ipfs-http-client` is out now! https://www.npmjs.com/package/ipfs-http-client/v/34.0.0 + +Thanks for reading 😘 diff --git a/src/_blog/057-ipfs-camp-course-videos/README.md b/src/_blog/057-ipfs-camp-course-videos/README.md new file mode 100644 index 00000000..7b119b0e --- /dev/null +++ b/src/_blog/057-ipfs-camp-course-videos/README.md @@ -0,0 +1,81 @@ +--- +date: 2019-09-18 +url: /2019-09-18-ipfs-camp-course-videos/ +title: IPFS Camp course videos released 🍿 +description: +author: Teri Chadbourne +--- + +If you've been following the updates from IPFS Camp here in the blog, you've likely already explored the videos from our [lightning talks](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks), [deep dives](https://github.com/ipfs/camp#-deep-dives), and [poster projects](https://github.com/ipfs/camp#-poster-projects). **Today we're excited to announce the release of the videos from our [core and elective courses](https://github.com/ipfs/camp#-core--elective-courses)**! + +## Core Courses + +Core courses at IPFS Camp served as the starting point to get all of us on the same page with a shared understanding of some the most essential concepts underlying IPFS. Elective courses covered even more ground, branching out into bleeding-edge DWeb topics, exciting use cases, and community endeavors. The format for these 75-minute courses varied, so you'll find app-building tutorials and interactive group discussions alongside cleverly diagrammed deep-dives and interpretive skits. There's something for everyone! + +**Check out the [complete course listings](https://github.com/ipfs/camp#-core--elective-courses) in the IPFS Camp repo for links to videos, slide decks, and other workshop materials for each session.** + +Whether you're new to IPFS or looking for a deeper understanding of core concepts, we highly recommend these two core courses as your starting point. Both are easily consumable in video form -- no coding required -- and offer plenty of "aha" moments: + +### Understanding How IPFS Deals with Files + +This core course covers the basics of how IPFS deals with files, including key concepts like immutability, content addressing, hashing, the anatomy of CIDs, what the heck a Merkle DAG is, and how chunk size affects file imports. It also covers the joys and pitfalls of the Mutable File System (MFS), the layer of abstraction in IPFS that lets you work with immutable files and directories as if you were using a tradiitional name-based file system. As with all great talks, this one is enhanced by images of adorable poodles. 🐩 (12 / 10, would recommend.) + +This workshop introduced a few awesome visualization and learning tools that you can try out at home: + +- Explore the [**ProtoSchool tutorial on the Mutable File System (MFS)**](https://proto.school/#/mutable-file-system) for coding challenges designed to familiarize you with its API +- Paste a Content Identifier (CID) into the [**CID Inspector**](https://cid.ipfs.io/) to break down its anatomy +- Drag a file into the [**DAG Builder**](https://dag.ipfs.io/) and adjust chunk size, DAG layouts, etc. to see how it affects the Merkle DAG + +Watch the recording below or check out the [slides](https://github.com/ipfs/camp/blob/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_A/IPFS_Camp_Core_Course_A_Slides.pdf)! + +[![Video: Understanding How IPFS Deals with Files](./core-a-thumbnail.png)](https://youtu.be/Z5zNPwMDYGg) + +_Video: [Understanding How IPFS Deals with Files](https://youtu.be/Z5zNPwMDYGg)_ + +### The Lifecycle of Data in DWeb + +This course covers all the stuff that happens _after_ you add a file to IPFS, highlighting the intricacies of how peers interact with each other to provide, get, pin, and delete blocks of data. It explains the Distributed Hash Table (DHT) that helps us track which peers are storing which CIDs, as well as how Bitswap requests and sends blocks while verifying their data. No poodle pics here, but the live Bitswap dance using bean bags to model the block-sharing process is not to be missed! 🤹‍♂️ + +Watch the video below or check out the slides (available on [Google Slides with speaker notes](https://docs.google.com/presentation/d/1UOX-a1lCxi-LOyEOe9VEFRcxg_j93Xkywwa4Y95TJaw/edit?usp=sharing) or as a [PDF](https://github.com/ipfs/camp/blob/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_D/IPFS_Camp_Core_Course_D_Slides.pdf))! + +[![Video: The Lifecycle of Data in DWeb](./core-d-thumbnail.png)](https://youtu.be/fLUq0RkiTBA) + +_Video: [The Lifecycle of Data in DWeb](https://youtu.be/fLUq0RkiTBA)_ + +### And more! + +There are plenty more core and elective courses to explore in the latest batch of videos. Check out our full [course playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtSsHMhjeWpfOzr8tonPaePu) or jump right to the video that looks most interesting: + +**Core Courses** + +- [**Understanding how IPFS Deals with Files**](https://youtu.be/Z5zNPwMDYGg) by [@alanshaw](https://github.com/alanshaw), [@mikeal](https://github.com/mikeal), and [@stebalien](https://github.com/stebalien) +- [**Solving Distributed Networking Problems with Libp2p**](https://youtu.be/Q4IH5rWEO-E) by [@jacobheun](https://github.com/jacobheun), [@bigs](https://github.com/bigs), and [@achingbrain](https://github.com/achingbrain) +- [**Developing Apps with the IPFS API**](https://youtu.be/6EHBOnFQJN4) by [@lidel](https://github.com/lidel), [@hugomrdias](https://github.com/hugomrdias), and [@jimpick](https://github.com/jimpick) +- [**The Lifecycle of Data in DWeb**](https://youtu.be/fLUq0RkiTBA) by [@olizilla](https://github.com/olizilla), [@meiqimichelle](https://github.com/meiqimichelle) and [@kishansagathiya](https://github.com/kishansagathiya) + +**Elective Courses** + +- [**Identity on the DWeb using IDM and Nomios**](https://youtu.be/EsLqjFEN-MM) by [@satazor](https://github.com/satazor), [@paulobmarcos](https://github.com/paulobmarcos), and [@joaosantos15](https://github.com/joaosantos15) +- [**Managing Pinsets with IPFS Cluster**](https://youtu.be/wmxaVrAFfeE) by [@hsanjuan](https://github.com/hsanjuan), [@lanzafame](https://github.com/lanzafame), and [@meiqimichelle](https://github.com/meiqimichelle) +- [**Cat Roulette! Building a P2P Laser Catbot**](https://youtu.be/kVzHE4MRPOM) by [@gorhgorh](https://github.com/gorhgorh) +- [**Deploying IPFS Infrastructure**](https://youtu.be/PD0e89b4NBk) by [@obo20](https://github.com/obo20) and [@mburns](https://github.com/mburns) +- [**Starting, Growing, and Stewarding your IPFS Community**](https://youtu.be/crTa1j3FRac) by [@nukemandan](https://github.com/nukemandan), [@kk3wong](https://github.com/kk3wong), and [@stefanhans](https://github.com/stefanhans) +- [**Building DApps with Textile, the iCloud for the DWeb**](https://youtu.be/4r7_lOyv4W8) by [@balupton](https://github.com/balupton), [@carsonfarmer](https://github.com/carsonfarmer), and [@andrewxhill](https://github.com/andrewxhill) +- [**Managing Datasets with QRI**](https://youtu.be/ZN1mPBECsvA) by [@b5](https://github.com/b5) + +Each of these courses has its own folder in the IPFS Camp repo, complete with course descriptions, slide decks, videos, code walk-throughs, or other materials provided by our awesome instructors. Check out the [complete course listings](https://github.com/ipfs/camp#-core--elective-courses) for all the details. + +## Explore related content in ProtoSchool + +If you enjoy hands-on learning, set down that popcorn for a minute and try out a [ProtoSchool tutorial](https://proto.school/#/tutorials)! Or better yet, find a [chapter near you](https://proto.school/#/chapters) and attend a live workshop. (Want to get really meta? Today's batch of videos includes an [interactive workshop on leading interactive workshops](https://github.com/ipfs/camp/tree/master/CORE_AND_ELECTIVE_COURSES/ELECTIVE_COURSE_F)!) + +The ProtoSchool curriculum is growing, and we're excited to explore all of the fabulous IPFS Camp content to find gems to add to our tutorials. Watch [this issue](https://github.com/ProtoSchool/protoschool.github.io/issues/261) to track those content developments, or learn more about [contributing to ProtoSchool](https://proto.school/#/contribute) as a tutorial author or chapter leader. + +## But wait, that's not all! + +There's even more great content from IPFS Camp content coming your way, including recordings of keynotes and interviews. If you're interested in receiving an update when the next batch of videos are available, try out one of these strategies: + +- Watch and star the [ipfs/camp repo](https://github.com/ipfs/camp/blob/master/README.md), where all the content will live. +- Subscribe to the [RSS feed of this blog](https://blog.ipfs.io/index.xml). +- Subscribe to the [IPFS Weekly Newsletter](https://tinyletter.com/ipfsnewsletter) if you're interested in general IPFS updates. +- Subscribe to the [IPFS Events Newsletter](https://protocol.us20.list-manage.com/subscribe?u=62e1eb7f68461b5a2ab5c52e6&id=f3fed9af1d) if you're interested in IPFS events. diff --git a/src/_blog/057-ipfs-camp-course-videos/core-a-thumbnail.png b/src/_blog/057-ipfs-camp-course-videos/core-a-thumbnail.png new file mode 100644 index 00000000..64c9a9d1 Binary files /dev/null and b/src/_blog/057-ipfs-camp-course-videos/core-a-thumbnail.png differ diff --git a/src/_blog/057-ipfs-camp-course-videos/core-d-thumbnail.png b/src/_blog/057-ipfs-camp-course-videos/core-d-thumbnail.png new file mode 100644 index 00000000..d28a95d1 Binary files /dev/null and b/src/_blog/057-ipfs-camp-course-videos/core-d-thumbnail.png differ diff --git a/src/_blog/058-ipfs-desktop-0-9/README.md b/src/_blog/058-ipfs-desktop-0-9/README.md new file mode 100644 index 00000000..eb476694 --- /dev/null +++ b/src/_blog/058-ipfs-desktop-0-9/README.md @@ -0,0 +1,66 @@ +--- +date: 2019-09-19 +url: /2019-09-19-ipfs-desktop-0-9/ +title: IPFS Desktop 0.9 released +description: +author: Henrique Dias +--- + +IPFS Desktop has come a long way to reach its current form. We are here to celebrate and announce the [release of 0.9.0](https://github.com/ipfs-shipyard/ipfs-desktop/releases) and share the story of this application and, of course, all the exciting new features. + +## Once upon a time... + +Back in May 2015, Juan Benet pushed the first so-called "Initial Commit" to start a project at the time named "ipfs-electron". The purpose of the app was quite simple and that hasn't changed much with time: providing a long running daemon, alongside with a GUI for managing it. + +![Evolution of IPFS Desktop](/058-ipfs-desktop-0-9/evolution.jpg) + +Regarding the application's name, it went from "ipfs-electron" to "IPFS Native Application", then to ["IPFS Station"](https://github.com/ipfs-shipyard/ipfs-desktop/commit/5a123c2c9ed0fe3ec86aad336417ddbefdea9243), it being a much fancier name. However, we [changed it again](https://github.com/ipfs-shipyard/ipfs-desktop/pull/574) to "IPFS Desktop" and that's where we are right now! It's a result of an uniformization between our applications names and the most self-explanatory option we had. + +## Where we are today: IPFS Desktop 0.9.0 + +The newest version of IPFS Desktop, 0.9.2 - yes, we already released two patch versions! - brings more stability and some new experimental features. Although it is not a completely revamped application, such as what happened with 0.7.0, I believe this version deserves an overview of the current (and new) features and plans for the future. + +### Browse the wild... + +With the [recent update to the Web UI](https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v2.5.0), we are now capable of navigating through the whole IPFS system. Previously, you could only access your 'Files' (the contents of the [Mutable File System](https://proto.school/#/mutable-file-system)). Now, you can navigate not only to any `/ipfs/` or `/ipns/` path, but also any content [pinned](https://docs.ipfs.io/guides/concepts/pinning/) to your IPFS node! + +![Browsing /ipns/ipns.io](/058-ipfs-desktop-0-9/browse-wild.jpg) + +### Use npm on ipfs + +In addition, we are introducing a new experiments section on the 'Settings' page which will allow you to enable new experimental features as they come in. To celebrate this new section, we are adding [npm on ipfs](https://github.com/ipfs-shipyard/npm-on-ipfs) to it! This is a project that allows you to use the `ipfs-npm` and `npm-ipfs` commands to install your Node.js modules through the IPFS network! + +![Experiments section](/058-ipfs-desktop-0-9/npm-ipfs.jpg) + +**Please note** that this feature is intended for those who have [Node.js](https://nodejs.org) installed on their system. Moreover, the activation will only work if your setup does not require additional permissions for executing `npm install -g`. + +### Add `ipfs` command line tools to your system + +Adding `ipfs` command line tools to your system was actually introduced in 0.8.0, but it's always worth noting that you are just a click away of having the `ipfs` command available from your command line! This way, you don't have to worry about configuring your `PATH` variable or doing other confusing stuff to start using all IPFS capabilities. Just go to Settings and enable "IPFS command line tools"! + +![IPFS command line tools](/058-ipfs-desktop-0-9/ipfs-cmd.jpg) + +### And more... + +Other notable features from previous releases include: + +- **Handle `ipfs://`, `ipns://` and `dweb:` links**. If you have IPFS Desktop installed and you click on [ipns://ipfs.io](ipns://ipfs.io) in your browser or any other application, that request will go through be redirected to your own gateway via the app, or to the public gateway if yours is not online. +- **Easily add files to IPFS**. Just drag and drop them to the application icon, either on the menubar for macOS users, or the shortcut icon for Windows users. +- **Add screenshots to IPFS**. You can click on 'Take Screenshot' on the app's menu or enable the global shortcut on "Settings". After taking a screenshot, a shareable link will be copied to your clipboard! +- **Download any CID content**. If you would like to download the contents of some CID or IPFS/IPNS path, you can copy it, go to the dropdown menu and select 'Download Hash'. Then, just pick wherever you want to write those files to! This is also available through a global shortcut. + +You can also take a look at this video: + + + +# Let's talk about future... + +We are now working on the [specification](https://github.com/ipfs-shipyard/cohosting/pull/2) of a new feature called [cohosting](https://github.com/ipfs-shipyard/cohosting), i.e., having a local copy of some website on your machine. You can do that just because you would like to keep a website available to others or because you want to read it offline later. Then, IPFS Companion or IPFS Desktop would re-check every few hours to make sure the website is up to date. It would be interesting to hear your thoughts! + +For the future of IPFS Desktop, we are now focusing much more on maintenance, bug fixing and improving the test suite to catch bugs before they go into production. Since this an Electron app, it is a bit harder to test than some other types of apps. If you're interested in knowing more or help us build tests, please read the issue [#1121](https://github.com/ipfs-shipyard/ipfs-desktop/issues/1121). + +Is there any feature you would like to see on IPFS Desktop? If so, please [create a feature request](https://github.com/ipfs-shipyard/ipfs-desktop/issues/new)! We will certainly appreciate it. + +# Don't forget... + +Don't forget to [install IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop/releases) today and be part of the decentralized Internet! We also recommend you to install our browser extension, [IPFS Companion](https://github.com/ipfs-shipyard/ipfs-companion/#install), which gives your browser superpowers. Both of these applications work well together. While IPFS Desktop makes your OS InterPlanetary, IPFS Companion connects to your node on your browser, enabling further integration on your Internet interactions to the IPFS world. diff --git a/src/_blog/059-ipfs-camp-sci-fi-fair-videos/README.md b/src/_blog/059-ipfs-camp-sci-fi-fair-videos/README.md new file mode 100644 index 00000000..504f53dc --- /dev/null +++ b/src/_blog/059-ipfs-camp-sci-fi-fair-videos/README.md @@ -0,0 +1,86 @@ +--- +date: 2019-10-03 +url: /2019-10-03-ipfs-camp-sci-fi-fair-videos/ +title: IPFS Camp Sci-Fi videos 🧬 +description: +author: Arkadiy Kukarkin +--- + +
+ +
+_Welcome to the Sci-Fi Fair!_ + +Hot on the heels of IPFS Camp videos covering [lightning talks](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks), [deep dives](https://github.com/ipfs/camp#-deep-dives), [poster projects](https://github.com/ipfs/camp#-poster-projects) and [core + elective courses](https://github.com/ipfs/camp#-core--elective-courses) come the **interviews from our [sci-fi fair](https://github.com/ipfs/camp#-sci-fi-fair)**. + +## The Sci-Fi Fair + +In keeping with the fun and exploratory spirit of the camp, we put a twist on the usual conference demo area with our Sci-Fi Fair. We challenged our campers to bring their most surprising, experimental, interactive, scientific projects: in short, a vision of what the IPFS universe could look like in a future, or slightly askew, timeline. + +See the complete-ish (we had quite a few guerilla participants!) [list of Fair projects](https://github.com/ipfs/camp/blob/master/SCI-FI_FAIR) for more details, or skip to the [playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTWCyJcTgLFhsg8Bi2dFPCo) if you're impatient. + +### Textile + +
+ +
+_The Textile team demonstrates their interactive wares_ + +Long-time IPFS community members [Textile](https://textile.io) brought their crowd favorite p2p photobooth, as well as a game of cryptographically verified [Interplanetary Tag](https://medium.com/textileio/building-peer-to-peer-games-on-ipfs-a-look-at-interplanetary-tag-52d081ee1d32) (or arguably Interplanetary Assassin) + +### RPi Cluster + +
+ +
+_Hector explains the topology of the RPi cluster (feat. many blinkenlights)_ + +Hector and the rest of the [IPFS Cluster](https://cluster.ipfs.io) team came through with a project high in fun, fabric, and blinking lights: the Raspberry Pi IPFS Cluster. Six tiny but mighty (and lovingly upholstered) nodes tirelessly worked together to pin whatever CIDs were thrown at them and reported their pinset load through an ingenious hardware display. Not pictured: [@cluster-labs'](https://github.com/cluster-labs) [Horizon UI for IPFS Cluster](https://medium.com/towardsblockchain/we-made-a-dashboard-for-ipfs-clusters-and-now-we-want-you-to-check-it-out-a87234629908) giving fair attendees even more fine-grained insights into the pinset. + +![@achingbrain's npm-in-a-box](/059-ipfs-camp-sci-fi-fair-videos/npm-in-box.jpg) +_[Alex Potsides’s](https://github.com/achingbrain) npm-in-a-box project_ + +**BONUS:** If you like big IPFS nodes running on small computers (and/or "The IT Crowd"), you may also enjoy Alex's ["npm in a box"](https://github.com/ipfs-shipyard/npm-on-ipfs), which packs the entire NPM package repository on a very portable (and pretty sleek looking) RPi based IPFS node with a BIG archival grade hard drive. Take this with you on your field trip and your team will never see an npm timeout ever again. + +### MetaMask's Network Visualizer + +
+ +
+_[kumavis](https://github.com/kumavis) shows off the live network visualizer_ + +The [MetaMask](https://metamask.io) crew brought a tool that proved invaluable in their network connectivity diagnostics: a DHT visualizer. Following some wireless network trouble (a real-world scenario to be sure), we were treated to some beautiful visualizations of network connectivity. + +### And More + +These are just some of the projects that made it to the Fair: head over to the [offical Fair playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTWCyJcTgLFhsg8Bi2dFPCo) to catch the rest of the videos, as well as the full cuts of the interviews above. Don't miss [Berty's Bluetooth Low Energy p2p transport](https://www.youtube.com/watch?v=B3fUHtdVBn0), [Brave's one-click in-browser IPFS](https://www.youtube.com/watch?v=JTAMeBrul6k), and more! + +### Lest We Forget + +Our tireless camera crew could only be in one place at a time (we're working on it), which has left some of our favorite projects sadly underdocumented in the video department. Here are some stills that fill in the gaps: + +![@MarneeDear's FARS + @gorhgorh's minitel IPFS](/059-ipfs-camp-sci-fi-fair-videos/marnee-minitel.jpg) +_[Marnee Dearman](https://github.com/MarneeDear)'s IPFS-over-Ham Radio FARS project and Jérôme's IPFS Chat on a French Minitel terminal_ + +![@vasa-develop's 3D collaboration](/059-ipfs-camp-sci-fi-fair-videos/vasa.jpg) +_[Vasa](https://github.com/vasa-develop)'s CRDT-based collaborative 3D modeling interface_ + +![@gorhgorh's catbot](/059-ipfs-camp-sci-fi-fair-videos/catbot.jpg) +_[Jérôme Loï](https://github.com/goth goth)'s libp2p-powered Lazer Catbot (unfortunately no cats were on premises)_ + +![the elusive @rklaehn](/059-ipfs-camp-sci-fi-fair-videos/actyx.jpg) +_Actyx's [Rüdiger](https://github.com/rklaehn) has somehow managed to avoid ALL photos at the fair, so here's a shot of him demoing their amazing industrial automation system from the lightning talks_ + +![@aschmahmann's Fast IPNS](/059-ipfs-camp-sci-fi-fair-videos/ipns.jpg) +_Last but not least, [Adin](https://github.com/aschmahmann)'s "Fast IPNS" demo (it was VERY FAST!)_ + +## Keep Exploring! + +Huge thanks to our SciFi Fair participants for making IPFS Camp so out-of-this-world! If you're excited by any of these projects, please do get involved by checking out the [sci-fi fair repo](https://github.com/ipfs/camp#-sci-fi-fair) or reaching out to presenters directly about their work. + +There's still more great content from IPFS Camp content coming your way, including recordings of keynotes and interviews. If you're interested in receiving an update when the next batch of videos are available, try out one of these routes: + +- Watch and star the [ipfs/camp repo](https://github.com/ipfs/camp/blob/master/README.md), where all the content will live. +- Subscribe to the [RSS feed of this blog](https://blog.ipfs.io/index.xml). +- Subscribe to the [IPFS Weekly Newsletter](https://tinyletter.com/ipfsnewsletter) if you're interested in general IPFS updates. +- Subscribe to the [IPFS Events Newsletter](https://protocol.us20.list-manage.com/subscribe?u=62e1eb7f68461b5a2ab5c52e6&id=f3fed9af1d) if you're interested in IPFS events. diff --git a/src/_blog/060-ipfs-camp-keynotes-interviews/README.md b/src/_blog/060-ipfs-camp-keynotes-interviews/README.md new file mode 100644 index 00000000..8887ab3e --- /dev/null +++ b/src/_blog/060-ipfs-camp-keynotes-interviews/README.md @@ -0,0 +1,77 @@ +--- +date: 2019-10-14 +url: /2019-10-14-ipfs-camp-keynotes-interviews/ +title: IPFS Camp Keynotes and Interviews +description: +author: Molly Mackinlay +header_image: 060-ipfs-camp-keynotes-interviews.png +--- + +If you've been following the many IPFS Camp updates here in the blog, you've likely already explored the videos from our [lightning talks](https://github.com/ipfs/camp#%EF%B8%8F-lightning-talks), [deep dives](https://github.com/ipfs/camp#-deep-dives), [poster projects](https://github.com/ipfs/camp#-poster-projects), [core and elective courses](https://github.com/ipfs/camp#-core--elective-courses), and most recently [the SciFi Fair](https://github.com/ipfs/camp#-sci-fi-fair). Today, we're excited to share the **Keynotes** that brought us together on our first and last days of IPFS Camp, and the **Community Interviews** that highlight some of the amazing work being done by IPFS Camp attendees in the wider ecosystem. + +## Keynotes + +We kicked off our time together with a [Welcome from David Dias](https://www.youtube.com/watch?v=gUE5vhZoavQ&feature=youtu.be) recapping the IPFS Project Mission, our community, and how we defined success for IPFS Camp. Want to know our full agenda for the weekend? Check out this great overview of the [InterPlanetary Space Training Program](https://www.youtube.com/watch?v=AJvng8Z2W2I&feature=youtu.be) from David and all our content DRIs to index on everything IPFS Camp covered! + +### Why IPFS? -- Juan Benet + +[![Screen Shot 2019-09-30 at 6 19 45 PM](https://user-images.githubusercontent.com/618519/65927657-6e404b00-e3af-11e9-97f7-4ef38ed31de6.png)](https://www.youtube.com/watch?v=zE_WSLbqqvo&feature=youtu.be) + +Juan Benet, the original creator of IPFS, used [his keynote on "Why IPFS?"](https://www.youtube.com/watch?v=zE_WSLbqqvo&feature=youtu.be) to help attendees zoom out to the wider context around our moment in time, how technology is evolving, and how IPFS fits into the bigger picture. He described the history of the internet, some potential predictions about the future, and how IPFS can address some major problems in the web as it exists today (notably censorship, inefficiency, and poor offline usability). Persistence, innovation, and determination are required to ensure we continue making progress for the long haul! + +### IPFS Ecosystem Progress Report - Molly Mackinlay + +[![Screen Shot 2019-09-30 at 6 19 33 PM](https://user-images.githubusercontent.com/618519/65927659-700a0e80-e3af-11e9-9282-5c405c4ace1c.png)](https://www.youtube.com/watch?v=jpQnQbfhuBc&feature=youtu.be) + +Want to learn about how the IPFS Community and Ecosystem have been growing? [This video](https://www.youtube.com/watch?v=jpQnQbfhuBc&feature=youtu.be) from Molly Mackinlay, IPFS Project Lead, is a great overview of the scale, progress, and important milestones IPFS has achieved so far in 2019. IPFS-powered apps and tools now reach **millions of monthly end users**, and _hundreds of thousands of nodes_ participate in the public IPFS network daily! + +### Closing + +On our last day, we celebrated the amazing learning, presentations, and courses with a [Space Training Program Graduation & Awards Ceremony](https://www.youtube.com/watch?v=INVQPepMMMU&feature=youtu.be). Who got the award for best interactive skit? Watch this to see the team! + +To close, Juan set us back out through the airlock back toward Earth with his [IPFS Camp Sendoff](https://youtu.be/HDc7kEYHang), including a huge **THANK YOU** to everyone who made this camp possible - especially the tireless Protocol Labs Events Team who worked so hard to make this event a huge success! 🙏👏 + +### Recap + +[![Screen Shot 2019-10-02 at 7 44 37 PM](https://user-images.githubusercontent.com/618519/66095633-163f4b00-e54d-11e9-9963-bd68c23742d6.png)](https://youtu.be/cQJXnJDbXv4) + +Curious how everything fit together, or want to understand how the pieces of IPFS Camp became a greater whole? Check out [this overview from Molly](https://youtu.be/cQJXnJDbXv4) on how different components like the Poster Sessions & Deep Dives, SciFi Fair, Lightning Talks, and the Core & Elective Courses, wove together into a great community event. Many connections between different attendees and projects emerged from IPFS Camp too - spurring new collaborations and integrations. These great recaps from [Textile](https://medium.com/textileio/ipfs-camp-2019-the-highlights-and-takeaways-2b3cb4f42513), [Berty](https://berty.tech/blog/ipfs-camp/), and of course [the IPFS blog](https://blog.ipfs.io/2019-07-08-ipfs-camp-recap/) highlight a few! + +## Community Interviews + +IPFS Camp was all about sharing and forming connections between projects and individuals in the IPFS community, so we managed to get some sit-down time with a few wonderful community members to talk about their projects. Check out the videos below or skip right to the [playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTwwGv30nKdhr3GiIAnhbyE). + +### Netflix Containers - Edgar Lee + +[![Screen Shot 2019-09-30 at 5 23 20 PM](https://user-images.githubusercontent.com/618519/65925910-890ec180-e3a7-11e9-8eb9-b632a4d3c146.png)](https://youtu.be/wNfk05D887M) + +In [this interview](https://youtu.be/wNfk05D887M), we heard from Edgar about how he's exploring distributing container layers through IPFS, and how it's changing his workflow at Netflix. His work on [p2plab](https://github.com/Netflix/p2plab) is already helping benchmark (and improve!!) IPFS throughput in reproducible and quantifiable ways. + +### Audius - Hareesh Nagaraj + +[![Screen Shot 2019-09-30 at 5 32 15 PM](https://user-images.githubusercontent.com/618519/65926083-439ec400-e3a8-11e9-9b5b-c40f118e3258.png)](https://youtu.be/3pSV6ai6QUI) + +We [spoke](https://youtu.be/3pSV6ai6QUI) to Hareesh from [Audius](https://audius.co/), a decentralized music streaming platform, about how they're using IPFS as their primary file storing system. Check out their recent [launch blog post](https://techcrunch.com/2019/09/24/audius-music/) to learn more. + +### And More + +#### [Radicle & Monadic - Julian Arni](https://youtu.be/UCDHMKC8Seg) + +Julian told us about his peer-to-peer collaboration platform Radicle and the benefits of decentralized systems. + +#### [World Brain - Oliver Sauter](https://youtu.be/e1YfSa2_Drc) + +We talked to Oliver about their decentralized search tool, Memex, and their peer-to-peer search engine for personal and collective knowledge, Worldbrain.io. + +#### [IPFS Force - Steven Li](https://youtu.be/KsMqesFi4Ac) + +And on top of all that, Steven joined us from Shanghai City to discuss his work on IPFS-Force. + +## That's All, Folks + +This concludes our series of updates from IPFS Camp recap-ing the amazing presentations, demos, courses, and learnings we had together. We're so grateful to everyone for making this event so vibrant and creative - and are already looking forward to the **next** IPFS Camp. If you want more IPFS updates in the meantime, try these channels: + +- Watch and star the [ipfs/camp repo](https://github.com/ipfs/camp/blob/master/README.md), where all the content (and follow-ups) live. +- Subscribe to the [RSS feed of this blog](https://blog.ipfs.io/index.xml). +- Subscribe to the [IPFS Weekly Newsletter](https://tinyletter.com/ipfsnewsletter) if you're interested in general IPFS updates. +- Subscribe to the [IPFS Events Newsletter](https://protocol.us20.list-manage.com/subscribe?u=62e1eb7f68461b5a2ab5c52e6&id=f3fed9af1d) if you're interested in IPFS events. diff --git a/src/_blog/070-js-ipfs-0-38/README.md b/src/_blog/070-js-ipfs-0-38/README.md new file mode 100644 index 00000000..c05de3dc --- /dev/null +++ b/src/_blog/070-js-ipfs-0-38/README.md @@ -0,0 +1,131 @@ +--- +date: 2019-09-30 +url: /070-js-ipfs-0-38/ +title: js-ipfs 0.38.0 released +description: +author: Alex Potsides +header_image: js-ipfs-placeholder.png +--- + +> Garbage collection, gossipsub, IPNS support for ipfs resolve, oh my! + +```console +$ npm install -g ipfs +``` + +# 🔦 Highlights + +> Garbage collection, gossipsub & IPNS support for `ipfs resolve`! Also a new release process! + +## 🗑️ Garbage collection + +Support for garbage collection has shipped with `0.38.0`! This means that blocks in your IPFS Repo will be removed whenever gc is run unless they are pinned. + +This is essential for keeping your repo to a manageable size, but must be run manually for the time being. + +Use it with the following command: + +```console +$ jsipfs repo gc +removed Qmfoo +removed Qmbar +``` + +To prevent blocks being collected, pin them: + +```console +$ jsipfs pin add Qmbaz +pinned Qmbaz recursively +``` + +## 💬 Gossipsub enabled by default + +Pubsub is now enabled by default with Gossipsub as the default implementation. + +More efficient than [Floodsub](https://github.com/libp2p/js-libp2p-floodsub), [Gossipsub](https://github.com/ChainSafe/gossipsub-js) creates an overlay on top of the network of nodes which propagates messages to a subset of subscribers instead of broadcasting messages to everyone. + +Read more about the design at [`libp2p/specs/pubsub/gossipsub`](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) + +## 📛 IPNS support for `ipfs resolve` + +You can now resolve [IPNS](https://docs.ipfs.io/guides/concepts/ipns/) names via `ipfs resolve`, what's more the recursive option is now on by default. + +```console +$ jsipfs resolve /ipns/Qmqux +/ipfs/Qmgarply +``` + +## 🎁 New relase process & a call for early testers + +This is the first release to follow our new, more predictable, more rigorous release process. It's outlined in the [release issue template](https://github.com/ipfs/js-ipfs/blob/master/doc/RELEASE_ISSUE_TEMPLATE.md), but in short we have defined steps, with an additional period for internal & external testing and gathering feedback on the changes. + +It's also the first release to ship with lockfiles for `yarn` and `npm`. This is to ensure that you only get the dependencies that we have validated with CI, and not untested code that may have been released with breaking changes since CI last ran on the release candidate. + +But the best bit is that [we run the test suites of third party repos](https://travis-ci.com/ipfs/js-ipfs/builds/129226310) with the RCs as part of CI to ensure we don't break anything - if you would like your project added to that list, please send a PR to [`EARLY_TESTERS.md`](https://github.com/ipfs/js-ipfs/blob/master/doc/EARLY_TESTERS.md) adding a link to your repo! That way you'll get early warning of any work that needs to be done to upgrade your project to the latest & greatest. + +# 🏗 API Changes + +- [`ipfs.repo.gc([options])`](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/REPO.md#repogc) has been added +- [`ipfs.resolve(name, [options])`](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/MISCELLANEOUS.md#resolve) `options.recursive` now defaults to `true` +- Pubsub is now enabled by default so the config key `EXPERIMENTAL.pubsub` is ignored and passing the `--enable-pubsub-experiment` flag has no effect + +# ❤️ Huge thank you to everyone that made this release possible + +By alphabetical order, here are all the humans that contributed to the release: + +- [@achingbrain](https://github.com/achingbrain) (33 commits, 21 PRs, 7 issues, 46 comments) +- [@AcidLeroy](https://github.com/AcidLeroy) (1 comment) +- [@alanshaw](https://github.com/alanshaw) (50 commits, 25 PRs, 3 issues, 77 comments) +- [@andrycodestuffs](https://github.com/andrycodestuffs) (1 PR, 2 comments) +- [@AuHau](https://github.com/AuHau) (1 PR, 1 issue, 7 comments) +- [@bruinxs](https://github.com/bruinxs) (1 commit, 1 PR, 1 issue, 1 comment) +- [@daviddias](https://github.com/daviddias) (4 commits, 3 PRs, 1 issue, 18 comments) +- [@dirkmc](https://github.com/dirkmc) (2 commits, 1 comment) +- [@geastwood](https://github.com/geastwood) (1 commit, 1 PR) +- [@georgeaf99](https://github.com/georgeaf99) (1 comment) +- [@hacdias](https://github.com/hacdias) (4 commits, 3 PRs) +- [@hhfeng](https://github.com/hhfeng) (1 comment) +- [@hugomrdias](https://github.com/hugomrdias) (53 commits, 14 PRs, 1 issue, 23 comments) +- [@huyanyawei](https://github.com/huyanyawei) (1 comment) +- [@jacobheun](https://github.com/jacobheun) (4 commits, 2 PRs, 1 issue, 10 comments) +- [@jacogr](https://github.com/jacogr) (1 issue) +- [@jgeary](https://github.com/jgeary) (1 issue) +- [@jian-en](https://github.com/jian-en) (1 comment) +- [@jimpick](https://github.com/jimpick) (1 commit, 1 PR, 3 comments) +- [@JustMaier](https://github.com/JustMaier) (1 commit, 1 PR) +- [@lidel](https://github.com/lidel) (4 commits, 4 PRs, 2 issues, 18 comments) +- [@listenaddress](https://github.com/listenaddress) (2 issues) +- [@mikeal](https://github.com/mikeal) (1 PR, 7 comments) +- [@mitra42](https://github.com/mitra42) (1 issue, 6 comments) +- [@mkg20001](https://github.com/mkg20001) (1 commit, 1 PR, 1 issue, 2 comments) +- [@Nashatyrev](https://github.com/Nashatyrev) (1 issue) +- [@olizilla](https://github.com/olizilla) (10 comments) +- [@pruflyos](https://github.com/pruflyos) (1 comment) +- [@rabrux](https://github.com/rabrux) (1 comment) +- [@robertkiel](https://github.com/robertkiel) (1 PR) +- [@rvagg](https://github.com/rvagg) (1 comment) +- [@samparsky](https://github.com/samparsky) (18 PRs) +- [@Stebalien](https://github.com/Stebalien) (5 comments) +- [@tapaswenipathak](https://github.com/tapaswenipathak) (1 PR, 1 comment) +- [@teddycode](https://github.com/teddycode) (1 issue) +- [@terichadbourne](https://github.com/terichadbourne) (1 issue) +- [@vasa-develop](https://github.com/vasa-develop) (1 comment) +- [@vasco-santos](https://github.com/vasco-santos) (18 commits, 11 PRs, 18 comments) +- [@vmx](https://github.com/vmx) (2 commits, 3 PRs, 1 comment) +- [@x5engine](https://github.com/x5engine) (1 comment) +- [@yehia67](https://github.com/yehia67) (2 comments) +- [@yuwiggin](https://github.com/yuwiggin) (1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/071-ipfs-in-web-browsers/README.md b/src/_blog/071-ipfs-in-web-browsers/README.md new file mode 100644 index 00000000..33c39911 --- /dev/null +++ b/src/_blog/071-ipfs-in-web-browsers/README.md @@ -0,0 +1,98 @@ +--- +date: 2019-10-08 +url: /2019-10-08-ipfs-browsers-update/ +title: IPFS Browser Update +description: +author: Dietrich Ayala +header_image: 071-ipfs-in-web-browsers.png +--- + +Decentralization can feel slow in providing user-centric approaches to the internet's biggest problems. Right now, software that is fully in the control of the user is often too technical, too fragile, and too time-consuming to be the default choice. + +But we're making headway. Today, we'd like to share some collaborations the IPFS project has had in the works for a while, which bring us a few steps closer to making unmediated access to information _just work_... by solving that "last mile" problem and _integrating IPFS directly into web browsers_. + +## Stages + +![Stages of browser integration](./stages-of-browser-integration.png) + +The path to a truly decentralized web is a long one. For over 30 years the browser has been a [_client_]() – but a foundational concept in P2P systems is that a participant is both a client _and a [server]()\_. Web browser vendors and web standards bodies have not designed for this architectural shift, so we're breaking it down into steps. + +From the beginning, IPFS had an HTTP gateway. The gateway lets HTTP clients like web browsers publish to and read from the IPFS network. Now there are [lots of different public HTTP gateways to the IPFS network](https://ipfs.github.io/public-gateway-checker/), and the gateway we run at ipfs.io serves over _five million_ requests per day. + +Initially in our browser work, we're aiming to ease access to the IPFS HTTP gateways - creating a bridge between the billions of people on the centralized web and content on the distributed web. We expect some experimentation in the next phase - adjusting node behavior based on browser APIs, device capabilities, bandwidth availability and power consumption - while we grow adoption with our browser partners as we learn and build common understanding at standards bodies. Ultimately, we aim to have multiple browsers implement fully native (and interoperable!) IPFS support. + +As part of this progression to native IPFS support, we've had ongoing collaborations with Firefox, Brave, Opera, and other browsers. Read on to hear the latest status and learn about our progress so far. + +## Brave + +Brave has tended to live up to its name since the beginning - riling up the browser, publisher and crypto worlds. [Since 2018](https://github.com/brave/brave-browser/issues/819) we've been working with Brave on IPFS support in some form, and the results of that work are now emerging. + +Today you can open [`brave://settings/extensions`](brave://settings/extensions) in Brave and see a toggle for enabling IPFS Companion. + +![Enabling IPFS Companion in Brave](./enabling-ipfs-companion-in-brave.gif) + +Removing this install step _really matters_ for adoption. While technical users are familiar with browser extensions, it's less comfortable for non-technical users, and Brave users have the additional overhead of going to the _Chrome_ web app store to find and install them. + +In the future, when you [load a URL beginning with "ipfs://"](https://github.com/brave/brave-browser/issues/3045), Brave will prompt you to enable the extension, providing a smooth discovery and onboarding experience. And when you are browsing IPFS resource, the [address bar will reflect that](https://github.com/brave/brave-browser/issues/5218). + +But that isn't all. One of the biggest barriers to even just experimenting with true p2p networks in browsers is the lack of APIs available to extensions and web pages. The primitives of most p2p systems are filesystem access, raw TCP sockets, UDP sockets for broadcast and receive, and in browsers you need a way to navigate using a custom protocol. We've figured out one piece of that puzzle while working with Brave: Chromium OS sockets! + +[Chromium OS](https://en.wikipedia.org/wiki/Chromium_OS) has a raw sockets API, but it's disabled in the Chrome browser. Brave has modified their build to whitelist those APIs for IPFS Companion to use - and this gives us _superpowers_ compared to any other browser at this point. + +These powerful APIs enable the js-ipfs node embedded in the browser to provide a _true_ P2P experience without the need for an external daemon: + +- The embedded HTTP Gateway removes reliance on public gateways, by connecting over HTTP to a local IPFS node +- TCP transport improves connectivity - not only by enabling transport interoperability with go-ipfs nodes, but also makes direct browser-to-browser communication within the same network possible +- UDP sockets enable DNS-based service discovery of go-ipfs in LAN, and we are working on additional browser-to-browser discovery methods that work in offline environments + +By default, our browser extension still expects [IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop#ipfs-desktop) to be installed, however you can select the experimental option shown below in order to run _a standalone IPFS node_ in Brave itself. Mind this is an _early preview_ of both a full JS IPFS node and a gateway running in a browser extension. Performance and features will improve over time. + +![IPFS configuration option for embedded node using Chrome sockets API in Brave](./enable-embedded-node-in-brave.png) + +At IPFS Camp earlier this year, Brave engineer Jocelyn Liu demoed some of these features at the science fair, including one-click install of Companion, the embedded gateway, and also talks about what's to come: tackling the current connectivity limitations such as the lack of DHT support in js-ipfs, and also plans Brave has for the design of the address bar when loading IPFS content. + + + +## Opera + +Opera is another [early leader](https://blogs.opera.com/mobile/2018/12/ofa-49-with-crypto/) in the space. They've developed _native_ crypto wallets in their browsers, which began shipping in 2018 in Android and are now released in their iOS and desktop browsers as well. + +Earlier this year [Opera announced they were working on support for IPFS](https://twitter.com/ensdomains/status/1102884419017297921)! We've been talking ever since, and are looking forward to the launch of IPFS support in their Android browser by the end of this year. + +![Opera announcing ENS and IPFS at EthCC March 2019](./opera-announcement.png) + +## Firefox + +We've been working with Mozilla on initial APIs since 2018, when the [libdweb project](https://github.com/mozilla/libdweb) emerged, providing browser extension APIs for many of the primitives a P2P system needs: filesystem access, TCP, UDP and protocol registration and handling. Earlier in 2018 the [ipfs:// scheme was whitelisted in Firefox](https://blog.mozilla.org/addons/2018/01/26/extensions-firefox-59/), so now with libdweb we were able to experiment with a proper [ipfs:// protocol handler](https://github.com/ipfs-shipyard/ipfs-companion/pull/533), which we demoed at Lab Day in August 2018: + + + +We used yet more APIs in libdweb to implement [local discovery and TCP transport](https://github.com/ipfs-shipyard/ipfs-companion/pull/553): + + + +Unfortunately, libdweb is still an experimental set of APIs - not included in Firefox yet. We're hoping to see more progress soon from Mozilla on shipping libdweb APIs in Firefox for at least some extensions this year! + +## The Work is Just Beginning + +Integrated IPFS gateway support is one big step forward, but as the name implies, it isn't truly decentralized. Only when a browser can be a full participant in the network - both a client _and_ a server - will we have a truly distributed web. + +These early-adopters light the way, proving out what works and doesn't, and easing development for dapp developers in the near term. + +But there's a lot of work to be done. IPFS itself is still in flux, with major work ongoing in performance and robustness, and new features around privacy and content filtering. + +We're working on detailed use-cases to share with standards bodies, and a threat model that browser vendors can build and design against. Both are prerequisites for a future where all major browsers have interoperable implementations, which is what would make IPFS truly be part of the web. + +Web browsers have been solely a client for over 30 years - putting all power in the hands of the server. This year marks a paradigmatic shift in the belief of what a browser can be. Change is now happening at the level from which that power is derived: the network. + +## This is a Preview! + +Consider this a sneak peek. There's more on the way: + +- In Brave, the gateway is, well... a gateway to even more: We're working on local discovery (mDNS) of IPFS nodes, and also Brave-to-Brave connectivity for embedded nodes. +- We're continuing our experiments with [libdweb](https://github.com/mozilla/libdweb) in Firefox, both on desktop and Android. +- [Puma Browser](https://www.pumabrowser.com/), the first mobile browser with support for [Coil's micropayments for publishers](https://www.grantfortheweb.org/), is interested in IPFS support. +- Keeping a close eye on [Bundled HTTP Exchanges](https://wicg.github.io/webpackage/draft-yasskin-wpack-bundled-exchanges.html) and ways IPFS could provide decentralized alternative to centralized HTTP CDNs. +- We're exploring what a native Chromium implementation might look like... + +If you're an experienced Chromium developer or mobile app developer and you're interested in working on some of these projects, contact Dietrich Ayala on [Twitter](https://twitter.com/dietrich), the [fediverse](https://mastodon.social/@dietrich), [Secure Scuttlebutt](@vB/yLGZ7vBGgPMTG5NEczZc6ufr0YqhxRScOk6jPi60=.ed25519) or [LinkedIn](https://www.linkedin.com/in/dietrich). diff --git a/src/_blog/071-ipfs-in-web-browsers/enable-embedded-node-in-brave.png b/src/_blog/071-ipfs-in-web-browsers/enable-embedded-node-in-brave.png new file mode 100644 index 00000000..f77dd493 Binary files /dev/null and b/src/_blog/071-ipfs-in-web-browsers/enable-embedded-node-in-brave.png differ diff --git a/src/_blog/071-ipfs-in-web-browsers/enabling-ipfs-companion-in-brave.gif b/src/_blog/071-ipfs-in-web-browsers/enabling-ipfs-companion-in-brave.gif new file mode 100644 index 00000000..af66d89d Binary files /dev/null and b/src/_blog/071-ipfs-in-web-browsers/enabling-ipfs-companion-in-brave.gif differ diff --git a/src/_blog/071-ipfs-in-web-browsers/opera-announcement.png b/src/_blog/071-ipfs-in-web-browsers/opera-announcement.png new file mode 100644 index 00000000..02a2151a Binary files /dev/null and b/src/_blog/071-ipfs-in-web-browsers/opera-announcement.png differ diff --git a/src/_blog/071-ipfs-in-web-browsers/stages-of-browser-integration.png b/src/_blog/071-ipfs-in-web-browsers/stages-of-browser-integration.png new file mode 100644 index 00000000..70d4cd9e Binary files /dev/null and b/src/_blog/071-ipfs-in-web-browsers/stages-of-browser-integration.png differ diff --git a/src/_blog/072-js-ipfs-0.39/README.md b/src/_blog/072-js-ipfs-0.39/README.md new file mode 100644 index 00000000..588119d1 --- /dev/null +++ b/src/_blog/072-js-ipfs-0.39/README.md @@ -0,0 +1,138 @@ +--- +date: 2019-10-24 +url: /071-js-ipfs-0-39/ +title: js-ipfs 0.39.0 released +description: +author: Alex Potsides +header_image: js-ipfs-placeholder.png +--- + +> Configure your node with preset profiles! Limit outgoing browser requests! Start your node from fresh with one command! + +# 🔦 Highlights + +## 🛠 Config profiles + +IPFS now supports the `jsipfs config profile` subcommand which you can use to update your configuration with certain presets suited for different use cases. + +You can examine available profiles with the `jsipfs config profile ls` command: + +```console +$ jsipfs config profile ls +server: + Recommended for nodes with public IPv4 address (servers, VPSes, etc.)... +local-discovery: + Sets default values to fields affected by `server` profile... +test: + Reduces external interference, useful for running ipfs in test environments... +default-networking: + Restores default network settings. Inverse profile of the `test` profile. +lowpower: + Reduces daemon overhead on the system. May affect node functionality... +default-power: + Inverse of "lowpower" profile. +``` + +Apply them with `jsipfs config profile apply`: + +```console +$ jsipfs config profile apply lowpower +... output shows the difference between the old config and the new +``` + +You will need to restart your daemon for changes to take effect. + +Profiles can also be applied on init: + +```console +$ jsipfs init --profile server +``` + +Or when starting the daemon (more on that in the 'Init and start' section below): + +```console +$ jsipfs daemon --init-profile server +``` + +## 🌐 Concurrent HTTP requests limited in the browser + +Interacting with IPFS can cause a lot of preloading and other background requests to be made - [most browsers](https://bugs.chromium.org/p/chromium/issues/detail?id=285567) can only have so many requests in flight to a single origin at once so this can cause requests to the same origins made outside of IPFS to take time as they wait their turn to be processed. + +As of `ipfs@0.39.0`, the concurrency of HTTP requests for DNS resolution and preloading are limited to ensure there are always connections available to speedily process requests made by users. + +## 🌅 Init and start your daemon in one command + +When a new user first starts up the IPFS daemon they've been greeted by an unfriendly message telling them to `init` it first. + +No longer! Now on first startup, the daemon will auto-init its repo, removing a tiny bit of friction from getting on to the distributed web. 🙌 + +## 🚯 `block rm` now supported over the HTTP API + +Previously this command only worked with the daemon turned off, now you can use the low level `jsipfs block rm` command with the daemon running. + +N.b. it's rare that you would need to use this command, a more common approach would be to call `jsipfs repo gc` instead which removes all non-pinned blocks from your IPFS repo. + +# 🏗 API Changes + +- [`ipfs.config.profiles.list([options])`](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/CONFIG.md#configprofileslist) has been added +- [`ipfs.config.profiles.apply(name, [options])`](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/CONFIG.md#configprofilesapply) has been added +- [`ipfs.block.rm(cid, [options])`](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/BLOCK.md#blockrm) now works over the HTTP API + +# ❤️ Huge thank you to everyone that made this release possible + +By alphabetical order, here are all the humans that contributed to the release: + +- [@achingbrain](https://github.com/achingbrain) (73 commits, 23 PRs, 4 issues, 64 comments) +- [@alanshaw](https://github.com/alanshaw) (2 PRs, 1 issue, 14 comments) +- [@alx696](https://github.com/alx696) (1 issue, 1 comment) +- [@aschmahmann](https://github.com/aschmahmann) (1 issue) +- [@AuHau](https://github.com/AuHau) (6 commits, 6 PRs, 1 issue, 10 comments) +- [@autonome](https://github.com/autonome) (2 comments) +- [@betamos](https://github.com/betamos) (1 commit, 1 PR, 1 comment) +- [@csuwildcat](https://github.com/csuwildcat) (1 commit, 1 PR) +- [@cwaring](https://github.com/cwaring) (2 comments) +- [@daviddias](https://github.com/daviddias) (2 commits, 1 PR, 3 issues, 50 comments) +- [@dirkmc](https://github.com/dirkmc) (1 commit) +- [@guoliu](https://github.com/guoliu) (1 issue, 1 comment) +- [@hacdias](https://github.com/hacdias) (2 commits, 1 PR, 1 comment) +- [@hazae41](https://github.com/hazae41) (1 comment) +- [@hugomrdias](https://github.com/hugomrdias) (8 commits, 10 PRs, 1 issue, 16 comments) +- [@iiska](https://github.com/iiska) (1 commit, 1 PR) +- [@its-VSP](https://github.com/its-VSP) (1 comment) +- [@jacobheun](https://github.com/jacobheun) (2 commits, 4 PRs, 2 issues, 14 comments) +- [@javaadpatel](https://github.com/javaadpatel) (1 issue) +- [@kpp](https://github.com/kpp) (2 issues, 3 comments) +- [@lidel](https://github.com/lidel) (1 commit) +- [@mikeal](https://github.com/mikeal) (9 comments) +- [@mkg20001](https://github.com/mkg20001) (2 comments) +- [@momack2](https://github.com/momack2) (1 comment) +- [@npfoss](https://github.com/npfoss) (2 issues, 5 comments) +- [@oed](https://github.com/oed) (2 issues, 3 comments) +- [@orpheus](https://github.com/orpheus) (2 comments) +- [@pashoo2](https://github.com/pashoo2) (2 issues, 1 comment) +- [@PedroMiguelSS](https://github.com/PedroMiguelSS) (1 commit, 3 PRs) +- [@prayaglehana](https://github.com/prayaglehana) (2 comments) +- [@ptoner](https://github.com/ptoner) (3 comments) +- [@reasv](https://github.com/reasv) (1 issue, 5 comments) +- [@rumkin](https://github.com/rumkin) (1 issue) +- [@tapaswenipathak](https://github.com/tapaswenipathak) (3 comments) +- [@vasco-santos](https://github.com/vasco-santos) (9 commits, 1 PR, 9 comments) +- [@vaultec81](https://github.com/vaultec81) (1 issue, 2 comments) +- [@vincepmartin](https://github.com/vincepmartin) (1 commit, 1 PR, 1 issue, 4 comments) +- [@vmx](https://github.com/vmx) (5 comments) +- [@yehia67](https://github.com/yehia67) (1 comment) +- [@Ziwei-Wei](https://github.com/Ziwei-Wei) (1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode and [Matrix](https://matrix.to/#/#ipfs:matrix.org) diff --git a/src/_blog/073-073-go-ipfs-as-a-library/README.md b/src/_blog/073-073-go-ipfs-as-a-library/README.md new file mode 100644 index 00000000..f45ba8d4 --- /dev/null +++ b/src/_blog/073-073-go-ipfs-as-a-library/README.md @@ -0,0 +1,20 @@ +--- +date: 2019-10-29 +url: /073-go-ipfs-as-a-library/ +title: A new Tutorial has been created - Learn how to use go-ipfs as a Library +description: +author: David Dias +--- + +The title says it all. Learn how to use [go-ipfs as a Library with the new Tutorial](https://github.com/ipfs/go-ipfs/tree/master/docs/examples/go-ipfs-as-a-library) and take full advantage of the [go-ipfs Core API](https://godoc.org/github.com/ipfs/interface-go-ipfs-core). + +![](https://ipfs.io/ipfs/QmWgSVDmVDCPcf8zMHzXJTnDf6SFf9FpWXGDpXMozaBgQ6/go-ipfs-as-a-library.gif) + +Let us know what you think by opening a topic with your questions and feedback at https://discuss.ipfs.io. + +Invite your friends to share it and help us broadcast it to reach a wider audience of DWeb developers + + + + +Can't wait to see what you build with it! Happy hacking! diff --git a/src/_blog/074-explore-the-files-api-on-protoschool/README.md b/src/_blog/074-explore-the-files-api-on-protoschool/README.md new file mode 100644 index 00000000..de4ae60b --- /dev/null +++ b/src/_blog/074-explore-the-files-api-on-protoschool/README.md @@ -0,0 +1,54 @@ +--- +date: 2019-11-06 +url: /2019-11-06-explore-the-files-api-on-protoschool/ +title: Explore the Files API on ProtoSchool +description: +author: Teri Chadbourne +header_image: 074-explore-the-files-api-on-protoschool.png +--- + +Today we're excited to announce the launch of a [brand new ProtoSchool tutorial exploring the **Regular Files API**](https://proto.school/#/regular-files-api), built by the awesome [Gil Domingues](https://github.com/dominguesgm). 🎉 + +![Tutorial Table of Contents](./toc_screenshot.png) +![Code Challenge](./challenge_screenshot.png) + +This new tutorial explores the methods at the top-level of js-ipfs (`add`, `get`, `cat`, etc.) that are custom-built for working with files. We refer to these methods as the Regular Files API to distinguish them from the Mutable File System (MFS). MFS mimics a more traditional file system interface with methods like `files.cp` and `files.mkdir`, but it hides the complexity of immutable content addressing in IPFS. Check out the [first lesson](https://proto.school/#/regular-files-api/01) of the new tutorial for more on the differences between these two approaches, as well as some important distinctions between the Files API and the DAG API. + +If you're new to IPFS and finding CIDs to be challenging as a naming convention, keep an eye out in this tutorial for an explanation of how you can use the `wrapWithDirectory` option in the Regular Files API to create more human-readable paths and filenames. + +### More to explore on ProtoSchool + +#### Explore other IPFS APIs through coding challenges + +Like most of our tutorials, this latest addition uses JavaScript coding challenges to teach IPFS methods, allowing you to explore them right from your web browser without installing anything or touching the command line. Check out our other code-based IPFS tutorials on ProtoSchool: + +- The [Mutable File System (MFS)](https://proto.school/#/mutable-file-system) (part of the Files API) +- The DAG API: [P2P Data Links with Content Addressing](https://proto.school/#/basics) +- The DAG API: [Blogging on the Decentralized Web](https://proto.school/#/blog) + +#### Don't know JavaScript or don't know how to code? + +Our [Decentralized Data Structures](https://proto.school/#/data-structures) tutorial offers a code-free look at important concepts like content addressing and hashing. + +#### Prefer to learn in a group setting? + +Find a [ProtoSchool chapter near you](https://proto.school/#/chapters) and attend a live workshop. + +#### Help us improve our curriculum + +We're constantly working to improve and grow our ProtoSchool curriculum, and have lots of new content planned for you in the months ahead. You can help us improve our offereings by sharing your feedback on existing tutorials (using the links provided a the bottom of each lesson) or by [building a new tutorial](https://proto.school/#/build). (Our platform currently supports browser-based JavaScript coding challenges, text-based lessons, and multiple-choice quizzes.) + +### Other resources on using IPFS with files + +If you'd like to dig a little deeper, we recommend checking out the **Understanding How IPFS Deals with Files** course offered at IPFS Camp 2019. (No coding required.) It offers a deep dive on key concepts like immutability, content addressing, hashing, the anatomy of CIDs, what the heck a Merkle DAG is, and how chunk size affects file imports. It also covers the joys and pitfalls of the Mutable File System (MFS), the layer of abstraction in IPFS that lets you work with immutable files and directories as if you were using a traditional name-based file system. As with all great talks, this one is enhanced by images of adorable poodles. 🐩 (12 / 10, would recommend.) + +Watch the recording below or check out the [slides](https://github.com/ipfs/camp/blob/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_A/IPFS_Camp_Core_Course_A_Slides.pdf)! + +[![Video: Understanding How IPFS Deals with Files](/img/057-ipfs-camp-course-videos/core-a-thumbnail.png)](https://youtu.be/Z5zNPwMDYGg) + +_Video: [Understanding How IPFS Deals with Files](https://youtu.be/Z5zNPwMDYGg)_ + +This course also introduces new visualization tools that you can use to see how IPFS addresses and manipulates files: + +- Paste a Content Identifier (CID) into the [**CID Inspector**](https://cid.ipfs.io/) to break down its anatomy +- Drag a file into the [**DAG Builder**](https://dag.ipfs.io/) and adjust chunk size, DAG layouts, etc. to see how it affects the Merkle DAG diff --git a/src/_blog/074-explore-the-files-api-on-protoschool/challenge_screenshot.png b/src/_blog/074-explore-the-files-api-on-protoschool/challenge_screenshot.png new file mode 100644 index 00000000..6e7a1f4f Binary files /dev/null and b/src/_blog/074-explore-the-files-api-on-protoschool/challenge_screenshot.png differ diff --git a/src/_blog/074-explore-the-files-api-on-protoschool/toc_screenshot.png b/src/_blog/074-explore-the-files-api-on-protoschool/toc_screenshot.png new file mode 100644 index 00000000..43175c54 Binary files /dev/null and b/src/_blog/074-explore-the-files-api-on-protoschool/toc_screenshot.png differ diff --git a/src/_blog/075-js-ipfs-0.40/README.md b/src/_blog/075-js-ipfs-0.40/README.md new file mode 100644 index 00000000..9a3bbe23 --- /dev/null +++ b/src/_blog/075-js-ipfs-0.40/README.md @@ -0,0 +1,228 @@ +--- +date: 2019-12-02 +url: /2019-12-02-js-ipfs-0-40/ +title: js-ipfs 0.40.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +# 🔦 Highlights + +> Migrations are not just for ducks. We're paving the way for the dweb in the browser by laying foundations to switch to a hash format that can be used in URL origins 🛣 + +## 🦆 New repo migrations tool + +Ever worked on an application where you've had to write a database migration? Yeah, us too. Up until now js-ipfs hasn't been able to migrate repo's to a new format. Well, that's not strictly true, you could have used the go-ipfs repo migration tool on a repo created when running js-ipfs in Node.js (yes, we have repo compatibility!), but in the browser you were stuck. + +..and I mean really stuck, if we'd updated the format of a repo that ships with js-ipfs then your applications would just have to catch an error that the repo version was not compatible. You couldn't use it, and you couldn't upgrade. Bad news bears 🐻. + +We had a cunning strategy to avoid this situation - do not change the repo 😂, but this is rapidly becoming unsustainable since we actually want to add a migration to achieve our dream of [base32 encoded v1 (by default) CIDs](https://github.com/ipfs/js-ipfs/issues/1440). + +Good news friends! The new version of js-ipfs now ships with a repo migration tool that'll automatically migrate repo's in the browser. So now all our ducks are in a line, stay tuned for a migration and a switch to v1 CIDs ✨! + +## 🎻 base32 encoded CIDs in IPNS paths + +My violin strings gently weep for being able to use Peer IDs in a domain, and let me tell you why. + +Peer IDs currently cannot be used in a domain name because their string format is `base58` - a case _SENSITIVE_ encoding. In domain names the following are equivalent: + +``` +QmNib2c1qCVSbp9QPT81RmDSg3n8kFgPsMCdj4gpveJESE +qmnib2c1qcvsbp9qpt81rmdsg3n8kfgpsmcdj4gpvejese +QMNIB2C1QCVSBP9QPT81RMDSG3N8KFGPSMCDJ4GPVEJESE +``` + +So, bad times. + +...but wait, [Peer IDs _ARE_ CIDs](https://github.com/libp2p/specs/blob/master/RFC/0001-text-peerid-cid.md)! I know, weird, but also rad because in theory we should be able to re-encode them as `base32`. Right now though, everything expects a `base58` encoded string (a v0 CID) because they're actually just a multihash. + +In this js-ipfs release we've made a small change to allow you to take your Peer ID (a v0 CID), convert it to a base32 encoded v1 CID and use it in an IPNS path like `/ipns/bafybeidta3hkxk3ihxfsk765oswgsjhmvcnkeestyuov6r2t5tyts4xuoe`. You can take advantage of [cid.ipfs.io](https://cid.ipfs.io) (base32 version is provided for your convenience at the very bottom of the page) or do the conversion with the command line tools: + +```sh +jsipfs id | json id | jsipfs cid base32 +bafybeidta3hkxk3ihxfsk765oswgsjhmvcnkeestyuov6r2t5tyts4xuoe +``` + +This is really, seriously cool, because now Peer IDs can be used in domain names and so an IPFS gateway operating at `bafybeidta3hkxk3ihxfsk765oswgsjhmvcnkeestyuov6r2t5tyts4xuoe.ipns.dweb.link` for example, will have origin isolation (hooray for security 🔒) _AND_ IPNS enabled mutable data 🚀⚡️ + +To ease the transition we support CID v0 converted to v1 (with `dag-pb` multicodec). In the future, new Peer IDs will be v1 CIDs with self-describing [`libp2p-key` codec](https://github.com/libp2p/specs/blob/master/peer-ids/peer-ids.md#libp2p-key-cid) that is `base32` encoded by default...but that's a change for another day. + +## 🌲 Implemented `dag put` and `dag resolve` CLI commands + +These have been available in core for a while now and we finally got round to surfacing them in the CLI. e.g. + +```console +$ jsipfs dag put '""IPLD RULEZ""' +bafyreia5coklfzblgd3reqwaieafmpasdceqmcnjrowre3623mtb4nxlhm + +$ jsipfs dag put '{"to": {"/": "bafyreia5coklfzblgd3reqwaieafmpasdceqmcnjrowre3623mtb4nxlhm"}}' +bafyreiequnkfflujkwhxk6wud5w64hmijdqdmx7p55fgrbiizw32kdrb7e + +$ jsipfs dag put '{"path": {"/": "bafyreiequnkfflujkwhxk6wud5w64hmijdqdmx7p55fgrbiizw32kdrb7e"}}' +bafyreidgfdsoupe747qnjzkjk2yirgv76wr4drev3i7kv6dht4dkypusze + +$ jsipfs dag resolve bafyreidgfdsoupe747qnjzkjk2yirgv76wr4drev3i7kv6dht4dkypusze/path/to +bafyreia5coklfzblgd3reqwaieafmpasdceqmcnjrowre3623mtb4nxlhm + +$ jsipfs dag get bafyreia5coklfzblgd3reqwaieafmpasdceqmcnjrowre3623mtb4nxlhm +IPLD RULEZ +``` + +# 🏗 API Changes + +- `dag.put` got a `pin` option to save you from calling the pin API separately (and potentially losing your node if GC runs inbetween!) + +# ❤️ Huge thank you to everyone that made this release possible + +- [@0x6431346e](https://github.com/0x6431346e) (1 commit, 2 PRs, 1 comment) +- [@0xflotus](https://github.com/0xflotus) (1 comment) +- [@achingbrain](https://github.com/achingbrain) (33 commits, 23 PRs, 1 issue, 56 comments) +- [@alanshaw](https://github.com/alanshaw) (59 commits, 49 PRs, 8 issues, 148 comments) +- [@Alvan98](https://github.com/Alvan98) (1 issue, 1 comment) +- [@andrew](https://github.com/andrew) (1 comment) +- [@anorth](https://github.com/anorth) (1 comment) +- [@aphelionz](https://github.com/aphelionz) (1 comment) +- [@AquiGorka](https://github.com/AquiGorka) (1 comment) +- [@arithmetric](https://github.com/arithmetric) (1 comment) +- [@arminsal1](https://github.com/arminsal1) (1 issue) +- [@atfornes](https://github.com/atfornes) (1 comment) +- [@AuHau](https://github.com/AuHau) (17 commits, 2 PRs, 2 issues, 16 comments) +- [@ay2306](https://github.com/ay2306) (1 commit, 1 PR, 1 issue, 8 comments) +- [@ayushee10](https://github.com/ayushee10) (1 issue, 1 comment) +- [@bitspill](https://github.com/bitspill) (1 comment) +- [@bonedaddy](https://github.com/bonedaddy) (1 issue, 4 comments) +- [@BrunoZell](https://github.com/BrunoZell) (1 comment) +- [@bvand](https://github.com/bvand) (1 comment) +- [@caelumdev](https://github.com/caelumdev) (1 comment) +- [@ceslabdocker](https://github.com/ceslabdocker) (1 issue, 3 comments) +- [@charleenfei](https://github.com/charleenfei) (1 comment) +- [@chirag-shinde](https://github.com/chirag-shinde) (1 comment) +- [@csuwildcat](https://github.com/csuwildcat) (1 comment) +- [@dasilvacontin](https://github.com/dasilvacontin) (1 comment) +- [@datafatmunger](https://github.com/datafatmunger) (1 comment) +- [@daviddias](https://github.com/daviddias) (2 commits, 2 PRs, 3 issues, 21 comments) +- [@davidgilbertson](https://github.com/davidgilbertson) (1 comment) +- [@dbachko](https://github.com/dbachko) (1 comment) +- [@demmojo](https://github.com/demmojo) (1 comment) +- [@dirkmc](https://github.com/dirkmc) (2 commits, 5 PRs, 1 issue, 2 comments) +- [@djdv](https://github.com/djdv) (1 comment) +- [@dordille](https://github.com/dordille) (1 comment) +- [@elsehow](https://github.com/elsehow) (1 comment) +- [@enricomarino](https://github.com/enricomarino) (1 comment) +- [@ethers](https://github.com/ethers) (1 comment) +- [@faheel](https://github.com/faheel) (1 comment) +- [@fbaiodias](https://github.com/fbaiodias) (1 comment) +- [@felixonmars](https://github.com/felixonmars) (1 comment) +- [@Fil](https://github.com/Fil) (1 comment) +- [@filips123](https://github.com/filips123) (1 comment) +- [@fsdiogo](https://github.com/fsdiogo) (2 comments) +- [@Gozala](https://github.com/Gozala) (1 comment) +- [@grantlouisherman](https://github.com/grantlouisherman) (1 comment) +- [@grassias](https://github.com/grassias) (1 comment) +- [@hacdias](https://github.com/hacdias) (2 commits, 2 PRs, 2 comments) +- [@HamzaBinSarfraz](https://github.com/HamzaBinSarfraz) (1 issue, 1 comment) +- [@harshjv](https://github.com/harshjv) (1 comment) +- [@holodisc](https://github.com/holodisc) (1 comment) +- [@hsanjuan](https://github.com/hsanjuan) (1 comment) +- [@hugomrdias](https://github.com/hugomrdias) (1 commit, 1 PR, 10 comments) +- [@iRyanBell](https://github.com/iRyanBell) (1 PR) +- [@ishanjoshi02](https://github.com/ishanjoshi02) (1 comment) +- [@jacobheun](https://github.com/jacobheun) (30 commits, 12 PRs, 1 issue, 32 comments) +- [@jaller94](https://github.com/jaller94) (1 commit, 1 PR) +- [@JChanceHud](https://github.com/JChanceHud) (1 comment) +- [@jessicaschilling](https://github.com/jessicaschilling) (1 commit, 1 PR, 3 comments) +- [@JGAntunes](https://github.com/JGAntunes) (2 comments) +- [@joaosantos15](https://github.com/joaosantos15) (1 comment) +- [@jonahweissman](https://github.com/jonahweissman) (1 comment) +- [@Jonybang](https://github.com/Jonybang) (1 comment) +- [@Jorropo](https://github.com/Jorropo) (1 commit, 1 PR) +- [@kenshyx](https://github.com/kenshyx) (1 comment) +- [@kpp](https://github.com/kpp) (2 issues, 1 comment) +- [@KrishnaPG](https://github.com/KrishnaPG) (1 issue, 1 comment) +- [@lidel](https://github.com/lidel) (5 commits, 6 PRs, 14 comments) +- [@liofchina](https://github.com/liofchina) (1 issue) +- [@machawk1](https://github.com/machawk1) (1 comment) +- [@magik6k](https://github.com/magik6k) (1 comment) +- [@masylum](https://github.com/masylum) (1 comment) +- [@maxlath](https://github.com/maxlath) (1 comment) +- [@mboperator](https://github.com/mboperator) (2 commits, 2 PRs, 2 comments) +- [@mburns](https://github.com/mburns) (1 PR) +- [@mcclure](https://github.com/mcclure) (1 issue, 1 comment) +- [@MichaelMure](https://github.com/MichaelMure) (1 comment) +- [@michaelsbradleyjr](https://github.com/michaelsbradleyjr) (1 issue) +- [@mikeal](https://github.com/mikeal) (3 comments) +- [@mishmosh](https://github.com/mishmosh) (1 comment) +- [@mitar](https://github.com/mitar) (1 comment) +- [@mkg20001](https://github.com/mkg20001) (26 commits, 6 PRs, 4 issues, 52 comments) +- [@mnts](https://github.com/mnts) (1 issue, 2 comments) +- [@momack2](https://github.com/momack2) (3 comments) +- [@moshisushi](https://github.com/moshisushi) (1 comment) +- [@mpetrunic](https://github.com/mpetrunic) (1 commit, 1 PR, 2 comments) +- [@Mr0grog](https://github.com/Mr0grog) (1 comment) +- [@Nashatyrev](https://github.com/Nashatyrev) (1 comment) +- [@NatoBoram](https://github.com/NatoBoram) (1 comment) +- [@negamaxi](https://github.com/negamaxi) (1 comment) +- [@nick](https://github.com/nick) (1 comment) +- [@niinpatel](https://github.com/niinpatel) (1 comment) +- [@noffle](https://github.com/noffle) (2 comments) +- [@npfoss](https://github.com/npfoss) (1 issue) +- [@obo20](https://github.com/obo20) (1 issue, 3 comments) +- [@oed](https://github.com/oed) (1 comment) +- [@olizilla](https://github.com/olizilla) (2 comments) +- [@OR13](https://github.com/OR13) (1 comment) +- [@Otto-AA](https://github.com/Otto-AA) (1 comment) +- [@PascalPrecht](https://github.com/PascalPrecht) (1 comment) +- [@pashoo2](https://github.com/pashoo2) (1 PR, 3 comments) +- [@PedroMiguelSS](https://github.com/PedroMiguelSS) (10 commits, 20 PRs, 1 issue, 22 comments) +- [@petethomas](https://github.com/petethomas) (1 comment) +- [@pgte](https://github.com/pgte) (2 comments) +- [@phillmac](https://github.com/phillmac) (1 commit, 1 PR, 2 comments) +- [@PopTudor](https://github.com/PopTudor) (2 comments) +- [@raksooo](https://github.com/raksooo) (1 comment) +- [@raoulmillais](https://github.com/raoulmillais) (1 comment) +- [@rasmuserik](https://github.com/rasmuserik) (1 comment) +- [@ratsclub](https://github.com/ratsclub) (1 issue, 2 comments) +- [@reasv](https://github.com/reasv) (2 commits, 2 PRs, 1 issue, 9 comments) +- [@requilence](https://github.com/requilence) (1 comment) +- [@RichardLitt](https://github.com/RichardLitt) (2 comments) +- [@RobertFischer](https://github.com/RobertFischer) (1 comment) +- [@rodkeys](https://github.com/rodkeys) (1 comment) +- [@rudolph9](https://github.com/rudolph9) (1 issue, 1 comment) +- [@rumkin](https://github.com/rumkin) (2 issues, 3 comments) +- [@rusfearuth](https://github.com/rusfearuth) (1 issue) +- [@rvagg](https://github.com/rvagg) (1 commit, 1 PR, 4 comments) +- [@sarthak0906](https://github.com/sarthak0906) (1 commit, 1 PR, 1 comment) +- [@satazor](https://github.com/satazor) (1 comment) +- [@SidHarder](https://github.com/SidHarder) (1 comment) +- [@sktt](https://github.com/sktt) (1 comment) +- [@Stebalien](https://github.com/Stebalien) (2 comments) +- [@suutaku](https://github.com/suutaku) (3 issues, 6 comments) +- [@swedneck](https://github.com/swedneck) (1 comment) +- [@terichadbourne](https://github.com/terichadbourne) (1 comment) +- [@thisconnect](https://github.com/thisconnect) (1 comment) +- [@Thisisjuke](https://github.com/Thisisjuke) (1 issue, 2 comments) +- [@uluhonolulu](https://github.com/uluhonolulu) (1 issue) +- [@vasco-santos](https://github.com/vasco-santos) (46 commits, 21 PRs, 4 issues, 15 comments) +- [@victorb](https://github.com/victorb) (1 comment) +- [@vith](https://github.com/vith) (1 comment) +- [@vmx](https://github.com/vmx) (9 commits, 4 PRs, 13 comments) +- [@vporton](https://github.com/vporton) (1 issue, 1 comment) +- [@vweevers](https://github.com/vweevers) (4 comments) +- [@whyrusleeping](https://github.com/whyrusleeping) (1 comment) +- [@wraithgar](https://github.com/wraithgar) (2 comments) +- [@ya7ya](https://github.com/ya7ya) (1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/076-ipfs-docs-beta/README.md b/src/_blog/076-ipfs-docs-beta/README.md new file mode 100644 index 00000000..ee756b7c --- /dev/null +++ b/src/_blog/076-ipfs-docs-beta/README.md @@ -0,0 +1,40 @@ +--- +date: 2020-01-07 +url: /2020-01-07-ipfs-docs-beta/ +title: The new IPFS Docs beta is live! 📚 🆕 +description: +author: Jessica Schilling +header_image: 076-ipfs-docs-beta.png +--- + +**We’re excited to announce [the new IPFS documentation site is live in beta](https://docs.ipfs.io/)!** The doors are open, and just like any housewarming, you’re cordially invited to stop by, have a look around, and let us know what you think. + +Screenshot of docs beta +
+_New year, new look._ + +![Mind map of docs beta nav](/076-ipfs-docs-beta/img/docs-beta-site-mindmap.png) +
+_Here’s a mind map of how the docs beta’s navigation works._ + +## 🆕 What’s new in the docs beta: + +- Redesigned, simple, clean interface +- Better navigation +- The return of search functionality + +## ↗️ What’s coming up in Q1 2020 and beyond: + +- Enhancements to existing content +- Brand-new content, including use-case scenarios, visual explainers, and more +- Next-gen API documentation +- Enhanced full-text search +- More new features: [vote on your favorite](https://ipfs.canny.io/admin/board/docs-features)! + +## 👩‍🔬 Want to get involved with the new docs beta? + +It’s never been easier to do something that benefits the global IPFS community! Here’s how: + +- [Contribute your own content](https://github.com/ipfs/docs/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) to the new docs site to share your knowledge with others **(and note, some of these content issues have bounties attached!)** +- [Become a docs beta tester](https://docs.google.com/forms/d/1LVaD1B2uyW6Ff0jfU_iQ5mCeyQcHfyQO6BDD99XAgK0/) and help us test, refine and prioritize new content and features +- [Vote for your favorite new docs features](https://ipfs.canny.io/admin/board/docs-features) to help us determine what to build next diff --git a/src/_blog/077-collaborative-clusters/README.md b/src/_blog/077-collaborative-clusters/README.md new file mode 100644 index 00000000..83124b61 --- /dev/null +++ b/src/_blog/077-collaborative-clusters/README.md @@ -0,0 +1,61 @@ +--- +date: 2020-01-09 +url: /2020-01-09-collaborative-clusters/ +title: Announcing collaborative clusters +description: +author: Hector Sanjuan +header_image: 077-collaborative-clusters.png +--- + +We are very excited to announce the first set of public _collaborative +clusters_ and the first iteration of the +[collaborative clusters website](https://collab.ipfscluster.io). + +_Collaborative clusters_ are an easy way to join and help improving distribution +and data availability of specific datasets in the IPFS Network. + +Using IPFS Cluster's +[latest release (0.12.1)](https://cluster.ipfs.io/news/0.12.0_release/) we +have set up the first of those archives: + +- Filecoin cluster: which will be used to pin Filecoin parameters and + Filecoin objects. +- Spanish books from the Gutenberg Project: a collection of Spanish literature + from the [Gutenberg Project](http://www.gutenberg.org/). +- IPFS Websites: a list with a few of the IPFS-universe websites (such as ipfs.io, libp2p.io). + +Users can join these clusters by running a single `ipfs-cluster-follow` +command. You will need to have enough space available in your IPFS repository +(check the size row for each cluster on the +[website](https://collab.ipfscluster.io)). + +Instructions on how to setup and join these and, in the future, other +collaborative clusters can be found at +[https://collab.ipfscluster.io](https://collab.ipfscluster.io). You can stop +and re-start replication whenever you want. Also, here's a quick video to show +how easy it is: + + + +We hope that collaborative clusters will allow the community to participate in +the distribution and seeding of data they care about, enabling easy "mirroring" +on the IPFS network, along with unlocking _Content-Distribution-Network (CDN)_ +properties. + +## Creating your own Clusters + +Collaborative clusters are no different from normal IPFS Clusters, with the exception that +they include a list of _trusted peers_ (peers that can modify the cluster pinset). + +The process of setting up one of these and letting other peers easily join as +followers is documented at +[https://cluster.ipfs.io/documentation/collaborative/](https://cluster.ipfs.io/documentation/collaborative/). + +## About the IPFS Cluster project + +The [IPFS Cluster project](https://cluster.ipfs.io) provides data +orchestration across a swarm of IPFS daemons by allocating, replicating and +tracking a global pinset distributed among multiple peers. + +For full documentation on how to setup and operate clusters, see +[https://cluster.ipfs.io/documentation](https://cluster.ipfs.io/documentation). diff --git a/src/_blog/078-go-ipfs-0.4.23/README.md b/src/_blog/078-go-ipfs-0.4.23/README.md new file mode 100644 index 00000000..d500bd60 --- /dev/null +++ b/src/_blog/078-go-ipfs-0.4.23/README.md @@ -0,0 +1,102 @@ +--- +date: 2020-01-30 +url: /2020-01-30-go-ipfs-0-4-23/ +title: go-ipfs 0.4.23 released +description: +author: Alan Shaw +--- + +> Would sir/madam care for another patch release while they wait? + +Yes that's right, the next feature release of go-ipfs (0.5.0) is, well, running a tiny bit behind schedule. In the mean time though we have patches, and I'm not talking pirate eye patches, I'm talking bug fixes. We're hunting these bugs like they're Pokemon, and jeez, do we come across some rare and difficult to fix ones? - you betcha. + +Alright, enough funny business, what's the deal? Ok so, I don't want to _alarm_ anyone but this release has some **critical fixes** and if you're using go-ipfs or know someone who is then you and your friends need to slide into your upgrade pants and give those IPFS nodes a good wipe down ASAP. + +If you're a busy person and are feeling like you've read a little too much already, the TLDR; on the critical fixes is: + +1. We fixed a bug in the TLS transport that would (very rarely) cause disconnects during the handshake. You really _should_ upgrade or you'll see this bug more and more when TLS is enabled by default in go-ipfs 0.5.0. +1. We patched a commonly occurring bug in the websocket transport that was causing panics because of concurrent writes. + +## 🔦 Highlights + +### 🤝 Fixed Spontaneous TLS Disconnects + +If this isn't reason enough to upgrade I don't know what is. Turns out, a TLS handshake _may_ have accidentially been unintentionally aborted for no good reason 😱. Don't panic just yet! It's a really rare race condition and in go-ipfs 0.4.x the TLS transport is _experimental_ (SECIO is currently the default). + +Phew, ok, that said, in go-ipfs 0.5.0, TLS will be the default so don't delay, upgrade today! + +### 😱 Fixed Panics and Crashes + +Panicing won't help, in life, and also in golang. Stay calm and breathe slowly. We patched a number of panics and crashes that were uncovered, including a panic due to concurrent writes that you probably saw quite a lot if you were using the websocket transport. High ten 🙌? + +### 🔁 Fixed Recursive Resolving of dnsaddr Multiaddrs + +`dnsaddr`s can be recursive! That means a given `dnsaddr` can resolve to another `dnsaddr`. Not indefinitely though, don't try to trick us with your circular addresses - you get 32 goes on the ride maximum. + +We found this issue when rolling out a brand spanking new set of bootstrap nodes only to discover their new addresses were, well, what's the opposite of recursive? It's not cursive...non-recursive I guess. Basically they resolved one time and then not again. I know right - bad news bears 🐻!? + +Ok, "bear" this in mind: you want to keep all your DNS TXT records [below 512 bytes to avoid UDP fragmentation](https://serverfault.com/questions/840241/do-dns-queries-always-travel-over-udp), otherwise you'll get a truncated reply and have to connect with TCP to get all the records. If you have lots of dnsaddr TXT records then it can be more efficient to use recursive resolving than to get a truncated reply and go through the famous 18-way SYN, SYN-ACK ACK, ACK-SYN, ACK-ACK (...etc, etc) TCP handshake, not to mention the fact that go-ipfs will not even try to fallback to TCP 😅. + +Anyway, long story short. We fixed recursive `dnsaddr` resolving so we didn't have to deal with UDP fragmentation. You're welcome. + +### 📻 Retuned Connection Manager + +The Connection Manager has been tuned to better prioritise existing connections by not counting new connections in the "grace" period (30s) towards connection limits. New connections are like new friends. You can't hang out with everyone all the time, I mean, it just gets difficult to book a restaurant after a while. + +You also wouldn't stop being friends with Jane just because you met Sarah _once_ on the train. You and Jane have history, think of everything you've been through. Remember that time when Jane's dog, Dave, ran away? I know, it's a weird name for a dog, I mean who gives a human name to a dog anyway, but I guess that's one of the reasons you like Jane. Anyway, she lost her dog and you both looked all around town for it, you were about to give up but then you heared faint wimpering as you were walking back to the house. Dave had somehow managed to fall into the old abandoned well! + +You see?! History! ...and, erh, what was I saying? Oh yeah, Connection Manager - new connections don't cause us to close useful, existing connections (like Jane). More specifically though, this change solves the problem of your peer receiving more inbound connections than the `HighWater` limit, causing it to disconnect from Jane, as well as all your other good friends (peers not in the grace period) in favor of connections that might not even work out. No-one wants to be friendless, and this fix avoids that awkward situation. Though, it does mean you'll keep more connections in total. Maybe consider reducing the `HighWater` setting in your config. + +### 🍖 Reduced Relay Related DHT Spam + +When `AutoRelay` was enabled, and your IPFS node was unreachable behind a NAT or something, go-ipfs would search the DHT for 3 relays with `RelayHop` enabled, connect to them and then advertise them as relays. + +The problem is that many of the public relays had low connection limits and were overloaded. There's a lot of IPFS nodes in the network, and a _lot_ of unreachable nodes trying their best to hop around via relays. So relay nodes were being DDoSed and they were constantly killing connections. Nodes trying to use the relays were on a continuous quest for better ones, which was causing 95% of the DHT traffic. Eek! + +So, instead of spamming the DHT the whole time trying to find random, potentially poor relays, IPFS is now using a pre-defined set of autorelays. I mean, try to tell me that _doesn't_ make sense. + +### 🐾 Better Bitswap + +Joe has the rare shiny collectable card you've been hunting for forever (since yesterday). You've spotted him, right over there on the other side of the playground. But now that you've found what you're looking for, you're so excited you forget what you were doing and start looking again. + +This is exactly what bitswap is like when you have a bug where you stop trying to connect to providers once you've found enough of them. Specifically, if we found enough providers (100) or timed out the provider request, bitswap would cancel any in-progress connection attempts to providers and walk away. + +We're also now marking frequently used peers as "important" in the connection manager so those connections do not get dropped. This is like, erm, you and Joe being besties. Joe has all the good cards and is surprisingly willing to part with them. Ok, I'll admit, card trading is probably not a great analogy to bitswap 😛 + +### 🦄 And More! + +- Fixed build on go 1.13 +- New version of the WebUI to fix some issues with the peers map + +## 📒 Changelog + +Check out the full [changelog for this release](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#0423-2019-01-29) which has all the details. + +## ❤️ Contributors + +| Contributor | Commits | Lines ± | Files Changed | +| ------------------ | ------- | ---------- | ------------- | +| Steven Allen | 52 | +1866/-578 | 102 | +| vyzo | 12 | +167/-90 | 22 | +| whyrusleeping | 5 | +136/-52 | 7 | +| Roman Proskuryakov | 7 | +94/-7 | 10 | +| Jakub Sztandera | 3 | +58/-13 | 7 | +| hucg | 2 | +31/-11 | 2 | +| Raúl Kripalani | 2 | +7/-33 | 6 | +| Marten Seemann | 3 | +27/-10 | 5 | +| Marcin Rataj | 2 | +26/-0 | 5 | +| b5 | 1 | +2/-22 | 1 | +| Hector Sanjuan | 1 | +11/-0 | 1 | +| Yusef Napora | 1 | +4/-0 | 1 | + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [go-ipfs repo](https://github.com/ipfs/go-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at [discuss.ipfs.io](https://discuss.ipfs.io/) and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +## ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode, which is also [accessible through our Matrix bridge](https://riot.im/app/#/room/#freenode_#ipfs:matrix.org). diff --git a/src/_blog/079-async-await-refactor/README.md b/src/_blog/079-async-await-refactor/README.md new file mode 100644 index 00000000..479a36fb --- /dev/null +++ b/src/_blog/079-async-await-refactor/README.md @@ -0,0 +1,249 @@ +--- +date: 2020-02-01 +url: /2020-02-01-async-await-refactor/ +title: The Async Await Refactor +description: +author: Alan Shaw +--- + +We're on the cusp of completing a refactor in the js-ipfs, js-libp2p and js-ipld codebases to use Promises and remove [Node.js streams](https://nodejs.org/dist/latest/docs/api/stream.html) and [pull streams](https://pull-stream.github.io/) from the code base entirely. We're using `async`/`await` everywhere (i.e. not the vanilla `then`/`catch` style of working with promises) and async iterables, allowing users to consume our streaming APIs with [`for await...of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) loops. + +🚨 If you're using **js-ipfs** or **js-ipfs-http-client**, this is your early warning klaxon - the next releases of these two modules will have BIG breaking changes. Good news though, the [migration guide](https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26) is already written and a pre-release of js-ipfs-http-client is already available for testing (`v42.0.0-pre.0`) along with a comprehensive [list of breaking changes](https://github.com/ipfs/js-ipfs-http-client/releases/tag/v42.0.0-pre.0). So, read this post and then check out those resources, it'll make the transition way easier, I promise you (no pun intended). + +Motivations? Yes, we have them. Many of them in fact. Too many perhaps, because it tipped the scales in favour of a 60+ repo refactor! Something that no developers should take on lightly. + +The refactor is much more than just a switch to promises, it's also primarily a refocus to offer a smaller, streaming-first core API to js-ipfs, giving our team and the community a code base that's much easier to debug, understand and maintain, as well as a few other reasons. + +⚠️ It's important to note that the changes we're making don't actually alter the HTTP API or CLI in any way, these interfaces are untouched and remain compatible with the HTTP and CLI interfaces that go-ipfs exposes. The changes we're referring to only change the [core API](https://github.com/ipfs/interface-js-ipfs-core/tree/master/SPEC), which is the interface you'd use to interact with IPFS programmatically in JavaScript. + +Anyway, motivations, yes, I've listed them below in a rough order of importance: + +## 1. Streaming by default + +We need streaming APIs by default. Currently we provide non-streaming APIs and our users are frustrated when things take a long time to yield any results _and_ they get no feedback. To explain a little, non-streaming APIs buffer data in memory. These are currently the _default_ in js-ipfs but we also provide streaming _alternatives_ of the same API methods. One such example is `ipfs.cat()`, for which we also expose `ipfs.catReadableStream()` and `ipfs.catPullStream()`. + +When the size of the result is small and/or the information is readily available it is absolutely fine to have, and use, buffering APIs; we're not suggesting switching _all_ API methods to be streaming by default. However, when the size of the result is big or unknown and/or may not be instantly available it makes a whole lot more sense for it to be streamed. + +**For big files, it's entirely necessary to stream data to reduce memory pressure**. This is particularly important for IPFS because typically users will not know the size of a file, given a hash, and it will be obtained from a network of poorly connected peers where locality and immediacy cannot be assumed. Bearing that in mind, we should provide APIs that a) encourage developers to do the right thing and not buffer content into memory regardless of the size of the file they're retrieving and b) reduce time to first byte, giving users visibility over progress and allowing them to differentiate between the file being unavailable or it being very large. + +**Removing streaming alternatives reduces our API surface area**. That's good because it means there's simply fewer API methods for developers to understand and choose from. This just makes things a little easier, and by guiding developers towards streaming by default we're hopefully helping them to avoid OOM errors when their applications become popular or are used on resource constrained devices like mobile or when their users start sharing huge files. + +A more concrete benefit of a smaller API surface area is that there is simply less code to ship. There's a lot less boilerplate and fewer streaming modules and conversion utilities that need to be `npm install`-ed or that make their way into the final bundle. That means a smaller `node_modules` directory and smaller browser builds for applications. There's also no performance hits to be had converting between two different streaming implementations. + +## 2. Streaming with async iterables + +Our streaming APIs will use [async iterables](https://javascript.info/async-iterators-generators). That's significant for a couple of reasons. Firstly, since we've been talking about bundle sizes it's worth mentioning that using a streaming implementation that is actually a language feature means that we don't need to _bundle_ any libraries/modules to provide a streaming implementation! Obviously, that also means that we don't need to `npm install` them either. + +Secondly, **async iterables make streaming APIs approachable**. There's a BIG hurdle involved with streaming APIs that is lowered significantly by using async iterables instead of Node.js or pull streams. That hurdle is understanding the naming, usage, and concepts, which developers new to JS or new to streaming have to overcome. + +There's tension between exposing streaming APIs vs exposing an API that is easy to use and understand for _all_ developers. With async iterables, you can boil down the understanding of reading from a stream to a `for` loop (you read an async iterable using [`for await...of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) loops), helping developers instantly draw parallels to one of the first things they learnt in programming and making streaming APIs easier to use. This is simply not the case if your API returns a Node.js `ReadableStream` for example. + +## 3. Better debugging + +One of the best things about debugging in an `async`/`await` code base is that **stack traces are much better**. With callbacks you typically lose the stack trace across an async boundary because with callbacks, the call stack starts at the callback function. + +This can make debugging super difficult because you can't get a good idea of the execution path of the program prior to the async boundary. The situation is improved by using promises, but using `async`/`await` is _even better_: + +> `await X()` suspends execution of the current function, while `promise.then(X)` continues execution of the current function after adding the X call to the callback chain. In the context of stack traces, this difference is pretty significant. +> https://mathiasbynens.be/notes/async-stack-traces + +The upshot is that stack traces are more informative and span async boundaries, giving developers more power to debug code. Take this example using callbacks: + +```js +function one(callback) { + setTimeout(() => two(callback)) +} + +function two(callback) { + setTimeout(() => three(callback)) +} + +function three(callback) { + try { + throw new Error('boom') + } catch (err) { + callback(err) + } +} + +one((err) => console.error(err)) +``` + +It yields the following stack: + +``` +Error: boom + at three (cb-stacks.js:11:11) + at Timeout._onTimeout (cb-stacks.js:6:20) + at listOnTimeout (internal/timers.js:531:17) + at processTimers (internal/timers.js:475:7) +``` + +What happened before the call to `three`? We can't see past the async boundary. An approximately equivalent example using `async`/`await`: + +```js +async function one() { + await two() +} + +async function two() { + await three() +} + +async function three() { + throw new Error('boom') +} + +one().catch((err) => console.error(err)) +``` + +Yields the following stack: + +``` +Error: boom + at three (async-fn-stack.js:10:9) + at two (async-fn-stack.js:6:9) + at one (async-fn-stack.js:2:9) + at Object. (async-fn-stack.js:13:1) + at Module._compile (internal/modules/cjs/loader.js:1063:30) + at Object.Module._extensions..js (internal/modules/cjs/loader.js:1103:10) + at Module.load (internal/modules/cjs/loader.js:914:32) + at Function.Module._load (internal/modules/cjs/loader.js:822:14) + at Function.Module.runMain (internal/modules/cjs/loader.js:1143:12) + at internal/main/run_main_module.js:16:11 +``` + +Aha! We can now trace this all the way back to the call to `one`! + +The second best thing about debugging in an `async`/`await` code base is that synchronous and asynchronous errors are handled by the same construct: `try`/`catch`. + +Asynchronous errors when using callbacks must be handled by checking for an error parameter passed to the callback function using an `if` statement: + +```js +saveData(someData, (err, result) => { + if (err) { + console.error(err) // handle the error + return // remember to return or execution continues! + } + // continue the program, no error happened yet :) +}) +``` + +Synchronous errors can be thrown on purpose, using `throw new Error('...')` or because of bugs in the code e.g. `Cannot read property 'z' of undefined`, `x is not a function` etc. etc. and _must_ be handled with a `try`/`catch` block. + +Typically, developers _trust_ that a call to a function that does asynchronous work will not throw an error _synchronously_ so they don't put `try`/`catch` around calls to them. They also _trust_ that they won't throw an error _after_ they've done some async work because they have no means to catch it - even if there were a `try`/`catch`, program execution has moved outside of the scope of it. Hence the need for any errors to be passed to a callback. So, when using callbacks, any thrown errors, synchronous or asynchronous can cause uncaught exceptions and force a mixing of two different error handling strategies e.g. + +```js +function saveData(someData, callback) { + let serialized + + // Handle synchronous error with try/catch + try { + serialized = JSON.stringify(someData.map((d) => d.value)) + } catch (err) { + // (This should really be called on a future tick or we risk unleashing zalgo + // https://blog.izs.me/2013/08/designing-apis-for-asynchrony) + return callback(err) + } + + fs.writeFile('/path/to/data.json', serialized, (err) => { + // Handle asynchronous error from fs.writeFile with if statement + if (err) { + return callback(err) + } + + callback() + }) +} +``` + +With promises, the situation is significantly better, because thrown errors are caught for you, but you can still be in danger of causing an unhandled rejection if code in a `.catch()` throws an error. + +With `async`/`await` you use only `try`/`catch`, and it works for all errors: synchronous and asynchronous. It reduces boilerplate and guards against uncaught exceptions and unhandled rejections making it significanly less likely your code will take down the process or unrecoverably crash your application: + +```js +async function saveData(someData) { + const serialized = JSON.stringify(someData.map((d) => d.value)) + await fs.promises.writeFile('/path/to/data.json', serialized) +} + +try { + await saveData(someData) +} catch (err) { + // Could be a sync error caused by serialization, or an async error from writing the file + console.error(err) +} +``` + +The other super power that `try`/`catch` has is that you can wrap it around a [`for await...of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) loop to catch errors in a stream. Having had to deal with error handling in Node.js streams for many years I find it _incredible_ that you can just `catch` an error in a stream and continue program execution. Let me explain why: + +If you're familiar with Node.js streams you'll know that you have to add an event listener for the `error` event and then somehow deal with the error, and then continue program execution. You also need to listen for the `data` event _or_ "pipe" the stream somewhere and listen for an event that signifies that the stream has completed. Writable streams have `close` and `finish` events and you have to figure out the correct one to use, while worrying about whether the `close` listener gets called or not when an `error` occurs. Also, readable streams emit an `end` event, so, don't get confused between `end`, `close` and `finish`...or do, because we're all humans. + +Even if you do manage to figure this all out you now have two (or sometimes more) possible continuation points for your program that you have to juggle, which is not always easy. + +Note: it would be remiss of me not to mention that there are modules out there that help with this, [`pump`](https://www.npmjs.com/package/pump) and [`pipeline`](https://nodejs.org/dist/latest/docs/api/stream.html#stream_stream_pipeline_streams_callback) are two popular examples. These utils essentially hide the complexity of dealing with streams, which is convenient, but doesn't always mean you can simply ignore that it's there. + +At this point, `catch`ing an error and being able to continue program execution from the same point after processing a stream asynchronously sounds super appealing! Just incase you didn't already notice this is another reason async iterables make streams aproachable! + +## 4. Improved readability + +Asynchronous code written using `async`/`await` is simply easier to follow than code written using callbacks or vanilla promises. This is a little subjective and I'm pretty sure there are ways and means of writing `async`/`await` code to make it more difficult to follow but for the most part, asynchronous code that can be read as though it is synchronous is easier to follow. + +This is also true when working with conditionals. Things get hairy pretty quickly as soon as you need to conditionally execute async tasks and then continue with some common code. There's libraries that'll help with this but just being able to use an `if` statement is so much easier and doesn't require the cognitive overhead of understanding those libraries. + +Readability is also improved by the reduction in overall code to look at. By this I mean that there's a lot less boilerplate involved with asychronous code written using `async`/`await`. In refactoring our callback based code we often found ourselves reducing 3 (or more) lines of code down to a single statement that achieved exactly the same task. + +## 5. Performance improvements + +The reduction in boilerplate in combination with the reduced API surface area (which meant we could remove many modules relating to different stream implementations) means **js-ipfs will be faster to `npm install`, take up less disk space and be smaller when bundled with your dweb applications**. A smaller bundle is great for saving bandwidth, but also faster to download and friendlier in low powered or resource constrained environments. + +Any kind of streaming that was done previously was passing chunks through various conversion libraries and we were taking a performance hit for every chunk. This has been eradicated from js-ipfs and now we only do conversions where absolutely necessary when interfacing with TCP or WebSocket libraries for example. + +Another important performance improvement of switching to streaming APIs by default is that it actually **enables operations that were previously impossible**, like listing a really really really REALLY big directory. We put the entirety of npm on js-ipfs a while ago and had this problem - our process just hung and eventually ran out of memory. + +Outside of the `async`/`await` world, we've taken this opportunity to make some other changes we always wanted to get done to improve preformance, here's a few interesting ones: + +1. Removed crypto libraries from js-ipfs-http-client. These were being brought in by the [`PeerId`](https://www.npmjs.com/package/peer-id) class and were basically unused. Instead of `PeerId` instances we now return strings, which, for the HTTP API does not result in any loss of information and it's made a huge reduction to the bundle size of the HTTP client. +1. Use [`BufferList`](https://www.npmjs.com/package/bl) throughout libp2p. This helps reduce unnecessary (and slow) buffer copies. Instead of using `Buffer.concat`, we just pass around `BufferList` instances and concat them together when absolutely necessary. +1. Return [`CID`](https://www.npmjs.com/package/cids) instances from core. This simply reduces the amount of conversions between string and buffer forms of CIDs. If you never need to see a CID as a string, you no longer have to do the work of encoding it. Previously this wasn't the case and all CIDs would be converted to strings and core would make assumptions about what multibase the CID should be encoded with. + +Be sure to read the release notes when js-ipfs 0.41 is released because we will pack it with as many perf stats as we can get our hands on. + +## 6. It's the right time to switch + +Using `async`/`await` in JavaScript is gaining a _lot_ of traction in the ecosystem and is rapidly becoming the de facto way of writing idiomatic JS. We want js-ipfs to **move with the times and continue to be attractive to contributors** by using modern JS features, techniques and practices. The big idea with these changes is for the code to be easier to contribute to, easier to understand, easier to maintain, and be faster and smaller than ever. + +The `async`/`await` syntax, async iterables and `for await...of` loops are now supported by the overwhelming majority of browsers as well as Node.js since v10. It means that we can continue to _not_ transpile our code, keeping debugging nice and easy. + +Another great reason to make this switch is that **Node.js streams are async iterable**, and have been for a while now. So we can switch to async iterables and remove Node.js streams from the code base, but that doesn't stop us from accepting them as inputs because we don't need any special streaming code to be able to read from them. Browser streams will also hopefully follow this move too. + +In rewriting the code base we built a few tools to help us work with async iterables and share code. They mostly begin with the `it-` prefix (for "iterable") which follows other existing module themes like the `p-` ("promises") collection of modules. They're being documented here: https://github.com/alanshaw/it-awesome + +One thing you should know about these tools is that there's an iterator helpers proposal (https://github.com/tc39/proposal-iterator-helpers) at stage 2 of the TC39 process, so... + +> The committee expects the feature to be developed and eventually included in the standard + +It means that when/if the proposal makes it into the standard a bunch of them will become obsolete, so instead of, for example: + +```js +const all = require('it-all') +const filesAdded = await all( + ipfs.add([ + /* ... */ + ]) +) +``` + +You will be able to, more simply: + +```js +const filesAdded = await ipfs + .add([ + /* ... */ + ]) + .toArray() +``` + +Awesome, huh!! + +...and that's about...half of what needs to be said on the `async`/`await` refactor 😉. In the next blog post we'll cover some of the learnings of completing this big code refactor with a distributed team. In the mean time, watch out for the upcoming js-ipfs 0.41 RC and the release post when it finally lands. diff --git a/src/_blog/080-big-refactors/README.md b/src/_blog/080-big-refactors/README.md new file mode 100644 index 00000000..12d4595f --- /dev/null +++ b/src/_blog/080-big-refactors/README.md @@ -0,0 +1,31 @@ +--- +date: 2020-02-06 +url: /2020-02-06-big-refactors/ +title: Big Refactors +description: +author: Alan Shaw +--- + +> If you're considering a refactor that'll touch **~70** interdependent repos, you've come to the right place for some perspective! This is the sister post to [The Async Await Refactor](/2020-02-01-async-await-refactor/) and covers some of the learnings of completing a big code refactor with a distributed team. + +If you think you'd like to take on a challenge like this, do the math. If each repo takes a day to refactor and if you work on it 5 days a week then you've automatically used 14 of your 52 weeks in a year. That's like, 4 months, and that's the absolute best case scenario. + +In reality, even if you get approval to do it you're unlikely to be able to work on it all day every day. The problem is that the benefits of a refactor can't always be seen until everything is done and the whole stack is using the new code. The point is, **your project needs to keep moving**. New features need to land and those bugs don't squash themselves. + +Refactors to each dependent repo **won't take just one day**. A tiny percentage of them will take less than a day but the vast majority will take multiple days to complete, if not weeks. + +You'll be tempted to make those API changes and performance refactors you've always wanted to make. **Beware of scope creep**. If you also decide to take on these tasks, be aware that you're adding to the complexity of integrating a massive breaking change and also to the time the refactor is going to take. You'll probably significantly underestimate the amount of extra time your additional changes will take to write, be tested, be reviewed and re-integrated into the project. You are also likely to introduce new bugs, so **stay focused**. You cannot make everything perfect now. Pick your battles, open issues, and move on. + +Some repos will just take days or weeks to actually convert, and that's not even including converting the tests, getting your work reviewed, making changes from review feedback or rebasing your work because master got this critical security fix in the interim. + +Prioritise refactors by dependents. It's obvious, but maybe worth highlighting - the only way you're going to get this done is from the bottom up. **Refactor repos that don't depend on anything first**. Make a list and assign an approximate priority to each repo based on how many other repos it depends on. This creates an opportunity to audit your project's structure and cross-module interdependencies. We removed a lot of dev-deps on IPFS and libp2p from modules low in the stack as part of this refactor, speeding up test runs and making CI significantly more reliable. + +It's not always possible to use a refactored repo in your dependencies. Sometimes this is due to a circular dependency but sometimes the refactor in another repo is taking longer than expected or is blocked on something else. **Unblock yourself with facades**. You can make the old look like the new but consider it carefully. Doing this takes time and will need to be revisited at a later date to be removed once the dependency refactor is released. In our refactor we made use of `promisify` and `callbackify` modules and also created facades to make the new look like the old so that it could get into production sooner. + +Leverage npm tags. The "latest" tag is what everyone gets when they `npm install yourmodule`, but you can publish betas, experimental builds, or release candidates (for example) under whatever tag name you choose. Consumers will only get that version if they explicitly install it by the tag name or the version number associated with the tag. + +This helps when you want to publish a refactored module but don't want it to actually be used yet by your users because it's not compatible with the rest of the modules in your ecosystem. We had a few issues with users trying to use the new with the old. Using npm tags allowed us to do these releases earlier, roll them up into their dependents and avoid issues with users pulling down releases early. The beauty with this is that when it's time to go live, it's a simple switch of tags on npm. No new code needs to get deployed, which also means you're guaranteed to be using the exact code you tested with. + +**Keep track of what's been done, who is owning what, and where the PR is**. For you own sanity, keep on top of it and celebrate your progress with the team every step of the way. It's a long road and you and your team will need all the encouragement you can get. Update the team and your community regularly with percentages of how done you are so you can all stay informed of progress and allow yourself to make better estimates for completion. + +It's taken us 1 year and 3 months so far, but we're nearly there. Read all about our big refactor: [The Async Await Refactor](/2020-02-01-async-await-refactor/). diff --git a/src/_blog/081-js-libp2p-0.27/README.md b/src/_blog/081-js-libp2p-0.27/README.md new file mode 100644 index 00000000..155fb4e1 --- /dev/null +++ b/src/_blog/081-js-libp2p-0.27/README.md @@ -0,0 +1,172 @@ +--- +date: 2020-02-07 +url: /2020-02-07-js-libp2p-0-27/ +title: js-libp2p 0.27 released +description: +author: Jacob Heun +header_image: 081-js-libp2p-0.27.png +--- + +It's heeeeere! After a very long road, and a lot of [lessons learned](/2020-02-06-big-refactors/), the Async Await refactor of js-libp2p has landed in the **0.27** release. If you're not familiar with the refactor you can read up more about the reasons and history in a recent blog post by the wonderful Alan Shaw, [The Async Await Refactor](/2020-02-01-async-await-refactor/). In addition to the efforts mentioned there, the refactor to js-libp2p includes a slew of additional improvements, the highlights of which you can read about below. + +In addition to these highlights, we've consolidated many of the core modules of js-libp2p into js-libp2p itself in an effort to make it easier for community members to contribute. We've also consolidated our interface repositories into [libp2p/js-interfaces](https://github.com/libp2p/js-interfaces) and improved the documentation and test suites there. + +And a wonderful bonus, we've measured memory usage improvements between **30-40%** compared to the previous version, 0.26! + +We're really excited for 2020 and the opportunities this HUGE effort has opened for js-libp2p, and we're looking forward to making it even better! + +# 🔦 Highlights + +## 📜 Improved docs + +We've done an overhaul of our docs to make libp2p easier to use. Among other docs in the new [doc][docs] folder, you can find a full list of exposed methods in the [API.md][api], and a guide on how to configure libp2p in [CONFIGURATION.md][config]. We've also created a [Getting Started guide][getting_started] for anyone starting out with libp2p. + +## ⌚️ Async/Await instead of Callbacks + +All callback APIs have been changed to be async / await compliant. See the [API.md][api] readme for detailed usage. When migrating, you can leverage the [migration guide][migration] to see samples on some of the common migrations you may need to make. + +## 🚰 Streaming Iterables instead of Pull Streams + +Now that readable streams are async iterable, we can leverage [Streaming Iterables][streaming_iterables] instead of Pull Streams to greatly simplify the internal stream logic of libp2p. Among other things, this makes debugging streams much easier. You can check out the [it-awesome repo](https://github.com/alanshaw/it-awesome) for a list of an increasing number of modules built for the streaming iterables ecosystem. This also includes modules to convert to and from pull streams if you need to refactor your applications over time. If you're having trouble migrating, please feel free to reach out on the [discuss forums][discuss]! + +## 📞 Clearer Connections + +We've created a whole new [Connection Interface][connection]! Creating multiple streams off of a single connection is now much clearer, and every stream created is tracked in the Connection. This makes it much easier to keep track of every open stream, which greatly empowers resource management in js-libp2p. + +```js +// Was +libp2p.dialProtocol(remotePeerInfo, protocol, (error, stream) => {}) + +// Now +const connection = await libp2p.dial(remotePeerInfo) +const { stream, protocol } = await connection.newStream(protocols) +const allStreams = connection.streams +``` + +## ⏹ Abortable Dials + +We've reconstructed transports and connections from the ground up. This gives us the ability to pass an [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) when dialing, so we can now properly terminate connections early. This also means we'll be able to add proper support for parallel dials to reduce connection times without running the risk of lingering dials. + +```js +const controller = new AbortController() +libp2p.dial(remotePeerInfo, { signal: controller.signal }) +// after a short delay... +controller.abort() +``` + +## 🆔 The Identify Push Protocol + +[Identify Push](https://github.com/libp2p/specs/tree/master/identify#identifypush) is now available in js-libp2p. As a libp2p node changes its Multiaddrs (changes in networks) or protocols, it will broadcast those changes to all connected peers. Once support for AutoNAT and AutoRelay is added to js-libp2p, we will be able to broadcast those changes maximizing the effectiveness of those protocols. + +## 🔍 Plaintext 2 for testing + +We've upgraded from [Plaintext 1 to 2](https://github.com/libp2p/specs/tree/master/plaintext#protocol-id-and-version-history). If you need to test things locally without encryption to see what's going on over the wire, Plaintext 2 makes this more viable. Public Keys are now exchanged, which is required by many protocols. This should NEVER be used in production, happy testing! + +## 🙏 More polite connections + +Currently when two nodes connect, they will actively ask each other what protocols they support. This ends up being multiple checks in parallel, rather than getting the information from a single Identify check. js-libp2p will now only use Identify. This greatly reduces network chatter. The `peerStore`, formerly `peerBook` to better match common libp2p terminology, will now emit change events for protocols. Applications that need to check for protocol support can now politely listen for updates, instead of actively checking every peer that connects. + +```js +libp2p.peerStore.on('change:protocols', ({ peerInfo, protocols }) => { ... }) +``` + +## 📊 Metrics (formerly Stats) can now be enabled/disabled + +We're making `stats` disabled by default and they are now available at `libp2p.metrics` instead of `libp2p.stats`. You can enable metrics if you need them, but for performance reasons we have disabled them by default. Good news, if you need to run them they're more performant as we've moved away from event emitting in metrics. This greatly reduces the amount of processing that happens until you explicitly request something! You can read more about Metrics at [METRICS.md][metrics]. + +# 🏗 API Changes + +See the [API.md][api] readme for detailed usage on the new API. Significant breaking changes are detailed below. + +- Callbacks are no longer supported, async / await is now used for all asynchronous methods. See [API.md][api] for a full list of methods. +- Pull streams have been replaced by [Streaming Iterables][streaming_iterables] +- `libp2p.peerBook` is now `libp2p.peerStore` to match common libp2p terminology. +- `libp2p.stats` is now `libp2p.metrics`. +- `libp2p.pubsub.ls` is now `libp2p.pubsub.getTopics`. +- `libp2p.pubsub.peers` is now `libp2p.pubsub.getSubscribers`. +- `libp2p.ping` now simply returns the latency of the ping. See the [migration guide][migration] for more details. + +# ❤️ Huge thank you to everyone that made this release possible + +In alphabetical order, here are the 60 humans that made 1241 contributions to this release: + +- [AgentJ-WR](https://github.com/AgentJ-WR) (1 PR, 1 issue) +- [Akulich Paul](https://github.com/pashoo2) (2 PRs, 1 issue, 2 reviews, 5 comments) +- [Alan Shaw](https://github.com/alanshaw) (16 PRs, 1 issue, 31 reviews, 14 comments) +- [Alex Potsides](https://github.com/achingbrain) (10 PRs, 6 issues, 7 reviews, 5 comments) +- [Anton Nashatyrev](https://github.com/Nashatyrev) (1 issue, 1 comment) +- [Arve Knudsen](https://github.com/aknuds1) (1 comment) +- [Blake Byrnes](https://github.com/blakebyrnes) (1 issue, 1 comment) +- [bruinxs](https://github.com/bruinxs) (1 PR, 1 issue, 1 comment) +- [Carson Farmer](https://github.com/carsonfarmer) (3 PRs, 1 issue, 3 reviews, 17 comments) +- [Cayman](https://github.com/wemeetagain) (2 PRs, 1 issue, 17 reviews, 7 comments) +- [Chadwick Dahlquist](https://github.com/bugeats) (1 comment) +- [Christian M](https://github.com/chriamue) (1 PR) +- [Christian Paul](https://github.com/jaller94) (1 PR) +- [David Dias](https://github.com/daviddias) (2 PRs, 4 issues, 21 reviews, 21 comments) +- [Didrik Nordström](https://github.com/betamos) (1 PR, 1 comment) +- [Dietrich Ayala](https://github.com/autonome) (1 comment) +- [Dima](https://github.com/DieMyst) (1 issue) +- [dirkmc](https://github.com/dirkmc) (5 PRs, 1 issue, 7 reviews, 2 comments) +- [emclab](https://github.com/emclab) (1 issue, 1 comment) +- [Eric Tu](https://github.com/ec2) (1 review) +- [folex](https://github.com/folex) (1 comment) +- [Friedel Ziegelmayer](https://github.com/dignifiedquire) (1 review, 1 comment) +- [George Farcasiu](https://github.com/georgeaf99) (1 comment) +- [Gopalakrishna Palem](https://github.com/KrishnaPG) (2 issues) +- [Gregory Markou](https://github.com/GregTheGreek) (4 reviews, 3 comments) +- [Guo Liu](https://github.com/guoliu) (1 issue, 1 comment) +- [Henrique Dias](https://github.com/hacdias) (1 review, 2 comments) +- [Hugo Dias](https://github.com/hugomrdias) (2 reviews) +- [Jacob Heun](https://github.com/jacobheun) (59 PRs, 6 issues, 240 reviews, 80 comments) +- [Jorropo](https://github.com/Jorropo) (1 PR) +- [kumavis](https://github.com/kumavis) (1 PR, 1 issue, 1 review, 6 comments) +- [Maciej Krüger](https://github.com/mkg20001) (2 PRs, 2 issues, 17 reviews, 30 comments) +- [Marcin Rataj](https://github.com/lidel) (2 PRs, 13 reviews, 1 comment) +- [Marcus Bernales](https://github.com/mboperator) (1 PR) +- [Marin Petrunić](https://github.com/mpetrunic) (1 PR, 1 issue, 5 reviews, 3 comments) +- [Maying(Matt) Shi](https://github.com/chinesebug) (1 issue) +- [mcclure](https://github.com/mcclure) (2 issues, 3 comments) +- [Mikeal Rogers](https://github.com/mikeal) (1 review) +- [Nate Foss](https://github.com/npfoss) (2 PRs) +- [Oli Evans](https://github.com/olizilla) (2 comments) +- [phillmac](https://github.com/phillmac) (1 PR, 1 comment) +- [Raúl Kripalani](https://github.com/raulk) (1 comment) +- [ridenaio](https://github.com/ridenaio) (1 issue) +- [Roman Proskuryakov](https://github.com/kpp) (1 comment) +- [Rui Fortes](https://github.com/ruifortes) (2 issues) +- [Ryan Bell](https://github.com/iRyanBell) (1 PR) +- [shresthagrawal](https://github.com/shresthagrawal) (1 PR, 1 issue) +- [Stavros Charitakis](https://github.com/sce9sc) (1 issue) +- [swedneck](https://github.com/swedneck) (1 PR) +- [Teri Chadbourne](https://github.com/terichadbourne) (1 comment) +- [Tony Jin](https://github.com/nijynot) (1 PR, 1 issue, 2 comments) +- [Topper Bowers](https://github.com/tobowers) (3 PRs, 2 issues, 13 comments) +- [tuyennhv](https://github.com/tuyennhv) (1 review, 1 comment) +- [Vasco Santos](https://github.com/vasco-santos) (91 PRs, 7 issues, 254 reviews, 79 comments) +- [Yusef Napora](https://github.com/yusefnapora) (1 review) +- [Ziwei_Wei](https://github.com/Ziwei-Wei) (1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [libp2p repo](https://github.com/libp2p/js-libp2p/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt#all-hands-call +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at http://discuss.libp2p.io/ and help users finding their answers. +- Join the [⚡️libp2p Weekly Sync 🙌🏽](https://github.com/libp2p/team-mgmt/issues/16) and be part of the Sprint action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about libp2p, how it works and what you can do with it is at [discuss.libp2p.io](https://discuss.libp2p.io). We are also available at the #libp2p channel on Freenode. + +[api]: https://github.com/libp2p/js-libp2p/blob/master/doc/API.md +[config]: https://github.com/libp2p/js-libp2p/blob/master/doc/CONFIGURATION.md +[docs]: https://github.com/libp2p/js-libp2p/blob/master/doc/ +[getting_started]: https://github.com/libp2p/js-libp2p/blob/master/doc/GETTING_STARTED.md +[metrics]: https://github.com/libp2p/js-libp2p/blob/master/doc/METRICS.md +[migration]: https://github.com/libp2p/js-libp2p/blob/master/doc/migrations/v0.26-v0.27.md +[streaming_iterables]: https://github.com/libp2p/js-libp2p/blob/master/doc/STREAMING_ITERABLES.md +[discuss]: https://discuss.libp2p.io +[connection]: https://github.com/libp2p/js-interfaces/tree/master/src/connection#interface-connection diff --git a/src/_blog/082-ethdenver-2020/README.md b/src/_blog/082-ethdenver-2020/README.md new file mode 100644 index 00000000..427d7d2f --- /dev/null +++ b/src/_blog/082-ethdenver-2020/README.md @@ -0,0 +1,30 @@ +--- +date: 2020-02-07 +url: /2020-02-07-ethdenver-2020/ +title: Hack with us at ETHDenver +description: +author: Jenn Turner +header_image: 082-ethdenver-2020.png +--- + +![IPFS at ETHDenver 2020](https://user-images.githubusercontent.com/50103/73981264-bbe13d00-48e6-11ea-8446-033257df44bc.png) + +Next week, the IPFS team will be heading to Denver, Colorado for [ETHDenver](https://www.ethdenver.com/), one of the biggest Ethereum and decentralized web developer-focused events in the US. We’re very excited to connect with the dweb community during a week full of presentations, workshops, [#BUIDLathon](https://www.ethdenver.com/buidlweek/)-ing, and community gathering. + +On Thursday, February 13, the IPFS Community is hosting the [Distributed Networks Summit](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487?aff=protocollabs), featuring speakers and workshops from IPFS Core, Protocol Labs, Textile, ProtoSchool, 3Box, RTrade Technologies, Pinata, Althea, Quorum Control, Kauri, and more! [Register to attend](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487?aff=protocollabs) so you can figure out how to implement IPFS in your dapp, with the advice from leading experts. Think of it as our early Valentine’s Day gift from the IPFS community to you. 💝 + +## Did we mention we have bounties? + +We’ll have bounties for using and improving IPFS, and building IPFS or our community’s libraries and services into your dapps—all managed through the ETHDenver DAO. ETHDenver will announce the bounties on February 10th, so until then take a look at [awesome.ipfs.io](https://awesome.ipfs.io/) to get your mental propellers spinning! + +## Join us at the following events + +- [The Pre-Hack Social](https://www.eventbrite.com/e/the-pre-hack-social-tickets-90279882559) on Wednesday, February 12 + +- All day long at the [Decentralized Network Summit](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487?aff=protocollabs), Thursday, February 13 + +- Stop by the IPFS Booth at [ETHDenver](https://www.ethdenver.com/) all day Friday, February 14 through Sunday, February 16. + +You can still [sign up to attend at ETHDenver.com](https://ethdenver.devfolio.co/). + +2019 took the IPFS Community in so many inspiring directions. We can’t wait to see where the community is headed in 2020. See you there! diff --git a/src/_blog/082-ethdenver-2020/ipfs-ethdenver.png b/src/_blog/082-ethdenver-2020/ipfs-ethdenver.png new file mode 100644 index 00000000..ab911cdc Binary files /dev/null and b/src/_blog/082-ethdenver-2020/ipfs-ethdenver.png differ diff --git a/src/_blog/082-our-focus-for-2020/README.md b/src/_blog/082-our-focus-for-2020/README.md new file mode 100644 index 00000000..16d9f384 --- /dev/null +++ b/src/_blog/082-our-focus-for-2020/README.md @@ -0,0 +1,121 @@ +--- +date: 2020-02-10 +url: /2020-02-10-our-focus-for-2020/ +title: IPFS Project Focus for 2020 +description: +author: Molly Mackinlay +header_image: 082-our-focus-for-2020.png +--- + +_"The mission of IPFS is to create a resilient, upgradeable, open network to preserve and grow humanity’s knowledge."_ + +It’s a new year, and with it time to update the [IPFS Project Roadmap](https://github.com/ipfs/roadmap) with our focus for 2020. As part of that, we also want to reflect on our successes, challenges, and learnings from 2019 to help us stay on track to achieve our mission, and maximize the value and utility we create in the world. + +> Looking for the TL;DR? Hop right over to the [2020 section of our IPFS Roadmap](https://github.com/ipfs/roadmap#2020-priority) to see our focus and epics for the next year. + +## Looking Back at 2019 + +2019 was a super exciting year for the IPFS Project: + +- The IPFS Public Network grew by **30x in 2019**! 🚀 +- **💯s of thousands of nodes** are participating in the IPFS Network daily +- **Millions of users** access the IPFS HTTP Gateway every week 🎉 +- There are **hundreds of dapps, tools, & projects** in the wider IPFS Ecosystem including newcomers like [Anytype](https://anytype.io/), [Microsoft ION](https://techcommunity.microsoft.com/t5/azure-active-directory-identity/toward-scalable-decentralized-identifier-systems/ba-p/560168), [Haven](https://gethaven.app/) by OB1, [Brave](https://brave.com/), [3box](https://3box.io/), [EthDNS](https://medium.com/the-ethereum-name-service/ethdns-9d56298fa38a) and more!! 🙌 + +![IPFS Ecosystem Diagram](https://user-images.githubusercontent.com/618519/74373908-3819cb80-4d92-11ea-816a-1b6f04002b4c.png) +See our [Ecosystem Update from IPFS Camp](https://www.youtube.com/watch?v=jpQnQbfhuBc&feature=youtu.be) to learn more about 2019 adoption! + +This growth caused us to shift some of our attention midyear to support new usage and demand - re-focusing some of our working groups on improving documentation, gateway performance, and testing tools to validate large-scale network upgrades (see our [Operation Task-Force blog post](https://blog.ipfs.io/2019-07-31-operation-task-force/) for details). We still made progress on our Package Managers goal, but less than we hoped given **also** investing heavily in other critical areas to support the ecosystem. 🤞 + +### 5 Notable Wins + +1. We held the first [IPFS Camp](https://www.youtube.com/watch?v=cQJXnJDbXv4&feature=youtu.be), a gathering for developers and builders in the wider InterPlanetary community to [learn](https://blog.ipfs.io/2019-09-18-ipfs-camp-course-videos/), [share](https://www.youtube.com/playlist?list=PLuhRWgmPaHtQVNQcBaCKg5kKhfOBv45Jb), and [demo](https://blog.ipfs.io/2019-10-03-ipfs-camp-sci-fi-fair-videos/) their work (see [this recap](https://blog.ipfs.io/2019-07-08-ipfs-camp-recap/) for more)! 🏕 +2. We made significant progress on our Package Managers goal (read on for awesome new features like [collaborative clusters](https://blog.ipfs.io/2020-01-09-collaborative-clusters/)!) 🎯 +3. We developed and launched [TestGround v0.1](https://github.com/ipfs/testground/releases/tag/v0.1.0) in collaboration with the libp2p team, a platform for testing distributed systems and networks at various scales ⚖️ +4. We launched [ProtoSchool](https://proto.school/#/), a new portal for interactive tutorials to learn about decentralized web concepts, protocols, and tools, with 23 chapters across 4 continents! 🌏 +5. We built a [new IPFS docs site](https://blog.ipfs.io/2020-01-07-ipfs-docs-beta/) with improved search, information architecture, and explainers on InterPlanetary concepts 📖 + +## Our 2019 Roadmap + +To chart our path for the year, we did a large 2019 Roadmapping effort to write down our [mission](https://github.com/ipfs/roadmap#ipfs-mission-statement), define some of the many [long-term goals for the IPFS Project](https://github.com/ipfs/roadmap#future-goals), and [prioritize](https://github.com/ipfs/roadmap#sorting-function) where to focus our energy first. We had a lot of “planning” debt, so going from 0 to 1 on a project roadmap was a large endeavor. Our process involved each working group generating a roadmap around a shared goal, and then merging important work streams into “epics” for the whole project that highlighted our major objectives. You can see how we did against these objectives in our [2019 Project Roadmap](https://github.com/ipfs/roadmap/blob/master/2019-IPFS-Project-Roadmap.md), or dive more into how we chose those goals in our [2019 Roadmap blog post](https://blog.ipfs.io/78-ipfs-2019-roadmap). + +### Our Focus on Package Managers + +Our main goal for last year was to improve IPFS performance and scalability by analyzing the needs and pain points for using IPFS in **Package Managers**. This goal was less about _package management_ in particular, and more about defining a representative use case we could research, test, and drive improvements around that would **also** benefit all downstream IPFS users with similar performance and scalability needs for adding, updating, and fetching large datasets. + +Focusing on a representative use case like package managers brought focus and structure to our prioritization of improvements to IPFS. We built a number of proofs-of-concept (POCs) like [apt-on-ipfs](https://github.com/ipfs-shipyard/apt-on-ipfs), [npm-on-ipfs](https://github.com/ipfs-shipyard/npm-on-ipfs), [clojars-on-ipfs](https://github.com/ipfs-shipyard/clojars-mirror-test) and [homebrew-on-ipfs](https://github.com/ipfs/package-managers/issues/12) to analyze how well IPFS performed against user expectations for adding, updating, and fetching large package repositories—allowing us to identify and fix major pain points. For example, our POCs identified a huge bottleneck in adding GBs of data to IPFS. Further testing resulted in _doubling_ the speed of adding on Linux & OSX devices by switching to async-by-default datastores.🎉 While IPFS had previously taken **24mins** to add an Arch Linux repo, after [these fixes](https://github.com/ipfs/go-ipfs/issues/6523#issuecomment-546822191) it only took **11mins** (comparable to the time to copy/paste)! _Note: improvement seen on the badger datastore, already 3x faster than flatfs!_ + +Our Package Managers goal also helped focus our user research, quarterly objectives, and collaborations. In Q1&2, our Package Managers team surveyed the space and identified core needs documented in our [Package Managers repo](https://github.com/ipfs/package-managers). These insights informed our [quarterly OKR planning](https://github.com/ipfs/team-mgmt/blob/master/OKR/PACKAGE-MANAGERS.md), driving features to make it easier to mirror file system package managers on IPFS. One particular addition was adding metadata on “last updated” time to our unixfs data model to support smarter/faster package updates (humbly named “unixfsv1.5” and already implemented in js-ipfs; coming soon to go). A number of these package-manager-focused improvements are all slated to roll out in our next feature release, go-ipfs 0.5.0 - [feel free to follow along here](https://github.com/ipfs/go-ipfs/issues/6776) or grab the latest master to try them out! + +We also formed collaborations with IPFS users to partner on improving IPFS for package management use cases. One of our main collaborations was with [Netflix](https://netflix.com) to optimize the speed of fetching large container images with [Bitswap](https://github.com/ipfs/go-bitswap), our peer-to-peer data transfer algorithm. You can read more about that specific collaboration—and the resulting improvements in Bitswap performance!—in our [new blog post](/2020-02-14-improved-bitswap-for-container-distribution/)! + +

+5ms-1024MB5ms-40MB +

+ +IPFS Cluster also released _[collaborative clusters](https://blog.ipfs.io/2020-01-09-collaborative-clusters/)_, a new feature to enable package manager maintainers and mirrors to add and replicate repositories across a community of IPFS nodes. With collaborative clusters, any maintainer can push new updates to the pinset of data to mirror, which is then sharded and sync’d across all mirroring nodes. We’ve already seen package managers like Pac-Man added to collaborative clusters along with many “data package managers” like Wikipedia and Project Gutenberg, [follow these instructions to add your own!](https://collab.ipfscluster.io/) + +### How We Did Against Our Package Managers Goal + +We made huge strides this year on the performance at scale needed by many package manager communities, but it’s clear there’s still lots of work left to be done to achieve widespread adoption and meet the needs of more types of package managers. While focusing on a specific use case _did_ help us identify and drive important fixes, it didn’t give us feedback across the entire IPFS ecosystem as to what pain points were top priority blockers to growth or value-add. We also found that a number of paths to increasing IPFS usage in package managers were actually divergent from the core goal we wanted to achieve: making IPFS itself better. This tension required constant vigilance to ensure features and improvements would be felt by many downstream use cases—not just specialized package manager tooling. + +In the end, we succeeded at staying focused, not building another new package manager, and landing a ton of features and improvements to make IPFS better for everyone; where we didn’t succeed was shipping and integrating those improvements directly into existing package managers to drive adoption and visibility of IPFS with an awesome community of aligned and talented developers. With the [features and improvements landing in go-ipfs 0.5.0](https://github.com/ipfs/go-ipfs/issues/6776), that future adoption work is significantly unblocked, however we also learned through our research that many package manager communities aren’t fast adopters of new tooling around package distribution due to the semi-pro-bono nature of maintainership. To support a slower, more ad-hoc adoption cadence, we plan to use channels like [DevGrants](https://github.com/ipfs/devgrants) and Collaborations to support package manager adopters acting within their own communities. This allows us to continue focusing our core working groups on improving and augmenting the core protocol and reference implementation, while supporting many community applications and refinements of these tools. + +Excited to use these new improvements to IPFS in your package management use case? [Make an issue in the package managers repo](https://github.com/ipfs/package-managers/issues) for the latest recommendations! + +## 2020 Roadmapping Process + +We did a slightly different roadmapping process this year, after learning from the wins and challenges we encountered with our massive roadmapping endeavor in 2019. Rather than starting with project goals to inspire a distributed working group roadmapping process (which was difficult to merge and hard to make open), we decided to flip the order of things and start with a [broad call for themes and suggestions](https://github.com/ipfs/roadmap/blob/master/2020-IPFS-Project-Planning.md) from the community for where the IPFS Project should focus in 2020. + +We got [**11** awesome proposals](https://github.com/ipfs/roadmap/issues), with great ideas and discussion across a wide variety of tracks. Notable mentions include [IPFS in Rust](https://github.com/ipfs/roadmap/issues/54), [IPFS for Mobile](https://github.com/ipfs/roadmap/issues/45), [IPFS-Wikipedia](https://github.com/ipfs/roadmap/issues/46), and [IPFS-powered GitHub](https://github.com/ipfs/roadmap/issues/43). Huge thank you for the community members who took the time to write these proposals, and call out the core needs and gaps, which fed directly into our next stage! + +

+

+

+ +During our IPFS Planning “Spike”, we took stock of our wider ecosystem and project health. We synthesized feedback from [top IPFS users](https://user-images.githubusercontent.com/618519/69945610-c58d9500-149e-11ea-9be8-7429c4d9a201.png), sourcing many ideas and needs from the ‘core needs & gaps’ section of each 2020 Theme Proposal. We also reflected on the biggest pain points and risks to the IPFS Project’s long term goals and mission to refocus on our north star. Looking at the skills and capacity of our core working groups, we created a set of [decision-making criteria](https://github.com/ipfs/roadmap#2020-h1-priority-selection-criteria) to identify where to allocate this subset of IPFS contributors for maximum impact, expanded on a set of top candidates (sourced both from the 2020 theme proposals and the exploration of wider project pain points), and ultimately made a decision. + +### 2020 Focus: Improving Content Routing + +> Based on our decision-making criteria, we chose **improving the performance and reliability of Content Routing in the IPFS network** as our main priority for the next 6 months (through mid-year 2020). + +‘Content routing’ is the process of finding a node hosting the content you’re looking for, such that you can fetch the desired data and quickly load your website, dapp, video, or data. As the IPFS public network scaled this past year (over 30x!), it ran into new problems in our distributed routing algorithms: struggling to find content spread across many unreliable nodes. This was especially painful for [IPNS](https://docs.ipfs.io/guides/concepts/ipns/), which relied on _multiple_ of these slow/unreliable queries to find the latest version of a file. These performance gaps caused IPFS to lag and stall while searching for the needed content, hurting the end user experience and making IPFS feel broken. Searching the network to find desired content (a.k.a., using IPFS as a decentralized CDN) is one of the most common actions for new IPFS users and is required by most ipfs-powered dapp use cases—therefore, it’s the **number 1 pain point** we need to mitigate in order to unlock increased adoption and scalability of the network! Our goal for midyear: **95th percentile content routing speed is less than 5 seconds.** + +To achieve this goal, we’ve formed a Content Routing team (and spun down our Package Managers working group) to focus our main engineering effort on this problem for the next 6 months. Improving content routing performance requires making improvements and bugfixes to the go-libp2p DHT _at scale_, and changing how we form, query, and resolve content in the IPFS network to be faster and more resilient. This involves a combination of research, design, implementation, and testing. Making changes to the _configuration of the entire network_ is non-trivial, which is why we’ve been investing in the [InterPlanetary Testground](https://github.com/ipfs/testground/), a new set of tools for testing next generation P2P applications, to help us diagnose issues and evaluate improvements prior to rolling out upgrades to the entire public network. You can follow along with the team's work in the [Content Routing ZenHub Roadmap](https://app.zenhub.com/workspaces/content-routing-2020-5e29be25ab9d8da0b032cfcc/roadmap): + +

+ +Screen Shot 2020-02-10 at 8 08 00 PM + +

+ +We considered a number of other potential goals—especially all the great [2020 Theme Proposals](https://github.com/ipfs/roadmap/issues/)—before selecting this priority. However, we decided it was more important to focus core working group development time on the main blockers and pain points to enable the entire ecosystem to grow and succeed. Many of our theme proposals are actually very well suited for community ownership via [DevGrants](https://github.com/ipfs/devgrants) and collaborations. Some of them, like [“IPFS in Rust”](https://github.com/ipfs/roadmap/issues/54) and [“Examples and Tutorials”](https://github.com/ipfs/roadmap/issues/50), already have grants or bounties associated with them, and community teams actively pushing forward! 🙌 + +### Increasing Contributor Velocity & Supporting Adoption + +Part of allowing our core go-ipfs developers to focus deeply on content routing is to systematize and improve our maintainership for the many IPFS users and contributors merging changes into the core repos. As we’ve grown as a project, we’ve not done the necessary work of intentionally distributing and decentralizing this stewardship, in order to make community contribution scalable too. We want to create more pathways for folks throughout the community to step up to help with this, and build better avenues for experimentation with fast feedback loops. + +We also want to grow and support the many amazing contributors to IPFS, and exciting new explorations to build tools or address new use cases. There were a ton of amazing suggestions for features and focus areas in our 2020 theme collection that would be immensely valuable for the project, but our core working groups can’t push forward this quarter. To help with that, we’re launching a [community DevGrants program](https://github.com/ipfs/devgrants) where Protocol Labs and other groups can offer bounties, RFPs, and accept open suggestions for improvements, new features, and even new implementations. + +To kick this off, we’ve added a number of [bounties](https://github.com/ipfs/devgrants/projects/1) suggested by our 2020 Theme proposal process, and already have 7+ [targeted](https://github.com/ipfs/devgrants/tree/master/targeted-grants) or [open grant](https://github.com/ipfs/devgrants/tree/master/open-grants) proposals for larger-scale improvements to help benefit the whole community. If you are a user or contributor to IPFS, this is a great opportunity to both sponsor and apply for [grants](https://github.com/ipfs/devgrants/tree/master/rfps#how-to-create-rfp) or [bounties](https://github.com/ipfs/devgrants/blob/master/BOUNTIES.md#how-to-propose) to help make IPFS better for everyone! + +To help coordinate this work, we’re creating a new “Ecosystem” working group made up of 3 Special Interest Groups (SIGs) focused on developer experience, collabs and community, and browsers/connectivity. Our Ecosystem working group’s objective is to ensure community health & growth through collaborations, developer experience and platform availability. The 3 SIGs each focus on: + +- **Browsers & Connectivity**: Maximize availability & connectivity of IPFS on the web +- **Collabs & Community**: Support IPFS users and grow new opportunities through research, collaborations and community engagement +- **Developer Experience & Maintainership**: Support the IPFS technical community through documentation, contributor experience, API ergonomics and tooling + +Curious about the work they’re taking on? Check out the [Project Roadmap Epics](https://github.com/ipfs/roadmap#2020-epics) for more tangible goals, and be on the lookout for more suggestions on how you can help enable other contributors throughout the IPFS ecosystem! + +### Everything Else + +Naturally, even with narrowing our focus, there are some really important pieces of our work that need continued energy, like the IPFS Gateway. While we’ve seen huge leaps in performance on the IPFS Community HTTP Gateway we run (now able to support large 10x usage spikes, and reduced 95th percentile response time by 30-50%), this still needs continued enhancement, automation, and scaling work to support expected 2020 growth and new use cases. Our Bifrost team will continue leading the charge here, while ensuring our bootstrappers, preload nodes, and other useful infra is operating smoothly. + +While we definitely will have other maintainership work on various projects in the wider IPFS ecosystem, in order to achieve the goals above we are going to need to **focus** and say “not right now” to a lot of things we want to do. The more focus we apply to content routing, the faster we can improve the network for everyone! That means there will be more opportunities for community contributors to step up as lead maintainers of modules unrelated to content routing, push forward new experiments with React Native or mobile, or add shiny new features to unblock new uses. + +If you’d like to get involved, check out our [contribution guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) and come to [IPFS Office Hours](https://github.com/ipfs/community/issues?utf8=%E2%9C%93&q=label%3A%22%F0%9F%99%8C%F0%9F%8F%BD+IPFS+Weekly+Call%22+) to get pointers on where to start! + +## Onwards! + +We have an exciting 6 months ahead of us, and we’re already well on our way. Thank you so much for your support, IPFS would be nowhere without this passionate and dedicated community helping make the web InterPlanetary! We’re excited to continue working with you in 2020 to build a resilient, upgradeable, open network to preserve and grow humanity’s knowledge. +Onwards! 🚀 diff --git a/src/_blog/083-improved-bitswap-with-netflix/README.md b/src/_blog/083-improved-bitswap-with-netflix/README.md new file mode 100644 index 00000000..08454003 --- /dev/null +++ b/src/_blog/083-improved-bitswap-with-netflix/README.md @@ -0,0 +1,82 @@ +--- +date: 2020-02-14 +url: /2020-02-14-improved-bitswap-for-container-distribution/ +title: New improvements to IPFS Bitswap for faster container image distribution +description: +author: Dirk McCormick (IPFS) and Edgar Lee (Netflix) +header_image: 083-improved-bitswap-with-netflix.png +--- + +Web 2.0 services increasingly depend on large scale computing infrastructure to support fast iteration and deployment cycles. In order to build, test, and release software faster, these services are often seeking ways to upgrade their systems to take advantage of new learnings and tools from distributed peer-to-peer networks. + +After [IPFS Camp 2019](https://camp.ipfs.io/), Netflix and IPFS began collaborating on ways to incorporate peer-to-peer services into Netflix's developer tooling. Together, we figured out a way to leverage IPFS to speed up cloud builds, designing and testing solutions for faster Continuous Integration (CI) pipelines powered by efficient p2p container image distribution. + +

+ + + +

+ +As part of this collaboration, we made big improvements over the last two quarters to [Bitswap](https://github.com/ipfs/go-bitswap), the mechanism IPFS uses to transfer pieces of a file between two or more peers. A key factor enabling this improvement was [p2plab](https://github.com/Netflix/p2plab) - a performance benchmarking tool created by Netflix to run reproducible tests - allowing us to target and measure improvements. Our specific focus was a container distribution challenge Netflix wanted to address: how to efficiently pull container images in a large scale, multi-region environment. Image layers often reside in different regions. Leveraging IPFS as a peer-to-peer CDN lets nodes inside Netflix’s infrastructure collaborate and seed common pieces to neighboring nodes, helping make container distribution faster. + +To speed this up even more, we added some useful new capabilities to the Bitswap protocol which cut transfer time **in half** for benchmarked use cases around container distribution. In the previous version of Bitswap, it took on average 9.08 seconds to pull a 300 MiB image to 32 leeching peers. The optimized branch brought this down to 3.16 seconds -- 20% faster than DockerHub (3.93 seconds)! When the number of leeching peers exceed the seeders, we observed that pieces downloaded by leechers are reseeded, reducing the contention on the seeding peers. + +![container_image_benchmark](https://user-images.githubusercontent.com/618519/73900782-aa942400-4845-11ea-8643-83c504750b35.png) + +## How Bitswap works + +IPFS breaks up files into chunks called Blocks, identified by a Content IDentifier ([CID](https://github.com/multiformats/cid)). When nodes running the [Bitswap](https://github.com/ipfs/go-bitswap) protocol want to fetch a file, they send out "want lists" to other peers. A "want list" is a list of CIDs for blocks a peer wants to receive. Each node remembers which blocks its peers want, and each time the node receives a block it checks if any of its peers want the block and sends it to them. + +To find out which peers have the blocks that make up a file, a Bitswap node first sends a want for the root block CID to all the peers it is connected to. If the peers don’t have the block, the node queries the Distributed Hash Table ([DHT](https://docs.ipfs.io/guides/concepts/dht/)) to ask who has the root block. Any peers that respond with the root block are added to a session. From now on Bitswap only sends wants to peers in the session, so as not to flood the network with requests. + +The node sends out a want for each CID to several peers in the session in parallel, because not all peers will have all blocks. If the node starts receiving a lot of duplicate blocks, it sends a want for each CID to fewer peers. If the node gets timeouts waiting for blocks, it sends a want for each CID to more peers. In this way the node tries to maintain a high download speed without too many duplicate blocks. + +## Bitswap improvements for p2p image distribution + +In order to improve Bitswap performance and efficiency, the IPFS team made some changes to the way Bitswap fetches blocks. + +Initially a node wants to know which of its peers have the root block, but doesn’t actually want to receive the block itself (because it sends this “discovery” want to many peers). So one new change is that when Bitswap sends a want it can ask for a HAVE message in response (instead of getting back the whole block). + +

+ + + +

+ +Once a node has added peers to the session, it can also use these HAVE messages to figure out which of the session peers have the rest of the blocks it needs relatively cheaply, because it doesn’t have to worry about duplicate blocks. At this stage the node also wants the peer to say if it doesn’t have the block. So we added a DONT_HAVE response. + +With these changes a node can cheaply work out how blocks are distributed amongst its peers, and can direct the requests for blocks more accurately, increasing overall download speed and reducing the number of duplicate blocks. + +The node can also quickly recognize when all the peers in a session don’t have a block it needs, and go out to the DHT to find out who has the block. + +For more details on how Bitswap worked before ("master"), and the changes we’ve made ("poc"), check out [these slides](https://docs.google.com/presentation/d/1mbFFGIIKNvboHyLn-k26egOSWkt9nXjlNbxpmCEQfqQ), this [presentation at the IPFS Weekly Call](https://www.youtube.com/watch?v=G_Q7iTpwYQU), and [this recent performance comparison](https://github.com/ipfs/go-ipfs/issues/6782#issuecomment-579973116). + +

+5ms-1024MB5ms-160MB5ms-40MB5ms-20MB +

+ +## Container distribution at Netflix + +Netflix developers regularly deploy millions of containers on Titus, the [Netflix container management platform](https://medium.com/netflix-techblog/titus-the-netflix-container-management-platform-is-now-open-source-f868c9fb5436). As many of these containers handle critical workloads that power Netflix, they often need to be deployed in many regions around the world, scaling accordingly to the traffic in that geographical location. When developers push a release image to production, the image needs to be replicated to Docker Registries in other regions or deployments will suffer from cross-region data costs and slow transfer speeds. + +The docker registry is designed to decouple the notion of what an image reference like “alpine” presents, and what data is contained inside the image through content-addressability. This is parallel with IPFS’s data model, where data is always represented by its [CID](https://github.com/multiformats/cid). In fact, this is exactly how IPFS can be leveraged as a CDN for container image layers because the container runtime can be modified to retrieve layers identified by their CIDs. To learn more about the Netflix use case for IPFS, check out [this interview of Edgar from IPFS Camp](https://www.youtube.com/watch?v=wNfk05D887M)! + +## p2plab + +[![image](https://user-images.githubusercontent.com/618519/73901452-abc65080-4847-11ea-992c-b4b3690c3206.png)](https://github.com/Netflix/p2plab) + +Netflix infrastructure is deployed on Amazon Web Services (AWS) across multiple availability zones and regions around the world. In order to emulate that kind of environment, [p2plab](https://github.com/Netflix/p2plab) was created to measure the throughput of data transfer on the IPFS network in multi-region clusters. Using p2plab, we can reliably determine whether a change in IPFS will improve performance. An operator is able to provision live clusters with cluster definitions and benchmark a data transfer scenario with scenario definitions. Nodes in a p2plab cluster can also hot swap the IPFS binary under test, allowing Protocol Labs and Netflix engineers to quickly test a branch of an IPFS component like bitswap. + +Once a benchmark has completed, we can extract metrics from libp2p and bitswap to understand application-level bottlenecks, flamegraphs to understand where CPU time is spent, and distributed tracing spans in a [jaeger dashboard](https://www.jaegertracing.io/) to follow the request flow across the cluster. + +An in-memory driver for p2plab is also available. Head over to [the repository](https://github.com/Netflix/p2plab) and try it out today on your local system! + +

+ + + +

+ +## Next steps + +Itching to get your hands on the new speedups? The new and improved Bitswap is **[merged](https://github.com/ipfs/go-bitswap/pull/189)** and slated for the [next go-ipfs release](https://github.com/ipfs/go-ipfs/issues/6776) - bringing the performance benefits described above to all IPFS users. 😍🎉🚀 diff --git a/src/_blog/083-js-ipfs-0.41/README.md b/src/_blog/083-js-ipfs-0.41/README.md new file mode 100644 index 00000000..ba85e655 --- /dev/null +++ b/src/_blog/083-js-ipfs-0.41/README.md @@ -0,0 +1,321 @@ +--- +date: 2020-02-13 +url: /2020-02-13-js-ipfs-0-41/ +title: js-ipfs 0.41.0 released +description: +author: Alan Shaw +header_image: js-ipfs-placeholder.png +--- + +# 🔦 Highlights + +> One giant leap forward + +## 🦁 Async Await and Async Iterables + +🎶 In the jungle, the mighty jungle the lion sleeps tonight! + +🎶 async await, async await, async await, async await... + +We've completed a [**HUGE** refactor](https://github.com/ipfs/js-ipfs/issues/1670) to js-ipfs internals 🥳, switching to using Promises and `async`/`await` over Callbacks and using async [iterables](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) instead of [Node.js Streams](https://nodejs.org/dist/latest/docs/api/stream.html) and [Pull Streams](https://pull-stream.github.io/). Ok, I tell a lie, it's actually not just js-ipfs internals, it's the whole stack, including libp2p, IPLD and multiformats, you might call it a ground up re-write, but, you know, we don't like to brag. + +🚨 Oh, wait, serious note - this release brings **big breaking changes** to the core API so please consult the "[API Changes](#api-changes)" section below for all the information. + +It's been a long and emotional voyage but this refactor brings a plethora of incredible immediate and future benefits to consumers, contributors and core developers that make all the work and effort worthwhile. To summarise, we've: + +- Switched to streaming APIs by default to reduce memory pressure +- Reduced API surface area by removing buffering, Node.js and Pull Stream APIs +- Reduced the amount of code in the code base and number of dependencies we depend on (for smaller browser bundles and faster install times) +- Switched to using async iterables to stream data to help make streaming more approachable +- Switched to using `async`/`await` so we’ll get better error stack traces and improved readability and maintainability + +Using `async`/`await` in JavaScript is gaining a _lot_ of traction in the ecosystem and is rapidly becoming the de facto way of writing idiomatic JS. We want js-ipfs to **move with the times and continue to be attractive to contributors** by using modern JS features, techniques and practices. The big idea with these changes is for the code to be easier to contribute to, easier to understand, easier to maintain, and be faster and smaller than ever. + +This change is so big, and so significant, we wrote a whole [blog post](https://blog.ipfs.io/2020-02-01-async-await-refactor/) about it to explain the motivations behind the changes...in ~~excruciating~~ delightful depth 🤣! + +We've also compiled some stats on this refactor for your viewing pleasure: + +- 27 direct dependencies were removed from our `package.json` +- 214 fewer modules end up in our browser bundle +- 155 kB lighter browser bundle ([unpkg.com/ipfs@0.40.0](https://unpkg.com/ipfs@0.40.0/dist/index.min.js) vs [unpkg.com/ipfs@0.41.0-rc.0](https://unpkg.com/ipfs@0.41.0-rc.0/dist/index.min.js)) - that's **18% smaller**! +- 124 kB lighter `ipfs-http-client` browser bundle ([unpkg.com/ipfs-http-client@41.0.1](https://unpkg.com/ipfs-http-client@41.0.1/dist/index.min.js) vs [unpkg.com/ipfs-http-client@42.0.0](https://unpkg.com/ipfs-http-client@42.0.0/dist/index.min.js)) - that's **60% smaller**! +- ~2,600 lines of code removed (net) +- ~360 lines of code removed from `ipfs-http-client` (net) +- ~10 minutes shorter CI run times + +...and a lot of those stats are just for js-ipfs and js-ipfs-http-client - the tip of the iceberg! We saw changes similar to this for [between 60-70 dependencies](https://github.com/ipfs/js-ipfs/issues/1670) across IPFS, libp2p, IPLD and multiformats. + +## 🌗 UnixFS v1.5 + +Turns out, it's really important for package managers to retain file metadata, particularly last modified time (`mtime`). File `mtime` allows them to selectively sync only data that has changed. Up until now if you wanted to host a large data set on IPFS, like a package manager's repository, it would be difficult to update. + +"What about the permanent web?" I hear you cry. Well, this absolutely **doesn't** prevent a particular snapshot of a package manager's repository from being permanently available. Metadata just enables diffs to be imported, instead of the whole thing. So, when I say "difficult to update", like I did up there, I mean slow and/or impossible. When you have Terabytes (or more) of package data and someone publishes a new package, it's _kinda_ inconvenient to import _everything_ again, when only a little part changed. File `mtime` is a really good indicator of which things have changed, so you can use it in IPFS now! 🥳 + +For example, there's two new options to `jsipfs add` that allow `mode` and `mtime` to be preserved as the file is added to IPFS: + +```console +$ jsipfs add -r --preserve-mtime --preserve-mode ~/Desktop/gif +added QmT6WX9McZyx5ZoisRgpsjYKDBWnYpMnBLpfAgjW5kavBA gif/yesthisisdog.jpg +added QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q gif +``` + +Ok, no big changes there aside from the new options, buuut, now when you list directory contents you get `Mode` and `Mtime` info: + +```console +$ jsipfs ls QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q -v +Mode Mtime Hash Size Name +-rw-r--r-- Apr 16, 2018, 12:20:33 PM GMT+1 QmT6WX9McZyx5ZoisRgpsjYKDBWnYpMnBLpfAgjW5kavBA 87779 yesthisisdog.jpg +``` + +Rad right!? + +Persisting the file `mode` is also super rad, because it opens up NFS type use cases that weren't possible before. Imagine your `node_modules` directory is backed by IPFS and mounted on your file system - the file `mode` will allow everything in [`node_modules/.bin`](https://docs.npmjs.com/configuring-npm/folders.html#executables) to be executable as you'd expect. + +The coolest thing about all of this is that it's completely backwards compatible. The CID for a given file/directory only changes if you opt in to metadata, otherwise the CIDs remain the same. Hooray! + +There's a bunch of changes that add metadata capability to the CLI, HTTP and core API both for inputs and outputs. There's also a couple of new MFS commands `touch` and `chmod` which allow you to change the metadata whenever you like! Magic 🧙‍♂️. + +See the API Changes sections below for details of all the new UnixFS v1.5 stuffs. + +# 🏗 API Changes + +## Core API + +There are significant and breaking core API changes in this release. Please see the [migration guide](https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26). + +- IPFS is not a class that can be instantiated - use `IPFS.create`. An IPFS node instance is not an event emitter. +- The `init` option passed to `IPFS.create` will now _not_ take any initialization steps if it is set to `false`. Previously, the repo would be initialized if it already existed. This is no longer the case. If you wish to initialize a node but only if the repo exists, pass `init: { allowNew: false }` to the constructor. +- Instance `.ready` property has been removed. Please use `IPFS.create` instead. +- `IPFS.createNode` has been removed, please use `IPFS.create` instead. +- Callbacks are no longer supported on any API methods. Please use a utility such as [`callbackify`](https://www.npmjs.com/package/callbackify) on API methods that return Promises to emulate previous behaviour. See the [migration guide](https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26#migrating-from-callbacks) for more info. +- Delegated peer and content routing modules are no longer included as part of core (but are still available if starting a js-ipfs daemon from the command line). If you wish to use delegated routing and are creating your node _programmatically_ in Node.js or the browser you must `npm install libp2p-delegated-content-routing` and/or `npm install libp2p-delegated-peer-routing` and provide configured instances of them in [`options.libp2p`](https://github.com/ipfs/js-ipfs#optionslibp2p). See the module repos for further instructions: + - https://github.com/libp2p/js-libp2p-delegated-content-routing + - https://github.com/libp2p/js-libp2p-delegated-peer-routing +- `add` now returns an async iterable. +- `add` now accepts `mode` and `mtime` options on inputs to allow setting mode and mtime metadata for added files. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#add) for more info. +- `add` results now contain a `cid` property (a [CID instance](https://github.com/multiformats/js-cid)) instead of a string `hash` property. +- 🆕 `add` results now include `mode` and `mtime` properties if they were set. +- `addReadableStream`, `addPullStream` have been removed. Please see the [migration guide](https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26#migrating-to-async-iterables) for more info. +- `addFromStream` has been removed. Use `add` instead. +- `addFromFs` has been removed. Please use the exported `globSource` utility and pass the result to `add`. See the [glob source documentation](https://github.com/ipfs/js-ipfs#glob-source) for more details and an example. +- `addFromURL` has been removed. Please use the exported `urlSource` utility and pass the result to `add`. See the [URL source documentation](https://github.com/ipfs/js-ipfs#url-source) for more details and an example. +- `bitswap.stat` result has changed - `wantlist` and values are now an array of [CID](https://github.com/multiformats/js-cid) instances and `peers` is now a `string[]` of peer IDs. +- `bitswap.wantlist` now returns an array of [CID](https://github.com/multiformats/js-cid) instances. +- `block.rm` now returns an async iterable. +- `block.rm` now yields objects of `{ cid: CID, error: Error }`. +- `block.stat` result now contains a `cid` property (whose value is a [CID instance](https://github.com/multiformats/js-cid)) instead of a `key` property. +- `dht.findProvs`, `dht.provide`, `dht.put` and `dht.query` now all return an async iterable. +- `dht.findPeer`, `dht.findProvs`, `dht.provide`, `dht.put` and `dht.query` now yield/return an object `{ id: string, addrs: Multiaddr[] }` instead of a `PeerInfo` instance(s). +- 🆕 `files.chmod` has been added. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#fileschmod) for info. +- 🆕 `files.flush` now returns the root CID for the path that was flushed (`/` by default) +- `files.lsPullStream` and `files.lsReadableStream` have been removed. Please see the [migration guide](https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26#migrating-to-async-iterables) for more info. +- `files.ls` now returns an async iterable. +- `files.ls` results now contain a `cid` property (whose value is a [CID instance](https://github.com/multiformats/js-cid)) instead of a `hash` property. +- 🆕 `files.ls` results now include `mode` and `mtime` properties if they were set. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#ls) for more info. +- `files.ls` no longer takes a `long` option (in core) - you will receive all data by default. +- 🆕 `files.mkdir` now accepts `mode` and `mtime` options to allow setting mode and mtime metadata. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#filesmkdir) for more info. +- `files.readPullStream` and `files.readReadableStream` have been removed. Please see the [migration guide](https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26#migrating-to-async-iterables) for more info. +- `files.read` now returns an async iterable. +- `files.stat` result now contains a `cid` property (whose value is a [CID instance](https://github.com/multiformats/js-cid)) instead of a `hash` property. +- 🆕 `files.stat` result now includes `mode` and `mtime` properties if they were set. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#filesstat) for more info. +- 🆕 `files.touch` has been added. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#filestouch) for info. +- 🆕 `files.write` now accepts `mode` and `mtime` options to allow setting mode and mtime metadata. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#fileswrite) for more info. +- `get` now returns an async iterable. The `content` property value for objects yielded from the iterator is now an async iterable that yields [`BufferList`](https://github.com/rvagg/bl) objects. +- `id` result has changed, the `addresses` property is now a `Multiaddr[]` +- `name.resolve` now returns an async iterable. It yields increasingly more accurate resolved values as they are discovered until the best value is selected from the quorum of 16. The "best" resolved value is the last item yielded from the iterator. If you are interested only in this best value you could use `it-last` to extract it like so: + + ```js + const last = require('it-last') + await last(ipfs.name.resolve('/ipns/QmHash')) + ``` + +- 🆕 `object.get` now accepts a `timeout` option. It will cause the method to throw with a `TimeoutError` if no data is received within the timeout window. It can be passed as a `number` or a `string`. If a `number` is passed it is interpreted as milliseconds, if a string is passed it is interpreted as a [human readable duration](https://www.npmjs.com/package/parse-duration). +- `ls` now returns an async iterable. +- `ls` results now contain a `cid` property (whose value is a [CID instance](https://github.com/multiformats/js-cid)) instead of a `hash` property. +- 🆕 `ls` results now include `mode` and `mtime` properties if they were set. See the [core interface docs](https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/FILES.md#ls) for more info. +- `pin.add` results now contain a `cid` property (a [CID instance](https://github.com/multiformats/js-cid)) instead of a string `hash` property. +- 🆕 `pin.add` now accepts a `timeout` option. It will cause the method to throw with a `TimeoutError` if no data is received within the timeout window. It can be passed as a `number` or a `string`. If a `number` is passed it is interpreted as milliseconds, if a string is passed it is interpreted as a [human readable duration](https://www.npmjs.com/package/parse-duration). +- `pin.ls` now returns an async iterable. +- `pin.ls` results now contain a `cid` property (a [CID instance](https://github.com/multiformats/js-cid)) instead of a string `hash` property. +- `pin.rm` results now contain a `cid` property (a [CID instance](https://github.com/multiformats/js-cid)) instead of a string `hash` property. +- `ping` now returns an async iterable. +- `refs` and `refs.local` now return an async iterable. +- 🆕 `refs` now accepts a `timeout` option. It will cause the method to throw with a `TimeoutError` if no data is received within the timeout window. It can be passed as a `number` or a `string`. If a `number` is passed it is interpreted as milliseconds, if a string is passed it is interpreted as a [human readable duration](https://www.npmjs.com/package/parse-duration). +- `repo.gc` now returns an async iterable. +- `stats.bw` now returns an async iterable. +- `swarm.peers` now returns an array of objects with a `peer` property that is a `string`, instead of a `PeerId` instance. +- `swarm.addrs` now returns an array of objects `{ id: string, addrs: Multiaddr[] }` instead of `PeerInfo` instances. + +## HTTP API + +- 🆕 `/api/v0/add` now supports the following additional multipart headers to allow `mode` and `mtime` metadata to be set on individual files: + - `mode` file mode to apply to created UnixFS entries `[string]` + - `mtime` modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries `[number]` + - `mtime-nsecs` modification time fraction in nanoseconds `[number]` +- 🆕 `/api/v0/add` now returns file `Mode`, `Mtime` and `MtimeNsecs` if set. +- `/api/v0/file/ls` has been removed, please use `/api/v0/ls` instead. +- 🆕 `/api/v0/files/chmod` has been added and supports the following query string args: + - `arg` path of file to apply mode to `[string]` + - `mode` file mode to apply `[string]` +- 🆕 `/api/v0/files/ls` now returns file `Mode`, `Mtime` and `MtimeNsecs` if set. +- 🆕 `/api/v0/files/mkdir` now supports supports the following additional query string args: + - `mode` file mode to apply `[string]` + - `mtime` modification time in seconds before or since the Unix Epoch to apply `[number]` +- 🆕 `/api/v0/files/stat` now returns file `Mode`, `Mtime` and `MtimeNsecs` if set. +- 🆕 `/api/v0/files/touch` has been added and supports the following query string args: + - `arg` path of file to apply mode to `[string]` + - `mtime` modification time in seconds before or since the Unix Epoch to apply `[number]` +- 🆕 `/api/v0/files/write` now supports the following additional multipart headers: + - `mode` file mode to apply to created UnixFS entries `[string]` + - `mtime` modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries `[number]` +- 🆕 `/api/v0/ls` now returns file `Mode`, `Mtime` and `MtimeNsecs` if set. + +## CLI + +- 🆕 `jsipfs add [file...]` now supports the following flags to respect and apply `mode` and `mtime` metadata of files added from the file system or explicitly set them: + - `--preserve-mode` automatically apply permissions to created UnixFS entries from the file system `[boolean] [default: false]` + - `--preserve-mtime` automatically apply modification time to created UnixFS entries from the file system `[boolean] [default: false]` + - `--mode` file mode to apply to created UnixFS entries `[string]` + - `--mtime` modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries `[number]` + - `--mtime-nsecs` modification time fraction in nanoseconds `[number]` +- `jsipfs file ls` has been removed, please use `jsipfs ls` instead. +- 🆕 `jsipfs files chmod [mode] [path]` has been added. +- 🆕 `jsipfs files ls` now prints file `mode` and `mtime`. +- 🆕 `jsipfs files mkdir` now supports the following flags: + - `--mode` file mode to apply to created UnixFS entries `[string]` + - `--mtime` modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries `[number]` +- 🆕 `jsipfs files stat` now prints file `mode` and `mtime`. +- 🆕 `jsipfs files touch [path]` has been added and supports the following flags: + - `--mtime` modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries `[number]` +- 🆕 `jsipfs files write` now supports the following flags: + - `--mode` file mode to apply to created UnixFS entries `[string]` + - `--mtime` modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries `[number]` +- 🆕 `jsipfs ls` now prints file `mode` and `mtime`. + +## Other changes + +- libp2p has been upgraded to 0.27, which also includes breaking changes to it's core API. Please see the release announcement post for more info: + - https://blog.ipfs.io/2020-02-07-js-libp2p-0-27/ +- The protocol _name_ for peer IDs in multiaddrs has changed from 'ipfs' to 'p2p'. There's no changes to data on the wire but this change is seen when multiaddrs are converted to strings. + +# ❤️ Huge thank you to everyone that made this release possible + +- [@achingbrain](https://github.com/achingbrain) (159 commits, 69 PRs, 10 issues, 121 comments) +- [@adamsoffer](https://github.com/adamsoffer) (2 comments) +- [@AdityaNambiar](https://github.com/AdityaNambiar) (1 issue, 1 comment) +- [@AgentJ-WR](https://github.com/AgentJ-WR) (1 PR, 1 issue) +- [@agowa338](https://github.com/agowa338) (1 issue) +- [@alanhoff](https://github.com/alanhoff) (1 comment) +- [@alanshaw](https://github.com/alanshaw) (85 commits, 88 PRs, 12 issues, 177 comments) +- [@AliMirlou](https://github.com/AliMirlou) (1 comment) +- [@andylim0221](https://github.com/andylim0221) (1 comment) +- [@AuHau](https://github.com/AuHau) (1 issue, 3 comments) +- [@autonome](https://github.com/autonome) (4 comments) +- [@blakebyrnes](https://github.com/blakebyrnes) (1 issue, 1 comment) +- [@bonedaddy](https://github.com/bonedaddy) (1 comment) +- [@bugeats](https://github.com/bugeats) (1 comment) +- [@calikevuche](https://github.com/calikevuche) (1 issue, 1 comment) +- [@carsonfarmer](https://github.com/carsonfarmer) (14 commits, 9 PRs, 4 issues, 27 comments) +- [@chriamue](https://github.com/chriamue) (1 PR) +- [@claassistantio](https://github.com/claassistantio) (3 comments) +- [@codecov-io](https://github.com/codecov-io) (9 comments) +- [@coryschwartz](https://github.com/coryschwartz) (1 PR, 1 comment) +- [@DallasC](https://github.com/DallasC) (1 issue) +- [@DaniellMesquita](https://github.com/DaniellMesquita) (3 comments) +- [@dannyid](https://github.com/dannyid) (1 comment) +- [@daviddias](https://github.com/daviddias) (6 commits, 3 PRs, 2 issues, 21 comments) +- [@DieMyst](https://github.com/DieMyst) (1 issue) +- [@dignifiedquire](https://github.com/dignifiedquire) (2 comments) +- [@dirkmc](https://github.com/dirkmc) (11 commits, 5 PRs, 9 comments) +- [@dostu](https://github.com/dostu) (1 comment) +- [@ekkis](https://github.com/ekkis) (1 issue, 6 comments) +- [@elmariachi111](https://github.com/elmariachi111) (1 comment) +- [@emclab](https://github.com/emclab) (4 issues, 7 comments) +- [@eordano](https://github.com/eordano) (1 PR) +- [@folex](https://github.com/folex) (1 comment) +- [@ggarri](https://github.com/ggarri) (1 commit, 1 PR, 3 issues, 5 comments) +- [@hacdias](https://github.com/hacdias) (9 commits, 4 PRs, 1 issue, 15 comments) +- [@hiddentao](https://github.com/hiddentao) (1 comment) +- [@hugomrdias](https://github.com/hugomrdias) (48 commits, 10 PRs, 3 issues, 41 comments) +- [@iameddieyayaya](https://github.com/iameddieyayaya) (1 comment) +- [@ilirhushi](https://github.com/ilirhushi) (2 PRs, 2 comments) +- [@inspiraluna](https://github.com/inspiraluna) (2 comments) +- [@jacobheun](https://github.com/jacobheun) (123 commits, 28 PRs, 3 issues, 55 comments) +- [@jimpick](https://github.com/jimpick) (1 commit, 1 PR) +- [@joequant](https://github.com/joequant) (1 issue) +- [@john-osullivan](https://github.com/john-osullivan) (1 issue, 4 comments) +- [@Jorropo](https://github.com/Jorropo) (1 PR) +- [@kawmaiparis](https://github.com/kawmaiparis) (1 issue) +- [@khartig](https://github.com/khartig) (1 issue) +- [@kottackalsulvin](https://github.com/kottackalsulvin) (2 issues) +- [@kuabhish](https://github.com/kuabhish) (4 comments) +- [@kumavis](https://github.com/kumavis) (1 PR, 1 issue, 6 comments) +- [@leandroyalet](https://github.com/leandroyalet) (2 comments) +- [@lidel](https://github.com/lidel) (6 commits, 3 PRs, 12 comments) +- [@Maj0rT](https://github.com/Maj0rT) (2 issues, 1 comment) +- [@mariotaku](https://github.com/mariotaku) (1 issue, 2 comments) +- [@mburns](https://github.com/mburns) (5 PRs, 1 comment) +- [@mcclure](https://github.com/mcclure) (1 issue, 2 comments) +- [@michaelsbradleyjr](https://github.com/michaelsbradleyjr) (1 comment) +- [@mikeal](https://github.com/mikeal) (5 commits, 3 PRs, 3 issues, 18 comments) +- [@mohe2015](https://github.com/mohe2015) (1 comment) +- [@momack2](https://github.com/momack2) (1 comment) +- [@mpetrunic](https://github.com/mpetrunic) (1 issue, 1 comment) +- [@mqklin](https://github.com/mqklin) (1 issue, 1 comment) +- [@My9Bot](https://github.com/My9Bot) (1 comment) +- [@nhynes](https://github.com/nhynes) (2 comments) +- [@npfoss](https://github.com/npfoss) (1 comment) +- [@oed](https://github.com/oed) (1 comment) +- [@olizilla](https://github.com/olizilla) (2 commits, 1 PR, 11 comments) +- [@parkan](https://github.com/parkan) (1 comment) +- [@pcowgill](https://github.com/pcowgill) (1 commit, 2 PRs, 7 issues, 41 comments) +- [@PedroMiguelSS](https://github.com/PedroMiguelSS) (6 commits, 6 PRs, 3 comments) +- [@peter-donovan](https://github.com/peter-donovan) (1 comment) +- [@posix4e](https://github.com/posix4e) (1 issue) +- [@Prabhakar-Poudel](https://github.com/Prabhakar-Poudel) (2 comments) +- [@pvsmounish](https://github.com/pvsmounish) (1 comment) +- [@qu37zal](https://github.com/qu37zal) (1 issue) +- [@raulk](https://github.com/raulk) (1 comment) +- [@raullaprida](https://github.com/raullaprida) (1 issue, 1 comment) +- [@ribasushi](https://github.com/ribasushi) (1 issue, 2 comments) +- [@ridenaio](https://github.com/ridenaio) (2 issues) +- [@Rkrushanovskij](https://github.com/Rkrushanovskij) (1 issue, 1 comment) +- [@robertkiel](https://github.com/robertkiel) (3 issues, 2 comments) +- [@ruifortes](https://github.com/ruifortes) (3 issues) +- [@rvagg](https://github.com/rvagg) (3 commits, 4 PRs, 5 comments) +- [@SahidMiller](https://github.com/SahidMiller) (1 comment) +- [@Schwartz10](https://github.com/Schwartz10) (1 issue) +- [@shamb0t](https://github.com/shamb0t) (1 issue, 1 comment) +- [@shresthagrawal](https://github.com/shresthagrawal) (1 commit, 1 PR, 1 issue, 7 comments) +- [@Stebalien](https://github.com/Stebalien) (4 commits, 3 PRs, 1 issue, 10 comments) +- [@SvenMeyer](https://github.com/SvenMeyer) (1 issue, 4 comments) +- [@tapaswenipathak](https://github.com/tapaswenipathak) (1 commit) +- [@terichadbourne](https://github.com/terichadbourne) (3 comments) +- [@travisperson](https://github.com/travisperson) (1 comment) +- [@tuyennhv](https://github.com/tuyennhv) (1 comment) +- [@uchetron](https://github.com/uchetron) (1 PR) +- [@uluhonolulu](https://github.com/uluhonolulu) (1 comment) +- [@vasco-santos](https://github.com/vasco-santos) (92 commits, 42 PRs, 5 issues, 56 comments) +- [@Velenir](https://github.com/Velenir) (1 issue) +- [@vmx](https://github.com/vmx) (22 commits, 1 PR, 1 issue, 25 comments) +- [@vweevers](https://github.com/vweevers) (1 comment) +- [@wehriam](https://github.com/wehriam) (1 comment) +- [@wemeetagain](https://github.com/wemeetagain) (16 commits, 4 PRs, 5 comments) +- [@xmaysonnave](https://github.com/xmaysonnave) (1 issue, 1 comment) +- [@zhoreeq](https://github.com/zhoreeq) (1 comment) +- [@zicmama](https://github.com/zicmama) (1 comment) +- [@zot](https://github.com/zot) (2 comments) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don't know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/README.md b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/README.md new file mode 100644 index 00000000..aaa6e714 --- /dev/null +++ b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/README.md @@ -0,0 +1,71 @@ +--- +date: 2020-03-04 +url: /2020-03-04-protoschool-tutorial-anatomy-of-a-cid/ +title: Explore the anatomy of a CID in ProtoSchool’s newest tutorial +description: +author: José Bateira and Teri Chadbourne +header_image: 084-explore-the-anatomy-of-a-cid-on-protoschool.png +--- + +The [ProtoSchool](https://proto.school/#/) team is pleased to announce the launch of a shiny new multiple-choice tutorial on the **[Anatomy of a CID](https://proto.school/#/anatomy-of-a-cid)**, built by the fabulous [José Bateira](https://github.com/zebateira)! It’s our first multiple-choice content and the first to explore Multiformats. 🎉 + +![Table of Contents](./table-of-contents.png) +![Sample Lesson](./sample-lesson.png) + +Content identifiers (CIDs) and cryptographic hashing make content addressing possible, allowing us to securely locate and identify data on the decentralized web. The string representations of CIDs used by IPFS look like random characters strung together, but there’s a lot more going on under the hood. In this new tutorial we explore all of the data revealed by these self-describing content-addressed identifiers, digging deep into multihash, multicodec, multibase, and version prefixes. + +We also take a look at the evolution of the [CID specification](https://github.com/multiformats/cid), which originated in IPFS and now lives in the [Multiformats Project](https://multiformats.io/). The Multiformats Project is a collection of self-describing protocols that future-proof distributed information systems including IPFS, IPLD, libp2p, and Filecoin. Curious why some IPFS CIDs start with `Qm...` and others start with `b`? Wondering why we made the switch from CIDv0 to CIDv1, or whether those versions are interchangeable? We’ve got you covered! + +## More ways to explore CIDs + +### CID Inspector + +Did you know you can paste any IPFS CID into the [**CID Inspector**](https://cid.ipfs.io/) for a human-friendly breakdown of its multihash format and length, multicodec, multibase, and version? It can even convert CIDv0 to CIDv1! The awesome [Oli Evans](https://github.com/olizilla) built this super-useful visualization tool that we explore in this new tutorial and which you can now access from our coding challenges. + +![CID Inspector](./cid-inspector.png) + +### IPFS Camp Course: Understanding How IPFS Deals with Files + +If you’d like to dig a little deeper into CIDs via video, we recommend checking out the IPFS Camp 2019 workshop that inspired this tutorial, [**Understanding How IPFS Deals with Files**](https://youtu.be/Z5zNPwMDYGg). It offers a deep dive on key concepts like immutability, content addressing, hashing, the anatomy of CIDs, what the heck a Merkle DAG is, and how chunk size affects file imports. It also covers the joys and pitfalls of the Mutable File System (MFS), the layer of abstraction in IPFS that lets you work with immutable files and directories as if you were using a traditional name-based file system. Kudos to [Alan Shaw](https://github.com/alanshaw) for creating the portion of this course that inspired our new tutorial. 🏆 + +Watch the recording below or check out the [slides](https://github.com/ipfs/camp/blob/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_A/IPFS_Camp_Core_Course_A_Slides.pdf)! + +[![Video: Understanding How IPFS Deals with Files](/img/057-ipfs-camp-course-videos/core-a-thumbnail.png)](https://youtu.be/Z5zNPwMDYGg) + +_Video: [Understanding How IPFS Deals with Files](https://youtu.be/Z5zNPwMDYGg)_ + +## ProtoSchool content for every learner + +### Introducing multiple-choice tutorials + +The new [Anatomy of a CID](https://proto.school/#/anatomy-of-a-cid) tutorial is our first to include **multiple-choice quizzes** to keep you sharp on the concepts introduced in each lesson. 😉 + +![Multiple-Choice Quiz](./quiz.png) + +Kudos to [Teri Chadbourne](https://github.com/terichadbourne) and [Diogo Silva](https://github.com/fsdiogo), who laid the groundwork for our multiple choice lessons. + +### Finding the content that meets your needs + +If you’ve explored [ProtoSchool tutorials](https://proto.school/#/tutorials) in the past, you may have noticed that most of them use **JavaScript coding challenges** to teach IPFS methods, allowing you to explore them right from your web browser without installing anything or touching the command line. We have code-based content introducing the [Mutable File System (MFS)](https://proto.school/#/mutable-file-system), the [Regular Files API](https://proto.school/#/regular-files-api), and the [DAG API](https://proto.school/#/basics). + +We also offer a **text-based** tutorial on [Decentralized Data Structures](https://proto.school/#/data-structures), which introduces important decentralized web concepts like content addressing, cryptographic hashing, content identifiers (CIDs), and sharing with peers. (This one makes a great precursor to our latest tutorial!) + +We’re excited to create beginner-friendly content suitable for a variety of learners, regardless of their coding experience. To that end, we recently added **spiffy new icons** throughout the site to represent our coding challenges, multiple-choice quizzes, and text-only lessons, making it easy to identify lesson formats before you get started. + +![Lesson Type Icons](./type-icons.png) + +We also updated our [tutorial listings](https://proto.school/#/tutorials) with a **handy toggle to help you hide coding challenges** if you’d like to stick to text-based and multiple-choice content. 👏 + +![Toggle Coding Challenges](./toggle-coding-challenges.png) + +A shoutout to [Teri Chadbourne](https://github.com/terichadbourne) for taking the lead on these improvements, and to [Agata Krych](https://github.com/akrych) for the aforementioned spiffy new icons. + +## Help us improve ProtoSchool + +As you can tell from all the name-dropping, ProtoSchool is a team effort. We depend on folks in the IPFS community and beyond to outline new content, add new features, fix bugs, catch typos, and test-drive new tutorials like this one. There are many ways to [contribute to the project](https://proto.school/#/contribute), no matter your background. In fact, our new multiple-choice format makes it super easy to [create new tutorials](https://proto.school/#/build) without any coding experience. + +**Here’s to the many folks whose names we’ve failed to drop who are pitching in daily to making ProtoSchool more useful for our learners.** ❤️ + +One of the easiest ways to help is by sharing your feedback as you explore our tutorials. You’ll find a link at the bottom of every lesson to help you submit your suggestions. + +**We can’t wait to hear what you think of the [new tutorial](https://proto.school/#/anatomy-of-a-cid)!** diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/cid-inspector.png b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/cid-inspector.png new file mode 100644 index 00000000..3f8970a3 Binary files /dev/null and b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/cid-inspector.png differ diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/quiz.png b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/quiz.png new file mode 100644 index 00000000..1c5cc8f7 Binary files /dev/null and b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/quiz.png differ diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/sample-lesson.png b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/sample-lesson.png new file mode 100644 index 00000000..2c0c7cfb Binary files /dev/null and b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/sample-lesson.png differ diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/table-of-contents.png b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/table-of-contents.png new file mode 100644 index 00000000..351c7cd1 Binary files /dev/null and b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/table-of-contents.png differ diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/toggle-coding-challenges.png b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/toggle-coding-challenges.png new file mode 100644 index 00000000..bc4c7b36 Binary files /dev/null and b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/toggle-coding-challenges.png differ diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/type-icons.png b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/type-icons.png new file mode 100644 index 00000000..102b9e0b Binary files /dev/null and b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool/type-icons.png differ diff --git a/src/_blog/085-announcing-rust-ipfs/README.md b/src/_blog/085-announcing-rust-ipfs/README.md new file mode 100644 index 00000000..e03e4e53 --- /dev/null +++ b/src/_blog/085-announcing-rust-ipfs/README.md @@ -0,0 +1,65 @@ +--- +date: 2020-03-18 +url: /2020-03-18-announcing-rust-ipfs/ +title: Announcing Rust IPFS, and a call for contributors +description: +author: Mark Robert Henderson and Molly Mackinlay +header_image: 085-announcing-rust-ipfs.png +--- + +

+ +

+ +Calling all rustaceans, rustafarians, ferrosities, and rustlers - we’ve got an exciting update! +Active full time work on a Rust-IPFS implementation has commenced, building on the great work by +[Parity](https://www.parity.io/) in `rust-libp2p`. [Equilbrium](https://equilibrium.co) is spearheading the new community and +implementation with support from Protocol Labs, and is looking for additional Rust devs itching +to help build a new language implementation of the InterPlanetary File System combining the +performance and resource utilization benefits of Rust with a keen eye on conformance to the IPFS spec. Read more on the [Equilibrium Labs blog](https://medium.com/equilibriumco/rust-ipfs-our-plan-of-attack-af8358f90beb)! + +## Why Rust IPFS? Why Now? + +Rust, the programming language, has enjoyed a recent spike in popularity. This is due both to its +inclusive community, and also being a safe systems language with performance comparable to C and +C++. An IPFS implementation written in Rust only makes sense. Additionally, the community has been +[asking for a while now](https://github.com/ipfs/notes/issues/363), for a number of use cases: + +1. Usage in resource-constrained systems such as Industrial Internet-of-Things (IIoT) controllers +2. Portability of certain subsets of the IPFS stack into WebAssembly +3. Usage of IPFS functionality and APIs via native Rust function calls via inclusion as a Rust crate. + +Given that, it's no surprise that Rust-IPFS was also one of the [IPFS 2020 Theme Proposals](https://github.com/ipfs/roadmap/issues/54) suggested in our community-driven [IPFS 2020 Roadmapping Process](https://github.com/ipfs/roadmap/blob/master/2020-IPFS-Project-Planning.md) - and that the community quickly rose to the challenge. Equilibrium, an active participant in many dweb infrastructure projects, stepped up to take on core implementation and stewardship of this new language implementation, with support through the [new IPFS DevGrants program](https://github.com/ipfs/devgrants) to provide coordination and maintainership for passionate developers in the wider Rust community. + +With both community demand and active participation, the time was ripe for the Rust-IPFS effort to be revitalized and reborn! + +## Leveraging Community Efforts + +The IPFS community is a talented group of people with an impressive array of high quality work in the Rust space already. There's the aforementioned +[rust-libp2p](https://github.com/libp2p/rust-libp2p), which is already used by the likes of Polkadot, Substrate, and Lighthouse; there's ferrismtg's [rust-ipfs-api](https://github.com/ferristseng/rust-ipfs-api) which is already doing wonders in providing a bridge from the Rust world; and of course [David Craven](https://github.com/dvc94ch)'s [rust-ipfs](https://github.com/rs-ipfs/rust-ipfs), which is the foundational work behind this latest endeavor. + +Instead of forking and/or starting fresh, this project aims to support and build on the impressive amount of progress that's already been made, helping carry the torch across the finish line while _incorporating_ and _including_ the community of passionate Rust contributors in the process. + +## What can be expected, and when? + +![Rust IPFS Timeline](https://gateway.ipfs.io/ipfs/QmU7sssvo52Rrwj7MWZNpeHnFjjdG271Dx5zfGkZSbgVnN) + +As you can see in the [Rust-IPFS DevGrant Roadmap](https://github.com/ipfs/devgrants/tree/master/open-grants/ipfs-rust) implementation work +takes place mostly over early Q2 2020 and covers the use case of **IPLD applications**, +targeting the low-level blockstore, libp2p integration, and IPLD-related functionality +such as `ipfs dag put` and `ipfs dag get`. + +To learn more about the effort, you can: + +1. Visit the [rs-ipfs organization](https://github.com/orgs/rs-ipfs) on GitHub +2. Read more about this effort on the [Equilibrium Labs blog](https://medium.com/equilibriumco/rust-ipfs-our-plan-of-attack-af8358f90beb) + +## You can help! + +Community participation in making Rust-IPFS a reality is encouraged and welcomed! If you +want to pitch in, here are a few ways: + +1. Star and watch the [GitHub repo](https://github.com/rs-ipfs/rust-ipfs) +2. Take on the development efforts associated with IPFS APIs [deemed out of scope for the initial grant milestones](https://github.com/rs-ipfs/ipfs-rust-conformance/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +3. Look for `help-wanted` issues that are marked as [needing help from the community](https://github.com/rs-ipfs/rust-ipfs/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) +4. Back IPFS Rust on [OpenCollective](https://opencollective.com/ipfs-rust) diff --git a/src/_blog/086-ipfs-in-opera-for-android/README.md b/src/_blog/086-ipfs-in-opera-for-android/README.md new file mode 100644 index 00000000..deca4ff3 --- /dev/null +++ b/src/_blog/086-ipfs-in-opera-for-android/README.md @@ -0,0 +1,105 @@ +--- +date: 2020-03-30 +url: /2020-03-30-ipfs-in-opera-for-android/ +tags: IPFS, Web Browsers, Opera, Android +title: IPFS in Opera for Android +description: +author: Dietrich Ayala +header_image: 086-ipfs-in-opera-for-android.png +--- + +![IPFS built-in to Opera for Android](./opera-android-banner.png) + +As we hinted in our previous post about [IPFS in web browsers](https://blog.ipfs.io/2019-10-08-ipfs-browsers-update/), IPFS support in the Opera web browser has been in development for some time. + +Today, **Opera for Android 57** is live in the Google Play Store with default support for IPFS with a native handler for `ipfs://` addresses that redirects to the HTTP gateway of your choosing! [Install Opera Android with IPFS now](https://play.google.com/store/apps/details?id=com.opera.browser). + +[![Screenshot of Opera for Android in the Google Play Store, linked to the URL of that page](./opera-android-play-store.png)](https://play.google.com/store/apps/details?id=com.opera.browser) + +This release is a huge leap forward for the IPFS project, with a couple of important milestones: + +- This is the first time IPFS features are _enabled by default_, right out of the box, in a production release of a major web browser. +- This is the first time IPFS is implemented as an _addressable protocol_ in a production release of a mainstream web browser. You can type ipfs:// in the address bar, and Opera for Android will load the provided content address. +- This is the first _mobile_ web browser that is shipping IPFS features in a production release, easing access to decentralized content on the devices used by most internet users around the world. + +This is not just a win for IPFS, but for the distributed web, peer-to-peer, and the idea of content addressability: + +_For the first time, a major web browser does not ask the user to specify which server the content should be fetched from._ + +IPFS and other peer-to-peer protocols are a paradigmatic change to the network architecture of the web - full integration into browsers and web platform will be a very long road. While this type of integration is not a _full_ node, it is this type of bold experimentation by companies like Opera that advances our goal of truly putting users in control of their experience on the internet. + +## Using IPFS in Opera for Android + +IPFS support is enabled by default, so as a user you don’t need to do anything to turn it on. + +![Screenshots of entering an ipfs:// address in Opera for Android, and loading it.](./opera-android-protocol-demo.png) + +You can load an IPFS content address such as: + +> [ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/wiki/](ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/wiki/) + +If you click the link above in Opera for Android you’ll see Wikipedia, served from IPFS! + +Here’s what that same address looks like from an HTTP gateway, which will work in all browsers: + +> https://ipfs.io/ipfs/bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/wiki/ + +## Enabling human-readable addresses + +As you can see, raw IPFS addresses can be quite long and provide few human-readable elements. While many people do not understand what HTTP URLs actually mean, the human readable parts of them have meaning and build trust for users (We’re publishing [some research](https://github.com/ipfs/browser-design-guidelines) about this soon). + +There’s a lot more work to do in maturing [naming in IPFS and distributed web efforts generally](https://github.com/ipfs/notes/blob/master/OPEN_PROBLEMS/HUMAN_READABLE_NAMING.md), but some services have already launched efforts to bridge this gap. + +You can register _decentralized domain names_ that map to IPFS addresses using services like [Unstoppable Domains](https://unstoppabledomains.com/) or the [Ethereum Name System (ENS)](https://medium.com/the-ethereum-name-service/ethdns-9d56298fa38a?source=rss----63df5ce4636f---4). + +You can also register and use any _DNS_ domain name, and map it to IPFS addresses using services like [Terminal.co](https://terminal.co) or tools like [DNSLink](https://docs.ipfs.io/guides/concepts/dnslink/). + +## Implementation + +IPFS support in Opera for Android is enabled by a native protocol handler that uses an IPFS HTTP gateway to fulfill the request. This approach provides a balance: it is respectful of mobile device resources like battery and bandwidth, while easing access to IPFS for early web3 developers. As IPFS continues to mature, we’re evaluating what a more full-featured node on mobile devices might be, and look forward to experimenting with collaborators like Opera to see our vision of a fully decentralized web become real. + +IPFS features in this implementation: + +- Implements the [IPFS Web Browser Addressing specification](https://github.com/ipfs/in-web-browsers/blob/master/ADDRESSING.md), both "ipfs://" and "ipns://" +- Configurable HTTP gateway, with options to use gateways like `dweb.link`, Infura, or a local node +- Supports [subdomain gateways](https://docs.ipfs.io/how-to/address-ipfs-on-web/#subdomain-gateway) for secure web apps +- Supports mixed protocol use, such as loading images over IPFS in an HTTP web page + +Read on to learn more about these features. + +## Native Protocol Addressing + +Opera has implemented the protocol handler using the IPFS Web Browser Addressing specification. This specification defines how IPFS addresses should be constructed and handled in web browsers. + +Implementation of this specification means a browser supports schemes such as `ipfs://` or `ipns://`. +In addition to navigating to content with these schemes in the address bar, mixed content scenarios are also possible. Examples are XMLHTTPRequest or Fetch requests, external style sheets, or images: + +> <img src="ipfs://..."> + +You can easily check compatibility and level of implementation using the [IPFS protocol handler smoketest page](https://ipfs.github.io/in-web-browsers/ipfs-protocol-handler-support-tests.html). + +Here’s what it looks like in a browser that doesn't support IPFS addresses. In Opera for Android, the image loads the same in both cases. + +![Screenshot of a failed image test in the IPFS protocol handler smoketests.](./opera-android-test-page.png) + +## HTTP Gateways + +Opera for Android 57 adds IPFS support by navigating native IPFS addresses to an IPFS HTTP gateway — a server which connects directly to the IPFS network on your behalf. + +The default gateway in this release of Opera for Android is `dweb.link`, but you can also easily configure the gateway in the Crypto Wallet settings, as shown here: + +![IPFS HTTP gateway configuration in the Crypto Wallet settings in Opera for Android](./opera-android-settings.gif) + +The setting has several choices of gateway built in, and also allows you to set a _custom_ gateway. Perhaps you run your own gateway, are running an IPFS node on your device with a local gateway, or want to use one of the many [public gateways provided by the community](https://ipfs.github.io/public-gateway-checker/). + +Making the default gateway configurable puts you, the user, in control of how you want to connect to the dweb - removing any central point of failure in your IPFS browsing experience. + +## Get Involved + +If you’re interested in IPFS in web browsers, join our channel on IRC on Freenode [#ipfs-in-web-browsers](ircs://irc.freenode.net/#ipfs-in-web-browsers) and [Matrix](https://matrix.to/#/!LiCFQLjSxdKuUVxokg:matrix.org?via=matrix.org&via=tomesh.net) to participate in the discussion! + +You can file issues and follow along with our browser integration work at [ipfs/in-web-browsers](https://github.com/ipfs/in-web-browsers). + +We welcome your help in bringing the distributed web to browsers! Have an idea for an IPFS+browsers project you want to build? We are actively funding new proposals. Take a look at the [IPFS DevGrants program](https://github.com/ipfs/devgrants), where we sponsor work that contributes materially to the success of IPFS. + +Now go install [Opera for Android](https://play.google.com/store/apps/details?id=com.opera.browser) and enjoy default support for your favorite web3 apps and pages on your phone! diff --git a/src/_blog/086-ipfs-in-opera-for-android/opera-android-banner.png b/src/_blog/086-ipfs-in-opera-for-android/opera-android-banner.png new file mode 100644 index 00000000..141a6b39 Binary files /dev/null and b/src/_blog/086-ipfs-in-opera-for-android/opera-android-banner.png differ diff --git a/src/_blog/086-ipfs-in-opera-for-android/opera-android-play-store.png b/src/_blog/086-ipfs-in-opera-for-android/opera-android-play-store.png new file mode 100644 index 00000000..dbd99c69 Binary files /dev/null and b/src/_blog/086-ipfs-in-opera-for-android/opera-android-play-store.png differ diff --git a/src/_blog/086-ipfs-in-opera-for-android/opera-android-protocol-demo.png b/src/_blog/086-ipfs-in-opera-for-android/opera-android-protocol-demo.png new file mode 100644 index 00000000..f61f7df5 Binary files /dev/null and b/src/_blog/086-ipfs-in-opera-for-android/opera-android-protocol-demo.png differ diff --git a/src/_blog/086-ipfs-in-opera-for-android/opera-android-settings.gif b/src/_blog/086-ipfs-in-opera-for-android/opera-android-settings.gif new file mode 100644 index 00000000..075a3fd9 Binary files /dev/null and b/src/_blog/086-ipfs-in-opera-for-android/opera-android-settings.gif differ diff --git a/src/_blog/086-ipfs-in-opera-for-android/opera-android-test-page.png b/src/_blog/086-ipfs-in-opera-for-android/opera-android-test-page.png new file mode 100644 index 00000000..4fb2257a Binary files /dev/null and b/src/_blog/086-ipfs-in-opera-for-android/opera-android-test-page.png differ diff --git a/src/_blog/087-ipfs-mobile-design-research/README.md b/src/_blog/087-ipfs-mobile-design-research/README.md new file mode 100644 index 00000000..7a74d8f0 --- /dev/null +++ b/src/_blog/087-ipfs-mobile-design-research/README.md @@ -0,0 +1,46 @@ +--- +date: 2020-04-10 +url: /2020-04-10-ipfs-mobile-design-research/ +title: IPFS Mobile Design Research +description: +author: Jim Kosem, Dietrich Ayala +tags: mobile-design-guidelines, Mobile, Design, Research +--- + +The focus of development of IPFS to date has been primarily on desktop and server-class hardware. However, the growth of the internet for more than a decade has been almost entirely on mobile devices. + +This growth at the furthest edge of the network requires solutions at the edge. While the IPFS network continues to grow on mobile (for instance, IPFS now has default support on Opera for Android), more research is needed for the value of the network to be fully realized. IPFS should be directly available and accessible to end users in all their devices - and the design of IPFS integrations should make this clear and easy to use. To create that level of clarity, developers need good guidelines that align with user needs while unlocking all the power of the mobile dweb. + +![Graph of global internet device sales showing devices explosively growing from 2005 to 2016.](./device-sales-2005-2016.jpg) + +In emerging markets and for under-served audiences and marginalized or oppressed peoples the need for data sovereignty, offline-first applications and trustable computing is especially dire, so IPFS should function optimally on the devices used by them in order to serve their use-cases. + +## Research + Design + +Instead of jumping directly into [mobile implementation](https://github.com/ipfs/roadmap/issues/45), we created the **IPFS Mobile Design Guidelines project**: an initiative to research existing P2P protocol use in mobile apps, and create an informed and research-backed set of design guidelines and best-practices for IPFS and the broader P2P and dweb communities to support growth and ease-of-use on mobile. + +The IPFS Mobile Design Guidelines work began in early March 2020 with a research phase investigating usage of mobile internet, cloud services, and P2P / IPFS tools - along with research on wider mobile data sharing and receiving workflows. The guidelines research is the beginning of an open body of design research intended to serve the community and inform efforts to use IPFS in mobile applications, and to use mobile devices to build resilient networks that serve the people holding them. + +## Methodology + +The overall project has two programmes of work. The first is primary research and synthesis, and the second is the development and publication of tools for designers, implementors and builders. The primary research phase is now in progress. It consists of qualitative interviews with three cohorts, landscape surveys of technology and interaction methods, and secondary research to produce findings to be used in the next phase. This second phase will include design recommendations for the implementation and use of IPFS on mobile, including the enumeration of use cases, the design of interaction patterns, and creation of interface components - all of which will be published for the community to use. + +## Interviews + +Research interviews have been split between three cohorts, the first of which are Experts. Experts are people who’ve worked on IPFS or similar technologies to gather insights and experience in developing P2P technologies for mobile users. + +Simultaneously, Early Adopters were interviewed to understand in which directions the adoption of IPFS on mobile might or should go. Most Early Adopters gathered experience by working in related fields such as blockchain, decentralisation, research, data privacy and security. Therefore, they were uniquely positioned to give educated opinions and foresight in how to translate the knowledge and developments of experts into what might work for users. + +Finally, we’ve begun talking to Potential Users, who are mobile phone users recruited for having had smart phone, P2P and cloud services experience across varying geographies and demographics. These future users will help guide the design phase of the Mobile Design Guidelines - which will identify features, patterns and standards to enable P2P and IPFS to gain widespread acceptance and adoption on mobile. + +## Survey Review + +The survey reviews will cover current uses and applications of IPFS and P2P in mobile devices. The survey is focused on mobile devices exclusively, and applications which use P2P transports in both native or web apps. It will list use-cases, and identify commonalities and differences in implementations. + +## What's Next + +As we wrap up the research phase of the Mobile Design Guidelines, we'll share the insights from this phase and kick off work on the next. We're looking forward to engaging the community to build a better, safer internet that works on the devices you're probably reading this on. + +Learn more in the [project repository](https://github.com/ipfs/mobile-design-guidelines) and join the [Telegram channel](https://t.me/joinchat/H8bKHhSATdsqbPJsPIzcfw). + +This work was funded through the IPFS DevGrants program, which sponsors work that contributes materially to the success of IPFS. Learn more [here](https://github.com/ipfs/devgrants). diff --git a/src/_blog/087-ipfs-mobile-design-research/device-sales-2005-2016.jpg b/src/_blog/087-ipfs-mobile-design-research/device-sales-2005-2016.jpg new file mode 100644 index 00000000..f8b9b7eb Binary files /dev/null and b/src/_blog/087-ipfs-mobile-design-research/device-sales-2005-2016.jpg differ diff --git a/src/_blog/087-js-ipfs-0.42/README.md b/src/_blog/087-js-ipfs-0.42/README.md new file mode 100644 index 00000000..1481e1df --- /dev/null +++ b/src/_blog/087-js-ipfs-0.42/README.md @@ -0,0 +1,200 @@ +--- +date: 2020-04-14 +url: /2020-04-14-js-ipfs-0-42/ +title: js-ipfs 0.42.0 released +header_image: js-ipfs-placeholder.png +description: +author: Alex Potsides +--- + +# 🔦 Highlights + +> Smaller, faster, more reliable + +`js-IPFS@0.42.0` has been released, bringing a host of bug fixes and other small stability improvements. + +It reduces the size of the minified bundle by 7.5% for faster downloads and more responsive web apps! + +We've also merged some of our repos together which were logically intertwined. Our hope is that this will make contributing easier and encourage experimentation as there will be fewer PRs to juggle to land a piece of functionality! + +## 🤖 Automated publishing of RCs + +Release Candidate builds of [`js-ipfs`](https://www.npmjs.com/package/ipfs) and [`js-ipfs-http-client`](https://www.npmjs.com/package/ipfs-http-client) are now being published to npm with every build of master, so you can try out the very bleeding edge with: + +```console +$ npm install -g ipfs@next +or +$ npm install ipfs-http-client@next +``` + +This will download and install a version of `js-ipfs` and/or `js-ipfs-http-client` created from the last successful [build](https://travis-ci.com/github/ipfs/js-ipfs/branches) of master with no GitHub URLs in the production dependency tree. + +## 🛳️ Updated Docker containers + +Publishing to Docker Hub has been restored so you can get a container running the latest and greatest `js-ipfs` with: + +```console +$ docker pull ipfs/js-ipfs +``` + +You can also pull pre-releases at any time with: + +```console +$ docker pull ipfs/js-ipfs:next +``` + +Check out all the releases at: https://hub.docker.com/r/ipfs/js-ipfs + +## ✨New features + +The [MFS][] CLI now supports nanosecond mtimes, use it with the following commands: + +```console +$ jsipfs mkdir /directory --mtime 1000 --mtime-nsecs 5 +``` + +`--mode` and `--mtime` are now also supported when piping files to `jsipfs add`: + +```console +$ cat ./file.txt | jsipfs add --mode 0500 +``` + +## 🔨 Breaking changes + +- [HAMT](https://en.wikipedia.org/wiki/Hash_array_mapped_trie) sharded directories are now reported as having a type of `'directory'` from `ipfs.files.stat` in line with `go-ipfs` [ipfs/js-ipfs#2811](https://github.com/ipfs/js-ipfs/pull/2811) +- When specifying metadata and `--raw-leaves` to `ipfs.add`, if the file is small enough to fit into one block, `--raw-leaves` is ignored and a [UnixFS][] entry is created (previously the returned [CID][] would have a codec of `raw`) [ipfs/js-ipfs-unixfs#44](https://github.com/ipfs/js-ipfs-unixfs/pull/44) + +## 🦟 Bugs fixed + +- WebRTC configuration is now passed to the libp2p WebRTC transport correctly [ipfs/js-ipfs#2966](https://github.com/ipfs/js-ipfs/pull/2966) +- Unknown CLI commands now cause the process to exit with a non-zero exit code [ipfs/js-ipfs#2916](https://github.com/ipfs/js-ipfs/pull/2916) +- Running Prometheus metrics in Docker containers no longer prevent the container from starting [ipfs/js-ipfs#2952](https://github.com/ipfs/js-ipfs/issues/2952) + +## 💍 One PR to rule them all + +A common observation made about IPFS development is that there are so many repos to gain knowledge of, it’s hard to know how everything fits together and where a problem might originate, all of which makes it hard to start contributing. + +Contributors will sometimes spend precious time crafting one PR, only to be told they need to make additional PRs to repos they didn't even know existed in order to land their initial change. This often ends up being too much of a barrier for developers who have external time pressures or have other shiny PRs to push on. + +Features must be staged across multiple releases from multiple repos, and any of these releases have the potential to block unrelated work streams in other repos & projects purely through human error - bugs may be introduced, or perhaps a follow up piece of work becomes necessary. With multiple releases from multiple repos it also becomes hard to roll back these changes; it's a last resort tactic but denying us it's use because our module release process is complicated is an artificial constraint of our own making. + +To start to address this we’ve consolidated `js-ipfs`, `js-ipfs-mfs`, `js-ipfs-multipart`, `js-ipfs-http-client` and `interface-js-ipfs-core` into [one repository](https://github.com/ipfs/js-ipfs). + +This made sense because a given IPFS feature is typically implemented in `js-ipfs`, exposed over http by the http client and tests are added to the interface suite to ensure everything works together - now you will be able to make that sort of change in **one PR instead of three!** + +It’s our hope that this will go some way towards simplifying IPFS development and will encourage new contributors to pitch in and help us build the platform to power the distributed web. + +## 🗺️ What's next? + +To get a better view on what’s coming up in `js-ipfs` releases, we’ve put a [Project Roadmap](https://github.com/orgs/ipfs/projects/6) together that contains headline features organised in the order we hope them to land. + +Only large features are called out in the roadmap, expect lots of small bugfix releases between the roadmapped items! + +# 😍 Huge thank you to everyone that made this release possible + +- [@achingbrain](https://github.com/achingbrain) (149 commits, 44 PRs, 6 issues, 166 comments) +- [@agustinmessina](https://github.com/agustinmessina) (3 comments) +- [@alanshaw](https://github.com/alanshaw) (8 commits, 6 PRs, 1 issue, 12 comments) +- [@alexjc](https://github.com/alexjc) (1 issue, 1 comment) +- [@andrew](https://github.com/andrew) (7 commits, 14 PRs, 1 comment) +- [@aphelionz](https://github.com/aphelionz) (1 PR, 1 issue, 3 comments) +- [@aquiladev](https://github.com/aquiladev) (1 issue) +- [@betamos](https://github.com/betamos) (1 issue) +- [@bluelovers](https://github.com/bluelovers) (2 commits, 8 PRs, 14 issues, 26 comments) +- [@calikevuche](https://github.com/calikevuche) (2 issues, 1 comment) +- [@carsonfarmer](https://github.com/carsonfarmer) (3 comments) +- [@chafey](https://github.com/chafey) (2 commits, 4 PRs, 4 issues, 9 comments) +- [@ChainSafeSystems](https://github.com/ChainSafeSystems) (1 comment) +- [@christopheSeeka](https://github.com/christopheSeeka) (2 issues, 7 comments) +- [@CLAassistant](https://github.com/CLAassistant) (1 comment) +- [@codecov-io](https://github.com/codecov-io) (4 comments) +- [@daviddias](https://github.com/daviddias) (2 commits, 3 PRs, 1 issue, 7 comments) +- [@dirkmc](https://github.com/dirkmc) (1 PR, 5 comments) +- [@Elvenisboy](https://github.com/Elvenisboy) (1 comment) +- [@emclab](https://github.com/emclab) (3 comments) +- [@Gudahtt](https://github.com/Gudahtt) (1 issue) +- [@hacdias](https://github.com/hacdias) (2 commits) +- [@happy-zhangbo](https://github.com/happy-zhangbo) (2 issues, 2 comments) +- [@hazae41](https://github.com/hazae41) (2 issues) +- [@hsanjuan](https://github.com/hsanjuan) (3 comments) +- [@hugomrdias](https://github.com/hugomrdias) (39 commits, 27 PRs, 6 issues, 35 comments) +- [@icidasset](https://github.com/icidasset) (2 issues, 3 comments) +- [@iRyanBell](https://github.com/iRyanBell) (1 PR) +- [@jacobheun](https://github.com/jacobheun) (45 commits, 3 PRs, 3 issues, 36 comments) +- [@Jonybang](https://github.com/Jonybang) (1 issue) +- [@josselinchevalay](https://github.com/josselinchevalay) (1 issue, 4 comments) +- [@jsonsivar](https://github.com/jsonsivar) (2 issues) +- [@kalmi](https://github.com/kalmi) (1 issue, 1 comment) +- [@kanej](https://github.com/kanej) (1 commit, 1 PR, 2 comments) +- [@kawmaiparis](https://github.com/kawmaiparis) (1 issue, 1 comment) +- [@koivunej](https://github.com/koivunej) (1 issue) +- [@kumavis](https://github.com/kumavis) (1 commit, 1 PR, 2 comments) +- [@latenssi](https://github.com/latenssi) (1 issue, 2 comments) +- [@lidel](https://github.com/lidel) (1 PR, 2 issues, 4 comments) +- [@MaduraRaj](https://github.com/MaduraRaj) (1 issue) +- [@MaxGraey](https://github.com/MaxGraey) (1 comment) +- [@mcclure](https://github.com/mcclure) (1 issue) +- [@mell-old](https://github.com/mell-old) (1 issue) +- [@mfsoftworks](https://github.com/mfsoftworks) (1 comment) +- [@mikeal](https://github.com/mikeal) (1 issue, 12 comments) +- [@mkg20001](https://github.com/mkg20001) (4 commits, 1 issue, 4 comments) +- [@mmm8955405](https://github.com/mmm8955405) (1 issue, 6 comments) +- [@MonarthS](https://github.com/MonarthS) (1 comment) +- [@mpetrunic](https://github.com/mpetrunic) (1 PR) +- [@nijynot](https://github.com/nijynot) (1 commit) +- [@notsag-dev](https://github.com/notsag-dev) (1 PR) +- [@npfoss](https://github.com/npfoss) (1 commit) +- [@obo20](https://github.com/obo20) (1 issue, 3 comments) +- [@olizilla](https://github.com/olizilla) (1 commit, 1 PR, 2 comments) +- [@ottodevs](https://github.com/ottodevs) (5 comments) +- [@pcowgill](https://github.com/pcowgill) (2 PRs, 8 issues, 43 comments) +- [@ribasushi](https://github.com/ribasushi) (1 issue, 1 comment) +- [@rigwild](https://github.com/rigwild) (1 comment) +- [@robertkiel](https://github.com/robertkiel) (6 commits, 6 PRs, 1 comment) +- [@rvagg](https://github.com/rvagg) (1 PR, 7 comments) +- [@SahidMiller](https://github.com/SahidMiller) (1 comment) +- [@sbhamad](https://github.com/sbhamad) (1 issue) +- [@Schwartz10](https://github.com/Schwartz10) (1 comment) +- [@sebastiendan](https://github.com/sebastiendan) (2 issues, 9 comments) +- [@SignpostMarv](https://github.com/SignpostMarv) (2 issues, 2 comments) +- [@siman](https://github.com/siman) (2 comments) +- [@sinkuu](https://github.com/sinkuu) (1 comment) +- [@stale](undefined) (1 comment) +- [@Stebalien](https://github.com/Stebalien) (2 commits, 2 PRs, 1 issue, 9 comments) +- [@svdo](https://github.com/svdo) (1 PR, 1 comment) +- [@tabcat](https://github.com/tabcat) (2 commits, 2 PRs, 1 issue) +- [@tniessen](https://github.com/tniessen) (1 issue) +- [@tuyennhv](https://github.com/tuyennhv) (1 PR, 1 comment) +- [@uchetron](https://github.com/uchetron) (1 issue) +- [@ulvus](https://github.com/ulvus) (1 comment) +- [@vasco-santos](https://github.com/vasco-santos) (72 commits, 17 PRs, 17 issues, 78 comments) +- [@vaultec81](https://github.com/vaultec81) (2 issues, 10 comments) +- [@vmx](https://github.com/vmx) (12 commits, 9 PRs, 11 comments) +- [@warpfork](https://github.com/warpfork) (1 comment) +- [@wemeetagain](https://github.com/wemeetagain) (1 commit, 1 comment) +- [@whyrusleeping](https://github.com/whyrusleeping) (1 comment) +- [@wolfgang](https://github.com/wolfgang) (1 comment) +- [@woss](https://github.com/woss) (1 comment) +- [@x5engine](https://github.com/x5engine) (1 comment) +- [@Xmader](https://github.com/Xmader) (1 commit, 1 PR) +- [@xmaysonnave](https://github.com/xmaysonnave) (1 issue, 1 comment) +- [@zebateira](https://github.com/zebateira) (1 PR) +- [@zot](https://github.com/zot) (1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don’t know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute: https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works, and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. + +[unixfs]: https://docs.ipfs.io/guides/concepts/unixfs/ +[cid]: https://docs.ipfs.io/guides/concepts/cid/ +[mfs]: https://docs.ipfs.io/guides/concepts/mfs/ diff --git a/src/_blog/088-ipfs-grants-platform/README.md b/src/_blog/088-ipfs-grants-platform/README.md new file mode 100644 index 00000000..7d71c8cb --- /dev/null +++ b/src/_blog/088-ipfs-grants-platform/README.md @@ -0,0 +1,38 @@ +--- +date: 2020-04-20 +url: /2020-04-20-ipfs-grants-platform/ +title: IPFS Grants Platform +description: +author: Arkadiy Kukarkin, Molly Mackinlay +header_image: 088-ipfs-grants-platform.png +tags: grants, COVID, bounties +--- + +If you’ve spent time in the Web3 ecosystem, you’ve probably come across work that was supported by an IPFS ecosystem development grant. The [ENS integration work funded in 2019](https://medium.com/the-ethereum-name-service/ethdns-9d56298fa38a) established a de facto standard for [decentralized website hosting](https://app.ens.domains/name/ethereum.eth). A [2018 grant to Peergos](https://peergos.org/posts/dev-update) to build a new scalable capabilities system helped define an exemplar for distributed access controls for mutable data. And a [shared grant with NearForm](https://www.nearform.com/blog/a-quic-update-for-node-js/) helped implement Node.js support for the new QUIC protocol. These grants help support and accelerate the ecosystem of developers building on IPFS, and contribute to our mission to create a resilient, upgradeable, open network to preserve and grow humanity’s knowledge. + +### Motivation + +As with every growing ecosystem, there’s a lot to be done to make IPFS successful. Last June, we gathered with the rest of the community at [IPFS Camp](https://blog.ipfs.io/2019-07-08-ipfs-camp-recap/), where the variety and vitality of the projects building in this space was exemplified in the SciFi fair, showcasing projects from Brave, Metamask, Textile, Berty, and more. Spending time with this thriving ecosystem (while immensely inspiring), also clarified the demand for more IPFS tooling: the functionality, features, and integrations outside the core IPFS protocol to help accelerate development by many projects across the community. + +The newly updated IPFS Grant Platform aims to support exactly this need—helping the community coordinate and fund production of high-leverage tooling to grow IPFS adoption and usability. We call it the IPFS Grant _Platform_, because it’s intended to bring together community members at every stage of the grant-making and grant-writing process. Anyone can propose new RFPs or bounties for features and enhancements they’d like to see, and the process of refining and selecting grant recipients happens transparently in the open. Multiple organizations can even fund grants together! + +### Q1 Soft Launch + +We soft launched this updated Grants Platform in Q1, with a [quarterly focus](https://github.com/ipfs/devgrants/blob/master/FOCUS.md#q1-2020-hello-world) on empowering the community to meet shared needs. This broad goal led to a wide range of projects in this cohort: from [a microadoption grant to NYCMesh for integrating dweb technlogies in support of local services](https://github.com/ipfs/devgrants/issues/11), to [a bounty for adding metadata support to Unixfs](https://github.com/ipfs/go-ipfs/issues/6920) needed by [package managers](https://github.com/ipfs/package-managers) to speed up updating large mirrors, to [an ambitious new IPFS implementation in Rust](https://github.com/ipfs/devgrants/tree/master/open-grants/ipfs-rust) that will benefit many projects using IPFS in resource-constrained environments. + +### Launch and Q2 Focus + +This batch has already borne fruit, including [half a dozen completed bounties](https://github.com/ipfs/devgrants/projects/1), the beginnings of a [Rust IPFS implementation](https://github.com/ipfs-rust/rust-ipfs), [new user research into IPFS on mobile](https://blog.ipfs.io/2020-04-10-ipfs-mobile-design-research/), and more! Therefore, we’re excited to **officially launch the IPFS Grants Platform!** Hop over to the [repo](https://github.com/ipfs/devgrants) to learn more. We’ll be following up soon with an IPFS Grants Guide here on the blog, including a deep dive into the different grant types and how to participate. + +Unfortunately, spinning up this Grants Platform also happened to coincide with the spread of the worst pandemic this century. Therefore, we’re making the Q2 [Quarterly Focus](https://github.com/ipfs/devgrants/blob/master/FOCUS.md) **COVID-19 relief** to help the many projects and tools working to contain the spread and impact of this disease. This means proposals like making COVID-19 related datasets [more durable and available](https://github.com/ipfs/ipfs-cluster/issues/1021), enabling local community support networks, empowering remote work during quarantine, and so on, will be given first consideration. + +### Acknowledgements + +We couldn’t have put this program together without your support and guidance: + +- The [libp2p](https://github.com/libp2p/devgrants) and [Filecoin](https://filecoin.io/grants/) Dev Grants programs were great sources of advice and recommendations +- The [COVID-19 Open Innovation Grants](https://protocollabs.smapply.io/prog/covid-19_open_innovation_grants/) from Protocol Labs Research helped inspire our Q2 focus +- The [Secure Scuttlebut Consortium](https://github.com/ssbc/grants-process) are a useful example of low overhead, high autonomy grants +- [Ethereum Foundation Ecosystem Support](https://ecosystem.support/) and [Web3 Foundation Grants](https://web3.foundation/grants/) were also great references + +But most importantly, a huge thank you to everyone who participated in the Q1 cohort and helped us dial in the proposal and application flow for the IPFS Grants Platform. Thanks for helping accelerate the IPFS Project and ecosystem! diff --git a/src/_blog/089-ipfs-mobile-design-research-findings/README.md b/src/_blog/089-ipfs-mobile-design-research-findings/README.md new file mode 100644 index 00000000..de797d19 --- /dev/null +++ b/src/_blog/089-ipfs-mobile-design-research-findings/README.md @@ -0,0 +1,58 @@ +--- +date: 2020-04-24 +url: /2020-04-24-ipfs-mobile-design-research-findings/ +title: IPFS Mobile Design Research Findings +description: +author: Jim Kosem, Dietrich Ayala +tags: mobile-design-guidelines, Mobile, Design, Research +--- + +For IPFS to succeed, it needs to be where people will use it, and for the vast majority around the world that is on their smartphones. In the [introductory post](https://blog.ipfs.io/2020-04-10-ipfs-mobile-design-research/), we laid out the intent of this project - to provide a foundation for successful IPFS apps on mobile by understanding how people are building, using and thinking about P2P and IPFS on mobile today, and then publishing tools to guide the next wave of application builders. + +In this first phase of the work, we carried out primary research and analysis consisting of qualitative interviews, and surveys of technology and interaction methods. We’re now ready to publish the results of that research! + +A short summary of the findings is below. You can read the full findings and detailed research at the [IPFS Mobile Design Guidelines website](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/). + +## Application Survey + +We surveyed the two most used mobile browsers, Android’s Chrome and iOS’s Safari. Neither of these browsers has native P2P capabilities, but we surveyed them to understand mobile users’ first stop on the internet and how they may think about sharing to and from there. + +![Google Android sharing photo interaction](https://raw.githubusercontent.com/ipfs/mobile-design-guidelines/master/.gitbook/assets/android-chrome-share.png) + +Mobile sharing of files is a very common activity for all ranges of users, but the type of file shared varies from the desktop. We chose sharing photos as an interaction to study on both Android and iOS. This was to understand clearly how mobile users experience getting a file from their phone to another device. + +We then tested a variety of publicly released mobile P2P apps. This was to understand previous approaches to designing and developing mobile P2P applications. The applications explored in the survey were spread across three main areas of use: messaging, posting and community boards. From this we learned which features, interface components, and design patterns are currently used in designing for P2P on mobile, to inform future designs for IPFS. + +![Status.im's key recovery process](https://raw.githubusercontent.com/ipfs/mobile-design-guidelines/master/.gitbook/assets/status-recover.png) + +After in-depth review, we found many intriguing approaches to several shared core areas: + +- Apps differed widely in how they approached onboarding and user education. +- Users were generally made aware of privacy and connection implications with sharing. +- Identity and account management varied, ranging from typical email login and password to key and seed phrase recovery. +- We found status and notifications around connection, syncing, and download status to be lacking. We found many scenarios where the user could connect to others and send files without confirmation, as well. +- In general, there was no consistent sharing method. The main sharing methods were either through torrent apps or through messaging, either direct to users or to community boards. +- The anonymous file share web apps handled privacy better, making use of links and QR codes. +- To find other users with chat, features ranged from public discoverability to obscure invite methods. + +## User Research + +User research began with creating assumptions. We gathered these by speaking with and running a workshop with IPFS stakeholders. These assumptions framed the interviews with the Experts, Early Adopters, or Potential Users. + +#### EXPERTS + +In the interviews, the Experts expressed concern for many potential user issues such as battery life and signal. They did not have extensive user feedback to validate this yet and spoke about needing to grow their user bases. There was particular emphasis on identity being essential to both users and developers. There was also the assumption users concerned about privacy and security would find P2P useful. We also found that offline-first is a trend that is important but difficult to push forward. Design came up in interviews as well, pointing to Dropbox and AirDrop as the gold standard for file sharing. Finally, they highlighted status and notifications as areas requiring consideration and further work. + +#### EARLY ADOPTERS + +Early Adopters thought users should always know what was going on. The app would inform the user with notifications, but they should not be overwhelming. Early Adopters thought privacy and security was crucial, yet in general navigating privacy and security options is difficult even for advanced users. They emphasised file management, security, permissions, and backup as essential. What was less important was who had the final or original file which was interesting. Most mentioned Single Sign-On (SSO) as a good thing but complex to manage. Finally, most mentioned cloud services like Dropbox as easy to use but not trustworthy. + +#### POTENTIAL USERS + +The Potential Users all showed a great deal of variety in the type of media files used and shared. They all understood P2P as a concept, but, were unaware of its application. Battery and signal strength were significant issues, but only when lacking. Many ignored identity management, thinking of it as a chore they should do more about. All thought cloud services, such as Dropbox and Google Drive, as stable and dependable. There was concern about their longevity as well as their true intents in business models. + +## Next steps + +In the next phase we will develop and publish tools for designers, implementors, and builders including design recommendations for the implementation and use of IPFS on mobile. This will take the form of use cases, interaction design patterns, and interface components design. All of this will be published for the community to use, and to inform the next wave of application builders using IPFS or other P2P protocols. These learnings will also be used to inform our core protocol design as IPFS usage grows and extends beyond desktop and server machines. + +As IPFS matures and the community grows, we need to look in earnest at how to involve users. The [IPFS Mobile Design Guidelines](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/) will bridge user needs with core development and the many builders of apps and services. The design guidelines will unify thinking and best practices, providing necessary components, interaction and interface design frameworks. Look for our next post sharing that work soon. diff --git a/src/_blog/090-go-ipfs-0-5-0/README.md b/src/_blog/090-go-ipfs-0-5-0/README.md new file mode 100644 index 00000000..900228d7 --- /dev/null +++ b/src/_blog/090-go-ipfs-0-5-0/README.md @@ -0,0 +1,105 @@ +--- +date: 2020-04-28 +url: /2020-04-28-go-ipfs-0-5-0/ +title: IPFS 0.5.0 is here! Our largest upgrade to IPFS yet +description: +author: Molly Mackinlay +header_image: 090-go-ipfs-0-5-0.png +tags: go-ipfs, release +--- + +![Announcing IPFS 0.5](/header_images/090-go-ipfs-0-5-0.png) + +_go-ipfs 0.5.0 is a major step forward on our journey toward a more efficient, secure, and resilient web to preserve and grow humanity’s knowledge._ + +We’re happy to share that IPFS 0.5.0, the largest upgrade to the IPFS protocol and Public Network yet, is now available. The result of extensive community feedback and rigorous focus, IPFS 0.5.0 offers major performance and reliability updates so that you can distribute content peer-to-peer more efficiently and affordably. + +[Check out our changelog](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md) if you’d like to dive right into the details. + +## What IPFS 0.5.0 means for the web + +Today’s web is fragile, inefficient, and expensive. It’s built on a client-server model that finds and serves up content based on its location on a particular host — no matter how far away or inaccessible. It is a system that can no longer stand up to the highly dynamic ways we communicate, create, work, consume, and connect. + +The distributed web is changing that. IPFS rearchitects the web to work peer to peer, addressing data by **what** it is instead of **where** it’s located. In doing so, IPFS powers a resilient and scalable network. Our latest release, IPFS 0.5.0, offers even greater performance and reliability to meet the increasing demands on the web today, as well as into the future. + +## Community feedback was our roadmap + +The IPFS Public Network has experienced substantial growth (scaling 30x in 2019!), bringing new opportunities for IPFS users and the wider InterPlanetary ecosystem. Major deployments and applications that require fast and reliable connectivity have started building on and supporting IPFS: + +- **Opera & Brave:** [Opera](https://blog.ipfs.io/2020-03-30-ipfs-in-opera-for-android/) became the first major web browser to offer default IPFS support on Android, shortly after [Brave](https://blog.ipfs.io/2019-10-08-ipfs-browsers-update/) started directly embedding the IPFS Companion extension (complete with a built-in js-ipfs node). This means millions of people around the world now have access to the decentralized web built directly into their browsers. +- **Microsoft ION:** [Microsoft has turned to IPFS](https://techcommunity.microsoft.com/t5/azure-active-directory-identity/toward-scalable-decentralized-identifier-systems/ba-p/560168) as the content addressed storage layer to power its take on a decentralized identity system. +- **Netflix:** [We began collaborating](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/) on ways to incorporate peer-to-peer services into Netflix’s developer tooling to speed up container image distribution in their build pipeline. +- **Cloudflare:** Cloudflare runs a [distributed web gateway](https://www.cloudflare.com/distributed-web-gateway/) to serve content hosted on IPFS easily, quickly, and securely. + +We worked with these organizations, as well as many active IPFS users and our broader community, to source feedback and identify priorities for this release and the remainder of 2020. With their help, we zeroed in on two major pain points: performance and reliability. + +## Performance and reliability upgrades in IPFS 0.5.0 + +Our performance work centered around **content routing**, the process of finding and fetching the data you need to load a website, watch a video, or use an app. Now that our distributed network scales to **100,000s of nodes**, we need to be much more rigorous about what nodes should participate in routing requests and where we should announce new content to improve overall reliability. + +Here are a few of the improvements made in IPFS 0.5.0: + +![Improvements to go-ipfs 0.5.0](/090-go-ipfs-0-5-0/0.5-Infographic.png) + +- **Faster content discovery:** IPFS 0.5.0 makes finding and sharing data in the network much faster, thanks to large improvements to our [DHT logic](https://docs.ipfs.io/concepts/dht/). More efficient routing and providing—already 2-3x faster—lowers bandwidth usage and background traffic. We’ve also updated our experimental QUIC transport to reduce connection latency and round-trips—with the aim to make this the default next release! +- **Speedy files transfers:** We sped up our file transfer mechanism, [Bitswap](https://docs.ipfs.io/concepts/bitswap/), to make sharing data between many nodes much faster. [Read more](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/) about how we worked with Netflix to benchmark and stress-test these improvements! +- **Faster file adding:** It’s now up to 2x faster to add files to the IPFS network using the Badger datastore on Linux and MacOS. Huzzah for async writes! We’ve also configured Badger to use less memory. +- **Faster and more reliable mutable links:** The Inter-Planetary Name System ([IPNS](https://docs.ipfs.io/concepts/ipns/)), our system for creating mutable links for content addresses, now provides faster naming lookups and has a new experimental pubsub transport to speed up record distribution. Providing an IPNS record is now _30-40x_ faster in 1K node network simulations! + +To ensure the reliability of all these large-scale improvements, we created [Testground](http://testground.ipfs.team/), a new testing tool for peer-to-peer networks at scale. This allowed us to validate and benchmark each enhancement across many network configurations with 1K+ node simulations—increasing development velocity and rigor. + +## But wait—there’s more! + +We said this was a major release, after all. 😉 In IPFS 0.5, we also made great progress on the developer tools and security front, including: + +- **Broader support for security and encryption protocols:** IPFS now uses Transport Layer Security (TLS), an open standard for transport security, by default to help maintain secure connections between clients and servers. +- **Developer experience improvements:** IPFS 0.5.0 supports many existing tools and workflows, making the power of decentralization accessible to more developers. Updates include: + - **Subdomains in the HTTP gateway:** Developers can now put dapps (decentralized apps) in isolated origins to secure their applications and web content. This works with hashes, IPNS, DNSLink, ENS, and others. + - **/ipfs/peer_id → /p2p/peer_id:** We now disambiguate ipfs files from peer addresses by using /p2p/ for the latter. + - **.eth link support:** Blockchain-based .eth links are supported by default, opening up IPFS further to decentralized application developers (support for more distributed TLDs coming soon!). + +Please see our [changelog](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md) for the comprehensive list of IPFS 0.5.0 updates, as well as our deep dive on all the great things in this release. + +## The impact of IPFS 0.5.0 (already!) + +With our new testing and release process, IPFS 0.5.0 has already been put to use in a variety of production environments. Here’s how it’s making a difference for IPFS users: + +**_Matt Ober, Pinata:_** “IPFS 0.5 makes big improvements to Bitswap, which de-dupes data transfer between nodes. This means data providers like Pinata who are transferring a lot of data all around the world every day, can send each block only once and it gets to its destination. That cuts our bandwidth costs down significantly. And, it’s also faster.” + +![Improved container image performance](/090-go-ipfs-0-5-0/container-image.png) + +**_Michael Godsey, Infura:_** “Our collaboration with Protocol Labs and the latest go-ipfs v0.5 release are essential to our upcoming premium IPFS product release later this year. The upgraded subdomain gateway support greatly improves the security of our offering while helping us support some great new features. The improvements to the DHT and stability of peering allow us to provide an even more reliable product and continue to get IPFS into the hands of decentralized application developers.” + +**_Dr. Ian Preston, Peergos:_** “What we’ve seen is that an inactive IPFS instance now uses way less bandwidth to maintain the DHT and other background traffic. With IPFS 0.5, this load has gone down by a factor of four: it was about 800 kilobits a second and now it’s 200 kilobits a second. That doesn’t sound like much, but it adds up fast—so this makes a big difference.” + +**_Brendan O’Brien, Qri:_** “Our engineering time is one of our most valuable resources. We’re now seeing a much more mature version of IPFS, which means we're able to spend more time on our own code vs our dependencies. It took less than a day to upgrade to IPFS 0.5.0, allowing us to commit more of our engineering time to building and fixing our own things.” + +If you’re running IPFS, we highly encourage you to upgrade ASAP to take advantage of all these improvements! Check out our [release notes](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/) and [upgrade how-to](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/update-procedure) to get started today! + +## Thank you, thank you, and thank you. + +There is no way IPFS 0.5.0 could have been our biggest update yet without the help of many contributors. A special thanks to our [early testers](https://github.com/ipfs/go-ipfs/blob/master/docs/EARLY_TESTERS.md) for this release, especially: + +- @MichaelMure (Infura) +- @carsonfarmer (Textile) +- @b5 (Qri) +- @obo20 (Pinata) +- @ianopolous (Peergos) +- @postables (RTrade) +- @meeDamian +- @pataquets + +Also, a huge thank you to [everyone who contributed](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#contributors) patches and improvements in this release, all **98** of you! We couldn’t have made this happen without your help and feedback. ❤ + +[![IPFS Contributors](/090-go-ipfs-0-5-0/ipfs-contributors.png)](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#contributors) + +## Want to learn more...or even, better get involved? + +We’d like to know what you think and help answer any questions you may have. [Please join us for a virtual meetup](https://www.meetup.com/San-Francisco-IPFS/events/270212268/) on **Friday, May 1st**, to deep-dive on the improvements in this release and field questions and feedback. +[![IPFS 0.5 Launch Meetup](/090-go-ipfs-0-5-0/Launch-Meetup.png)](https://www.meetup.com/San-Francisco-IPFS/events/270212268/) + +In the meantime, get started by [installing go-ipfs](https://dist.ipfs.io/#go-ipfs) or [upgrading to go-ipfs 0.5](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/update-procedure) to see the improvements yourself! + +And, of course, there are many other ways to get involved with IPFS based on your skill set, interest, and availability. Please check out [our contribution page](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) on GitHub for guidance and next steps. + +This is an exciting time for IPFS and the web in general. Join us! diff --git a/src/_blog/091-dev-exp/README.md b/src/_blog/091-dev-exp/README.md new file mode 100644 index 00000000..9f52e65a --- /dev/null +++ b/src/_blog/091-dev-exp/README.md @@ -0,0 +1,40 @@ +--- +date: 2020-05-05 +url: /2020-05-05-developer-experience/ +title: Improving the IPFS Developer experience +description: +author: Hector Sanjuan +tags: Developer, Experience +--- + +Since its founding in 2014, the IPFS project has been stewarded by the [core IPFS working groups](https://github.com/ipfs/team-mgmt/blob/master/TEAMS_ROLES_STRUCTURES.md#active-teams), including developers, designers, researchers and project managers that work very hard towards its [success](https://blog.ipfs.io/weekly-84/). + +However, this success would be impossible without the participation of the open source community that has grown around IPFS - with participants from individuals, to nascent community-owned tools, to large organizations. We are lucky to have this thriving and influential community participating in our journey towards decentralization during these years. With their help, we’ve grown IPFS to empower [hundreds of tools, applications and projects](https://awesome.ipfs.io/). + +A thriving, growing, and participatory open source community is key to the success of the IPFS project, and continues to be a focus for the core IPFS working groups. We want every user and developer interested in building IPFS applications — or willing to join forces to fix and improve the codebase — to feel welcomed, informed, and empowered by the community. Therefore, as part of our [secondary 2020 focus on contributor velocity and support](https://blog.ipfs.io/2020-02-10-our-focus-for-2020/#increasing-contributor-velocity-supporting-adoption) we will: + +- Improve how users and developers get help, reducing response times and improving access to existing information and documentation. +- Reduce the number of pull requests and issue reports that stay in limbo by giving consistent feedback on status, prioritization and team capacity. +- Better inform contributors about the different steps of the contribution process, and how they fit with the priorities of the project and core working groups. + Increase community participation, providing better avenues to facilitate involvement in the projects, remove bottlenecks, and create capacity to give support. + +After discussion with active IPFS contributors and research into other OSS community best practices, we’ve identified a few changes to help improve the IPFS contributor experience: + +- Contributors need a clear and explicit contribution process to the more than 100 active repositories in the IPFS organization. Any new contribution should have clarity on who is going to review the submission, what priority it has, and what the next steps are. To meet this need, we’ll be drafting a new process in the [official IPFS forums](http://discuss.ipfs.io/) so that it can be iterated on by the community. +- The new IPFS Github organization [labelling taxonomy](https://github.com/ipfs/community/blob/master/ISSUE_LABELS.md) (recently rolled out to all repositories) aims to improve triaging of discussions and requests to clearly reflect status and priority. This comes with an additional effort to consolidate and clean up outdated issues and inactive repositories. As a result, many inactive repos have been moved to the [ipfs-inactive Github organization](https://github.com/ipfs-inactive) to clearly differentiate code that is actively maintained from code that is dormant or deprecated. +- To help funnel users and devs where the community can better support them, our [IPFS discussion forums](https://discuss.ipfs.io/) will be more prominently displayed (in docs, READMEs and issue templates) as the default venue for support (along with pointers to [ipfs.io/help](https://ipfs.io/help)). Some discussion-only and meta-topic repositories are also in the process of migrating their conversations to the forums, where they can reach a wider audience and be more easily searchable and discoverable by other users. +- New contributors to repositories will now receive automated responses on their first submission, giving context on the process outlined above and reminders for needed information. This will help reduce the number of round trips for contributors and reviewers/maintainers. +- A [major review of the documentation](https://docs.ipfs.io/) site is already underway to provide better developer documentation for our major implementations and products. [Watch this space!](https://github.com/ipfs/docs/milestones) + +![IPFS Autoresponder and labels](/091-dev-exp/labels-autoresponder.png) + +At the same time, there are some things that are NOT changing: + +- Old issues will not be closed or locked because they are old, or stale, or very low priority. Some parts of the IPFS project have a large backlog and it is important that the information is not lost or dismissed, but can be found by others interested in the topic. +- The core working groups will still dedicate a large portion of time to help users, answer questions, and review and merge contributions. However, there will be an extra focus on keeping discussions on point and limiting information explosion. + +We want to empower the developer community to build amazing things with IPFS, and these contributor experience changes aim to make it faster and easier to start participating in the IPFS Community (whether filing issues or making PRs). However, improving that experience requires feedback and iteration as we refine our next steps as a community. For this, [a new discussion thread](https://discuss.ipfs.io/t/ideas-to-improve-the-ipfs-developer-experience/7750) is available in the forum, where anyone can post new proposals or give suggestions/feedback on recent changes. + +We hope these measures help everyone build a happy and growing IPFS developer community! + +![IPFS Contributors](/090-go-ipfs-0-5-0/ipfs-contributors.png) diff --git a/src/_blog/092-launching-testground/README.md b/src/_blog/092-launching-testground/README.md new file mode 100644 index 00000000..0adce6bc --- /dev/null +++ b/src/_blog/092-launching-testground/README.md @@ -0,0 +1,120 @@ +--- +date: 2020-05-06 +url: /2020-05-06-launching-testground/ +title: Launching Testground v0.5 +description: +author: Raul Kripalani +header_image: 092-launching-testground.png +tags: testground, release +--- + +![Launching Testground](/header_images/092-launching-testground.png) + +Testing peer-to-peer (p2p) systems is hard. Doing so reliably and reproducibly is even harder. Today, **we’re releasing [Testground v0.5](https://github.com/testground/testground/releases/tag/v0.5.0) to the world**. This is a huge milestone for us, and for the wider p2p ecosystem. In this post, we’ll walk you through what Testground is, how to get started, what’s coming next, and the backstory behind Testground itself. + +If you followed the [IPFS v0.5.0 release announcements](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/), you will have heard about **Testground**. It was a vital piece of our engineering endeavour and unlocked major improvements in quality, velocity, and reliability. Without [Testground](https://docs.testground.ai/), we would’ve been unable to measure, iterate on, and validate the massive DHT and Bitswap improvements in v0.5.0 at scale. + +Testground was also indispensable in evaluating our latest [libp2p gossipsub 1.1 security extensions](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md). It allowed us to simulate a range of attacks, over 10k instance clusters, packed with sybils and honest nodes, hammering the network with pubsub messages, recording every single event for later analysis and comparison (expect a report soon). + +**The ambitious mission of building bulletproof, unstoppable networks and systems requires rock-solid testing platforms.** + +As Testground graduates from the cozy incubation nest of the IPFS Project, we’ve done an enormous amount of legwork to package Testground so that it’s dead simple for the distributed systems and p2p communities to _hit the ground running_. We hope it brings about a quantum leap in the way we—as a community—engineer p2p and distributed systems for the decentralized future. + +## What is Testground? + +Testground is a platform for testing, benchmarking, and simulating distributed and p2p systems at scale. It's designed to be multilingual and runtime-agnostic, scaling gracefully from 2 to 10k instances as needed. + + + +Testground aims to support **a variety of testing workflows** such as experimental/iterative development, A/B testing, backwards/forward-compatibility testing, interoperability testing, and CI workflows. + +Prior to Testground, distributed testing used to imply deploying fleets of daemons. You’d expose every single internal component, method and configuration parameter over an API, and command-and-control them via an external script acting like a puppeteer. But in Testground, **you write test plans just as you’d write unit tests.** + +We hear that the Testground approach feels strikingly natural to developers. Why? Because **test plans call your internal APIs directly,** and they leverage **a distributed synchronisation API to coordinate** with other instances participating in the test run. Thus, test cases turn into distributed state machines that follow a precise choreography. + +At present, [**you can write test plans in Go**](https://github.com/testground/sdk-go). But implementing a Testground SDK for another language/runtime is dead simple! In fact, the community is hacking away at a TypeScript SDK for node and the browser. + +Because real decentralised systems are at the mercy of network conditions, **Testground can shape network traffic** by flipping connectedness, changing IP addresses at runtime, or setting latency, jitter, bandwidth, etc. + +And since not all test scenarios require thousands of instances, you can **run test plans locally as executables or Docker containers,** saving the overhead, time and cost of resorting to cluster deployments for when you need to scale beyond ~300 instances, or so. For those larger cases, **Testground supports Kubernetes out-of-the-box.** + +To illustrate the above, consider a 200-instance test run. With Kubernetes, it could take 1-2 minutes to ship a Docker image to a remote registry, schedule a Kubernetes job, and wait for the workload to start. With the local Docker runner, that overhead is zero, and the run is immediate. It doesn’t sound like much, but developers know the death by a thousand cuts (or context switches) such delays do to one’s productivity and workflow. + +The cherry on the top of all this is the **observation pipeline (experimental)**. Test plans can record raw data points or aggregate metrics (histograms, [EWMA](https://en.wikipedia.org/wiki/EWMA_chart), counters, etc.) about the system under test, as well as emit arbitrary output assets. **The Testground platform will harvest them and make them available for one-stop collection.** + +![Testground Architecture](/092-launching-testground/launch_testground_architecture.png) + +

Architecture diagram, focused on a test plan’s inputs and outputs, highlighting the circuitry of the observability pipeline

+ +## Getting started + +Want to hit the ground running? Try the following: + +1. Head over to the [Getting started](https://docs.testground.ai/getting-started) section of our docs. +2. Read through the [concepts and architecture](https://docs.testground.ai/concepts-and-architecture) behind Testground. +3. Make sure to check out the [testground/testground](https://github.com/testground/testground) repo on GitHub. +4. Take a peek at some [example test plans](https://github.com/testground/testground/tree/master/plans). +5. Explore the [reference godocs of the Testground SDK](https://pkg.go.dev/github.com/testground/sdk-go?tab=overview), the library you will use to write Testground test plans. + +
+ +## What’s happening next? + +The Testground team paces itself in flexible bi-weekly sprints. + +In the next couple of weeks, we plan to solidify the foundations of Testground by boosting test coverage across the codebase. We affectionately call this phase “test the testground” 😃 + +At the tail end of that sprint, we will produce v0.7 of the Testground Core, which will serve as the plumbing for the next features we plan to land: + +- time-shared cluster deployments. +- tight continuous integration with GitHub (so that developers can @mention Testground and have their PRs automatically tested). +- better matrix-based forms to visualize test run results. + +
+Needless to say, you’re welcome to pitch in at any point in time! Continue reading to learn how. + +![Testground flowchart](/092-launching-testground/launch_testground_flowchart.png) + +## Getting involved + +Testground is an open community, and all the work we do is public. To know what the team is working on, you can peek at the [ZenHub board](https://app.zenhub.com/workspaces/testground-agile-5e55a12c82aac7fef146176e/board), and check the scope & progress of [various milestones](https://github.com/testground/testground/milestones). + +If you feel adventurous and would like to lend a hand with some coding, check out the issues marked with the label [“good first issue”](https://github.com/testground/testground/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22) to get started! + +If you encounter problems, check if an issue has been raised already, or otherwise feel free to raise one on the [GitHub issue tracker](https://github.com/testground/testground/issues). + +The team would love to hear how you’re using Testground in your project. Reach out via Twitter on [@run_testground](https://twitter.com/run_testground)! + +## The backstory: how Testground came to be + +For months, we—the IPFS and libp2p core teams—had been designing and debating ideas to improve the performance of the DHT, secure our pubsub protocol, and speed up content transfer. + +Most discussions led to substantial redesign proposals, which eventually circled back to the million dollar question: + +**_How do we test this without affecting the live network?_** + +Engineers on the libp2p and IPFS projects lean towards taking the scientific approach. It’s in our DNA. We articulate assumptions, gather evidence, formulate hypotheses, speculate about designs, and iterate on proposed changes by _benchmarking and quantifying their impact_ on the system. + +Proposing and merging pull requests that affect the core subsystems is not something we handle lightly. We strive to take solid steps. Unfortunately, we lacked the instruments to do exactly that, and it was slowing down our progress. We knew it, and it burnt. + +The risk of merging a seemingly sane patch and causing a side-effect or regression was crippling. Unit testing and benchmarking at the _micro_ level are insufficient to project or predict changes in the emergent behaviour of decentralised structured or unstructured networks at the macro level (with hundreds of thousands of nodes across a complex network topology). + +We needed to be capable of: + +- launching test workloads on private networks of thousands of nodes. +- exercising arbitrary commits or branches to capture metrics about their behaviour. +- iterating on changesets A and B, launching the same test plans to compare the results against baselines. +- measuring how the network reacts to conditions such as churn and connectivity issues. +- measuring the effect of node upgrades on the overall network health. +- validating that old nodes and upgraded nodes interoperate effectively (avoiding partitions). +- simulating varying network conditions, such as IP address changes, latency, bandwidth, etc. +- doing all of this in a consistent, reproducible manner. + +
+We looked for existing tools to unlock our progress, but couldn’t find a platform that enabled us to do just that. So we built Testground. But we didn’t start from scratch. Testground stands on the shoulders of OSS giants such as [Kubernetes](https://kubernetes.io/), [Docker](https://www.docker.com/), and [Redis](https://redis.io/). We also had previous past experiments, like [InterPlanetary TestLab (IPTB)](https://github.com/ipfs-inactive/pm-test-lab) to learn from and iterate on. + +Since Day Zero, we recognized the value of Testground to the larger distributed systems and p2p community out there. Therefore, we made it project-agnostic from the get-go. + +Despite being born out of the IPFS and libp2p projects, **nothing in Testground depends on libp2p or IPFS: there is a grand total of zero imports.** You don't have to use IPFS or libp2p in order to benefit from Testground to test your p2p network (be it a dapp, a blockchain, or another p2p protocol)! + +We hope that Testground will accelerate your development and experimentation, just like it did for us, and help you gain confidence and reassurance that you’re only improving systems, commit after commit, PR after PR, release after release. diff --git a/src/_blog/093-ipfs-pinning-summit-recap/README.md b/src/_blog/093-ipfs-pinning-summit-recap/README.md new file mode 100644 index 00000000..027a0206 --- /dev/null +++ b/src/_blog/093-ipfs-pinning-summit-recap/README.md @@ -0,0 +1,54 @@ +--- +date: 2020-05-13 +url: /2020-05-13-ipfs-pinning-summit-recap/ +title: IPFS Pinning Summit Recap +description: +author: Molly Mackinlay & Pooja Shah +header_image: 093-ipfs-pinning-summit-recap.png +tags: ipfs, infrastructure, summit, pinning, filecoin +--- + +

+ +

+ +The first-ever [IPFS Pinning Summit](https://ipfspinningsummit.com/) brought together [IPFS pinning services](https://docs.ipfs.io/guides/concepts/pinning/), infra providers, and users for 2 days of presentations & meetings to discuss the current state of IPFS infrastructure, services, and tools - and the future opportunities in this space. + +Day 1 focused on the accelerating growth of the IPFS ecosystem - especially the adoption and improvement of IPFS tooling and support for verticals like Web3 applications, DevOps pipelines, and Large Data on IPFS. The day also included presentations from major IPFS pinning services like [Infura](https://infura.io/) and [Pinata](https://pinata.cloud/), tools smoothing the IPFS upgrade UX like [Fleek](https://fleek.co/) and [UnstoppableDomains](https://unstoppabledomains.com/), and applications building on top of IPFS with strong use cases for IPFS infrastructure and tooling like [Ceramic](https://www.ceramic.network/), [Ucam](https://ucam.iotex.io/), and [Filecoin](https://filecoin.io/). + +
+ +
+ +
+ +**IPFS Project Lead [Molly Mackinlay](https://github.com/momack2)** called the next 18 months a “critical period” for the IPFS community. “There are lots of key applications and projects being built, improving the ecosystem, and all kinds of developer tools are arriving that are transforming how applications and users of IPFS end up using the system,” Mackinlay said. “All of these developer tools and systems are changing the nature of how people store and move data.” + +The Summit also welcomed a host of IPFS collaborators to the stage, who demoed their work and shared tips on running dweb infrastructure and techniques for improving these services. Here are a few ecosystem highlights: + +- **[Textile’s](https://textile.io/) Andrew Hill** and **Aaron Sutula** debuted [Powergate](https://blog.textile.io/filecoin-developer-tools-concepts/), an API-driven solution for deploying multitiered storage across Filecoin and IPFS. Powergate gives clients easier access to control who and where their data is stored. Hill also detailed Textile’s ThreadsDB and Buckets, technologies that get us closer to a more intuitive object storage experience. Combining these tools with IPFS enables new pinning capabilities that support dynamic datasets and IPNS addresses. Watch both videos: on [Powergate](https://www.youtube.com/watch?v=aiOTSkz_6aY) and on [ThreadsDB & Buckets](https://www.youtube.com/watch?v=ojaDzwp9M20&feature=youtu.be). +- **[Infura’s](https://infura.io/) Mike Godsey** walked through the history and role of IPFS in Infura’s Web3 dev suite. Infura is leading the charge on permissioned gateways. Godsey also hinted at what’s next for Infura when it comes to building on the Filecoin network. “We are actively in discussions with the PL team about all of the interesting ways we can utilize Filecoin inside our infrastructure. We’re exploring specific Filecoin functionality that would be separate from our IPFS functionality. This is still in progress, but it’s super important to us.” [Watch the video](https://www.youtube.com/watch?v=DOLIt2O2aj4). +- **Brett Shear, co-founder and COO of [Fleek](https://fleek.co/)**, showcased how to use Fleek's new IPFS/S3 product to upload, pin, and fetch files to/from IPFS at lightning speed. [Watch Shear’s presentation](https://www.youtube.com/watch?v=Ojtt5NGPxb8). +- **[IoTeX](https://www.iotex.io/) Co-founder Raullen Chai** talked about how IoTeX, a blockchain solution for powering the Internet of Things, is teaming up with IPFS to create decentralized privacy and user data ownership with home security camera Ucam. [Watch the video](https://www.youtube.com/watch?v=_ia0mgG08k8). +- **[Pinata](https://pinata.cloud/) CEO Kyle Tut** dove deep into data permanence and discussed how to keep the data behind a CID alive. Likening data preservation to the responsibility artists have to maintain their own work, Tut asked “Is Da Vinci responsible for maintaining the Mona Lisa? And the answer to that is, no! Da Vinci is no longer with us, the painting is something like over 500 years old, and the person or the body that takes care of that painting today is the Louvre Museum.” Similarly, ownership of digital data, Tut argued, can transfer as a token, from one wallet to another. It’s the file owner’s responsibility to pin that data on a network like IPFS to make sure it’s secure. [Watch the video](https://www.youtube.com/watch?v=RB884S2k59A). + +
+
+ +
+
+ +Day 2 focused on the future - with **Juan Benet**, creator of IPFS & Filecoin, highlighting new opportunities and improvements coming to the space, including a unified IPFS Pinning API, deeper integration of network services into IPFS tools like [IPFS-Desktop](https://github.com/ipfs-shipyard/ipfs-desktop) and [WebUI](https://github.com/ipfs-shipyard/ipfs-webui), and new capabilities like [Powergate](https://blog.textile.io/filecoin-developer-tools-concepts/) to bring Filecoin persistence to IPFS pinning services. + +The IPFS Pinning Summit brought together 100+ participants for product demos, deep-dives into ecosystem progress, and lightning talks on new tools. Talks dived into how infra providers could tune their services to enhance growing verticals like video, gaming, or browsers - or how they might offer new, specialized products for private networks, access control layers, or network introspection. + +Presentations also explored new opportunities related to the upcoming Filecoin Network launch - which adds an incentive layer to distributed data storage in IPFS. Filecoin Leads **Pooja Shah** and **Juan Benet** [shared a number of new ways to integrate Filecoin](https://www.youtube.com/watch?v=Q0oe6i7d1u4) to augment and enhance existing web3 infrastructure - like using Textile's Powergate to create Filecoin-backed IPFS Pinning Services. + +
+ +
+
+ +Watch all of the sessions [here](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTvsxuZ9T-tMlu_v0lja6v5), including lightning talks on [Filecoin’s GUI](https://www.youtube.com/watch?v=dMuVDELUdnE), [Git on Threads](https://www.youtube.com/watch?v=dx7TH7-YSEQ), the [Filecoin Discover Project](https://www.youtube.com/watch?v=UXmQfnwzhtQ&feature=youtu.be), and many more. + +Thanks for an amazing summit, and looking forward to the next wave of adoption and growth we create together! 🚀 diff --git a/src/_blog/094-gossipsub-v1.1/README.md b/src/_blog/094-gossipsub-v1.1/README.md new file mode 100644 index 00000000..20c19e94 --- /dev/null +++ b/src/_blog/094-gossipsub-v1.1/README.md @@ -0,0 +1,78 @@ +--- +date: 2020-05-20 +url: /2020-05-20-gossipsub-v1.1/ +title: Gossipsub v1.1 brings hardening extensions to PubSub +description: +author: David Dias +header_image: 094-gossipsub-v1.1-headerimage.jpeg +tags: ipfs, libp2p, pubsub, gossipsub +--- + +

+ +

+ +The gossip you’ve heard on the streets is correct, Gossipsub v1.1 is here and it packs several security hardening extensions along with new testing, documentation, and an updated specification. + +The Gossipsub Task Force has been hard at work exploring and analyzing various attack vectors on public and permissionless messaging networks. With that knowledge, we’ve crafted and iterated on mitigating strategies to make our beloved libp2p PubSub Router work in adversarial environments. The result is Gossipsub v1.1 🚀 + +If you are new to [libp2p PubSub](https://libp2p.io/) and especially Gossipsub, we recommend checking out the [**Gossipsub v1.1 talk at the Matrix Virtual Meetup**](https://research.protocol.ai/blog/2020/gossipsub-v1.1-at-open-tech-will-save-us-virtual-event). It will give you the complete motivation and background of libp2p PubSub and introduce you to Gossipsub v1.1. + +## 🔍 What is Gossipsub v1.1 + +The main focus for Gossipsub v1.1 is **security**. In addition, to the speedy message propagation guarantees from v1.0, this new version features several hardening extensions that make Gossipsub more resilient to a wide range of attacks. Some highlights include: + +**1) [Peer scoring](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#peer-scoring)**: Peers now monitor their directly-connected neighbours using a score function that reflects the peer’s usefulness. Well-behaving peers are kept in the mesh, while badly-behaving ones are dropped in order to protect the network from malicious actors. + +**2) [Adaptive gossip dissemination](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#adaptive-gossip-dissemination)**: In this new version, you can adjust the `gossip factor` to control the number of peers your node gossips with. This enables you to increase/decrease the amount of gossip, while keeping a baseline. + +**3) [Opportunistic Grafting](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#opportunistic-grafting)**: A new mechanism used to cherry pick well-behaving peers that are currently not part of a node’s mesh. Those well-behaving peers are then opportunistically inserted into the mesh to improve the median score of participating peers. + +**4) [Prune Peer eXchange](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#prune-backoff-and-peer-exchange)**: Prune Peer exchange gives a node a set of recommended peers to connect when it gets dropped from another peer’s mesh, helping reduce the dependency on ambient peer discovery mechanisms. + +**5) [Extended Message Validators](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#extended-validators)**: You can now add your custom message validator so that you can instrument Gossipsub to recognize (accept/reject) which messages are valid/invalid within the context of your application. + +**6) [Outbound Mesh Quotas](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#outbound-mesh-quotas)**: In v1.0 mesh peers are randomly selected, without any weight given to the direction of the connection. In contrast, v1.1 implements outbound connection quotas, so that a peer tries to always maintain a number of outbound connections in the mesh. + +The blend of these security measures, together with the properties of the “gossiping mesh” check the two most important boxes for message propagation protocols in permissionless networks, namely: i) fast message propagation, ii) security against attacks that attempt to degrade the quality of the service provided by the network. + +All of these upgrades can be consulted in the [Gossipsub v1.1 specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md), which if you ask us, it is a joy to read! + +Additionally, with the new release, the [reference implementation of Gossipsub](https://github.com/libp2p/go-libp2p-pubsub) got additional documentation and test coverage. + +## 🏎 Give Gossipsub v1.1 a test ride + +### Chat application example + +We’ve prepared a brand new example for you to give the latest Gossipsub a try. In this example, you get to experiment with a chat application powered by libp2p. It will enable you to join different channels by subscribing to PubSub topics and see other peers joining the room as they subscribe to the topic. + +

+ +

+ +You can find the code for this example at https://github.com/libp2p/go-libp2p-examples/tree/master/pubsub/chat + +### Test Gossipsub’s performance with Testground + +We are also releasing a brand new libp2p Test Plan that uses [Testground](https://github.com/testground/testground) to benchmark Gossipsub v1.1. + +

+ +

+ +With this Test Plan, you can run an emulation (yes, it will run real Gossipsub nodes!) of a Gossipsub Network in which you can adjust: + +- The number of nodes +- The latency of each link and the jitter % +- The length of the run +- The bandwidth available to each link + +To play with this Test Plan, check the instructions at https://github.com/libp2p/test-plans/tree/master/pubsub. + +## 🎁 We are preparing something more for you + +We’ve worked with networking, P2P, and security researchers to create this iteration of Gossipsub v1.1 and we’ve been cooking a comprehensive analysis report to share with you on our approach and how we evaluated our mitigation strategies. We are shooting to share this report in June, stay tuned! + +That’s it for now. Hope you enjoy the release and happy gossiping! + +**The Gossipsub Task Force** - David Dias, Dmitris Vyzovitis, Yiannis Psaras, Yusef Napora, Dirk McCormick diff --git a/src/_blog/095-road-to-dht/README.md b/src/_blog/095-road-to-dht/README.md new file mode 100644 index 00000000..8c013b0e --- /dev/null +++ b/src/_blog/095-road-to-dht/README.md @@ -0,0 +1,96 @@ +--- +date: 2020-05-19 +url: /2020-05-19-road-to-dht/ +title: The Road to the New DHT +description: +author: Adin Schmahmann +header_image: 095-road-to-dht.png +tags: go-ipfs, 0.5 release +--- + +

+ +

+ +At the end of April, we released our largest update to go-ipfs to date: [IPFS 0.5.0](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/). This upgrade brings major performance and reliability improvements to IPFS — especially on the content discovery and routing front. These gains are brought to you largely by our rework of the Distributed Hash Table (DHT) which powers most peer and content discovery in the IPFS Public Network. + +We’d like to take you through our journey to _re-write_ the DHT - from identifying the underlying issues, to how we approached designing a solution, to ensuring it would **work** in practice. Our work led to major performance gains, as well as a new development process and [Testground](https://github.com/testground/testground), a whole new tool for large-scale network testing [(read more)](https://blog.ipfs.io/2020-05-06-launching-testground/). + +**If you want to make use of these new improvements, please [upgrade IPFS now](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/update-procedure/#use-ipfs-update)!** +
+ +

+ +

+ +## First a refresher: What’s the DHT? + +The [DHT, or distributed hash table](https://docs.ipfs.io/guides/concepts/dht/), acts like both a catalog and navigation system for IPFS, helping the network keep track of and find data. A regular hash table is a key-value store where the keys are hashed and stored in one place. In the case of IPFS, the keys are the Content Identifiers (CIDs) of a block of data, and the values are the set of peers who have each block. + +The DHT distributes and stores these pairs of keys and values in small tables across many nodes or peers throughout the network. Peers, in turn, store information about where to physically locate specific content. Kademlia, our DHT implementation, helps keep track of which nodes are _providing_ what data to others in the network. + +In theory, the DHT should make finding, providing, and fetching data among nodes a well-orchestrated and very efficient affair. However, throw in real world conditions and a rapidly scaling network, and things can go awry. + +## Let’s rewind + +The IPFS Public Network experienced substantial growth last year, quickly scaling 30x, with **hundreds of thousands of nodes** now participating in the network! Major software deployments and new decentralized apps came on board with expectations for a production-ready network with the reliability and performance to match. Many were using IPFS as a decentralized CDN (Content Delivery Network) to share and find content across the network. Unfortunately, due to a proliferation of new nodes unable to route peers to the desired content, the network was letting some of these users down. + +
+ +
+
+ +In early 2019, we started to hear rumblings around content routing issues, which were exacerbated as more and more nodes joined the network over Q1 and Q2 - many of them behind home firewalls or NATs. We were constantly bootstrapping and patching the network to remedy performance and reliability issues. But, we couldn’t really test the efficacy (or truly diagnose any regressions) of these patches until they were _in production_, making it hard to iterate and try out larger fixes to network configuration. + +We clearly had a problem, and we were hearing about it from the community. Our first step was to investigate thoroughly to determine what fixes we should prioritize first, and identify the tooling we needed to land our changes successfully. + +## Narrowing in + +After some investigation, it was clear that our DHT implementation, combined with the recent growth of undialable nodes, was the culprit behind the slow, unreliable content routing. We had a chance to investigate this more deeply while we were together at IPFS Camp, and discovered a few problem areas: + +- **Peer Availability:** As new peers joined the network we treated them equally, but most couldn’t actually be reached because they were behind firewalls or NATs. DHT query time was wasted trying to dial these peers that never got requests. +- **Query Termination:** Even after a DHT query reached its target, it didn't stop - it continued querying additional peers to make sure it had reached its target. While robust to the many new undialable nodes in the network, this process was very time consuming. +- **Routing Table Maintenance:** Routing tables were clogged with many undialable peers, resulting in searches that were linear in the number of peers they queried instead of the expected log-scale efficiency. + +## Focus and go + +With this analysis and the feedback synthesized from our core users and community, it was clear we needed to hone in on content routing performance as a core focus for the IPFS Project. + +This meant some hard calls on prioritization: focusing our working groups on a targeted set of improvements to the DHT and routing logic to ensure we resolved these underlying performance and reliability concerns. In turn, we adjusted our product roadmap and stood up new core working groups, including one focused strictly on content routing and another on a new test infrastructure: [Testground](https://docs.testground.ai/). + +

+ +

+ +## Test, test, test + +We’d learned from our early patches that a network of our size **needs** to be able to test changes in a close to real-world setting to be able to make improvements quickly and reliably. We had the means to do unit tests and small simulations that could prove out basic tweaks, but no way to replicate thousands of nodes or typical network configurations in order to benchmark major changes. This left us without real data on the true impact of changes until they had gone live. + +We had to change this quickly to be successful in righting the DHT. We formed a working group to remedy this gap; [Testground](https://blog.ipfs.io/2020-05-06-launching-testground/) was born. Testground is a platform for testing, benchmarking, and simulating distributed and peer-to-peer systems at scale, allowing us to validate the needed fixes and pressure test the broad DHT changes before IPFS 0.5.0 went live. + +Testground gave us the tools to do _data-driven development_ in our DHT rewrite. It also helped us in other parts of the IPFS 0.5.0 release: like prototyping new potential solutions, comparing potential fixes against each other, and stress-testing the edge cases and upgrade process. The repeatability and introspection Testground gave us was _critical_ to accelerating our development velocity to reliably improve IPFS. + +With the [launch of Testground v0.5](https://blog.ipfs.io/2020-05-06-launching-testground/), we’re excited to share this tool with others as well to benchmark and evaluate their p2p networks. **[Start using Testground today!](https://docs.testground.ai/)** + +## Now for the “fix” + +With Testground, we were able to benchmark and quantify our DHT issues around peer availability, query termination, and routing table maintenance. We started with simulations of the existing network - showing how our previous query logic interacted with evolving network parameters, like many nodes being undialable. + +
+ +
+
+ +Testground allowed us to tweak these parameters to measure which changes would have the most impact on network performance. As we gathered for a Research Summit in January to compare potential mitigations to the ongoing network challenges, we were now empowered with a **quantitative** understanding of the network structure and the tools to immediately prototype and test out the resulting hypotheses from our discussions. + +What followed was a whirlwind of test-plan writing to measure each change to the DHT logic in a real-world network setting. We tested our new systems for diagnosing undialable peers and removing them from our routing tables, measured success rates for ending our queries earlier, and even re-benchmarked our [improvements to Bitswap](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/) to find additional improvements. Throughout these refactors, we were able to continually validate the performance of these changes with our Testground simulations, as well as a few well-placed canary nodes to run benchmarks against the full public network. + +With these tools in hand, we sprinted 🏃‍♂️💨 from the summit to our release to make it all happen. From identifying the problem with the community, to scoping potential solutions, building testing tools, learning from past research, and executing on the needed technical fixes - this marathon of a release certainly put us through our paces - resulting in an [epic list of new and improved features](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/features/). + +Up next, in **Part 2 of this DHT Deep Dive**, we'll walk you through exactly what’s new with the DHT and go even deeper on the improvements we saw. In the meantime, if you haven’t upgraded yet, **[please do](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/update-procedure/#use-ipfs-update)**. We’ll all reap the benefits of a more performant DHT as more and more nodes update! + +### Learn more + +- IPFS 0.5.0 Announcement: https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/ +- Release Highlights: https://www.youtube.com/watch?v=G8FvB_0HlCE +- TestGround: https://blog.ipfs.io/2020-05-06-launching-testground/ diff --git a/src/_blog/096-js-ipfs-0.44/README.md b/src/_blog/096-js-ipfs-0.44/README.md new file mode 100644 index 00000000..aeab8fc9 --- /dev/null +++ b/src/_blog/096-js-ipfs-0.44/README.md @@ -0,0 +1,177 @@ +--- +date: 2020-05-21 +url: /2020-05-21-js-ipfs-0-44/ +title: js-ipfs 0.44.0 released +header_image: js-ipfs-placeholder.png +description: +author: Alex Potsides +--- + +# 🔦 Highlights + +> Cancellable requests and a new browser datastore + +`js-IPFS@0.44.0` is out of the door with support for cancelling requests and a leaner, meaner datastore for the browser! + +## 🤖 Cancellable requests + +A user should be able to cancel long-lived asynchronous API operations. For example, if you are fetching the content for a [CID][] from the network, and that [CID][] is not resolveable, you should be able to set a timeout value for the request, after which the content would no longer be sought and control would be returned to your code with an error message describing what happened. + +This is not as straightforward as it seems in JavaScript because a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) is returned from the API call to resolve a piece of content and the [Promises spec](https://promisesaplus.com/) includes nothing about cancelling a Promise. + +However, the browser [fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) has a notion of an [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) which can be used to abort web requests. They are interacted with via an [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController): + +```javascript +const controller = new AbortController() + +setTimeout(() => { + controller.abort() +}, 1000) + +try { + await result = fetch('http://example.com', { + signal: controller.signal, + }) +} catch (err) { + console.err(err) // prints: user aborted the request +} +``` + +We’ve taken this approach and integrated it into every API call, so you can now use AbortControllers to cancel requests! We’ve also used this mechanism to add a `timeout` option to every API call which internally uses an AbortSignal to stop the request and throw a [TimeoutError](https://github.com/ipfs/js-ipfs/blob/f954659f75b011b12f83ee176aec006ea70cc0d7/packages/ipfs/src/core/errors.js#L58-L67) after the specified amount of time: + +```javascript +const cid = new CID('QmWillNeverResolve') + +try { + await ipfs.get(cid, { + timeout: 1000, // abort after 1000ms + }) +} catch (err) { + console.err(err) // err is a TimeoutError +} +``` + +You could also roll this yourself: + +```javascript +const cid = new CID('QmWillNeverResolve') +const controller = new AbortController() + +setTimeout(() => { + controller.abort() +}, 1000) + +try { + await ipfs.get(cid, { + signal: controller.signal, + }) +} catch (err) { + console.err(err) +} +``` + +The AbortSignal is passed all the way down the call stack to the libp2p and ipld components that underpin IPFS. In this initial release, timeouts are supported by the IPFS layer and in future releases libp2p and ipld will use the AbortSignal to also free up resources and perform any other necessary cleanup that would have been done if the request had completed successfully. + +## New browser datastore + +`js-IPFS@0.44.0` brings a new datastore to the browser. In the browser, all blocks and other repo data is currently stored in [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API), given that it is the only way available to persist and query large amounts of user data at the time of writing. + +In node and go-ipfs, [LevelDB](https://en.wikipedia.org/wiki/LevelDB) has been the datastore of choice for application data (though blocks have been stored on the filesystem) and go-IPFS is moving to [Badger](https://dgraph.io/blog/post/badger/)). + +Out of this grew [interface-datastore](https://github.com/ipfs/interface-datastore) — a spec for storing key/value pairs implemented by the datastores used by IPFS. In the browser this was [datastore-level](https://github.com/ipfs/js-datastore-level) which was backed by [level-js](https://www.npmjs.com/package/level-js), which was backed by IndexedDB. + +Phew. + +To remove a few layers here, we’ve created the [datastore-idb](https://github.com/ipfs/js-datastore-idb) which implements the interface-datastore spec, backed by IndexedDB without going via level. + +What does this mean? + +The new datastore is smaller and faster and the upgrade is seamless since it’s still IndexedDB under the hood: + +``` +datastore-idb up to 44% faster and 69% smaller + +batch idb x 5.26 ops/sec ±4.57% (29 runs sampled) +batch level x 2.92 ops/sec ±3.76% (19 runs sampled) +Fastest is batch idb + +size 37.32KB to 11.41KB +``` + +## ✨New features + +- Cancellable API calls ([#2993](https://github.com/ipfs/js-ipfs/issues/2993)) ([2b24f59](https://github.com/ipfs/js-ipfs/commit/2b24f590041a0df9da87b75ae2344232fe22fe3a)), closes [#3015](https://github.com/ipfs/js-ipfs/issues/3015) +- `ipfs.block.put` now accepts the `pin` argument in line with go-ipfs [#3015](https://github.com/ipfs/js-ipfs/issues/3015) + +## 🦟 Bugs fixed + +- Fixes browser script tag example ([#3034](https://github.com/ipfs/js-ipfs/issues/3034)) ([ee8b769](https://github.com/ipfs/js-ipfs/commit/ee8b769b96f7e3c8414bbf85853ab4e21e8fd11c)), closes [#3027](https://github.com/ipfs/js-ipfs/issues/3027) +- No longer produces browser bundle with all IPLD formats in the browser ([#3025](https://github.com/ipfs/js-ipfs/issues/3025)) ([e6079c1](https://github.com/ipfs/js-ipfs/commit/e6079c17d5656e92dd5191f0581000c6a782c7ed)) +- `typeof` bug when passing timeout to dag.get ([#3035](https://github.com/ipfs/js-ipfs/issues/3035)) ([026a542](https://github.com/ipfs/js-ipfs/commit/026a5423e00992968840c9236afe47bdab9ee834)) +- Removes use of node globals and built ins to prepare us for when browser bundlers [stop automatically including them](https://github.com/webpack/changelog-v5/blob/master/README.md#automatic-nodejs-polyfills-removed) [#2932](https://github.com/ipfs/js-ipfs/pull/2932) +- Source maps are no longer included with production builds [ipfs/aegir#549](https://github.com/ipfs/aegir/pull/549) + +## 🗺️ What’s next? + +Check out the js-ipfs [Project Roadmap](https://github.com/orgs/ipfs/projects/6) which contains headline features organised in the order we hope them to land. + +Only large features are called out in the roadmap, expect lots of small bugfix releases between the roadmapped items! + +# 😍 Huge thank you to everyone that made this release possible + +- [@5310](https://github.com/5310) (2 comments) +- [@achingbrain](https://github.com/achingbrain) (55 commits, 17 PRs, 3 issues, 33 comments) +- [@alanshaw](https://github.com/alanshaw) (1 issue, 3 comments) +- [@aphelionz](https://github.com/aphelionz) (2 comments) +- [@AuHau](https://github.com/AuHau) (1 comment) +- [@autonome](https://github.com/autonome) (1 comment) +- [@bertrandfalguiere](https://github.com/bertrandfalguiere) (1 comment) +- [@betamos](https://github.com/betamos) (1 PR, 1 issue, 7 comments) +- [@bluelovers](https://github.com/bluelovers) (1 PR, 1 comment) +- [@carsonfarmer](https://github.com/carsonfarmer) (1 commit) +- [@codecov-io](https://github.com/codecov-io) (1 comment) +- [@corporatepiyush](https://github.com/corporatepiyush) (1 issue) +- [@dapplion](https://github.com/dapplion) (2 comments) +- [@dirkmc](https://github.com/dirkmc) (2 commits) +- [@Gozala](https://github.com/Gozala) (5 issues, 15 comments) +- [@hugomrdias](https://github.com/hugomrdias) (11 commits, 4 PRs, 1 issue, 17 comments) +- [@jacobheun](https://github.com/jacobheun) (8 commits, 2 PRs, 1 issue, 8 comments) +- [@jakehemmerle](https://github.com/jakehemmerle) (3 comments) +- [@koivunej](https://github.com/koivunej) (1 comment) +- [@lidel](https://github.com/lidel) (1 commit, 2 comments) +- [@mdtanrikulu](https://github.com/mdtanrikulu) (1 issue, 1 comment) +- [@mistakia](https://github.com/mistakia) (1 PR) +- [@npfoss](https://github.com/npfoss) (1 commit, 1 PR, 1 issue) +- [@obo20](https://github.com/obo20) (1 commit, 1 PR, 1 comment) +- [@oed](https://github.com/oed) (1 comment) +- [@RobertFischer](https://github.com/RobertFischer) (1 comment) +- [@robertkiel](https://github.com/robertkiel) (1 comment) +- [@rvagg](https://github.com/rvagg) (1 PR, 1 comment) +- [@spasimir21](https://github.com/spasimir21) (1 issue, 3 comments) +- [@stensonb](https://github.com/stensonb) (1 commit, 13 PRs) +- [@thattommyhall](https://github.com/thattommyhall) (1 PR, 3 comments) +- [@typhu-xyz](https://github.com/typhu-xyz) (1 comment) +- [@vasco-santos](https://github.com/vasco-santos) (14 commits, 15 PRs, 2 issues, 16 comments) +- [@vmx](https://github.com/vmx) (5 commits, 1 PR, 2 comments) +- [@welcome](undefined) (19 comments) +- [@wemeetagain](https://github.com/wemeetagain) (2 commits, 1 PR, 3 comments) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don’t know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-ipfs repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute: https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works, and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. + +[unixfs]: https://docs.ipfs.io/guides/concepts/unixfs/ +[cid]: https://docs.ipfs.io/guides/concepts/cid/ +[mfs]: https://docs.ipfs.io/guides/concepts/mfs/ +[libp2p]: https://github.com/libp2p/js-libp2p +[ipld]: https://github.com/ipld/js-ipld diff --git a/src/_blog/097-js-ipfs-0.46/README.md b/src/_blog/097-js-ipfs-0.46/README.md new file mode 100644 index 00000000..2bed89ca --- /dev/null +++ b/src/_blog/097-js-ipfs-0.46/README.md @@ -0,0 +1,162 @@ +--- +date: 2020-06-08 +url: /2020-06-08-js-ipfs-0-46/ +title: js-IPFS 0.46.0 released with new faster bitswap and go-IPFS 0.5 compat +header_image: js-ipfs-placeholder.png +description: +author: Alex Potsides +--- + +# 🔦 Highlights + +> Bitswap 1.2.0, transfer speed improvements & go-IPFS 0.5.x compatibility + +Blink and you’ll miss it, ~~`js-IPFS@0.45.0`~~ `js-IPFS@0.46.0` has been released; goodies include Bitswap 1.2.0, much faster file transfers, and go-IPFS 0.5.x compatibility! + +## ↔️ Bitswap 1.2.0 + +Version 1.2.0 of the Bitswap protocol has landed in `js-IPFS` and brings a host of performance improvements around coordinating the supply of blocks to peers across the network. For example, peers can now respond to [WANT](https://github.com/ipfs/specs/blob/master/BITSWAP.md#bitswap-message)s with messages saying they have the block but not sending it, in order to later send multiple blocks in one message instead of many small messages resulting in less chatty network operations and faster overall transfer times. + +See [ipfs/js-ipfs-bitswap#204](https://github.com/ipfs/js-ipfs-bitswap/pull/204) for more! + +## 💨 Faster file transfers + +The Bitswap module has had a bit of an overhaul and is now much faster at pulling blocks from other nodes across the network. Before, we waited a little while before sending our wantlist to newly connected peers—we’ve reduced that window and seen a massive speedup (smaller bars are better): + +![Graphs showing Bitswap speedups](/097-js-ipfs-0.46/bitswap-speedup.png) + +As you can see, the new js-IPFS is about 3x faster at pulling large files from other nodes on the network than the previous release, and that increases to about 5x as the files get smaller. + +We’re not stopping there though, there are plenty more performance improvements on the way! + +See [ipfs/js-ipfs-bitswap#224](https://github.com/ipfs/js-ipfs-bitswap/pull/224) for all the details. + +## 🤝 go-IPFS v0.5.x compatibility + +The new version of go-IPFS brought a whole slew of changes with it—check out our [blog post](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/) for more details. + +The good news is js-IPFS has taken on a whole heap of these features and the `ipfs-http-client` is now 100% compatible with `go-ipfs@0.5.x`. Your `js-IPFS` nodes will now happily chat away to `go-IPFS` nodes over the network via Bitswap and [gossipsub](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/) too. + +See [ipfs/js-ipfs#3013](https://github.com/ipfs/js-ipfs/pull/3013) for the full rundown. + +# ✨New features + +- Using an [AbortSignal][] to cancel a request to get a block (via `ipfs.dag.get` or `ipfs.cat` for example) will now cause those blocks to be removed from your wantlist ([ipfs/js-ipfs-bitswap#214](https://github.com/ipfs/js-ipfs-bitswap/pull/214)) +- `ipfs.dht.get(key, [options])` accepts a string or a buffer as `key` ([#3013](https://github.com/ipfs/js-ipfs/issues/3013)) ([0900bb9](https://github.com/ipfs/js-ipfs/commit/0900bb9b8123edb689a137a006c5507d8503f693)) + +# 🦟 Bugs fixed + +- Decrease wantlist sending debounce time ([ipfs/js-ipfs-bitswap#224](https://github.com/ipfs/js-ipfs-bitswap/pull/224)) +- Fix bitswap race conditions when requesting the same block twice ([ipfs/js-ipfs-bitswap#214](https://github.com/ipfs/js-ipfs-bitswap/pull/214)) +- libp2p pubsub now creates two unidirectional streams to topic peers making message delivery more reliable ([ipfs/go-ipfs-pubsub#331](https://github.com/libp2p/go-libp2p-pubsub/issues/331)) +- `ipfs.config.get([key,] [options])` - `key` is optional again ([#3069](https://github.com/ipfs/js-ipfs/issues/3069)) ([d043138](https://github.com/ipfs/js-ipfs/commit/d043138be2c0c7fd458131d56e235edec1504ca3)) +- extra mode bits passed to unixfs constructor are now ignored ([ipfs/js-ipfs-unixfs#53](https://github.com/ipfs/js-ipfs-unixfs/pull/53)) ([65a040d](https://github.com/ipfs/js-ipfs-unixfs/pull/53/commits/65a040dadd68ca5cb6697c8fd15922f505833a19)) + +# 🏗 API Changes + +## Core API + +- `ipfs.ls` no longer supports a `sort` option ([#3013](https://github.com/ipfs/js-ipfs/issues/3013)) ([0900bb9](https://github.com/ipfs/js-ipfs/commit/0900bb9b8123edb689a137a006c5507d8503f693)) +- `ipfs.key.gen` defaults to 2048 bit RSA keys ([#3013](https://github.com/ipfs/js-ipfs/issues/3013)) ([0900bb9](https://github.com/ipfs/js-ipfs/commit/0900bb9b8123edb689a137a006c5507d8503f693)) + +## CLI + +- `ipfs files ls` no longer supports the `-U` (unsorted) flag ([#3013](https://github.com/ipfs/js-ipfs/issues/3013)) ([0900bb9](https://github.com/ipfs/js-ipfs/commit/0900bb9b8123edb689a137a006c5507d8503f693)) + +## HTTP API + +- `POST /api/v0/pin/list` no longer supports non-streaming responses ([#3013](https://github.com/ipfs/js-ipfs/issues/3013)) ([0900bb9](https://github.com/ipfs/js-ipfs/commit/0900bb9b8123edb689a137a006c5507d8503f693)) + +## HTTP API Client + +- `ipfs.dht.get` resolves to a Buffer in line with the core API ([#3013](https://github.com/ipfs/js-ipfs/issues/3013)) ([0900bb9](https://github.com/ipfs/js-ipfs/commit/0900bb9b8123edb689a137a006c5507d8503f693)) + +# 🗺️ What’s next? + +Check out the js-IPFS [Project Roadmap](https://github.com/orgs/ipfs/projects/6) which contains headline features organised in the order we hope them to land. + +Only large features are called out in the roadmap, expect lots of small bugfix releases between the roadmapped items! + +# 😍 Huge thank you to everyone that made this release possible + +- [@0xflotus](https://github.com/0xflotus) (1 commit, 1 PR) +- [@5310](https://github.com/5310) (1 comment) +- [@achingbrain](https://github.com/achingbrain) (30 commits, 12 PRs, 1 issue, 55 comments) +- [@aphelionz](https://github.com/aphelionz) (1 PR, 1 comment) +- [@AquiGorka](https://github.com/AquiGorka) (1 comment) +- [@Artod](https://github.com/Artod) (1 comment) +- [@autonome](https://github.com/autonome) (11 comments) +- [@bluelovers](https://github.com/bluelovers) (1 commit) +- [@bmann](https://github.com/bmann) (1 comment) +- [@carsonfarmer](https://github.com/carsonfarmer) (1 issue, 4 comments) +- [@chelneru](https://github.com/chelneru) (1 comment) +- [@codecov-commenter](https://github.com/codecov-commenter) (9 comments) +- [@danielrempe-ut](https://github.com/danielrempe-ut) (1 issue, 1 comment) +- [@dapplion](https://github.com/dapplion) (2 comments) +- [@daviddahl](https://github.com/daviddahl) (1 issue, 5 comments) +- [@dirkmc](https://github.com/dirkmc) (1 comment) +- [@domwoe](https://github.com/domwoe) (1 comment) +- [@DougAnderson444](https://github.com/DougAnderson444) (4 comments) +- [@Gozala](https://github.com/Gozala) (2 PRs, 7 issues, 25 comments) +- [@hacdias](https://github.com/hacdias) (2 comments) +- [@hugomrdias](https://github.com/hugomrdias) (4 commits, 5 PRs, 1 issue, 26 comments) +- [@jacobheun](https://github.com/jacobheun) (4 commits, 3 PRs, 2 issues, 18 comments) +- [@jakehemmerle](https://github.com/jakehemmerle) (2 comments) +- [@johnnymatthews](https://github.com/johnnymatthews) (1 commit, 1 PR) +- [@justinmchase](https://github.com/justinmchase) (1 comment) +- [@kumavis](https://github.com/kumavis) (2 comments) +- [@lazyweirdo](https://github.com/lazyweirdo) (2 comments) +- [@lidel](https://github.com/lidel) (1 PR, 2 comments) +- [@matrushka](https://github.com/matrushka) (1 PR) +- [@mburns](https://github.com/mburns) (1 comment) +- [@mdtanrikulu](https://github.com/mdtanrikulu) (1 issue) +- [@mikeal](https://github.com/mikeal) (1 comment) +- [@mitra42](https://github.com/mitra42) (1 comment) +- [@momack2](https://github.com/momack2) (1 commit, 1 comment) +- [@mpetrunic](https://github.com/mpetrunic) (1 comment) +- [@obo20](https://github.com/obo20) (1 comment) +- [@oed](https://github.com/oed) (10 comments) +- [@RenatoPerotti](https://github.com/RenatoPerotti) (1 issue) +- [@revolunet](https://github.com/revolunet) (1 commit, 1 PR) +- [@ribasushi](https://github.com/ribasushi) (1 comment) +- [@robert-cronin](https://github.com/robert-cronin) (1 issue, 1 comment) +- [@rohail411](https://github.com/rohail411) (2 issues, 2 comments) +- [@rumkin](https://github.com/rumkin) (1 issue) +- [@rvagg](https://github.com/rvagg) (4 comments) +- [@SignpostMarv](https://github.com/SignpostMarv) (1 comment) +- [@stasbar](https://github.com/stasbar) (1 issue, 1 comment) +- [@Stebalien](https://github.com/Stebalien) (7 comments) +- [@stensonb](https://github.com/stensonb) (11 commits) +- [@tabcat](https://github.com/tabcat) (1 issue) +- [@tarunbatra](https://github.com/tarunbatra) (1 PR, 3 comments) +- [@thattommyhall](https://github.com/thattommyhall) (1 commit) +- [@tymmesyde](https://github.com/tymmesyde) (1 comment) +- [@typhu-xyz](https://github.com/typhu-xyz) (2 comments) +- [@vasco-santos](https://github.com/vasco-santos) (56 commits, 13 PRs, 8 issues, 66 comments) +- [@vmx](https://github.com/vmx) (2 commits, 5 comments) +- [@welcome](undefined) (5 comments) +- [@wemeetagain](https://github.com/wemeetagain) (38 commits, 9 PRs, 3 issues, 8 comments) +- [@witten](https://github.com/witten) (1 comment) +- [@xinfushe-dev](https://github.com/xinfushe-dev) (1 comment) +- [@xmaysonnave](https://github.com/xmaysonnave) (1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don’t know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-IPFS repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute: https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works, and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. + +[unixfs]: https://docs.ipfs.io/guides/concepts/unixfs/ +[cid]: https://docs.ipfs.io/guides/concepts/cid/ +[mfs]: https://docs.ipfs.io/guides/concepts/mfs/ +[libp2p]: https://github.com/libp2p/js-libp2p +[ipld]: https://github.com/ipld/js-ipld +[abortsignal]: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal diff --git a/src/_blog/098-libp2p-in-2020/README.md b/src/_blog/098-libp2p-in-2020/README.md new file mode 100644 index 00000000..6e09a96d --- /dev/null +++ b/src/_blog/098-libp2p-in-2020/README.md @@ -0,0 +1,130 @@ +--- +date: 2020-06-09 +url: /2020-06-09-libp2p-in-2020/ +tags: lipb2p +header_image: blog-header-libp2p.png +title: libp2p in 2020 +description: +author: The libp2p Team +--- + +If you’re doing anything in the decentralized, peer-to-peer space, you’ve probably heard of libp2p - a modular networking stack for peer-to-peer applications. libp2p consists of many modular libraries from which p2p network developers can select and reuse just the protocols they need, while making it easy to upgrade and interoperate between applications. This helps web3 developers get up and running **faster**, build **more resilient** decentralized applications, and utilize **advanced features** like decentralized publish-subscribe and a distributed hash table. + +What makes libp2p different from the networking stack of today is its focus on **transport agnosticism**, **modularity**, and **portable encodings** (like [multiaddr](https://github.com/multiformats/multiaddr)). These properties make libp2p the networking layer of choice for most new dweb projects, blockchains, and peer-to-peer applications. Read more about [why projects are choosing to build on libp2p](https://medium.com/paritytech/why-libp2p-13085ed0c9c8), or watch the [recent talk from Tech Lead Raul Kripalani at DevCon5](https://www.youtube.com/watch?v=B7ecKMtNkXs). + +## 2019 Growth + +The past year has seen amazing improvements to libp2p with the protocol quickly becoming the de facto web3 networking layer for a huge swath of projects. + +Probably the most significant news on that front is the official adoption of libp2p as the networking layer for the [Ethereum 2.0 Network Specification](https://github.com/ethereum/eth2.0-specs/pull/1328). Ethereum 2.0 is the next generation of Ethereum, with a large and thriving network of clients, dapps, and developers. A big focus for libp2p in 2019 was leveling up stability, scalability, and ease of use to meet the requirements of such a large scale blockchain. + +![libp2p at DevConV](/img/098_devcon.png) + +libp2p now has 7 language implementations: + +- [go-libp2p](https://github.com/libp2p/go-libp2p) by Protocol Labs +- [rust-libp2p](https://github.com/libp2p/rust-libp2p) by the Web3 Foundation +- [js-libp2p](https://github.com/libp2p/js-libp2p) by Protocol Labs +- [cpp-libp2p](https://github.com/soramitsu/kagome/tree/master/core/libp2p) by Soramitsu +- [jvm-libp2p](https://github.com/soramitsu/kagome/tree/master/core/libp2p) by Harmony, PegaSys, and Web3 Labs +- [nim-libp2p](https://github.com/status-im/nim-libp2p) by Status.im +- [py-libp2p](https://github.com/libp2p/py-libp2p) by the Ethereum Foundation + +
+ + + +The other major new blockchain building on libp2p is **Filecoin** which plans to launch their public storage and retrieval network this summer. With over 7.5 PB of storage already live across an active community of testnet miners, a big focus for libp2p in 2019 was landing the performance and hardening improvements to meet Filecoin’s needs. + +In addition to Filecoin and Ethereum 2, there are now **more than two dozen** projects building directly on libp2p, including: [Polkadot and Parity Substrate](https://www.youtube.com/watch?v=mRlLSByFxCQ&index=8&list=PLhuBigpl7lqvIymGaM7A_VT4CYZW3R_4Q&t=0s), [Nervos](https://www.nervos.org/), [Status.im](https://status.im/), [Paratii](https://www.youtube.com/watch?v=QKFOWdOTrpo&index=4&list=PLhuBigpl7lqvIymGaM7A_VT4CYZW3R_4Q&t=0s), [0x](https://0x.org/), [Coda](https://codaprotocol.com/), [Enigma](https://www.enigma.co/), [Flow](https://www.onflow.org/), [Harmony](https://www.harmony.one/), [Golem](https://golem.network/), [Keep Network](https://keep.network/) and [Validity Labs](https://validitylabs.org/). Groups like [Matrix](https://matrix.org/).org are also in the early stages of adding libp2p support to their applications, helping their users benefit from the resilience and openness of p2p networking. + +These newcomers to the libp2p ecosystem are a **big deal** - but they actually still make up less than half of all active libp2p nodes! The vast majority of libp2p end users come from dapps, tools, and projects using libp2p through **IPFS**, the InterPlanetary File System! + +**Millions of end users** and over **100,000 libp2p nodes** participate in the IPFS network every week. Organizations like [Opera](https://blog.ipfs.io/2020-03-30-ipfs-in-opera-for-android/), [Ethereum](https://medium.com/the-ethereum-name-service/all-the-ways-you-can-surf-the-decentralized-web-today-bf8e7a42fa27), [Brave](https://u.today/brave-browser-in-2020-new-ad-blocks-filters-sdk-and-ipfs), [Netflix](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/), [Microsoft](https://techcommunity.microsoft.com/t5/azure-active-directory-identity/toward-scalable-decentralized-identifier-systems/ba-p/560168), and [Cloudflare](https://www.cloudflare.com/distributed-web-gateway/) have joined the IPFS ecosystem, and hundreds of nascent community-owned projects like [Audius](https://audius.co/), [Fleek](https://fleek.co/), [Textile](http://textile.io/), [Qri](http://qri.io/), [Pinata](http://pinata.cloud), [OpenBazaar](https://openbazaar.org/), [Berty](http://berty.tech/), [Infura](http://infura.io) and [3Box](http://3box.io) are building their businesses with IPFS. + +## 2019 and early 2020 features + +The focus for the year was hardening and evolving the stack - and we blew that out of the water! Here are some of the features the core team and our community have contributed to libp2p: + +- In 2019, we added AutoRelay, a feature that ensures any user can launch a libp2p node easily without having to open ports on their router or do anything technically complicated. Relay nodes will handle the relaying of traffic. Coming soon is an automatic upgrade to direct connections from relayed connections. +- We added better connection management, with decaying tags and connection gating. +- We built and released Gossipsub, wrote a [new explainer](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub), and later [enhanced with security extensions](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/) including peer scoring, opportunistic grafting, peer exchange, and other features. +- Specs improvement in 2019 has made a night-and-day difference for cross language compatibility and the ease of implementing libp2p in new languages. +- We simplified the go-libp2p codebase by centralizing abstractions and interfaces under the [go-libp2p-core module](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/), decommissioning 12+ repos along the way. Further codebase simplification is on the roadmap for 2020. +- A huge focus for the year was the Async Await refactor in js-libp2p - enabling the use of streaming iterables instead of pullstreams, along with some [interface refactors](https://github.com/libp2p/js-interfaces/tree/master/src/connection#interface-connection). +- The libp2p core team has launched a massive documentation overhaul. Check out [docs site](https://docs.libp2p.io/) and the new [Getting Started guide](https://github.com/libp2p/js-libp2p/blob/master/doc/GETTING_STARTED.md). +- We’ve completed a major DHT improvement project. Queries to the DHT are much faster, thus better supporting DHT-intensive applications like [IPFS’s name resolver](https://docs.ipfs.io/concepts/ipns/). +- Support for Noise handshakes has been spec’ed, and is now available in all 7 implementations of libp2p. +- We’ve continued to update our QUIC implementation to keep pace with new releases of the QUIC standard. We’ve also made progress on implementing QUIC in js. +- We introduced certified peer records to enhance foundational protocol security. They’re used by gossipsub and the DHT, and are available to application protocols too. +- We have prototyped an [introspection protocol](https://github.com/libp2p/go-libp2p-core/blob/master/introspection/pb/introspection.proto), with [a reference implementation in go-libp2p](https://github.com/libp2p/go-libp2p/pull/964). We’ll soon release a framework and UI shell that will interoperate with all libp2p implementations. + +Releases + +- go-libp2p had [19 releases](https://github.com/libp2p/go-libp2p/releases) including [v0.9.5](https://github.com/libp2p/go-libp2p/releases/tag/v0.9.5). +- js-libp2p had [41 releases](https://github.com/libp2p/js-libp2p/releases) including [v0.28.0](https://github.com/libp2p/js-libp2p/releases/tag/v0.28.0). +- rust-libp2p had [10 releases](https://github.com/libp2p/rust-libp2p/releases) including [v0.19.1](https://github.com/libp2p/rust-libp2p/releases/tag/v0.1.0). +- cpp-libp2p had [2 releases](https://github.com/soramitsu/cpp-libp2p/releases) including [v0.0.1-p0](https://github.com/soramitsu/cpp-libp2p/releases/tag/v0.0.1-p0). +- py-libp2p had [6 releases](https://github.com/libp2p/py-libp2p/releases) including [v0.1.5](https://github.com/libp2p/py-libp2p/releases/tag/v0.1.5). +- jvm-libp2p had [3 releases](https://github.com/libp2p/jvm-libp2p) including [v0.2.0](https://github.com/libp2p/jvm-libp2p/releases/tag/0.2.0). + +## Community + +We saw huge growth in the libp2p team and community this year, with presentations and workshops at a variety of conferences including [EthCC 2](https://www.youtube.com/watch?v=yPOROKQRFPQ), [Web3 2019](https://www.youtube.com/watch?v=SWdMdN9eGqU), [EthBerlin Zwei](https://ethberlinzwei.github.io/KnowledgeBase/resources/libp2p.html), [IPFS Camp](https://camp.ipfs.io/), [ReadyLayerOne](https://www.youtube.com/watch?v=p1c4l0xOnFI), DevCon V (talks: [state of libp2p](https://www.youtube.com/watch?v=NZL7XBxTI_s), [gossipsub](https://www.youtube.com/watch?v=b8AZBVdrCC0)), and more. + +The libp2p project also launched [a development grants program](https://github.com/libp2p/devgrants). The initial kickoff for the program at EthBerlinZwei led to several significant features being implemented by the community, including [Noise handshakes in Go](https://github.com/libp2p/devgrants/blob/master/004-noise-handshake-implementations.md) and [Lua Wireshark dissectors](https://github.com/ethberlinzwei/Bounties/issues/20). The bounties program is a great way to get involved in the libp2p project. [Check it out on GitHub](https://github.com/libp2p/devgrants)! + +## 2020 H1 in review + +Throughout the first half of the year, our top focus was supporting the needs of current and in-flight adopters, especially IPFS, Eth2, and Filecoin. So far, we have delivered on the following. + +### Content routing and connectivity + +To support IPFS and all our other dapp users out there, we’ve improved libp2p’s content routing and connectivity to make finding and sharing content in distributed networks fast and reliable. This meant we needed to dive deep into major systems like the libp2p DHT, providing subsystem, NAT traversal, and more to optimize and refactor for performance. We’ve been collaborating closely with Protocol Labs’ IPFS and Testground teams to make this a reality. Read more about our progress in the [IPFS 0.5 launch](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/) post, and our path to get there in the [Road to the New DHT](https://blog.ipfs.io/2020-05-19-road-to-dht/) post! + +![Content Routing Speed](/098-libp2p-in-2020/find-perf.png) + +### Launching Testground to the world + +What is [Testground](https://blog.ipfs.io/2020-05-06-launching-testground/) you ask? Only the coolest new testing tool for large-scale p2p networks! When starting our network upgrade plans, it was clear that the scope and complexity of changes we’d need to make to core IPFS network functions would be impossible to optimize without powerful testing tools to simulate each change to network performance at scale. We couldn’t find a tool with the scale and configurability we needed, so we built the testing tool we needed, and made it modular and system agnostic just like libp2p so other p2p networks can take advantage of this new OSS infrastructure too! + +![Launching Testground](/header_images/092-launching-testground.png) + +### Gossipsub security enhancements + +For our large blockchain users, the focus of Q1 was stability, scalability, and security hardening. We designed and implemented [a new version for the Gossipsub protocol, v1.1](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/). This new P2P PubSub router includes several security extensions that add a protection to Sybil, eclipse, and spam attacks. + +This work is of extreme importance as our adopters (e.g., Filecoin and Ethereum 2.0) require a secure messaging layer to distribute their time sensitive and valuable data, without being vulnerable to malicious actors. + +You can find the [specification](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) and [implementation](https://github.com/libp2p/go-libp2p-pubsub/) on GitHub. We will be releasing a report that fully describes how we identified the attack vectors, developed the motivations and went through implementing, testing, evaluating under multiple network conditions and got it audited. Stay tuned. + +![Gossipsub v1.1](/header_images/094-gossipsub-v1.1-headerimage+grid.jpeg) + +### Going forward + +Both of these workstreams (content routing performance and gossipsub hardening) continue to be top priorities with IPFS having launched go-ipfs 0.5 (their largest network upgrade in years), and Ethereum and Filecoin gearing up for Q3 mainnet launches, as well as other adopters such as Polkadot (who [went live](https://twitter.com/polkadotnetwork/status/1265334623086751745) recently!), Flow, Coda, 0x, Matrix, Keep Network, Enigma, Harmony, Golem, Validity Labs, etc., reaching new milestones. + +Furthermore, in H2 we plan to work on protocol negotiation enhancements, a more efficient connection boostrapping flow, an implementation alignment framework (including a long-awaited conformance test kit), code refactors, and a lot more! + +## Growing the team + +Protocol Labs’s small and scrappy libp2p core team transformed into a true force of nature with some great additions last year. Our doors will continue to be open for great people from both inside and outside of the ecosystem. + +In particular, **we’re looking for a new Project Lead** to help grow and steward the libp2p project and ecosystem to new heights in 2020. Check out the [role description](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26) for more specific details and information on where you can apply. In particular, we’re looking for candidates with proven leadership experience, a passion for p2p tech, and an interest in scaling the libp2p community as it becomes critical infrastructure for new, large users such as Ethereum (with launch of the Beacon chain) and Filecoin. + +Excited about building the networking stack for a more resilient, upgradeable, open network for humanity’s knowledge? We’d love to get in touch! Apply, or just shoot [mike@libp2p.io](mailto:mike@libp2p.io) a quick email with your thoughts or questions! + +## Thank you + +2019 was a fantastic, high growth year for the libp2p project and 2020 is already well on track to be even more exciting. Huge thank you to the thousands of community members who contributed to all the new language implementations, feature improvements, performance speedups, and amazing projects bringing libp2p directly to end users. + +Thank you for your support! We’re excited to continue working with you to build libp2p. + +## Appendix + +References: + +- [https://filecoin.io/blog/update-2018-q3-q4/#8-libp2p-update-for-filecoin](https://filecoin.io/blog/update-2018-q3-q4/#8-libp2p-update-for-filecoin) +- [https://filecoin.io/blog/update-2019-q2-q3/#9-libp2p-update-for-filecoin](https://filecoin.io/blog/update-2019-q2-q3/#9-libp2p-update-for-filecoin) +- [https://blog.ipfs.io/2020-02-10-our-focus-for-2020/](https://blog.ipfs.io/2020-02-10-our-focus-for-2020/) +- [https://medium.com/polkadot-network/polkadot-2019-year-in-review-8c852ef42668](https://medium.com/polkadot-network/polkadot-2019-year-in-review-8c852ef42668) diff --git a/src/_blog/099-identity-ipfs-ion/README.md b/src/_blog/099-identity-ipfs-ion/README.md new file mode 100644 index 00000000..69186d6c --- /dev/null +++ b/src/_blog/099-identity-ipfs-ion/README.md @@ -0,0 +1,68 @@ +--- +date: 2020-06-11 +url: /2020-06-11-identity-ipfs-ion/ +tags: [ipfs, identity] +header_image: blog-header-ion.png +title: Decentralized Identity, IPFS and ION +description: +author: Dietrich Ayala +--- + +

+ ![IPFS logo and ION logo](./ipfs-ion-header.png) +

+ +Identity is a key part of how we all interact with each other on the internet every day—sometimes every moment of every day. And sometimes each raging moment as we do the “forgot your password?” dance yet again. Regardless, forging a path forward for user-controlled online identity is a table-stakes requirement for the dweb to succeed. + +But, identity is hard. There are no easy solutions for interoperable decentralized digital assertions of self. Privacy, security, validity, access control, surveillance, GDPR, KYC, anonymity. It’s like Inception but each nested dream level is the same minefield, and those minefields are littered with projects that’ve tilted at the identity windmill, leaving naught behind but vinyl stickers slowly being covered up on our laptops. + +Hope has not forsaken this land. The [Decentralized Identity Foundation](https://identity.foundation/) has been plugging away at this challenge for many years, as have groups like [Rebooting the Web of Trust](https://www.weboftrust.info/). And there’ve been efforts to build decentralized identity systems on top of IPFS, such as [IPID](https://github.com/johnnycrunch/ipid), [Nomios.io](https://nomios.io/), [the IPFS IDM](https://github.com/ipfs-shipyard/pm-idm), and most recently the [Ceramic Network](https://www.ceramic.network/). + +However, today we’re celebrating the launch of a decentralized identity protocol and service from an unlikely place: Microsoft. + +Microsoft has been increasingly present in open-source tools and services in the past few years, and has now [launched a standards-based decentralized identity service called ION](https://techcommunity.microsoft.com/t5/identity-standards-blog/ion-booting-up-the-network/ba-p/1441552). + +

+ ![ION logo](./ion-logo.png) +

+ +ION has been under development for over a year, and is an instance implementation of [Sidetree (a blockchain-agnostic distributed PKI protocol)](https://github.com/decentralized-identity/sidetree) that runs on the Bitcoin blockchain. + +And it stores transaction data on IPFS. + +

+ ![ION architecture diagram](./ion-architecture.png) +

+ +Like HTTP, IPFS does not have user identity built into the protocol. However, IPFS provides resiliency, validation, and future-proofing features that HTTP cannot: + +- The content addressability of IPFS means that ION nodes who are pulling the CIDs off a blockchain or other underlying public network don’t need to care _where_ the transaction data resides. This means they can switch servers or datacenters, or new storage nodes can come online without requiring any code or infrastructure changes and without the addresses needing to change. +- ION nodes also don’t need to worry about the data being manipulated or tampered with, because hash-based addressing means the cryptographic verification of the data is built into the network request itself. + +## IPFS in ION + +The ION implementation is in JavaScript (specifically, TypeScript) so it made sense for them to use js-ipfs as a Node.js service. ION rolls up batches of identity transactions, publishes it through their IPFS node, and then writes the address (CID) of that batch to the Bitcoin blockchain. + +In order to meet Microsoft’s needs for using js-ipfs as a long-running process we added cancelable requests to all APIs, ensuring that as requests were being made and handled, the underlying objects, memory, file handles, and other resources created up and down the stack are cleaned up properly. Huge thanks goes to [Alex Potsides (@achingbrain)](https://github.com/achingbrain) for implementing this long-needed feature, which shipped in [js-ipfs 0.44.0](https://blog.ipfs.io/2020-05-21-js-ipfs-0-44/). + +What this looks like for developers is the ability to set timeouts on requests: + +```javascript +const cid = new CID('QmWillNeverResolve') + +try { + await ipfs.get(cid, { + timeout: 1000, // abort after 1000ms + }) +} catch (err) { + console.err(err) // err is a TimeoutError +} +``` + +## Try ION Now! + +This is the public beta of ION, and it is now running live on the Bitcoin blockchain. + +In the launch post, Microsoft’s ION project lead Daniel Buchner explains [how to run a node and use decentralized identities in your apps and services today](https://techcommunity.microsoft.com/t5/identity-standards-blog/ion-booting-up-the-network/ba-p/1441552). + +The project is open source, built on open standards, and you can run your own node—so try it out or contribute to the project today! diff --git a/src/_blog/099-identity-ipfs-ion/ion-architecture.png b/src/_blog/099-identity-ipfs-ion/ion-architecture.png new file mode 100644 index 00000000..44219855 Binary files /dev/null and b/src/_blog/099-identity-ipfs-ion/ion-architecture.png differ diff --git a/src/_blog/099-identity-ipfs-ion/ion-logo.png b/src/_blog/099-identity-ipfs-ion/ion-logo.png new file mode 100644 index 00000000..77e8130d Binary files /dev/null and b/src/_blog/099-identity-ipfs-ion/ion-logo.png differ diff --git a/src/_blog/099-identity-ipfs-ion/ipfs-ion-header.png b/src/_blog/099-identity-ipfs-ion/ipfs-ion-header.png new file mode 100644 index 00000000..10e7effa Binary files /dev/null and b/src/_blog/099-identity-ipfs-ion/ipfs-ion-header.png differ diff --git a/src/_blog/100-IPFS-mobile-design-guidelines/README.md b/src/_blog/100-IPFS-mobile-design-guidelines/README.md new file mode 100644 index 00000000..d3aea175 --- /dev/null +++ b/src/_blog/100-IPFS-mobile-design-guidelines/README.md @@ -0,0 +1,104 @@ +--- +date: 2020-06-25 +url: /2020-06-25-IPFS-mobile-design-guidelines/ +tags: mobile-design-guidelines, Mobile, Design, Research +header_image: 100-mobile-design-guidelines-header.png +title: IPFS Mobile Design Guidelines +description: +author: Jim Kosem, Dietrich Ayala +--- + +As IPFS adoption continues to grow, the next thousands of designers and developers using it will increasingly be doing so for _mobile_ apps and services. + +However, radically changing the underlying network and storage architecture of those apps and services means different application behavior, different capabilities, and changes in how to manage user expectations. These guidelines seek to answer some of the following questions: + +How can someone building on IPFS ensure... + +- A user understands that their application will work offline? +- A user can post a photo over the local network even though there’s no internet access? +- The app will still work even after the company who made it goes out of business or gets aquired? +- Their users know they can read uncensored news despite their government trying to block access? + +To design for these new capabilities, we need to understand the many different and very specific use cases and usage patterns on mobile devices today, and apply them to distributed architectures. We also need to look at those who’ve forged ahead and are already shipping decentralized mobile apps and services today, and learn from their work. This will help us lay the groundwork for IPFS-based mobile apps and services that _work_ for users, and that’s what we’re sharing with you today. + +The [IPFS Mobile Design Guidelines](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/) are intended for designers and developers using IPFS and other P2P systems for mobile applications. They’re a prompt and grounding in who and what we are designing and building for. They are guides, not instructions, and give just enough flexible direction to support different classes of applications. + +The guidelines are not yet comprehensive, but are a first take at identifying common user needs, patterns, and challenges for P2P on mobile, and turning those into early recommendations and best practices. + +This research area is still nascent and the learning is very much ongoing, but please read on to see what we’ve discovered so far about building IPFS apps on mobile devices that truly work for users and feel great to use. + +## Research + +The first phase of research explored different contexts with typical P2P operations. We researched the P2P app landscape, and then looked at mobile user patterns in typical P2P activities and how browsers influence these. + +In our user interviews, we found ample opportunity to address frustrations in file management and file sharing. We also found an increasing, although nuanced, interest in privacy and security issues across the board. + +We identified core areas that current mobile P2P apps all share: + +- Identity management +- Connection notification +- Confirmations of completed actions and transfers +- User education + +A summary of our research findings is available in [this earlier post](https://blog.ipfs.io/2020-04-24-ipfs-mobile-design-research-findings/). + +## Design + +As IPFS grows and matures, we need to look at how to keep growing the base of people using it. To do this, we developed and published design recommendations for designers and developers of apps using IPFS. This includes design and usability principles and scenarios, each featuring use cases, interaction design patterns, and interface components. This is all published for the community to use and improve upon. They are there to bridge user needs with development in making widespread adoption a reality. + +### Strategy and Workshop + +We began with extensive questions to frame the design and where to start. These questions informed a collaborative workshop with active IPFS developers. This was to understand the developer perspective and how to reconcile them with user needs. The workshop was the first step in creating a common understanding between designers and developers through clear guidelines. + +Read more about the [Mobile Design Strategy](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/design/design-strategy) and [workshop](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/design/design-workshop) in the guidelines. + +### Principles + +From the research, we developed an initial set of principles to address issues and concerns designers and developers might encounter when building apps and services on IPFS. + +- Mobile apps and services on IPFS are not reformatted desktop apps. They need to take into account a host of different issues, from battery life to signal. +- They vary greatly in the ways they can provide unique and key benefits like privacy and speed. +- Onboarding and educating the user should be subtle and avoid deep technical explanations. +- Users want assurance they have some level of security with their data and files as much as they need help managing them. +- Apps built on IPFS need to be seamless in managing connections and how the app works with their established pattern + Read about the [Principles](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/design/principles) in the guidelines. + +We’ve also created a handy cheat sheet for the design principles which you can download below. + +![Design principles cheat sheet](./cheat-sheet-preview.png) + +_Download full size in [PDF](./cheat-sheet.pdf) or [PNG](./cheat-sheet.png)_ + +### Scenarios + +With the design principles developed, we then created use case scenarios to illustrate and validate them. + +- When a user starts with an app, they only need to know IPFS works and provides a better way of handling data. +- Things need to be simple, so we should utilise users’ existing methods of getting things done. +- Going beyond file transfer to managing file access. +- IPFS’s unique ability to transfer files without centralised servers can help offline users in particular. +- A safe means for helping users connect with and contact one another. + +![Illustrations of the Scenarios](./scenarios.png) + +_Illustrations of the Scenarios_ + +Read more about [Scenarios](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/design/scenarios) in the guidelines. + +### Findings + +Design is as much a part of research as research feeds design. This reflexive relationship reveals what we found out by exploring user needs, behaviours, and patterns in the Principles and Scenarios. It’s only by investigating and creating interactions and interfaces that we uncover these richer details, hidden user needs, and possible solutions. + +Read the full conclusion of [these findings](https://protocol-labs.gitbook.io/ipfs-mobile-design-guide/design/findings) in the guidelines. + +## Next steps + +While we refined our understanding of IPFS and P2P mobile design with this project, we need more research to realise the full value of the network to users. This is especially true for emerging markets and under-served and marginalised users. Their need for data privacy, portability, and stability is as great, if not greater, than for those where the internet works most of the time. These users also serve as a way to understand not only under-explored markets, but also more resilient methods of computing that helps everyone. + +![Illustrations of the design principles](./principles.png) + +_Illustrations of the design principles_ + +While we spoke to users from many different countries and contexts in the research, more questions arose. Addressing user needs in rural and emerging markets presents challenges and questions not fully answered in the work thus far. While not typically considered by Silicon Valley, these unanswered questions are the daily experience for much of the world’s population. + +Researching and designing for rural, remote, and politically unsafe contexts creates edges to push against and explore. It is only by pushing and exploring those edges that we come to better understand and serve users best. diff --git a/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet-preview.png b/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet-preview.png new file mode 100644 index 00000000..5372690f Binary files /dev/null and b/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet-preview.png differ diff --git a/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet.pdf b/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet.pdf new file mode 100644 index 00000000..4f05fce1 Binary files /dev/null and b/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet.pdf differ diff --git a/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet.png b/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet.png new file mode 100644 index 00000000..8914f284 Binary files /dev/null and b/src/_blog/100-IPFS-mobile-design-guidelines/cheat-sheet.png differ diff --git a/src/_blog/100-IPFS-mobile-design-guidelines/principles.png b/src/_blog/100-IPFS-mobile-design-guidelines/principles.png new file mode 100644 index 00000000..7b7c3d17 Binary files /dev/null and b/src/_blog/100-IPFS-mobile-design-guidelines/principles.png differ diff --git a/src/_blog/100-IPFS-mobile-design-guidelines/scenarios.png b/src/_blog/100-IPFS-mobile-design-guidelines/scenarios.png new file mode 100644 index 00000000..21c447ec Binary files /dev/null and b/src/_blog/100-IPFS-mobile-design-guidelines/scenarios.png differ diff --git a/src/_blog/100-june-meetup-recap/README.md b/src/_blog/100-june-meetup-recap/README.md new file mode 100644 index 00000000..73c83af9 --- /dev/null +++ b/src/_blog/100-june-meetup-recap/README.md @@ -0,0 +1,18 @@ +--- +date: 2020-06-23 +url: /2020-06-23-june-meetup-recap/ +title: Watch exclusive content from our June meetup! +description: +author: Jenn Turner +tags: Events, Video +--- + + +
+
+ +The IPFS community gathered for [a virtual meetup last week](https://www.youtube.com/playlist?list=PLuhRWgmPaHtToVYaDkd6ZTwB2Lo30s1vB) to celebrate the progress made since the major [go-ipfs 0.5 launch](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/) and take a look at where the ecosystem is headed for the duration of 2020. + +If you missed it, you can catch up on all of the presentations, from Alex Potsides’ walk through what’s new in [js-ipfs](https://blog.ipfs.io/2020-06-08-js-ipfs-0-46/) to special guest Daniel Buchner’s explainer on [Microsoft’s ION](https://blog.ipfs.io/2020-06-11-identity-ipfs-ion/). You also won’t want to miss the lightning talks from folks at Textile, AvionDB, Filecoin, IPLD, and more! + +To view this exclusive content, head over to the [IPFS YouTube page](https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew), click the subscribe button, and enjoy! To find out about future community events and project news, [subscribe to the IPFS Weekly newsletter](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), in your inbox every Tuesday. diff --git a/src/_blog/101-go-ipfs-0-6-0/README.md b/src/_blog/101-go-ipfs-0-6-0/README.md new file mode 100644 index 00000000..432fb472 --- /dev/null +++ b/src/_blog/101-go-ipfs-0-6-0/README.md @@ -0,0 +1,73 @@ +--- +date: 2020-06-26 +url: /2020-06-26-go-ipfs-0-6-0/ +title: IPFS 0.6.0 is here! QUIC, Noise, Peering and more! +description: +author: Jacob Heun +tags: go-ipfs, release +--- + +# 🔦 Go-IPFS 0.6.0 Highlights + +**MIGRATION:** This release contains a small config migration to enable listening on the QUIC transport in addition to the TCP transport. This migration will: + +- Normalize multiaddrs in the bootstrap list to use the `/p2p/Qm...` syntax for multiaddrs instead of the `/ipfs/Qm...` syntax. +- Add QUIC addresses for the default bootstrappers, as necessary. If you’ve removed the default bootstrappers from your bootstrap config, the migration won’t add them back. +- Add a QUIC listener address to mirror any TCP addresses present in your config. For example, if you’re listening on `/ip4/0.0.0.0/tcp/1234`, this migration will add a listen address for `/ip4/0.0.0.0/udp/1234/quic`. + +## 🚂 QUIC is now enabled by default + +This release enables the QUIC transport (draft 28) by default for both inbound and outbound connections. When connecting to new peers, libp2p will continue to dial all advertised addresses (tcp + quic) in parallel so if the QUIC connection fails for some reason, the connection should still succeed. + +If you want to learn more about the advantages of QUIC, check out the [release notes](https://github.com/ipfs/go-ipfs/releases/tag/v0.6.0) for more information. + +**NOTE:** The QUIC transport included in this release is backwards incompatible with the experimental QUIC transport included in previous releases. Unfortunately, the QUIC protocol underwent some significant breaking changes and supporting multiple versions wasn’t an option. In practice this degrades gracefully as go-ipfs will simply fall back on the TCP transport when dialing nodes with incompatible QUIC versions. + +## 🔐 Introducing the Noise Security Transport + +This go-ipfs release introduces a new security transport: [libp2p Noise](https://github.com/libp2p/specs/tree/master/noise) (built from the [Noise Protocol Framework](http://www.noiseprotocol.org/)). While TLS1.3 remains the default go-ipfs security transport, Noise is simpler to implement from scratch and will be the standard cross-platform libp2p security transport going forward. + +This brings us one step closer to deprecating and removing support for SECIO. + +While enabled by default, TLS1.3 and SECIO will still be negotiated prior to Noise. Once the network has had time to upgrade, Noise will take priority over SECIO. If you’d like to prefer Noise over other security transports, you can change its priority in the [config](https://github.com/ipfs/go-ipfs/blob/v0.6.0/docs/config.md#swarmtransportssecurity) (`Swarm.Transports.Security.Noise`). + +## 🚪 Gateway + +This release brings two gateway-relevant features: custom 404 pages and base36 support. + +### 🚫 Custom 404 pages + +You can now customize `404 Not Found` error pages by including an `ipfs-404.html` file somewhere in the request path. When a requested file isn’t found, go-ipfs will look for an `ipfs-404.html` in the same directory as the requested file, and in each parent directory. If found, this file will be returned (with a 404 status code) instead of the usual error message. + +### 🗝️ Base36 Support + +This release adds support for a new multibase encoding: base36. Base36 is an optimally efficient case-insensitive alphanumeric encoding. Case-insensitive alphanumeric encodings are important for the subdomain gateway as domain names are case insensitive. + +While base32 (the current default encoding used in subdomains) is simpler than base36, it’s not optimally efficient and base36 Ed25519 IPNS keys are 2 characters too big to fit into the 63 character subdomain length limit. The extra efficiency from base36 brings us under this limit and allows Ed25519 IPNS keys to work with the subdomain gateway. + +This release adds support for base36 but won’t use it by default. If you’d like to re-encode an Ed25519 IPNS key into base36, you can use the `ipfs cid format` command: + +```sh +$ ipfs cid format -v 1 --codec libp2p-key -b base36 bafzaajaiaejca4syrpdu6gdx4wsdnokxkprgzxf4wrstuc34gxw5k5jrag2so5gk +# k51qzi5uqu5dj16qyiq0tajolkojyl9qdkr254920wxv7ghtuwcz593tp69z9m +``` + +## 🕸️ Gossipsub upgraded to v1.1 + +This release brings a new Gossipsub protocol version: 1.1. You can read about it in the [blog post](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/). + +## 🤝 Peering + +This release introduces a new Peering feature. The peering subsystem configures go-ipfs to connect to, remain connected to, and reconnect to a set of nodes. Nodes should use this subsystem to create “sticky” links between frequently useful peers to improve reliability. You can read more about it and how to configure peers in the [go-ipfs config readme](https://github.com/ipfs/go-ipfs/blob/v0.6.0/docs/config.md#peering). + +## Thank you contributors! + +A huge thank you to [everyone who contributed](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#contributors) patches and improvements in this release, all **46** of you! We couldn’t have made this happen without your help and feedback. ❤ + +## Install, upgrade, and join us! + +You can get started by [installing go-ipfs](https://dist.ipfs.io/#go-ipfs) or [upgrading to go-ipfs 0.6](https://docs.ipfs.io/recent-releases/go-ipfs-0-6/update-procedure). + +There are many ways to get involved with IPFS based on your skill set, interest, and availability. Please check out [our contribution page](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) on GitHub for guidance and next steps. + +This is an exciting time for IPFS and the web in general. Join us! diff --git a/src/_blog/102-case-study-audius/README.md b/src/_blog/102-case-study-audius/README.md new file mode 100644 index 00000000..07431a45 --- /dev/null +++ b/src/_blog/102-case-study-audius/README.md @@ -0,0 +1,31 @@ +--- +date: 2020-07-09 +url: /2020-07-09-case-study-audius/ +title: Introducing the IPFS Case Study Series! +description: +author: Jessica Schilling +tags: casestudy, case-study, Audius, examples, using-ipfs, collaborators +header_image: 102-case-study-audius.png +--- + +![IPFS Case Study Seriew - Audius](./case-study-audius.jpg) + +## You asked, we delivered! + +We've heard requests from avid docs readers and IPFS newcomers alike for more high-level info about real-world problem-solving using IPFS — including how those who are already extensively building on IPFS made the choices that got them to where they are today. In reply, we'd like to introduce the **IPFS Case Study Series**! + +## IPFS x Audius: A story of harmony + +We're pleased to kick off our IPFS Case Study Series with a profile of our friends at [Audius](http://audius.co/), the decentralized music and audio sharing platform designed to give artists and creators a direct link with their listeners. To create their censorship-resistant, privacy-friendly platform, it was key to have a distributed cloud storage network as the basis for the system. Audius uses IPFS as the core decentralized storage component in their mission to give everyone the freedom to share, monetize, and listen to any audio. + +[Head over to the IPFS Docs to read the full case study](https://docs.ipfs.io/concepts/case-study-audius/), but here's a quick quote to whet your whistle: + +> In 2018, when Audius was looking into decentralized storage, they needed a system that would enable routing and addressing of large amounts of content in a decentralized way for their content streaming network. At the time, IPFS had the only system that fit their needs for decentralization ... Now, after two years on the network, Audius has found that IPFS has consistently performed and provided the flexibility and resilience needed for their network. "The lack of surprises is an advantage," says Hareesh Nagaraj, senior engineer at Audius. It’s been reliable the whole time." + +Have a look at the [full case study](https://docs.ipfs.io/concepts/case-study-audius/) now to learn why IPFS was the best fit for Audius' needs, where IPFS fits into the Audius tech stack, and the concrete gains IPFS has helped the Audius team achieve. We hope you'll be inspired! + +## Up next ... + +We've got more case studies in the works, so keep an eye on the IPFS Blog (or sign up for the [IPFS Weekly](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) newsletter!) so you don't miss a single one. + +Got an idea for a project or product that would make a great IPFS case study? Leave your thoughts in the comments. diff --git a/src/_blog/102-case-study-audius/case-study-audius.jpg b/src/_blog/102-case-study-audius/case-study-audius.jpg new file mode 100644 index 00000000..967c7ea7 Binary files /dev/null and b/src/_blog/102-case-study-audius/case-study-audius.jpg differ diff --git a/src/_blog/102-gossipsub-reports/README.md b/src/_blog/102-gossipsub-reports/README.md new file mode 100644 index 00000000..3c3ac7e9 --- /dev/null +++ b/src/_blog/102-gossipsub-reports/README.md @@ -0,0 +1,71 @@ +--- +date: 2020-07-07 +url: /gossipsubv1.1-eval-report-and-security-audit/ +title: A comprehensive Evaluation of GossipSub-v1.1 (and a new Logo!) +header_image: 102-header-image-gossipsub-reports.png +description: +author: David Dias +tags: go-libp2p, gossipsub, pubsub, libp2p +--- + +

+ Gossipsub logo +

+ +We are back with a direct follow up on the [Gossipsub v1.1 release from May](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1) with the much awaited Evaluation Report and three other presents we have for you. + +## ✨ The Logo + +The first cat was out of the bag as soon as you opened this post – the new logo! We now have a dedicated logo for this libp2p PubSub router implementation which represents the double network nature of Gossipsub. We hope you enjoy it! + +You can find all the [logo assets here](https://ipfs.io/ipfs/QmVSk8VvxWExnYCjqg7TNW2aBnN8Wr7SzkawLUyocWq96p) + +## 📊 Evaluation Report + +

+ +

+ +We are sharing with you a comprehensive, 61-page evaluation report, in which you can learn how we approached the testing of Gossipsub v1.1, the setting in which tests were run, and detailed descriptions of the conclusions we were able to take from such evaluation. With this evaluation, we demonstrate that GossipSub is resilient against all of the attacks studied, capable of recovering the mesh and meeting the message delivery deadline requirements of the Filecoin and the ETH2.0 blockchains. + +In addition to this report, which you can [find here](https://gateway.ipfs.io/ipfs/QmRAFP5DBnvNjdYSbWhEhVRJJDFCLpPyvew5GwCCB4VxM4), we are also excited to share with you: + +- The code that runs the malicious actor, code-named “bad boy”, which is simpler, more lightweight, and faster than the actual GossipSub protocol code. This is because attackers don’t need to follow all protocol logic and benefit from running only the essential functions with the goal of degrading the quality of service of the network. Find the [code here](https://github.com/libp2p/gossipsub-hardening/blob/master/test/badboy.go). + +- All of the Testground test plans used to test GossipSub. We are now making available all 12 configuration scripts and test plans to allow for 100% reproducibility of the tests for the wide range of attacks that we have carried out. Please explore and try them out and let us know if you find any new interesting combinations! Find the [code here](https://github.com/libp2p/gossipsub-hardening). + +We went from the regular Sybil and Eclipse Attacks to tests that stretch the protocol in unconventional ways to challenge it under extreme conditions. Such attacks include: + +- The “Covert Flash Attack”, where attacker nodes are behaving correctly in order to build up reputation according to GossipSub’s scoring function, occupy most connections in the mesh by pretending to be honest nodes, and then carry out a co-ordinated Eclipse attack. + +- The “Cold Boot Attack”, where the network is attacked at launch time and Sybils join the network together with honest nodes. Given their majority, Sybils dominate the mesh from the get-go, potentially preventing the network from launching. + +These are all very challenging attacks, which we wanted to test GossipSub against. You will be surprised to see the elegant way in which GossipSub resists all of these attacks. + +## 🔏 Security Audit by Least Authority + +

+ +

+ +Additionally, we are delighted to release Least Authority’s audit report for GossipSub. Least Authority has carried out an extensive audit on GossipSub v1.1 hardening extensions, both in theory and in implementation. + +It was a great experience to work with Least Authority throughout multiple fruitful discussions, LA identified multiple findings which then got mitigated by the Gossipsub team and reviewed again by LA. + +Least Authority produced a report detailing all of the tests they have carried out. You can consult the [final report here](https://gateway.ipfs.io/ipfs/QmWR376YyuyLewZDzaTHXGZr7quL5LB13HRFnNdSJ3CyXu/Least%20Authority%20-%20Gossipsub%20v1.1%20Final%20Audit%20Report%20%28v2%29.pdf). You can also read Least Authority's report announcement post at [their own blog](https://leastauthority.com/blog/audit-of-gossipsub-v1-1-for-protocol-labs). + +## 📜 Gossipsub Paper + +

+ +

+ +Finally, we are proud to share with you a preprint of a 16-page paper that puts everything together, justifies our design choices, and outlines the most important results we have gathered throughout. With this paper we want to put everything in one place, from the spec, to the details of the test setup, and the insights we have gathered from the most challenging of attacks, in a concise manner. The paper benchmarks performance of GossipSub with Bitcoin’s broadcast/flooding protocol, ETH1.0’s pubsub protocol and the vanilla version of GossipSup (the one without mitigation strategies and the scoring function integrated). The performance improvements brought by GossipSub v1.1 are really impressive and certainly rewarding of the effort that has gone into the design and testing of the protocol. + +You can find a [preprint of the paper here](https://arxiv.org/abs/2007.02754) + +One last thing, as Gossipsub v1.1 adds mitigations to many attack scenarios, we found it wise to create a CVE for Gossipsub v1.0 so that users can get automatically notified through their build systems and package managers (assuming that the CVE database is being used). You can consult it at [CVE-2020-12821](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-12821) + +That’s all for now. Hope you enjoy the Evaluation Report and let us know if you have questions by posting them at https://discuss.libp2p.io + +**The Gossipsub Task Force** - David Dias, Dmitris Vyzovitis, Yiannis Psaras, Yusef Napora, Dirk McCormick diff --git a/src/_blog/104-dht-deep-dive/README.md b/src/_blog/104-dht-deep-dive/README.md new file mode 100644 index 00000000..58f5199e --- /dev/null +++ b/src/_blog/104-dht-deep-dive/README.md @@ -0,0 +1,155 @@ +--- +date: 2020-07-20 +url: /2020-07-20-dht-deep-dive/ +title: 'IPFS 0.5 Content Routing Improvements: Deep Dive' +description: +author: Adin Schmahmann +header_image: 104-dht-deep-dive.png +tags: go-ipfs, 0.5 release +--- + +

+ +

+ +At the end of April, we released our largest update to go-ipfs to date: [IPFS 0.5](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/). While there have been many improvements, the changes to IPFS’s Distributed Hash Table (DHT) were especially critical to improving the performance and stability of finding data in IPFS. For some background on how we arrived at the most recent set of DHT changes, take a look at [The Road to the New DHT](https://blog.ipfs.io/2020-05-19-road-to-dht/), or try them out yourself in the [latest version of go-ipfs](https://dist.ipfs.io/#go-ipfs). + +In this post we’d like to take you through the details of what the DHT looks like in v0.5.0, so get ready for a _monster post_ that truly **dives deep** into the ins and outs of the IPFS DHT implementation. If you want to learn a thing or two about how DHTs work, and how we made the implementation used by IPFS faster and more resilient, read on! + +## Background: What does the DHT do for IPFS? + +A DHT is a distributed system for mapping keys to values. In IPFS, the DHT is used as the fundamental component of the content routing system. It maps what the user is looking for (a CID) to the peer that is actually storing the matching content. There are 3 types of key-value pairings that are mapped using the DHT: + +- Provider Records: These map a data identifier (i.e., a multihash) to a peer that has advertised that they have, and are willing, to provide you with that content. + - Used by IPFS to find content + - Used by IPNS over PubSub to find other members of the pubsub topic +- IPNS Records: These map an IPNS key (i.e., hash of a public key) to an IPNS record (i.e., a signed and versioned pointer to some path like `/ipfs/bafyXYZ`) + - Used by IPNS +- Peer Records: These map a peerID to a set of multiaddresses at which the peer may be reached + - Used by IPFS when we know of a peer with content, but do not know its address + - Used for manual connections (e.g., `ipfs swarm connect /p2p/QmXYZ`) + +Each of these record types has slightly different semantics, but they are all updated and found via the same DHT protocol, IPFS’s take on Kademlia. + +## Kademlia Overview + +The Kademlia algorithm has been around for a while and there are some great resources already available for it online, including the [paper itself](https://ipfs.io/ipfs/QmaVrnwZrnoG4YramcN75mbE5AUfCymiEErrHGXoQR968V) and [Wikipedia](https://en.wikipedia.org/wiki/Kademlia). We’ll go through some of the basics here, though. + +The general idea of Kademlia is to build a DHT on top of three system parameters: + +- An address space: a way that all of the peers in the network can be uniquely identified (in IPFS this is all the numbers from `0` to `2^256-1`) +- A metric to order the peers in the address space and therefore visualize all the peers along a line ordered from smallest to largest (in IPFS we we take `SHA256(PeerID)` and interpret it as an integer between `0` and `2^256-1`) +- A projection, that will take a record key and calculate a position in the address space where the peer(s) most ideally suited to store the record should be near (in IPFS we use `SHA256(Record Key)`) + +Having this address space and a peer ordering metric allows us to search the network as though it was a sorted list. In particular, we can turn the system into something like a skip list where a peer knows peers that are distances of around 1,2,4,8,16… away from it. This will allow us to search the list in time that is logarithmic in the size of the network (i.e. O(log(N)) lookup time). Unlike a skip list, Kademlia is somewhat unstable since peers can join, leave and rejoin the network at any time. To deal with the unstable nature of the system, a Kademlia peer does not just keep links to the peers with distance 1,2,4,8,... away from it, but instead for each multiple of 2 away it keeps up to `K` (in IPFS 20) links. For example, instead of a peer keeping a single link 128 away it would keep 20 links that are between 65 and 128 away. + +Note that the selection of network wide parameters like `K` is not arbitrary, but is instead determined based on the observed average churn in the network and the frequency with which the network will republish information. System parameters (like K) are computed to maximize the probability that the network stays connected and no data is lost, while maintaining a desired latency for queries, and assuming the observations (of average churn) stay constant. These system and network parameters drive the decisions made in Kademlia’s two main components, the routing table which tracks all those links in the network, and the lookup algorithm which determines how to traverse those links to store and retrieve data. + +## Kademlia and Undialable Peers + +As noted above, a major property of Kademlia is that all peers can be assembled inline from smallest to largest. This property is useful since it means that as peer 0 walks down the line to find peer 55 it can know it is getting progressively closer. However, this requires that everyone on the line can talk to each other, otherwise peer 33 might send peer 0 down a dead end by telling them the content they want is on a node they can’t communicate with. This can result in the network being slow, and more importantly, **fragmented** with data being accessible by some peers and not others. + +While having peers that cannot talk to each other may sound like an oddity, two common causes of peers being unreachable by other peers are NATs and firewalls. For example, having asymmetrical networks where a set of peers X, Y, Z can connect to each other and to A, but A cannot connect to them is fairly common on the modern internet. Similarly, it is extremely common that two peers A and B which are both behind NATs cannot talk to (or dial) each other. + +When the IPFS network grew **30x in 2019**, we ran into a large problem: suddenly most of the peers on the IPFS DHT were behind NATs, which degraded quality since you couldn’t dial the peer that was supposed to have a given piece of content. To deal with this problem, we now have peers ignore anyone they think is not reachable by the general public, and have peers filter themselves out of the network if they suspect they are not reachable. + +To do this, we use libp2p’s AutoNAT, which acts as a distributed STUN layer informing peers of their observed addresses and whether or not they appear to be publicly dialable. Only when peers detect that they are publicly dialable do they switch from client mode (where they can query the DHT, but not respond to queries) to server mode (where they can both query and respond to queries). Similarly, if a server discovers that it is no longer publicly dialable it will switch back into client mode. + +Serving AutoNAT requests (i.e., checking whether other peers were dialable) was previously only enabled on opt-in nodes like some of the IPFS public infrastructure. However, leaning so heavily on AutoNAT to clean up undialable nodes from the DHT made us push to make AutoNAT more distributed. Therefore, we now expose a rate-limited AutoNAT service on all IPFS nodes that have discovered that they are publicly dialable. These requests should be infrequent and therefore not have noticeable overhead for standard IPFS nodes. + +Note: this automatic switching between DHT client and server modes is the default configuration option, however it is also possible to set your node to only be a “client” if desired. Misconfiguring your network setup while using any option other than “dht” (automatic mode) or “dhtclient” (client-only mode) has the ability to degrade network performance for yourself and everyone else by adding undialable nodes to the network so please exercise care. + +While AutoNAT-based mode switching is great, and we are hopeful that it will clear most of the undialable nodes out of the network, it seems only prudent that DHT peers (both clients and servers) should also verify whether nodes appear publicly dialable (e.g., advertise public IP addresses and not just ones like `192.168.X.Y`) before either adding them to their routing tables or issuing queries to them. + +## Two IPFS DHTs: Public and Local + +While many of our users utilize the publicly shared DHT to discover and advertise content, some of them operate in segregated networks (e.g., local networks or isolated VPNs). For these users, having a DHT where all non-publicly dialable nodes are clients is very problematic since NONE of the nodes are publicly dialable. + +To make things easier for this use case, we have _added a second DHT_ that is meant to include nodes that are not part of the public network, such as VPNs, CJDNS, Yggdrasil, etc. For now, we’ll refer to this as the LAN DHT, as opposed to the public network which is the WAN DHT. These two DHTs are separated by utilizing different DHT protocol names (i.e., `/ipfs/kad/1.0.0` for the WAN DHT, and `/ipfs/lan/kad/1.0.0` for the LAN DHT) to eliminate any accidental merging of the two networks. However, all of the non-public networks do have some risk of merging if users have not properly configured their networks. + +The main implementation difference between the WAN and LAN DHTs are the acceptance criteria for peers—which are eligible to be part of a routing table or query and which are not. The WAN DHT’s criteria is “do you look like a public address” and the LAN DHT’s criteria is “do you look like a non-public address.” However, while WAN DHT nodes switch from client to server mode based on whether they are publicly dialable, LAN DHT nodes are always servers (unless the “dhtclient” option has been set). + +## Routing Tables + +As mentioned earlier, every peer in a Kademlia network maintains links to various other peers in the network. The way this works is as follows: + +1. When we connect to a peer, check if it qualifies to be added to our routing table + - Ensure the peer is a DHT server that is advertising the DHT protocol ID (in IPFS `/ipfs/kad/1.0.0` for the public/WAN DHT and `/ipfs/lan/kad/1.0.0` for the LAN DHT) + - Ensure the peer has IP addresses that match the ranges we expect (e.g. members of the public DHT having at least one public range IP address as opposed to only addresses like `192.168.X.Y`) +2. If it qualifies, then determine how close the new peer is in the Kademlia address space to us to figure out which “bucket” it should go into (i.e. if the peer is between 2^7 and 2^8 away from us and the address space is of size 2^256 then the peer goes into bucket 256-8) +3. Attempt to put the peer in the bucket + - If the bucket is not full (i.e., has less than 20 peers in it) then add the peer + - If the bucket is full then determine if there are any peers that are "replaceable" (defined below), and then drop one of them and replace it with the new peer. Otherwise, don’t add the peer to the bucket +4. If we ever try to query a peer that is in our routing table and fail, then evict them + - Note: After every refresh (see below) we go through the routing table and attempt to connect to peers that we have not queried “recently” to check if they are still online and valid peers for our routing table. If not, then we evict them. + +Additionally, in order to keep the routing tables accurate and up to date, we periodically refresh the routing tables. The frequency of the routing table refresh is calculated from a similar set of metrics as the bucket size (you can increase the frequency of refreshes, but there is a floor for how low it may go). For IPFS the floor frequency was selected to be once every 10 minutes. While this is likely a higher frequency than is strictly necessary, we felt it was important to protect the health of the network as we learn more about the IPFS DHT network dynamics post-adoption of go-ipfs v0.5.0. + +A routing table refresh works as follows: + +1. Go through all the buckets, from bucket 0 (the one with peers that are on a different half of the network than we are) up until the highest bucket we have that contains a peer in it (we cap this at bucket 15 due to implementation concerns). For each bucket select a random address in Kademlia space that could fit in that bucket (e.g., in selecting a random peer between 512 and 1024 we selected 678 even though that peer likely does not exist in the network) and do a lookup to find the `K` closest peers to that random address. This will ensure that we will have filled up each bucket with as many peers as will fit. +2. We also search for ourselves in the network (i.e., bucket 255), just in case the network size and distribution are such that the first 15 buckets do not suffice for us to learn about the `K` peers closest to us. + +## Lookup Algorithm + +The lookup algorithm answers the question “What are the `K` closest peers to `X`?”. Our implementation of the Kademlia lookup algorithm goes like this: + +1. Load the `K` closest peers to `X` from our routing table into the query queue +2. Allowing up to Alpha concurrent queries (Alpha in go-ipfs is 10, but is an implementation parameter not inherent in the network itself) grab the peer closest to `X` and ask them “who are the `K` closest peers to `X`?” +3. When a query to a peer completes add those results to the query queue, and pull the next, closest peer off the queue and query them +4. The query terminates whenever the closest known Beta peers to `X` have been successfully queried (i.e. no dial timeouts, errors, etc.). + - Note: Beta is a network wide parameter designed to give some resiliency to the network, it is set to 3 for IPFS. +5. After the query is done take the `K` closest peers that we have not already failed at querying (i.e. we have heard from them or they are still in our queue) and return them + - Note: for some API compatibility reasons go-ipfs also ensures that we have actually sent queries to all of the top `K` peers + +In the routing table section, we mentioned that we evict peers that are "replaceable" if we find a new peer that could take their spot in the bucket. +In v0.5.0 we define a peer as "replaceable" if they have not been "useful" to us within the time period during which they are probabilistically expected to have been utilized in a refresh. That value is `Log(1/K) * Log(1 - Alpha/K) * refreshPeriod`, where Alpha is the number of peers dialed that can be simultaneously queried. Additionally, we define “useful” as responding within 2x the time it takes any other peer from our routing table to respond to us (this biases against peers that are slow, overloaded, unreliable, or have bad network connectivity to us). The definitions of replaceable and useful peers are likely to change as we gather more information about the dynamics of the network and investigate relevant threat models. + +## Routing Particulars + +While the lookup algorithm is what allows us to put and get records into the DHT, the way in which this is done is slightly different for each record type: + +- Provider Records (for a block with Multihash `H`) + - Put: Do a standard lookup for the `K` closest peers to `SHA256(H)` + - Put the provider record at those `K` closest peers (and also store it ourselves) + - Note: Currently you are only allowed to put a provider record for yourself (i.e. Alice cannot advertise that Bob has content) + - Get: Do a lookup for the `K` closest peers to `X=SHA256(H)`, but instead of just asking each peer in the lookup “who are the `K` closest peers to `X` you know about?” also ask “please send me the record corresponding to `X` if you have it”. + - The peer adds all new providers it has learned about and continues until the lookup terminates. Depending on which API is used, the lookup can also be forced to abort after receiving a certain number of provider records. +- IPNS Records (For an IPNS key where the multihash of the public key is `H`) + - Put: Do a standard lookup for the `K` closest peers to `SHA256(/ipns/H)` + - Put the IPNS record at those `K` closest peers (and also store it ourselves) + - Get: Do a lookup for the `K` closest peers to `X=SHA256(/ipns/H)`, but instead of just asking each peer in the lookup “who are the `K` closest peers to `X` you know about?” also ask “please send me the record corresponding to `X` if you have it”. + - If a user receives a newer record (i.e., a record that has a higher IPNS sequence number), it updates its existing one and continues until the lookup terminates. This is needed in order to make sure that the user gets the latest record. Recall that IPNS records are mutable and therefore, we need to make sure that we point a request to the latest version of the content. + - The default in go-ipfs will abort early after receiving 16 records, but it can be set to go until the query terminates + - Once the lookup is done, if any of the `K` closest peers to `X` did not have the newest IPNS record, send them the newest record +- Peer Records (For a peer where the multihash of the public key is `H`) + - Put: This occurs implicitly - when libp2p peers connect to each other they exchange peer information automatically. Being part of the DHT (as either a client or server) requires being in frequent contact with your `K` closest peers, therefore they will inherently end up with your peer record. + - Get: Do a lookup for the `K` closest peers to `X=SHA256(H)`, but instead of just asking each peer in the lookup “who are the `K` closest peers to `X` you know about?” also ask “please send me the peer record for `H` if you have it” + - We will try to connect to the peer with ID `H` as soon as we learn addresses about it. The lookup can terminate early if we end up connecting to the peer. + +## Testing and Results + +There have been a lot of changes to the DHT as part of the go-ipfs v0.5.0 release. While many of the changes were intuitively going to be quite useful, we needed harder evidence that the full set of changes would result in a stable and performant network. To that end, we utilized Testground, which is a new distributed testing infrastructure (check out their launch notes at [Testground blog post](https://blog.ipfs.io/2020-05-06-launching-testground/)). + +Throughout the development process we ran many Testground tests to get an understanding of how our changes have improved the network. Below is a comparison of the performance of a 1000 peer network where all peers have around 100-120ms latencies from each other, that is running the DHT from go-ipfs v0.4.23 and the DHT from go-ipfs v0.5.0. Note: The v0.4.23 DHT had small modifications to make testing easier like removing hard coded lookup timeouts, so we can see just how long the queries should really be running for. + +As can be seen in the graphs, the most drastic changes are to 95th percentile lookup times and to the operations that spent more time doing their lookups and could not terminate as early. This meant IPFS Provide and IPNS Put, which require actually completing a search through the network, got a very large boost (for Provide 24x speedup on average and 33x speedup for the 95th percentile). This was followed by IPNS Get which needs to find many records, then Find Peer which is looking for one very specific record, and finally the time to find just one IPFS Provider record was sped up by 2.2x on average and 6.4x for the 95th percentile. + +

+ + +

+ +## Parting Thoughts + +Phew! If you have made it all the way through this blog post (or even just skimmed most of it), I commend you! Before sending you back to your exciting lives — just a few brief comments about IPFS v0.5.0 and the releases to come: + +IPFS v0.5.0 included a lot of DHT changes and improvements. Something to watch out for is that new nodes are currently participating in the same DHT as older go-ipfs v0.4.23 and earlier nodes. While the DHT code for v0.5.0 is much improved over previous versions, a single node in a big network can only help so much. This means you should see improved performance today when you run v0.5.0, but as more of the network upgrades to v0.5.0 and beyond we will continue to see lookup times improve. So tell your friends it’s time to upgrade! 😁 + +There are many more exciting improvements to come - so if you are interested in contributing or just tracking our improvements, follow our repositories on [GitHub](https://github.com/ipfs/ipfs) and come chat with us on [IRC](https://github.com/ipfs/team-mgmt#chat). + +### Learn more + +- IPFS 0.5.0 Announcement: https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/ +- Release Highlights: https://www.youtube.com/watch?v=G8FvB_0HlCE +- Testground: https://blog.ipfs.io/2020-05-06-launching-testground/ diff --git a/src/_blog/104-js-ipfs-0.48/README.md b/src/_blog/104-js-ipfs-0.48/README.md new file mode 100644 index 00000000..8e137f63 --- /dev/null +++ b/src/_blog/104-js-ipfs-0.48/README.md @@ -0,0 +1,353 @@ +--- +date: 2020-07-20 +url: /2020-07-20-js-ipfs-0-48/ +title: js-IPFS 0.48.0 released with connectivity improvements and smaller blockstore +header_image: js-ipfs-placeholder.png +description: +author: Alex Potsides +--- + +# 🔦 Highlights + +> delegates turned on by default, smaller, faster blockstore and a more intuitive API + +`js-IPFS@0.48.0` is hot off the press with much better default connectivity, a smaller blockstore and a more intuitive API + +## 🧭 Delegate nodes on by default + +JS IPFS has traditionally primarily targeted the browser, and the browser is a bad place to be if you want to be on the [DHT][]. You typically aren't on a page long enough to make or respond to [DHT][] queries, nor are you diallable, so even if you were able to advertise yourself as a provider for a given block, the chances are no-one can connect to you to retrieve that block which results in a degraded service for everyone. Worse, the way you find more peers and content is via the [DHT][] so you're kind of stuck. + +There are several ways to give in-browser IPFS nodes a better experience on the network, one of those is [Delegate Nodes](https://blog.ipfs.io/2019-08-06-js-ipfs-0-37/#delegated-peer-and-content-routing). A Delegate Node is a network peer that performs certain actions on behalf of other nodes on the network. In this case it will make [DHT][] queries on our behalf so we can find more peers and more content than ever before. + +`js-IPFS@0.48.0` enables delegate nodes in the configuration by default, which means you should see far more peers than you have previously and be able to find content faster and more reliably. + +By default it uses [public delegate nodes](https://github.com/ipfs/js-ipfs/blob/master/packages/ipfs/docs/DELEGATE_ROUTERS.md) to give you the best out-of-the-box experience. These nodes are a shared commons but have no availability guarantees and are potentially a source of resource contention. If you are deploying JS IPFS in a production environment you should host your own delegate nodes and [configure JS IPFS](https://github.com/ipfs/js-ipfs/blob/master/docs/CONFIG.md#delegates) accordingly. + +## 🏓 DHT configuration + +The full [DHT][] implementation for JS IPFS with all the [changes made in Go IPFS 0.5](https://blog.ipfs.io/2020-05-19-road-to-dht/) will not arrive until later this year, but for the time being you can run the experimental [DHT][] implementation. This implementation is incomplete so some features may not work as intended but you should be able to use it to resolve content and find peers though there may be some performance degredation on your node over time. + +You can enable the [DHT][] for JS IPFS daemons via the command line. To put your node into client mode run: + +```console +$ jsipfs config Routing.Type dhtclient +``` + +Then restart your daemon process and you'll be running the [DHT][]. + +To do the same thing in your application, use the `libp2p` config option: + +```javascript +const IPFS = require('ipfs') + +const node = await IPFS.create({ + libp2p: { + config: { + dht: { + enabled: true, + clientMode: true, + }, + }, + }, +}) +``` + +DHT peers operate in either [client mode or server mode](https://github.com/ipfs/go-ipfs/blob/0acfb38763208999d0608a28f534867baad615f3/docs/config.md#routingtype). DHT clients can make queries to find content and other peers but will not advertise themselves as providers of content or answer any queries. You might be in client mode for any number of reasons but the primary one is that most DHT peers are behind a [NAT](https://en.wikipedia.org/wiki/Network_address_translation) firewall which means peers on other networks cannot dial them via [ipfs.swarm.connect](https://github.com/ipfs/js-ipfs/blob/master/docs/core-api/SWARM.md#ipfsswarmconnectaddr-options). Unless you know your node will have a public address, you should run it in client mode. + +Go IPFS nodes use the [libp2p-autonat](https://github.com/libp2p/go-libp2p-autonat) package to determine if they are diallable by peers on external networks or not - if they are, they upgrade themselves from DHT clients to DHT servers. Autonat support [is on the way for JS IPFS](https://github.com/libp2p/js-libp2p/issues/104) but until it lands it will only operate in client mode, which is a stepping stone on the way to full DHT support. + +## 🧱 Smaller, faster blockstore + +In the early days of IPFS, all [CID][]s were v0. That meant they were a bare [multihash][] - a byte array prefixed with some prefixed bytes that told you what sort of hash the rest of the bytes represented (`sha2-256`, `blake2s-128` etc) and how many of those bytes were present. The [multihash][] was created by hashing the data in a [block](https://docs.ipfs.io/how-to/work-with-blocks/) which was then stored in the block store contained within the [IPFS repo](https://github.com/ipfs/js-ipfs-repo). + +Later v1 [CID][]s arrived and they added a version number and a codec to the byte array, but the [CID][] still contained the [multihash][] - a block can correspond to multiple [CID][]s, as long as they contain the same [multihash][]. + +The blockstore was turning [CID][]s into byte arrays and using these to generate the key for a block, which meant the same block might get stored against a v0 [CID][] and a v1 [CID][]. Since the block data is the same, the repo was also doing a double-lookup on each passed [CID][] - once as a v0 [CID][] and if the block was not found, again as a v1 [CID][]. + +With the release of `js-IPFS@0.48.0`, all blocks are now stored against the base32 encoded [multihash][] extracted from the [CID][]. This means no more duplication and no more double-lookups, but it's come at the cost of needing to do a repo migration from v7 to v8 to ensure that all your blocks are stored under the correct key. + +You may notice this when starting up your node: + +```console +$ jsipfs daemon +Initializing IPFS daemon... +js-ipfs version: 0.48.0 +System version: x64/darwin +Node.js version: 12.16.1 +Incompatible repo version. Migration needed. Pass --migrate for automatic migration +``` + +Just pass `--migrate` and your blockstore will be converted: + +```console +$ jsipfs daemon --migrate +Initializing IPFS daemon... +js-ipfs version: 0.48.0 +System version: x64/darwin +Node.js version: 12.16.1 +Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/QmSRS11FZeMHvqe5wZamurpgj2Jmm9SYX76t7ZtJ7Tt74d +Swarm listening on /ip4/192.168.1.109/tcp/4002/p2p/QmSRS11FZeMHvqe5wZamurpgj2Jmm9SYX76t7ZtJ7Tt74d +Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/QmSRS11FZeMHvqe5wZamurpgj2Jmm9SYX76t7ZtJ7Tt74d +API listening on /ip4/127.0.0.1/tcp/5002/http +Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http +Web UI available at http://127.0.0.1:5002/webui +Daemon is ready +``` + +When used as a [module](https://github.com/ipfs/js-ipfs/blob/1760b8928dac14b3abcfa4a889042f0d7a956386/packages/ipfs/docs/MODULE.md) in the browser, or an application, [options.repoAutoMigrate](https://github.com/ipfs/js-ipfs/blob/1760b8928dac14b3abcfa4a889042f0d7a956386/packages/ipfs/docs/MODULE.md#optionsrepoautomigrate) is enabled by default so the upgrade will happen invisibly in the background; all you will notice is a one-off slightly longer startup time. + +## 🗺️ A more intuitive API + +As the IPFS ecosystem grows more and more developers become interested in the project and start using our APIs. A lot of them have grown organically over time and not all of them have had equal amounts of time invested in them. + +The following changes only affect the [core](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs) API and [ipfs-http-client](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client). The actual [HTTP API](https://docs.ipfs.io/reference/http/api/) and [CLI](https://docs.ipfs.io/reference/cli/) remain unchanged. + +### ipfs.add() + +Over time we've tried to remove the requirement to understand other frameworks and weird facets of the JavaScript language to start using IPFS. We removed [pull-streams](https://github.com/pull-stream/pull-stream) to let developers focus on the natural primitives of the environment they were developing for - e.g. [streams](https://nodejs.org/api/stream.html) in node and [Files](https://developer.mozilla.org/en-US/docs/Web/API/File)/[Blobs](https://developer.mozilla.org/en-US/docs/Web/API/Blob) in the browser. We removed the requirement to convert [Strings](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) to [Buffers](https://nodejs.org/api/buffer.html) to let people simply add stringified JSON as a file to IPFS. + +We refactored the whole API from [callbacks](https://nodejs.org/en/knowledge/getting-started/control-flow/what-are-callbacks/) to [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then from returning [Arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) to [AsyncIterators](https://jakearchibald.com/2017/async-iterators-and-generators/) to allow streaming of enormous amounts of data without using external libraries. + +In that last piece we lost a little bit of usability, as the humble `ipfs.add` API takes all manner of arguments and always returns an AsyncIterator: + +```javascript +for await (const file of ipfs.add('My file content')) { + // Wait, what? I only added one file, why am I in a loop? +} +``` + +With `js-IPFS@0.48.0`, `ipfs.add` now returns a single item. This seemingly innocuous change brings a raft of usability improvements as a very common question is 'I added a file, and got back `[object AsyncGenerator]`, what is that?' and then you have to get the whiteboard and the pens out and before you know it you've gone down a long explanation cul de sac when all they wanted to do was get a [CID][] back. + +```javascript +const file = await ipfs.add('My file content') +// Ahh, much better +``` + +But you can still add whole directories of files if you want to, just call `ipfs.addAll`: + +```javascript +const files = [ + { + path: '/foo/file1.txt', + content: 'file 1', + }, + { + path: '/foo/file2.txt', + content: 'file 2', + }, +] + +for await (const file of ipfs.addAll(files)) { + // All the files! +} +``` + +### APIs with optional arguments + +Recently we [released a change](https://blog.ipfs.io/2020-05-21-js-ipfs-0-44/#cancellable-requests) that allowed passing [AbortSignal][]s to all API methods. This necessitated adding an `options` object to every API call that didn't have one already. This left us in the weird situation where some arguments were optional, but were not in the options argument. Worse, the actions of some API calls changed dramatically depending on whether you passed an option or not. For example `ipfs.bootstrap.rm([multiaddr])` would completely empty the bootstrap list if you didn't pass a [Multiaddr][]. + +All this leads to weird behaviour and subtle bugs when you pass things like `undefined` in for an optional arg position and don't pass an options argument, as well as knotty, error-prone internal code that tries to guess what you passed based on type or properties of the objects where their types are the same. + +With `js-IPFS@0.48.0`, all optional parameters to API methods now go in the options object. All APIs that have dramatic changes in behaviour have been split into more intuitive commands. + +For example: + +```javascript +// before +ipfs.bootstrap.add('/ip4/...') // adds a multiaddr to the bootstrap list +ipfs.bootstrap.add({ default: true }) // restores default bootstrappers + +// after +ipfs.bootstrap.add('/ip4/...') // adds a multiaddr to the bootstrap list +ipfs.bootstrap.reset() // restores default bootstrappers +``` + +```javascript +// before +ipfs.bootstrap.rm('/ip4/...') // removes a multiaddr from the bootstrap list +ipfs.bootstrap.rm({ all: true }) // empties bootstrapper list + +// after +ipfs.bootstrap.rm('/ip4/...') // removes a multiaddr from the bootstrap list +ipfs.bootstrap.clear() // empties bootstrapper list +``` + +See the API Changes section below for the full rundown. + +# ✨New features + +- add interface and http client versions to version output ([#3125](https://github.com/ipfs/js-ipfs/issues/3125)) ([65f8b23](https://github.com/ipfs/js-ipfs/commit/65f8b23f550f939e94aaf6939894a513519e6d68)), closes [#2878](https://github.com/ipfs/js-ipfs/issues/2878) +- add size-only flag to cli repo stat command ([#3143](https://github.com/ipfs/js-ipfs/issues/3143)) ([b4d3bf8](https://github.com/ipfs/js-ipfs/commit/b4d3bf80e7cd5820e2561fc957a9f0f17235df05)) +- enable DHT by Routing.Type config key ([#3153](https://github.com/ipfs/js-ipfs/issues/3153)) ([dfe15d7](https://github.com/ipfs/js-ipfs/commit/dfe15d7422579afce8860f6321575454826d1844)) +- store blocks by multihash instead of CID ([#3124](https://github.com/ipfs/js-ipfs/issues/3124)) ([03b17f5](https://github.com/ipfs/js-ipfs/commit/03b17f5e2d290e84aa0cb541079b79e468e7d1bd)) +- turn on delegate nodes by default ([#3148](https://github.com/ipfs/js-ipfs/issues/3148)) ([3fd2ca8](https://github.com/ipfs/js-ipfs/commit/3fd2ca8c7bb3a907cc74d48516481fae01d47327)) +- optional arguments go in the options object ([#3118](https://github.com/ipfs/js-ipfs/issues/3118)) ([8cb8c73](https://github.com/ipfs/js-ipfs/commit/8cb8c73037e44894d756b70f344b3282463206f9)) +- add config.getAll ([#3071](https://github.com/ipfs/js-ipfs/issues/3071)) ([16587f1](https://github.com/ipfs/js-ipfs/commit/16587f16e1b3ae525c099b1975748510638aceee)) +- libp2p noise as fallback for secio ([#3074](https://github.com/ipfs/js-ipfs/issues/3074)) ([660d3db](https://github.com/ipfs/js-ipfs/commit/660d3db9a47bff652057762b52a25529ab37117f)) +- persist peerstore ([#3072](https://github.com/ipfs/js-ipfs/issues/3072)) ([b404974](https://github.com/ipfs/js-ipfs/commit/b40497427b7d33f52803c8fa14cc73be7f872d65)) +- webui v2.9.0 ([#3054](https://github.com/ipfs/js-ipfs/issues/3054)) ([5d9d331](https://github.com/ipfs/js-ipfs/commit/5d9d331ed42f3ac9efc243878011db871b742a4e)) +- support loading arbitrary ipld formats in the http client ([#3073](https://github.com/ipfs/js-ipfs/issues/3073)) ([bd12773](https://github.com/ipfs/js-ipfs/commit/bd127730039ab79dd7ad22b31245939ee01a6514)) +- use libp2p 0.28.0 ([#3019](https://github.com/ipfs/js-ipfs/pull/3019)) + +# 🦟 Bugs fixed + +- do not list raw nodes in a dag as directories ([#3155](https://github.com/ipfs/js-ipfs/issues/3155)) ([585a142](https://github.com/ipfs/js-ipfs/commit/585a142d3c2317e80f37d6195ce24ed3146112e5)) +- error when no command specified ([#3145](https://github.com/ipfs/js-ipfs/issues/3145)) ([4309e10](https://github.com/ipfs/js-ipfs/commit/4309e1004bb77ee276b57228c35a921fb780a227)) +- peer ids are returned as strings so don't call toB58String on them ([#3162](https://github.com/ipfs/js-ipfs/issues/3162)) ([281bfe6](https://github.com/ipfs/js-ipfs/commit/281bfe60f079011d0ada783a82d1f030d08a89f2)) +- still load dag-pb, dag-cbor and raw when specifying custom formats ([#3132](https://github.com/ipfs/js-ipfs/issues/3132)) ([a96e3bc](https://github.com/ipfs/js-ipfs/commit/a96e3bc9e3763004beafc24b98efa85ffa665622)), closes [#3129](https://github.com/ipfs/js-ipfs/issues/3129) +- unhandledpromiserejection in electron tests ([#3146](https://github.com/ipfs/js-ipfs/issues/3146)) ([4c0c67f](https://github.com/ipfs/js-ipfs/commit/4c0c67f023c75bbcb56b0520b31f1334480a5130)) +- use post for preloading ([#3149](https://github.com/ipfs/js-ipfs/issues/3149)) ([c9700f7](https://github.com/ipfs/js-ipfs/commit/c9700f78cefc523f6140361a90099c4991b427a7)) +- optional arguments go in the options object ([#3118](https://github.com/ipfs/js-ipfs/issues/3118)) ([8cb8c73](https://github.com/ipfs/js-ipfs/commit/8cb8c73037e44894d756b70f344b3282463206f9)) +- still load dag-pb, dag-cbor and raw when specifying custom formats ([#3132](https://github.com/ipfs/js-ipfs/issues/3132)) ([a96e3bc](https://github.com/ipfs/js-ipfs/commit/a96e3bc9e3763004beafc24b98efa85ffa665622)), closes [#3129](https://github.com/ipfs/js-ipfs/issues/3129) +- libp2p now requires encryption module ([#3085](https://github.com/ipfs/js-ipfs/issues/3085)) ([c567282](https://github.com/ipfs/js-ipfs/commit/c56728209f0eea63d00c68163c74cfdd350de69c)) + +# 🏗 API Changes + +## Core API & HTTP API Client + +- `ipfs.add` only works on single items - a Uint8Array, a String, an AsyncIterable\ etc +- `ipfs.addAll` works on multiple items +- `ipfs.bitswap.wantlist([peer], [options])` is split into: + - `ipfs.bitswap.wantlist([options])` + - `ipfs.bitswap.wantlistForPeer(peer, [options])` +- `ipfs.bootstrap.add([addr], [options])` is split into: + - `ipfs.bootstrap.add(addr, [options])` - add a bootstrap node + - `ipfs.bootstrap.reset()` - restore the default list of bootstrap nodes +- `ipfs.bootstrap.rm([addr], [options])` is split into: + - `ipfs.bootstrap.rm(addr, [options])` - remove a bootstrap node + - `ipfs.bootstrap.clear([options])` - empty the bootstrap list +- `ipfs.config.get([key])` is split into: + - `ipfs.config.get(key)` - return a value for a config key + - `ipfs.config.getAll()` - return the whole config +- `ipfs.dag.resolve` returns `Promise<{ cid, remainderPath }` instead of `AsyncIterator<{ value, remainderPath }>` + - Previously the core api returned an async iterator and the http client returned a simple promise +- `ipfs.dag.get(cid, [path], [options])` becomes `ipfs.dag.get(cid, [options])` + - `path` is moved into the `options` object +- `ipfs.dag.tree(cid, [path], [options])` becomes `ipfs.dag.tree(cid, [options])` + - `path` is moved into the `options` object +- `ipfs.dag.resolve(cid, [path], [options])` becomes `ipfs.dag.resolve(cid, [options])` + - `path` is moved into the `options` object +- `ipfs.files.flush([path], [options])` becomes `ipfs.files.flush(path, [options])` +- `ipfs.files.ls([path], [options])` becomes `ipfs.files.ls(path, [options])` +- `ipfs.object.new([template], [options])` becomes `ipfs.object.new([options])` + - `template` is moved into the `options` object +- `ipfs.pin.ls([paths], [options])` becomes `ipfs.pin.ls([options])` + - `paths` is moved into the `options` object +- `ipfs.refs.local` now returns a v1 CID with the raw codec for every block and not the original CID by which it was added to the blockstore - nb for the ipfs-http-client this is only true when running against js-ipfs + +For further reading, see the [Core API Docs](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api). + +# 🗺️ What’s next? + +Check out the js-IPFS [Project Roadmap](https://github.com/orgs/ipfs/projects/6) which contains headline features organised in the order we hope them to land. + +Only large features are called out in the roadmap, expect lots of small bugfix releases between the roadmapped items! + +# 😍 Huge thank you to everyone that made this release possible + +- [@3xtr4t3rr3str14l](https://github.com/3xtr4t3rr3str14l) (2 commits, 1 PR) +- [@achingbrain](https://github.com/achingbrain) (112 commits, 59 PRs, 2 issues, 109 comments) +- [@adamprocter](https://github.com/adamprocter) (1 issue, 7 comments) +- [@andrew](https://github.com/andrew) (1 issue, 1 comment) +- [@anywhichway](https://github.com/anywhichway) (1 issue, 1 comment) +- [@aphelionz](https://github.com/aphelionz) (2 comments) +- [@aquiladev](https://github.com/aquiladev) (1 comment) +- [@AravDalwani](https://github.com/AravDalwani) (1 comment) +- [@aschmahmann](https://github.com/aschmahmann) (3 comments) +- [@AuHau](https://github.com/AuHau) (2 commits) +- [@autonome](https://github.com/autonome) (4 comments) +- [@bluelovers](https://github.com/bluelovers) (5 PRs, 3 issues, 3 comments) +- [@BubuAnabelas](https://github.com/BubuAnabelas) (1 PR) +- [@carsonfarmer](https://github.com/carsonfarmer) (1 comment) +- [@codecov-commenter](https://github.com/codecov-commenter) (19 comments) +- [@d10r](https://github.com/d10r) (1 comment) +- [@dapplion](https://github.com/dapplion) (1 issue) +- [@dongshu2013](https://github.com/dongshu2013) (1 comment) +- [@DougAnderson444](https://github.com/DougAnderson444) (1 commit, 2 PRs, 1 comment) +- [@draeder](https://github.com/draeder) (1 issue, 1 comment) +- [@drewstaylor](https://github.com/drewstaylor) (2 comments) +- [@dsemenovsky](https://github.com/dsemenovsky) (1 issue, 1 comment) +- [@dthorpe](https://github.com/dthorpe) (1 PR, 2 issues) +- [@enochzhao](https://github.com/enochzhao) (1 issue) +- [@fabianhjr](https://github.com/fabianhjr) (1 comment) +- [@geolffreym](https://github.com/geolffreym) (4 PRs, 5 issues, 25 comments) +- [@gfpacheco](https://github.com/gfpacheco) (1 commit, 1 PR, 1 issue, 1 comment) +- [@Gozala](https://github.com/Gozala) (14 commits, 9 PRs, 14 issues, 86 comments) +- [@GregTheGreek](https://github.com/GregTheGreek) (2 comments) +- [@hacdias](https://github.com/hacdias) (5 commits, 1 comment) +- [@HexaField](https://github.com/HexaField) (1 issue) +- [@HLK65](https://github.com/HLK65) (1 issue) +- [@hugomrdias](https://github.com/hugomrdias) (28 commits, 7 PRs, 10 comments) +- [@icidasset](https://github.com/icidasset) (1 comment) +- [@jacobheun](https://github.com/jacobheun) (40 commits, 15 PRs, 7 issues, 81 comments) +- [@jjperezaguinaga](https://github.com/jjperezaguinaga) (2 issues, 3 comments) +- [@koivunej](https://github.com/koivunej) (3 commits, 2 PRs, 1 issue, 5 comments) +- [@kumavis](https://github.com/kumavis) (1 commit) +- [@lazyweirdo](https://github.com/lazyweirdo) (1 comment) +- [@leonardge](https://github.com/leonardge) (1 issue) +- [@lidel](https://github.com/lidel) (3 commits, 2 PRs, 3 comments) +- [@marcoippolito](https://github.com/marcoippolito) (2 issues, 4 comments) +- [@matrushka](https://github.com/matrushka) (1 commit) +- [@mdtanrikulu](https://github.com/mdtanrikulu) (1 comment) +- [@mikeal](https://github.com/mikeal) (4 commits, 19 comments) +- [@mitra42](https://github.com/mitra42) (1 comment) +- [@mpetrunic](https://github.com/mpetrunic) (1 comment) +- [@Neurone](https://github.com/Neurone) (2 PRs, 2 comments) +- [@oed](https://github.com/oed) (1 commit, 2 PRs, 4 issues, 18 comments) +- [@olivier-nerot](https://github.com/olivier-nerot) (4 issues, 3 comments) +- [@OR13](https://github.com/OR13) (1 issue) +- [@pcowgill](https://github.com/pcowgill) (1 comment) +- [@peterblockman](https://github.com/peterblockman) (1 issue, 1 comment) +- [@phillmac](https://github.com/phillmac) (2 issues, 2 comments) +- [@qalqi](https://github.com/qalqi) (1 comment) +- [@R9295](https://github.com/R9295) (2 issues, 1 comment) +- [@reconbot](https://github.com/reconbot) (1 commit, 1 PR) +- [@ribasushi](https://github.com/ribasushi) (1 comment) +- [@rllola](https://github.com/rllola) (1 issue) +- [@RobertFischer](https://github.com/RobertFischer) (1 comment) +- [@rvagg](https://github.com/rvagg) (1 commit, 1 PR, 5 comments) +- [@satoshi999](https://github.com/satoshi999) (1 issue) +- [@SignpostMarv](https://github.com/SignpostMarv) (1 comment) +- [@simonovic86](https://github.com/simonovic86) (1 PR) +- [@skysbird](https://github.com/skysbird) (1 issue, 1 comment) +- [@Slender1808](https://github.com/Slender1808) (1 issue, 1 comment) +- [@Stebalien](https://github.com/Stebalien) (1 issue, 6 comments) +- [@Strernd](https://github.com/Strernd) (1 commit, 2 PRs, 1 comment) +- [@tarunbatra](https://github.com/tarunbatra) (1 PR, 2 comments) +- [@terichadbourne](https://github.com/terichadbourne) (1 PR, 2 comments) +- [@tfoutrein](https://github.com/tfoutrein) (1 issue) +- [@thienpow](https://github.com/thienpow) (1 issue, 5 comments) +- [@VandeurenGlenn](https://github.com/VandeurenGlenn) (2 issues, 4 comments) +- [@vasco-santos](https://github.com/vasco-santos) (71 commits, 38 PRs, 5 issues, 100 comments) +- [@viethoanganh79](https://github.com/viethoanganh79) (1 issue, 1 comment) +- [@viventra](https://github.com/viventra) (1 issue, 1 comment) +- [@vmx](https://github.com/vmx) (20 commits, 3 PRs, 25 comments) +- [@welcome](undefined) (37 comments) +- [@wemeetagain](https://github.com/wemeetagain) (6 commits, 24 PRs, 11 issues, 15 comments) +- [@x5engine](https://github.com/x5engine) (3 comments) +- [@zebateira](https://github.com/zebateira) (1 commit, 1 PR) +- [@ZTECH10](https://github.com/ZTECH10) (1 issue, 2 comments) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don’t know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-IPFS repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute: https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works, and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. + +[unixfs]: https://docs.ipfs.io/guides/concepts/unixfs/ +[cid]: https://docs.ipfs.io/guides/concepts/cid/ +[mfs]: https://docs.ipfs.io/guides/concepts/mfs/ +[libp2p]: https://github.com/libp2p/js-libp2p +[ipld]: https://github.com/ipld/js-ipld +[abortsignal]: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal +[multihash]: https://multiformats.io/multihash +[dht]: https://docs.ipfs.io/concepts/dht/ +[multiaddr]: https://multiformats.io/multiaddr/ diff --git a/src/_blog/105-deprecating-secio/README.md b/src/_blog/105-deprecating-secio/README.md new file mode 100644 index 00000000..2d557022 --- /dev/null +++ b/src/_blog/105-deprecating-secio/README.md @@ -0,0 +1,60 @@ +--- +date: 2020-08-07 +url: /2020-08-07-deprecating-secio/ +title: We're removing support for the SECIO security transport +description: +author: Jacob Heun +tags: ipfs, libp2p, secio +--- + +We're removing support for the SECIO security transport in IPFS and libp2p. You can mitigate impact to your node(s) by updating to the latest versions. Newer nodes should not experience any signficant change when support is removed, but older nodes will start to experience performance degradation. Read on for more details. + +## What are security transports? + +Security transports are components of libp2p that encrypt data while it is being sent across the network. Libp2p provides the ability to negotiate security transports once a connection is established, giving nodes the ability to support multiple security transports. Once a security transport has been negotiated, all data sent and received is encrypted and only the intended peer can decrypt it. + +## A brief history + +SECIO is a TLS-like security transport that was developed for IPFS and libp2p in 2014 to alleviate a gap with TLS1.2 requiring Certificate Authorities. SECIO has been the primary security transport for all libp2p implementations as its underlying algorithms are widely supported. In May 2019, go-ipfs 0.4.21 added support for TLS1.3, and in go-ipfs 0.5 in April 2020 it became the default security transport. However, TLS1.3 is still gaining support across libp2p implementations and isn't accessible in browser contexts, so not all libp2p implementations can make it the default security transport. While web browsers have introduced support for TLS1.3, we have no way of attaching the necessary identity information for libp2p. + +Go-ipfs 0.6 also added support for the QUIC transport, which internally uses TLS1.3. QUIC is also not yet widely supported, so we still have the same problem as TLS1.3 by itself. + +So, how can we successfully deprecate SECIO and move on to more modern and widely-used security transports if we can't support TLS1.3 or QUIC everywhere? The answer is the [Noise security transport](https://github.com/libp2p/specs/tree/master/noise), which was created leveraging the [Noise Protocol Framework](https://noiseprotocol.org/noise.html). Noise provides a set of patterns for composing widely supported cryptographic primitives, which allows us to more easily add support across the various libp2p implementations. Support was added for Noise in go-ipfs 0.6, js-ipfs 0.47, and has been updated across major IPFS network infrastructure. + +SECIO was never meant to be a permanent security transport. Now that we have Noise for broad support and TLS1.3 for implementations that can support it, it's time for SECIO to be deprecated. + +## When is it happening? + +SECIO will be removed from go-ipfs in the release of 0.7, which you can track in the [Github issue](https://github.com/ipfs/go-ipfs/issues/7560). The release is tentatively planned for **August 25th**. We will also be coordinating a release of js-ipfs around the same time to remove SECIO there as well. + +## How does this impact me? + +### Go IPFS + +| Version | Impact | +| :-------------- | :-------------------------- | +| 0.5+ | Nominal | +| 0.4.21 - 0.4.23 | Slower Connection Upgrading | +| <0.4.21 | Connection Failures | + +**Older nodes on the network that only support SECIO will no longer be able to communicate with IPFS nodes after 0.7.** If you are running a go-ipfs version older than 0.5, we strongly recommend that you upgrade ASAP. While go-ipfs nodes 0.4.21 and newer have TLS1.3 support, you will experience a latency hit in your connections if you are not on at least IPFS 0.5. This is due to protocol negotiation defaulting to SECIO (which will fail to connect to recent nodes) and needing to be redone with TLS1.3. + +If you are running IPFS older than 0.4.21, you are going to start failing to connect to newer nodes at all, which will include the DHT Bootstrap nodes and other critical pieces of IPFS Public Network infrastructure. + +### JS IPFS + +| Version | Impact | +| :------ | :-------------------- | +| 0.47+ | Nominal | +| <0.47 | Connection Failures\* | + +\*We are looking at backporting Noise to js-ipfs 0.46.x. + +Noise was added to js-ipfs 0.47, however it is compatible with js-ipfs 0.41.0+ ([the async/await refactor](https://blog.ipfs.io/2020-02-01-async-await-refactor/)) but it needs to be manually configured. + +If you are running js-ipfs older than 0.41, you won't be able to connect to nodes who don't support SECIO. You will still be able to leverage the websocket-star server for the time being. + +## Updating IPFS + +- Download the latest go-ipfs from the [IPFS distributions page](https://dist.ipfs.io/#go-ipfs). +- Install the latest js-ipfs for Node.js or the browser, https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs#install. diff --git a/src/_blog/106-ipfs-meetup-aug2020/README.md b/src/_blog/106-ipfs-meetup-aug2020/README.md new file mode 100644 index 00000000..71620122 --- /dev/null +++ b/src/_blog/106-ipfs-meetup-aug2020/README.md @@ -0,0 +1,60 @@ +--- +date: 2020-08-14 +url: /2020-08-14-ipfs-meetup-aug2020/ +title: Reliving the IPFS August 2020 Meetup +description: +author: Emily Vaughan, Dietrich Ayala +tags: ipfs, events +--- + +The IPFS community got together last week for the August virtual meetup. This event continues a series we started with the [IPFS 0.5 Launch Meetup](https://www.youtube.com/watch?v=G8FvB_0HlCE), and continued with the IPFS Pinning Summit and a IPFS June Meetup to kick off the summer. + +But in one sense, this particular meetup _is_ a change: These virtual meetups are now replacing the IPFS Weekly community meeting. The IPFS Weekly has been held on most Mondays at 9am Pacific time for several years - host to loads of speakers from throughout the broader community, sharing their ideas, thoughts, products, and experiments with IPFS, libp2p, and various related technologies. Thanks to all the people who joined in real time and who commented on the recordings. So now, instead of a shorter weekly session with fewer people, we are building on the success of the larger events by doing them more regularly. You can look forward to more people joining, in-depth talks, and a wide variety of speakers, projects, and demos from around the dweb ecosystem. + +## 📣 The Talks + +For the August edition, we hosted some familiar faces and some new groundbreaking projects! + +Our host for this month’s meetup was IPFS Ecosystem lead Dietrich Ayala, who introduced the next half of the 2020 IPFS roadmap: + + +
+
+ +Bradley Kam from [Unstoppable Domains](https://unstoppabledomains.com) joined us to give us the step-by-step on just how easy it is to build with IPFS and decentralized tech. + + +
+
+ +The folks behind [Koda](https://twitter.com/KodaRobotDog), the world’s first decentralized dog, explained how IPFS + AI is a match made in heaven for robotics and distributed computing. + + +
+
+ +What is the Identity Index? What is [Ceramic](https://www.ceramic.network)? Michael Sena explained how this IPFS-based evolution in decentralized identity is going to be a standards game changer in identity management. + + +
+
+ +## ⚡️ Lightning Demos + +Each meetup invites the community to share what they’ve been working on with a round of lightning talks. Keep that in mind while you’re hacking away with IPFS. This meetup featured two fantastic talks. + +Lidel walked us through the upcoming IPFS Pinning Service API. + + +
+
+ +An exquisite (mostly) hand-drawn presentation by Irakli Gozalishvili about the performance of IPFS in web content. + + +
+
+ +You can see the all the talks in [this playlist](https://www.youtube.com/watch?v=mBFYKesErvI&list=PLuhRWgmPaHtToVYaDkd6ZTwB2Lo30s1vB&index=10), or keep up with what’s happening in IPFS land by heading over to the [IPFS Youtube Channel](https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew), clicking the subscribe button, and enjoy! + +To get more IPFS news, including releases, ecosystem updates, and community announcements in your inbox each Tuesday, subscribe to the [IPFS Weekly newsletter 💌](http://eepurl.com/gL2Pi5). diff --git a/src/_blog/107-nix-ipfs-milestone-1/README.md b/src/_blog/107-nix-ipfs-milestone-1/README.md new file mode 100644 index 00000000..8fcfdfb1 --- /dev/null +++ b/src/_blog/107-nix-ipfs-milestone-1/README.md @@ -0,0 +1,116 @@ +--- +date: 2020-09-08 +url: /2020-09-08-nix-ipfs-milestone-1/ +header_image: 107-nix-ipfs.jpg +title: Nix × IPFS - Milestone 1 +description: +author: John Ericson +tags: ipfs, nix +--- + +[Obsidian Systems](https://obsidian.systems/) is adding support for IPFS to Nix so that build products can be persisted to and fetched from IPFS. This adds resiliency and makes it easier for Nix users to reproduce and distribute their work - by caching and distributing source code (and hopefully in the future intermediate build steps) peer to peer by using IPFS content addresses (CIDs). + +## What is Nix? + +[Nix](https://nixos.org/) is usually used as a package manager, but at its heart is a general-purpose build tool, like Make, Ninja, or Bazel. + +What distinguishes Nix is its focus on sandboxing build steps and caching build artifacts. +With these features, neither the plans nor the build artifacts can have hidden dependencies, so builds can be reproduced and build artifacts shared robustly. + +This makes Nix an ideal build tool to use with a peer-to-peer system like IPFS. +Indeed, the premier project using Nix is Nixpkgs, a package collection (with associated Linux distro) that is one of the largest most widely-contributed projects on GitHub. + +## Why we use Nix + +Obsidian Systems is an end-to-end software product consultancy serving everyone from recently funded startups to large institutions. +We have made Nix an integral part of both our production deployments and developer workflows since our founding 2014. + +Nix is an indispensable tool for us because we frequently need to switch between projects, and Nix makes setting up and sharing per-project development environments trivial. +It has also made it easy to package software that the end user installs on their own machines, such as blockchain wallets. + +## Challenges that inspired our use of IPFS + +While Nix build plans are reproducible, one limitation that remains is the availability of the initial data—source code. +Nix plans have what are known as “fixed output derivations”. +These are unsandboxed build steps, with network access to download various sources. +They produce data that must match a pre-fixed hash, so the lack of sandboxing cannot be exploited to result in nondeterministic output. + +The big problem with this is that if the URL becomes inaccessible or the data downloaded is non-deterministic (e.g. due to some metadata), this build step will fail — +in other words, we are facing the exact same problems around linkrot IPFS is trying to solve with the web in general! +The IPFS solution is the right one — +we shouldn’t be relying on the _location_ at which some source code was originally uploaded. +And we’re already identifying source code by content addresses, so IPFS solution isn’t even a huge leap from our existing tooling and community practices. + +Yes, we can already pin and cache the results of those fixed-output build steps just as we do with regular build steps, but we’re stuck with our own cache of source code completely independent from what upstream offers. +It is tedious and inefficient for users of Nix to each maintain their own uncooperative caches of source code, and even more so for the downstream user who would have to manually configure each of the caches individually, when all they want is some source code that is self-authenticating due to the content-address. + +## Value + +For the Nix community at large, we finally have a chance to leverage our hard work on reproducibility and make it a practical reality. +Rather than relying on our centralized [cache.nixos.org](https://cache.nixos.org) to build artifacts before sources rot away, everyone should feel free to use Nixpkgs as a source or binary distro—as was originally intended. + +For users of Obsidian’s open-source software specifically, they finally have an easy and robust way to trust neither our own pre-built binaries or **cache.nixos.org**’s, but build everything from source, which makes auditing security-critical code easier. + +Ideally, we want to cache and distribute source code in collaboration with the upstream developers themselves and other downstream distributions. +[IPLD](https://ipld.io), more than any other schema we’ve seen, understands the value of addressing data with its original intended “native” references, rather than some bespoke 3rd-party format that others cannot understand. + +We think this is the key to enable that cooperation. +Upstream devs can simply continue working with git repos (or any other version control system with content-addressing that IPLD supports). +Downstream distros consume that data directly, without any conversion steps that obscure the data’s authenticity. +Neither party is faced with doing chores that the other used to handle. + +## Scope + +We aim to address these problems in two distinct phases. + +### Milestone 1: Distribution with IPFS + +We wanted Nix to be able to use IPFS as a “substituter” or provider of source/build artifacts alongside the other sorts of substituters that exist today. + +As part of this, we taught Nix git tree hashing, so it can content-address git repos in a way IPFS will understand — +which helps IPFS, Nix, upstream collaborators, and other parties with an interest in archiving and disseminating source code find a common way to reference these artifacts. +While the git hashing scheme has its limitations, we think it is the best method for multi-party collaboration on git data. + +Looking ahead to using IPFS for build products and deployments, we also added support for a metadata format around git tree hashing for IPFS and Nix to also convey data with run-time dependencies between separately-installed file system trees. +Finally, we provide a way for existing Nix build artifacts to be converted to this new data format. + +### Milestone 2: Building with IPFS + +Nix doesn’t actually content-address data produced by regular build steps (as opposed to the “fixed output” build steps described above). +Instead, it addresses them based on the plan from which they were made. + +Situations exist — such as when someone edits a comment — where the plan changes but the results don’t. +Besides causing extra rebuilding downstream, this muddles the separation between the raw data and its provenance. +With peer-to-peer systems, it doesn't matter who is _providing_ the data (and we want to take advantage of that not mattering), but it absolutely does matter who is _claiming_ what the data represents. + +With this core improvement, we can make new improved versions of build plans in IPLD and produce our newly supported IPFS-compatible formats directly from each build step, no manual conversions from legacy input-addressed data needed. This final step brings everything from both milestones together. + +For a complete breakdown, visit our [open grant proposal](https://github.com/ipfs/devgrants/blob/master/open-grants/open-proposal-nix-ipfs.md). + +## What was accomplished + +We’re happy to announce completion of Milestone 1! In response to community feedback, we were also able to do some extra work to get the Nix community started on using IPFS before migrating to the ideal git tree hashing. + +This neatly lays the groundwork for some of our Milestone 2 objectives. +We hope this step can help everyone transition to using IPFS more gracefully. + +Get started using our [guide repo](https://github.com/obsidiansystems/ipfs-nix-guide/) and, in particular, our [tutorial](https://github.com/obsidiansystems/ipfs-nix-guide/blob/master/tutorial.md). + +Finally, we recently did an interview on the [Nix Friday](https://zimbatm.com/NixFriday/) stream going over all our work, and also discussing more broadly how we see the IPFS and Nix ecosystems fitting together. +You can watch a recording [here](https://www.youtube.com/watch?v=FievtzvDbs82): + +
+ +
+ +## What’s Next? + +We’ve begun implementing Milestone 2, including the improved build steps that produce content-addressed data. +We expect this to be the bulk of the work, with the final IPFS integration being relatively smooth, as by that point the concepts of Nix and IPFS will align so neatly! + +We’ve been fastidious about juggling many branches to separate feature work from general improvements of the internals, and thus have been able to upstream many of those improvements. + +We like this approach because it allows us to continuously engage with the community, and leaves much more readable diffs for the features themselves. + +We hope you can give the demo a spin and like what you see. +Stay tuned for milestone 2! diff --git a/src/_blog/108-js-ipfs-0.50.0/README.md b/src/_blog/108-js-ipfs-0.50.0/README.md new file mode 100644 index 00000000..0b057ad5 --- /dev/null +++ b/src/_blog/108-js-ipfs-0.50.0/README.md @@ -0,0 +1,204 @@ +--- +date: 2020-09-14 +url: /2020-09-14-js-ipfs-0-50/ +title: js-IPFS 0.50.0 runs in shared webworkers and has faster pinning +header_image: js-ipfs-placeholder.png +description: +author: Alex Potsides +--- + +# 🔦 Highlights + +> share an IPFS node between multiple tabs and pin files more quickly + +`js-IPFS@0.50.0` has landed with the ability to share a node between multiple browser tabs and greatly improved pinning performance. + +We're also phasing out use of Node.js Buffers as data types in favour of standard JavaScript Uint8Arrays. + +Read on for the full details! + +## 🤝 Share a node between browser tabs + +An IPFS node makes lots of connections to other nodes on the network, and more so since [delegate nodes were turned on by default](https://blog.ipfs.io/2020-07-20-js-ipfs-0-48/). This is to ensure you have the greatest chance of finding content on the network, and so other people have the greatest chance of finding your content on the network. + +This does not come without a price though, maintaining multiple connections can be resource-intensive and in some cases the browser will limit the number of concurrent connections you can have have. + +This can be a problem in web browsers if the user opens your app in two tabs, suddenly you have two nodes running with twice the number of open connections. Worse, they are sharing a datastore and the same peer ID. + +Help is at hand in the shape of the [ipfs-message-port-client](https://www.npmjs.com/package/ipfs-message-port-client) and [ipfs-message-port-server](https://www.npmjs.com/package/ipfs-message-port-server) which allow you to run one IPFS node in a [SharedWorker](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) and share it between multiple tabs within your application. + +There will be a more in depth post here on this subject soon but in the meantime check out the [browser-sharing-node-across-tabs](https://github.com/ipfs/js-ipfs/tree/master/examples/browser-sharing-node-across-tabs) example to see how to use it! + +## 📌 Pinning performance + +When you add a piece of content to your local IPFS node, it's pinned in place to prevent the blocks that make up your files being deleted during garbage collection. The pin is placed in a collection of pins we call a pinset. + +The datastructure behind this pinset is a [DAG], much like the structures that represent the files and folders you'd added to IPFS. The root [CID] of the [DAG] is stored in the datastore and all the blocks that make up the [DAG] are stored in the blockstore. + +The pinset consists of a number of buckets in a tree structure, with each bucket containing a max of 8,192 items and each layer containing max 256 buckets. After the first bucket is full, pins are distributed between buckets. + +When garbage collection runs, all nodes in the [DAG] are traversed and the blocks that correspond to their [CID]s are exempted from deletion. + +As you add and remove pins, this DAG grows and shrinks. [CID]s of intermediate nodes within the [DAG] are recalculated as the structure changes. As the [DAG] gets larger this can become expensive and it hurts application performance for very large pinsets. + +`js-ipfs@0.50.0` has changed the default storage of pins to use the datastore instead of a [DAG] and has seen a corresponding speedup as the number of pinned blocks in your repo increases: + +

+ +

+ +In the diagram above you can see that as the number of pinned items increases, so does the time it takes to add the next pin. There's a steep increase at 8,192 pins, which is when the first bucket is considered full and multiple buckets are created which then involves more operations to add the next pin. + +The performance of the approach taken by js-ipfs@0.50.0 compares very favourably to that of previous versions and is essentially only limited by the peformance of the underlying datastore since it has switched to simple puts and gets without the overhead of creating a data structure. + +## 🍫 Uint8Arrays + +In the beginning there were Arrays. Simple arrays that could hold all sorts of mixed types, could not be optimised very well and were an abstraction over blocks of memory. + +Then Node.js came along and introduced the [Buffer](https://nodejs.org/api/buffer.html) - suddenly JavaScript developers could access memory (sort of) directly! These things held numbers with an integer value range of 0-255 and were blazingly fast. JavaScript was starting to look like a proper language that you could do resource intensive work in. + +The authors of the [ECMAScript](https://tc39.es) standard took note and introduced [TypedArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)s, of which there are many variations but the one we are most interested in is the [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array). + +These types of arrays hold numbers with an integer value range of 0-255 and support an API very similar to that of Node.js Buffers, which should come as no surprise as since v3.0.0 of Node.js, Buffers have been a subclass of Uint8Arrays. + +These are exciting times so going forwards as JavaScript becomes more capable and the browser support arrives we are reducing our dependence on core Node.js libraries and utilities. Part of that is removing all use of Node.js Buffers in our codebase. + +With js-ipfs@0.50.0 you should stop relying on Node.js Buffers to be returned from any part of the [Core-API], instead you should code against the Uint8Array interface. + +Some modules that we depend on will still return Buffers, which we pass on to avoid any conversion cost but we hope to remove or refactor these over time. In order to remain forwards-compatible you should not use Node.js Buffer methods on any of these returned values. + +For example in the code below we create a Buffer from the string 'Hello', add it to IPFS then immediately cat it and call `toString()` on the chunks. This takes advantage of the fact that the Buffer we've added is `utf8` encoded. Buffer.toString() takes an encoding argument which is `utf8` by default, so the below code works but it's only by coincidence: + +```javascript +const { cid } = await ipfs.add(Buffer.from('Hello')) + +for await (const chunk of ipfs.cat(cid)) { + console.info(chunk.toString()) // prints 'Hello' +} +``` + +Instead we would use the [TextEncoder](https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder) and [TextDecoder](https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder) classes. These are explicit in the encoding/decoding they use (also `utf8` by default) so are safer to use: + +```javascript +const encoder = new TextEncoder() +const decoder = new TextDecoder() + +const { cid } = await ipfs.add(encoder.encode('Hello')) + +for await (const chunk of ipfs.cat(cid)) { + console.info(decoder.decode(chunk)) // prints 'Hello' +} +``` + +# ✨New features + +- Store pins in datastore instead of a DAG ([#2771](https://github.com/ipfs/js-ipfs/issues/2771)) ([64b7fe4](https://github.com/ipfs/js-ipfs/commit/64b7fe41738cbe96d5a9075f0c01156c6f889c40)) +- Add protocol list to ipfs id output ([#3250](https://github.com/ipfs/js-ipfs/issues/3250)) ([1b6cf60](https://github.com/ipfs/js-ipfs/commit/1b6cf600a6b1348199457ca1fe6f314b6eff8c46)) +- IPNS publish in browser example ([#3207](https://github.com/ipfs/js-ipfs/issues/3207)) ([91faec6](https://github.com/ipfs/js-ipfs/commit/91faec6e3d89b0d9883b8d7815c276d44048e739)) +- Update hapi to v20 ([#3245](https://github.com/ipfs/js-ipfs/issues/3245)) ([1aeef89](https://github.com/ipfs/js-ipfs/commit/1aeef89c73f42a2f6cceb7f0598400141ce40e23)) +- Update to libp2p@0.29.0 ([63d4d35](https://github.com/ipfs/js-ipfs/commit/63d4d353c606e4fd487811d8a0014bb2173f11be)) + +## 🔨 Breaking changes + +- Node Buffers have been replaced with Uint8Arrays ([#3220](https://github.com/ipfs/js-ipfs/issues/3220)) + +# 🏗 API Changes + +## Core API & HTTP API Client + +- The return value from `ipfs.id` now includes a list of protocols the node understands +- 💥 **Breaking Change** 💥 Where Node.js `Buffer` objects were returned previously, now `Uint8Arrays` are in their place. This affects: + - `ipfs.block.*` The `.data` property of block objects is now a `Uint8Array` + - `ipfs.dag.get` Depending on the type of node returned: + - `ipld-raw` nodes are now returned as `Uint8Array`s + - The `.data` property of returned `ipld-dag-pb` nodes is now a `Uint8Array` + - `ipfs.dht.get` Returns a `Uint8Array` + - `ipfs.cat` File data is now returned as `Uint8Array`s + - `ipfs.files.read` File data is now returned as `Uint8Array`s + - `ipfs.object.data` Object data is now returned as a `Uint8Array` + - `ipfs.pubsub.subscript` Data published to a topic is now received as a `Uint8Array` + +For further reading, see the [Core API Docs](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api). + +# 🗺️ What’s next? + +Check out the js-IPFS [Project Roadmap](https://github.com/orgs/ipfs/projects/6) which contains headline features organised in the order we hope them to land. + +Only large features are called out in the roadmap, expect lots of small bugfix releases between the roadmapped items! + +# 😍 Huge thank you to everyone that made this release possible + +- [@abbasogaji](https://github.com/abbasogaji) (1 issue, 1 comment) +- [@achingbrain](https://github.com/achingbrain) (77 commits, 33 PRs, 1 issue, 57 comments) +- [@alanshaw](https://github.com/alanshaw) (3 commits) +- [@aphelionz](https://github.com/aphelionz) (1 issue, 3 comments) +- [@aschmahmann](https://github.com/aschmahmann) (1 comment) +- [@AuHau](https://github.com/AuHau) (1 commit, 1 PR, 2 issues, 5 comments) +- [@bluelovers](https://github.com/bluelovers) (1 PR, 2 issues, 4 comments) +- [@bmann](https://github.com/bmann) (1 issue, 1 comment) +- [@christopheSeeka](https://github.com/christopheSeeka) (1 comment) +- [@codecov-commenter](https://github.com/codecov-commenter) (15 comments) +- [@crypt0maniak](https://github.com/crypt0maniak) (1 PR, 2 comments) +- [@dave-dm](https://github.com/dave-dm) (1 issue) +- [@dependabot[bot]](https://github.com/dependabot%5Bbot%5D) (2 commits) +- [@duxiaofeng-github](https://github.com/duxiaofeng-github) (1 issue) +- [@er123rin](https://github.com/er123rin) (1 PR) +- [@ffa500](https://github.com/ffa500) (1 comment) +- [@Gozala](https://github.com/Gozala) (1 commit, 1 PR, 1 issue, 21 comments) +- [@hugomrdias](https://github.com/hugomrdias) (2 commits, 1 comment) +- [@hunterInt](https://github.com/hunterInt) (1 issue) +- [@icidasset](https://github.com/icidasset) (1 comment) +- [@jacekv](https://github.com/jacekv) (1 issue, 1 comment) +- [@jacobheun](https://github.com/jacobheun) (23 commits, 6 PRs, 1 issue, 28 comments) +- [@josselinchevalay](https://github.com/josselinchevalay) (1 issue, 2 comments) +- [@koivunej](https://github.com/koivunej) (2 issues, 1 comment) +- [@lidel](https://github.com/lidel) (2 comments) +- [@lukaw3d](https://github.com/lukaw3d) (1 issue, 1 comment) +- [@mikeal](https://github.com/mikeal) (1 commit) +- [@mitjat](https://github.com/mitjat) (1 comment) +- [@moodysalem](https://github.com/moodysalem) (1 issue, 5 comments) +- [@mrh42](https://github.com/mrh42) (1 issue) +- [@negamaxi](https://github.com/negamaxi) (1 issue, 1 comment) +- [@olivier-nerot](https://github.com/olivier-nerot) (1 issue, 1 comment) +- [@olizilla](https://github.com/olizilla) (2 commits, 1 PR, 1 comment) +- [@onichandame](https://github.com/onichandame) (1 comment) +- [@OR13](https://github.com/OR13) (2 issues) +- [@rvagg](https://github.com/rvagg) (5 comments) +- [@shazow](https://github.com/shazow) (1 commit, 1 PR) +- [@StationedInTheField](https://github.com/StationedInTheField) (1 issue, 4 comments) +- [@tabcat](https://github.com/tabcat) (1 PR, 2 issues, 4 comments) +- [@Tcll](https://github.com/Tcll) (2 issues, 4 comments) +- [@tk26](https://github.com/tk26) (1 commit, 1 PR, 3 comments) +- [@vasco-santos](https://github.com/vasco-santos) (66 commits, 20 PRs, 3 issues, 24 comments) +- [@vmx](https://github.com/vmx) (2 commits, 1 PR, 3 comments) +- [@vojtechsimetka](https://github.com/vojtechsimetka) (1 commit, 1 PR) +- [@welcome](undefined) (11 comments) +- [@wemeetagain](https://github.com/wemeetagain) (35 commits, 6 PRs, 2 issues, 5 comments) +- [@Xmader](https://github.com/Xmader) (3 commits, 3 PRs, 2 comments) +- [@xmaysonnave](https://github.com/xmaysonnave) (1 issue, 1 comment) + +# 🙌🏽 Want to contribute? + +Would you like to contribute to the IPFS project and don’t know how? Well, there are a few places you can get started: + +- Check the issues with the `help wanted` label in the [js-IPFS repo](https://github.com/ipfs/js-ipfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) +- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute: https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands +- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built +- Join the discussion at https://discuss.ipfs.io/ and help users finding their answers. +- Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! + +# ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works, and what you can do with it is at [discuss.ipfs.io](https://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode. + +[unixfs]: https://docs.ipfs.io/guides/concepts/unixfs/ +[cid]: https://docs.ipfs.io/guides/concepts/cid/ +[mfs]: https://docs.ipfs.io/guides/concepts/mfs/ +[libp2p]: https://github.com/libp2p/js-libp2p +[ipld]: https://github.com/ipld/js-ipld +[abortsignal]: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal +[multihash]: https://multiformats.io/multihash +[dht]: https://docs.ipfs.io/concepts/dht/ +[multiaddr]: https://multiformats.io/multiaddr/ +[dag]: https://docs.ipfs.io/concepts/merkle-dag/ +[core-api]: https://github.com/ipfs/js-ipfs/tree/master/docs/core-api diff --git a/src/_blog/109-ipfs-meetup-sep2020/README.md b/src/_blog/109-ipfs-meetup-sep2020/README.md new file mode 100644 index 00000000..f57e03ba --- /dev/null +++ b/src/_blog/109-ipfs-meetup-sep2020/README.md @@ -0,0 +1,48 @@ +--- +date: 2020-09-18 +url: /2020-09-18-ipfs-meetup-sep2020/ +title: The IPFS Remember September 2020 Meetup +description: +author: Dietrich Ayala +tags: ipfs, events, meetups +--- + +Fall is upon us, and so the IPFS community met again to share tales of glory and challenges surmounted as we collectively work to overthrow the hegemony of location-based addressing and the notion that security can only be derived from trust models defined by centralized authorities! + +## 🚢 Go-ipfs 0.7 Release Preview + +Our host Jacob Heun set the stage with some social calisthenics and a review of the [code of conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md), before introducing the first speaker - Adin Schmahmann, go-ipfs lead, who gave a preview of go-ipfs 0.7 which is due to release this week: + + + +## 🛠 IPFS Recovery + +The second talk was a team from the recent HackFS event, a month of hacking hosted by Protocol Labs and EthGlobal, resulting in [138 projects](https://hack.ethglobal.co/hackfs/showcase)! + +Govind Mohan and Hlib Kanunnikov shared their work on [IPFS Recovery](https://hack.ethglobal.co/showcase/ipfs-recovery-rec909D6romwHglDV), a module for ensuring data availability despite damage to it or the network, using [erasure coding](https://en.wikipedia.org/wiki/Erasure_code). + + + +## 🏭 Building Consumer Products on IPFS & Filecoin + +The final talk before the lightning demos was from Raullen Chen, co-founder and CEO of IoTeX. The upcoming Ucam home security camera that IoTeX is making uses IPFS for firmware updates, and they plan to incorporate IPFS and Filecoin into more of their product architecture over time. + +Raullen discussed the challenges and opportunities in bringing consumer hardware products to market using IPFS and Filecoin. + + + +## 📚 IPFS Case Study Series + +The sole brave lightning demoer was Jessica Schilling, who has been working on a series of case studies from projects who are building and shipping products and services on IPFS. Come for the dweb, stay for the rhymes. + + + +## 🎉 Thanks again! + +Thanks to everyone who joined, all our speakers and everyone who's reading this or watching the IPFS channel on YouTube! + +See you in October! Sign up for the [IPFS Meetup group](https://www.meetup.com/San-Francisco-IPFS/) to get notified automatically about it. + +Have a project you want to share with the community? [Send us an email](mailto:ipfs-community@protocol.ai) to sign up for a talk or lightning demo! + +And if you cannot wait until October for more IPFS goodness, [subscribe to the IPFS weekly newsletter](http://eepurl.com/gL2Pi5) to get releases, project announcements and job opportunities in your inbox 💌. diff --git a/src/_blog/110-go-ipfs-0-7-0/README.md b/src/_blog/110-go-ipfs-0-7-0/README.md new file mode 100644 index 00000000..c7c158c7 --- /dev/null +++ b/src/_blog/110-go-ipfs-0-7-0/README.md @@ -0,0 +1,97 @@ +--- +date: 2020-09-24 +url: /2020-09-24-go-ipfs-0-7-0/ +title: IPFS 0.7.0, the SECIO retirement edition, is here! +description: +author: Jacob Heun & Adin Schmahmann +tags: go-ipfs, release +--- + +In August we announced the [deprecation of the SECIO security transport](https://blog.ipfs.io/2020-08-07-deprecating-secio/). In this release we have disabled SECIO by default, which will have an impact on older nodes on the network. The best way to mitigate the impact of this change is to [upgrade your IPFS nodes](https://docs.ipfs.io/recent-releases/go-ipfs-0-7/update-procedure) as soon as possible! Not only will upgrading ensure you're using the latest security transports, you'll get access to all of the [performance improvements](https://blog.ipfs.io/2020-07-20-dht-deep-dive/) we've made this year to content routing. + +With this release you will also start seeing more Peer IDs and IPNS Keys on the network that start with `1` instead of the typical `Qm`. This is due to a switch to ed25519 keys being used by default over RSA keys, which you can read more about in the highlights below. + +🚨 For those of you using plugins with IPFS there is a breaking change detailed below to the build process. + +# 🔦 Go-IPFS 0.7.0 Highlights + +## 🔒 SECIO is now disabled by default + +As part of deprecating and removing support for the SECIO security transport, we have disabled it by default. TLS1.3 will remain the default security transport with fallback to Noise. You can read more about the deprecation in the blog post, https://blog.ipfs.io/2020-08-07-deprecating-secio/. If you're running Go IPFS older than 0.5 or JS IPFS older than 0.47, this may start to impact your performance on the public network, so we strongly encourage you to upgrade today! + +## 🗝️ Ed25519 keys are now used by default + +Previously go-ipfs generated 2048 bit RSA keys for new nodes, but it will now use ed25519 keys by default. This will not affect any existing keys, but newly created keys will be ed25519 by default. The main benefit of using ed25519 keys over RSA is that ed25519 keys have an inline public key. This means that someone only needs your PeerId to verify things you've signed, such as your Peer Records or in the future Signed Provider Records, which means we don't have to worry about storing bulky RSA public keys. + +### Rotating keys + +Along with switching the default key type, we've added support for rotating Identity keys. If you would like to change the key type of your IPFS node, you can now do so with the rotate command. **NOTE: This will affect your Peer Id, so be sure you want to do this!** Your existing identity key will be backed up in the Keystore so that it can still be referenced for things like IPNS records. + +```console +$ ipfs key rotate -o my-old-key -t ed25519 +``` + +## 📦 Key export/import + +Speaking of backing up keys, we've added commands to allow you to export and import keys from the IPFS Keystore to a local .key file. This does not currently apply to the IPFS identity key, `self`, which is housed in the configuration file. + +```console +$ ipfs key gen mykey +$ ipfs key export -o mykey.key mykey # ./.key is the default path +$ ipfs key import mykey mykey.key # on another node +``` + +## #️⃣ IPNS paths now encode the key name as a base36 CIDv1 by default + +Previously go-ipfs encoded the key names for IPNS paths as base58btc multihashes (e.g. `Qmabc...`). We now encode them as base36 encoded CIDv1s as defined in the [peerID spec](https://github.com/libp2p/specs/blob/master/peer-ids/peer-ids.md#string-representation) (e.g. `k51xyz...`) which also deals with the encoding of public keys. This is nice because it means that IPNS keys will by default be case-insensitive and that they will fit into DNS labels (e.g. `k51xyz...ipns.localhost`) and therefore that subdomain gateway redirections (e.g. from `localhost:8080/ipns/{key}` to `{key}.ipns.localhost`) will look better to users in the default case. + +Many commands will accept a `--ipns-base` option that allows changing command outputs to use a particular encoding (i.e. base58btc multihash, or CIDv1 encoded in any supported base): + +```console +$ ipfs key list -l --ipns-base b58mh +12D3KooWCjhz69LskTZEC5vFWs8eDpHo7kYbGzrC5EjU75BHSmVK self +$ ipfs key list -l --ipns-base base36 +k51qzi5uqu5dh9ihj4p2v5sl3hxvv27ryx2w0xrsv6jmmqi91t9xp8p9kaipc2 self +``` + +## 📮 Multiaddresses now accept PeerIDs encoded as CIDv1 + +In preparation for eventually changing the default PeerID representation multiaddresses can now contain strings like `/p2p/k51xyz...` in addition to the default `/p2p/Qmabc...`. There is a corresponding `--peerid-base` option to many functions that output peerIDs: + +```console +$ ipfs id --format "" --peerid-base b58mh +12D3KooWCjhz69LskTZEC5vFWs8eDpHo7kYbGzrC5EjU75BHSmVK +$ ipfs id --format "" --peerid-base base36 +k51qzi5uqu5dh9ihj4p2v5sl3hxvv27ryx2w0xrsv6jmmqi91t9xp8p9kaipc2 +``` + +## 🧮 `dag stat` command + +Initial support has been added for the `ipfs dag stat` command. Running this command will traverse the DAG for the given root CID and report statistics. By default, progress will be shown as the DAG is traversed. Supported statistics currently include DAG size and number of blocks. + +```console +$ ipfs dag stat bafybeihpetclqvwb4qnmumvcn7nh4pxrtugrlpw4jgjpqicdxsv7opdm6e # the IPFS webui +Size: 30362191, NumBlocks: 346 +``` + +## 🚨 Plugin build changes 🚨 + +We have changed the build flags used by the official binary distributions on [dist.ipfs.io](https://dist.ipfs.io) (or `/ipns/dist.ipfs.io`) to use the simpler and more reliable `-trimpath` flag instead of the more complicated and brittle `-asmflags=all=-trimpath="$(GOPATH)" -gcflags=all=-trimpath="$(GOPATH)"` flags, however the build flags used by default in go-ipfs remain the same. + +The scripts in [go-ipfs-example-plugin](https://github.com/ipfs/go-ipfs-example-plugin) have been updated to reflect this change. This is a **breaking change** to how people have been building plugins against the dist.ipfs.io binary of go-ipfs and plugins should update their build processes accordingly. See [go-ipfs-example-plugin/pull/9](https://github.com/ipfs/go-ipfs-example-plugin/pull/9) for details. + +## The Changelog + +For a full list of updates included in this release you can review the Changelog at https://github.com/ipfs/go-ipfs/blob/v0.7.0/CHANGELOG.md#v070-2020-09-22. + +## Thank you contributors! + +A huge thank you to [everyone who contributed](https://github.com/ipfs/go-ipfs/blob/v0.7.0/CHANGELOG.md#contributors) patches and improvements in this release, all **53** of you! We couldn’t have made this happen without your help and feedback. ❤ + +## Install, upgrade, and join us! + +You can get started by [installing go-ipfs](https://dist.ipfs.io/#go-ipfs) or [upgrading to go-ipfs 0.7](https://docs.ipfs.io/recent-releases/go-ipfs-0-7/update-procedure). + +There are many ways to get involved with IPFS based on your skill set, interest, and availability. Please check out [our contribution page](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) on GitHub for guidance and next steps. + +This is an exciting time for IPFS and the web in general. Join us! diff --git a/src/_blog/meet-the-community--Alan-Shaw-IPFS/README.md b/src/_blog/meet-the-community--Alan-Shaw-IPFS/README.md new file mode 100644 index 00000000..f276e128 --- /dev/null +++ b/src/_blog/meet-the-community--Alan-Shaw-IPFS/README.md @@ -0,0 +1,77 @@ +--- +date: 2019-05-20 +url: /meet-the-community-alan-shaw/ +tags: 'Meet the Community' +title: Meet the Community, Alan Shaw @ IPFS / Protocol Labs +description: +author: IPFS Events Team +--- + +> With the first-ever IPFS Camp right around the corner, we’re interviewing some of the community members who are making this highly anticipated event a reality. +> Haven’t applied yet? Don’t worry! Registration for the 3-day hacker retreat designed for the builders of the Distributed Web is still open! Visit [camp.ipfs.io](https://camp.ipfs.io) to learn more about IPFS Camp, scholarships, and what’s included in your conference pass. + +> 💌 This interview first appeared in the [IPFS Events newsletter](http://eepurl.com/giMQzj), subscribe to receive exclusive content and invites to upcoming events. + +## Meet the Community: Alan Shaw, Core Developer of the IPFS Protocol @ IPFS / Protocol Labs + +![](./alan-shaw.jpg) + +### Tell us a bit about yourself and your background. How did you get involved with IPFS and end up joining the team at Protocol Labs? + +Ok, quick recap of my whole life. Started building websites when I was 16 and basically continued that for nearly 20 years. It means I fondly remember things like tables, frames, IE6, Netscape Navigator, pixel perfect websites, a time before `border-radius` and `box-shadow`, Flash and ActionScript, CSS Zen Garden, Firebug, MooTools, jQuery and the like. Wow ok, I can’t finish that list there’s too much. + +I’m basically a developer who started with frontend, moved to backend and now I just tickle whichever end needs to be tackled, including the IoT end. I have a LOT of experience with JavaScript. I’ve worked with a lot of different programming languages in my career but you just always have to do some JavaScript. JavaScript is the one constant in my life and I love it, but that could be Stockholm syndrome talking. + +I’ve not had a real job for almost my whole life. I had a couple of years at a “new media agency” building expensive websites for businesses but I quickly became a freelancer (a.k.a. went and did a snowboard season in New Zealand) and after many freelance gigs spanning multiple years, I eventually founded a company with [Oli Evans](https://github.com/olizilla). + +We focused on building really great MVPs for entrepreneurs in really short iterations. We basically took the developer practice of “sprints” and applied it directly to working with our clients. Each week we wrote a work plan for 5 days of work. The idea was to have something useable at the end of the week, so it worked really well at focusing the client’s hopes and dreams into just the things we could achieve. We got the client to sign off on the work plan each week and then when the week was done they got something to play with. + +From there, the client could either go away and never speak to us again, or book in another week, with new ideas for how we could improve the product or new features they wanted to add. Often as the weeks progressed the thing we built differed drastically from the client’s original plan and was probably all the better for it. + +The company had a big focus on community, training and mentoring. We organised a number of tech meetups in the London area and got to know the community. Notably, we organised the London [Meteor](https://www.meteor.com/) and [Nodebots](https://nodebots.io/) meetups. The whole company also regularly attended tech conferences and Oli was invited to give a talk at [LXJS in Lisbon in 2013](http://2013.lxjs.org/). We met some super rad people there but the most “rad-est” person was [David Dias](https://github.com/daviddias/) who went on to organise [LXJS 2014](http://2014.lxjs.org/) and he invited us back to run a [Nodebots workshop](https://youtu.be/L894YhZBz3k). + +David Dias went on to work with [&yet](https://andyet.com/) but eventually got involved with IPFS (I believe through work on his university thesis). He started by building the JS implementation of IPFS and went on to become project lead. That’s a story for him to tell, but once he was in, David got us involved to work on a number of projects for IPFS. We started working on the peripheral but gradually ended up working on bigger, more core things. Personally, I love what [Protocol Labs](https://protocol.ai/) is doing and how ambitious it is—as an eternal optimist (often times to my detriment) this pleases me. + +So we were more than happy to have Protocol as a client and eventually they ate us. I joke, there was a time where we had a lull in other client work and we were spending most of our time on Protocol work. David had (basically from day 1) been asking us to join up and on a chance visit to London he brought up the subject again and we reconsidered... + +### Why should people be excited about IPFS? + +IPFS is going to completely change the way people think about storage, addressing, networking and ownership of data. There are so many good ideas in IPFS it’s easy to deep dive into the technical details but, how about this: + +Imagine a world where a copy of a file doesn’t actually consume any additional disk space. Maybe I should explain that a little—why would I have two of the same file? Well, it happens. Often I don’t have two of the _exact_ same file, but I have two files that have some bytes in common. When this happens, IPFS can share those bytes between those two files. Imagine how much disk space you’d save if this happened for _all_ of your files! + +Imagine what BitTorrent or any one of the old p2p file sharing apps did for individual files but for all files on your computer or the internet. + +Imagine two people in the same office downloading the same file and not having to move the same bytes across the Atlantic twice! + +Imagine not having to worry so much about man-in-the-middle attacks because the content you received was _automatically verified_ to be the content you asked for. + +Imagine a world where DoS attacks don’t really exist because there’s no central place to send the attack at. + +Imagine a world where offline first _actually_ works by default. + +Imagine building a website and not having to buy an SSL certificate just so your browser doesn’t flag it as “insecure” to your customers. + +Imagine a world where CDNs don’t have to exist because the whole network is one giant CDN. + +Imagine a world where you don’t have to share all your data with a big corporate entity where it would be mined and profiled and monetised. Imagine not being a product that companies sell to advertisers. + +This is why people should be excited about IPFS...and I’m pretty sure I’ve missed a whole bunch of good reasons. + +### What projects are really exciting you in the IPFS Ecosystem at the moment and why? + +We’ve been collaborating with the people behind [Brave](https://brave.com/) browser for a long time now and I believe we’re on the verge of shipping an IPFS integration, installed by default with the browser. It’s a small step towards a future where _all browsers_ are p2p by default. That is _very_ exciting. + +### Open Source communities are full of unsung heroes. Is there someone in IPFS community who you admire for their work? + +I really admire the work [Irakli](https://github.com/gozala/) has been doing to get p2p into Firefox with [libdweb](https://github.com/mozilla/libdweb) and his service worker explorations with [lunet](https://github.com/Gozala/lunet). He’s been really active in the IPFS community for a long time and truly understands the importance of p2p technology in the browser. He also has sound opinions about API design. + +### What are you most looking forward to at IPFS Camp? + +Science Fair. I absolutely _love_ mad science and experimenting. + +--- + +Thank you for answering our questions, Alan, looking forward to meet you at [IPFS Camp](https://camp.ipfs.io) + +> 💌 This interview first appeared in the [IPFS Events newsletter](http://eepurl.com/giMQzj), subscribe to receive exclusive content and invites to upcoming events. diff --git a/src/_blog/meet-the-community--Alan-Shaw-IPFS/alan-shaw.jpg b/src/_blog/meet-the-community--Alan-Shaw-IPFS/alan-shaw.jpg new file mode 100644 index 00000000..907be7dc Binary files /dev/null and b/src/_blog/meet-the-community--Alan-Shaw-IPFS/alan-shaw.jpg differ diff --git a/src/_blog/meet-the-community--Carson-Farmer-Textile/README.md b/src/_blog/meet-the-community--Carson-Farmer-Textile/README.md new file mode 100644 index 00000000..c8ae2a7c --- /dev/null +++ b/src/_blog/meet-the-community--Carson-Farmer-Textile/README.md @@ -0,0 +1,45 @@ +--- +date: 2019-05-13 +url: /meet-the-community-carson-farmer/ +tags: 'Meet the Community' +title: Meet the Community, Carson Farmer @ Textile +description: +author: IPFS Events Team +--- + +> With the first-ever IPFS Camp right around the corner, we’re interviewing some of the community members who are making this highly anticipated event a reality. +> Haven’t applied yet? Don’t worry! Registration for the 3-day hacker retreat designed for the builders of the Distributed Web is still open! Visit [camp.ipfs.io](https://camp.ipfs.io) to learn more about IPFS Camp, scholarships, and what’s included in your conference pass. + +> 💌 This interview first appeared in the [IPFS Events newsletter](http://eepurl.com/giMQzj), subscribe to receive exclusive content and invites to upcoming events. + +## Meet the Community: Carson Farmet, Core Developer @ Textile.io + +![](./carson-farmer.jpg) + +### Tell us a bit about yourself and your background. How did you get involved with IPFS and what’s your relationship with Protocol Labs? + +My name is Carson Farmer, I’m part of the Textile.IO team, working on developer tools for encrypted, recoverable, schema-based, and cross-application data storage built on IPFS and libp2p. Until pretty recently, I was a university professor in the Department of Geography at the University of Colorado Boulder. My previous research focused a lot on real-time streams of geospatial information, which aren’t all that different from streams of data shared over peer-to-peer networks. I’ve written a fair bit about getting started with IPFS on the Textile blog, and that has lead to a lot of awesome connections within the IPFS community. + +I got involved with IPFS as it is a core technology used by our team at Textile. A big piece of our vision is promoting a new model of data ownership where individuals have total agency over the information they create. IPFS is the perfect file system for that vision because content addressing means an individual’s data is resistant to censorship, is storage agnostic, and decentralized, plus IPFS is backed by a best-in-class peer-to-peer networking library, which makes developing on top of that whole ecosystem even easier. We made the decision to build on IPFS pretty early on, and we haven’t really looked back since :P + +### Why should people be excited about IPFS? + +Because IPFS has the potential to shift power dynamics in some very important ways. Control over data, content, distribution, access, information, etc., has very real consequences, and when the system itself (at the protocol layer) is built around open access as a core and undeniable feature, that is a big deal. This is a direct result of lots of folks thinking very seriously about how to ‘lock the web open’ and fix some of the issues with our current web, while keeping around some of the amazing technologies of our modern internet. Another reason I think folks should be excited about IPFS is the people within and around the project: the whole IPFS ecosystem has been extremely supportive of newcomers, developers, tinkerers, businesses, investors, critics, proponents, and even competitors. Because of this, I think IPFS as a community is sustainable, and that’s another reason to be excited about IPFS. + +### What projects are really exciting you in the IPFS Ecosystem at the moment and why? + +Certainly I’m excited about what we’re up to at Textile [winking face]. We’re working on a lot of developer tools at the layer _above_ IPFS, which is really allowing us to push IPFS to its limits (including running IPFS peers on mobile!). The community in general, and the core IPFS devs in particular, have made this a pretty fun experience. Outside of our own work, I’m seeing some really cool stuff come out of the IPFS desktop and browser teams that I think are going to have a big impact on the broader web-development community. I’m also really excited by all the CRDT work that is happening across the IPFS ecosystem. `orbit-db` is a project I’ve been following for a while, `peer-base` is very interesting, and the whole Dynamic Data and Capabilities in IPFS Working Group has been really fun to interact with. Another really cool project that uses IPFS under-the-hood to promote secure, privacy-preserving, value-aligned AI research is OpenMined; worth taking a look at that really active community. + +### Open Source communities are full of unsung heroes. Is there someone in IPFS community who you admire for their work? + +I think the core IPFS devs, while their names do show up on PRs and Issues, deserve some extra shout-outs for sure. In particular, for our team at Textile we’ve hugely benefited from interactions with (I’ll use their GitHub handles) `whyrusleeping` `stebalien`, `raulk`, `momack2`, `daviddias`, and `hsanjuan`. Also, the growing community at https://www.reddit.com/r/ipfs has been super supportive of IPFS projects in general. Efforts such as the Discord community setup by `leshokunin`, and the big dweb/IPFS push by `grittygrease` over at Cloudflare also deserve mentioning. Plus I’m a big fan of the community support provided by folks like `postables` and `obo20`. + +### What are you most looking forward to at IPFS Camp? + +I think for me, IPFS Camp is just going to be a great opportunity to get some direct face time with many of the folks I regularly ‘chat’ with on IRC, Slack, Discord, etc... Being part of a big open source community like IPFS means you meet great people from across the globe, but so often, you never get to meet them in person. The Camp ‘addresses’ this missing piece of distributed work. I have a feeling there is going to be an acceleration of outputs during and after the camp, and a big focus on external developer experience. So that’s something I’m excited about. I’m also really interested in chatting with folks about IPFS on mobile. I think this is somewhere the community can really stand to grow a bit as we start to look externally to new developers, users, and communities. Additionally, I think just having a solid chunk of time to focus on IPFS in the broadest sense, rather than the specific pieces that my colleagues and I regularly focus on, is going to be hugely beneficial. Seeing what’s going on broadly in the community will likely lead to so many new collaborations, some increased development synergy, and maybe some new partnerships. I think the whole thing is going to be really great for the community. + +--- + +Thank you for answering our questions, Carson, looking forward to meet you at [IPFS Camp](https://camp.ipfs.io) + +> 💌 This interview first appeared in the [IPFS Events newsletter](http://eepurl.com/giMQzj), subscribe to be notified and receive invites to upcoming events. diff --git a/src/_blog/meet-the-community--Carson-Farmer-Textile/carson-farmer.jpg b/src/_blog/meet-the-community--Carson-Farmer-Textile/carson-farmer.jpg new file mode 100644 index 00000000..b61f4e93 Binary files /dev/null and b/src/_blog/meet-the-community--Carson-Farmer-Textile/carson-farmer.jpg differ diff --git a/src/_blog/meet-the-community--Edgar-Lee-Netflix/README.md b/src/_blog/meet-the-community--Edgar-Lee-Netflix/README.md new file mode 100644 index 00000000..e4863700 --- /dev/null +++ b/src/_blog/meet-the-community--Edgar-Lee-Netflix/README.md @@ -0,0 +1,43 @@ +--- +date: 2019-05-06 +url: /meet-the-community-edgar-lee/ +tags: 'Meet the Community' +title: Meet the Community, Edgar Lee @ Netflix +description: +author: IPFS Events Team +--- + +> With the first-ever IPFS Camp right around the corner, we’re interviewing some of the community members who are making this highly anticipated event a reality. +> Haven’t applied yet? Don’t worry! Registration for the 3-day hacker retreat designed for the builders of the Distributed Web is still open! Visit [camp.ipfs.io](https://camp.ipfs.io/) to learn more about IPFS Camp, scholarships, and what’s included in your conference pass. + +> 💌 This interview first appeared in the [IPFS Events newsletter](http://eepurl.com/giMQzj), subscribe to receive exclusive content and invites to upcoming events. + +# Meet the Community: Edgar Lee, Software Developer @ Netflix + +![](./edgar-lee.jpg) + +### Tell us a bit about yourself and your background. How did you get involved with IPFS? + +I work on developer tooling and infrastructure at Netflix and previously worked at Docker on the registry. The Docker Registry stores images as a merkle DAG much like IPFS, but was only granular at the layer level as opposed to file chunks. When I came across Akihiro Suda’s Filegrain proposal to use IPFS as a storage mechanism for container images, I discovered its ecosystem and started experimenting with the technology. + +### Why should people be excited about IPFS? + +IPFS is exciting because it builds an ecosystem of tools over the concept of content addressable storage. By decoupling what the name of some content represents, and how to get said content, we get powerful properties typically desired in distributed systems. + +### What projects are really exciting you in the IPFS Ecosystem at the moment and why? + +System package managers, library dependency management, container image registries all have similar requirements. Over time, some of them have individually reinvented content addressable storage and structured their data as a merkle DAG. IPFS’s 2019 roadmap to address package management is the most exciting to me right now, as it presents an opportunity to greatly improve the software landscape for both the decentralization movement, as well as private infrastructure. + +### Open Source communities are full of unsung heroes. Is there someone in IPFS community who you admire for their work? + +Recently, magik6k and others worked hard on refactoring the IPFS Core API and created a clean HTTP client for IPFS. I use the results of this work extensively for the experiments I’m running so I’m grateful for their work. There’s also a lot of other exciting work like hsanjuan’s IPFS driver for Docker Registry, Stebalien’s work on IPFS itself, among many others. + +### What are you most looking forward to at IPFS Camp? + +I’m most looking forward to meeting the team behind IPFS, and mind sharing with the community. It’ll also be my first time in Barcelona, so I’m excited to visit the beautiful city. + +--- + +Thank you for answering our questions, Edgar, looking forward to meet you at [IPFS Camp](https://camp.ipfs.io) + +> 💌 This interview first appeared in the [IPFS Events newsletter](http://eepurl.com/giMQzj), subscribe to receive exclusive content and invites to upcoming events. diff --git a/src/_blog/meet-the-community--Edgar-Lee-Netflix/edgar-lee.jpg b/src/_blog/meet-the-community--Edgar-Lee-Netflix/edgar-lee.jpg new file mode 100644 index 00000000..21c492a2 Binary files /dev/null and b/src/_blog/meet-the-community--Edgar-Lee-Netflix/edgar-lee.jpg differ diff --git a/src/_blog/weekly-001/README.md b/src/_blog/weekly-001/README.md new file mode 100644 index 00000000..a462482e --- /dev/null +++ b/src/_blog/weekly-001/README.md @@ -0,0 +1,115 @@ +--- +date: 2016-01-11 +url: /4-ipfs-weekly-1/ +tags: weekly +title: IPFS Weekly 1 +description: +author: Richard Littauer, Andrew Chin +--- + +Welcome to the first edition of IPFS Weekly! + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we will try to highlight some of the development that happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [github](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +Since this is our first time launching the Weekly, we've included several past weeks. This is partially because we've been refining our process, and wanted to make the first weekly a great one. In the future, they will be released weekly. If you have any feedback about this process in general, let us know [here](//github.com/ipfs/weekly/issues/7). Thanks! + +## December 21 + +Here are some of the highlights for the [December 21](//github.com/ipfs/pm/issues/76) Sprint: + +### 32c3 + +Not too much happened during this sprint, because it was the holidays - however, it was also the 32nd CCC. [@whyrusleeping](//github.com/whyrusleeping), [@diasdavid](//github.com/diasdavid), [@lgierth](//github.com/lgierth), [@Dignifiedquire](//github.com/Dignifiedquire) and more of the team were over there in Hamburg. + +![](https://ipfs.io/ipfs/QmWYaX56pTskFL2UMV2x8ZZAB8xyntPce5bFmY8ugHw47j/32c3.ipfs.2.jpg) + +- [@whyrusleeping](//github.com/whyrusleeping) gave a lightning talk (see above). +- [@whyrusleeping](//github.com/whyrusleeping) [@diasdavid](//github.com/diasdavid) and [@Dignifiedquire](//github.com/Dignifiedquire) led an install party and live demo. +- [@MrChrisJ](//github.com/MrChrisJ) led a discussion about his [Full Node project](//news.bitcoin.com/developer-chris-ellis-builds-full-bitcoin-nodes-12-hours/), which includes IPFS. +- We met lots of our users, and other groups (including [Tahoe-LAFS](https://www.tahoe-lafs.org/trac/tahoe-lafs), [tor](https://www.torproject.org/), etc). + +### Updates + +- [**(go-ipfs)**](//github.com/ipfs/go-ipfs) [@whyrusleeping](//github.com/whyrusleeping) and [@diasdavid](//github.com/diasdavid) did amazing work closing around 200 issues as part of the "Great go-ipfs Issue Party of 2015". +- [**(registry-mirror)**](//github.com/diasdavid/registry-mirror) npm on IPFS was furthered by [@diasdavid](//github.com/diasdavid) by making it work with 0.4.0. Currently, there are 130,000 modules and it's going strong. +- [**(go-ipfs)**](//github.com/ipfs/go-ipfs) [@lgierth](//github.com/lgierth) set up namaka and hiiaka (NUC nodes at our table at 32c3). This is pretty cool. CF. [ipfs/infrastructure#142](//github.com/ipfs/infrastructure#142). +- [**(readme-standard)**](//github.com/RichardLitt/readme-standard) [@RichardLitt](//github.com/RichardLitt) had his own great issue party. He's most proud of breaking ground on the future [readme standard](//github.com/RichardLitt/readme-standard/issues/1) for IPFS. +- [**(webui)**](//github.com/ipfs/webui) [@Dignifiedquire](//github.com/Dignifiedquire) did some awesome work improving the webui [using webpack](//github.com/ipfs/webui/issues/87). +- He _also_ managed to release [rust-multiaddr](//github.com/Dignifiedquire/rust-multiaddr) and [rust-multihash](//github.com/Dignifiedquire/rust-multihash), which means more languages now implement the orginal [multihash](//github.com/jbenet/multihash) and [multiaddr](//github.com/jbenet/multiaddr) specs. + +For more updates, see the [sprint issue](//github.com/ipfs/pm/issues/76). + +## December 14 + +Here are some of the highlights for the [December 14](//github.com/ipfs/pm/issues/74) Sprint: + +### Releases + +- [@whyrusleeping](//github.com/whyrusleeping) shipped [fs-repo-migrations](//github.com/ipfs/fs-repo-migrations)! These are migrations for the filesystem repository of ipfs clients. This tool is written in Go, and developed alongside go-ipfs, but it should work with any repo conforming to the fs-repo specs. +- [@Dignifiedquire](//github.com/Dignifiedquire) did some great work with [rust-multiaddr](//github.com/Dignifiedquire/rust-multiaddr), which is a Rust implementation of [@jbenet](//github.com/jbenet)'s [multiaddr](//github.com/jbenet/multiaddr). + +### Updates + +- [**(registry-mirror)**](//github.com/diasdavid/registry-mirror) [@diasdavid](//github.com/diasdavid) worked on the npm on IPFS project. This involved some new features, moving the mirror to a different server, and making it work better with larger dirs and with 0.4.0. +- [**(js-ipfs)**](//github.com/ipfs/js-ipfs [@diasdavid](//github.com/diasdavid) pushed some major updates for [js-ipfs](//github.com/ipfs/js-ipfs-repo), too. + +Not much else to report this week; a lot of people are off to enjoy CCC, and the holidays. + +## December 7th + +Here are some highlights of what happened during the [December 7 Sprint](//github.com/ipfs/pm/issues/67) : + +### Releases + +- [@whyrusleeping](//github.com/whyrusleeping) shipped IPFS version 0.3.10! It contains [74 new commits](//github.com/ipfs/go-ipfs/compare/v0.3.9...v0.3.10) since the previous version and you can [get it here](//ipfs.io/docs/install/). +- npm on IPFS! `registry-mirror` is a new tool that enables distributed discovery of npm modules by fetching and caching the latest state of npm through IPNS. For more info, see this [blog post](//blog.daviddias.me/2015/12/08/stellar-module-management) by [@diasdavid](//github.com/diasdavid) . +- [@jbenet](//github.com/jbenet) released a new tool/library called [dnslink](//github.com/jbenet/go-dnslink) that makes it easy to resolve dns links (special TXT records in a domain name that can point to paths, like an IPFS path) + +### Updates + +- [**(infrastructure)**](//github.com/ipfs/infrastructure) On the infrastructure side of things, [@lgierth](//github.com/lgierth) has [bootstrapped](//github.com/ipfs/infrastructure/pull/135) two new storage, each with 17 TB of disk space! +- [**(api)**](//github.com/ipfs/api) [@RichardLitt](//github.com/RichardLitt) has [reached a draft 1]((//github.com/ipfs/api/pull/13) of the much needed API documentation. +- [@harlantwood](//github.com/harlantwood) wrote a bit of [nodejs code](//github.com/ipfs/project-repos/pull/11) that spins up a fresh IPFS node, sets it to a known ID, and publishes to IPNS using that node. +- [**(specs)**](//github.com/ipfs/specs) The new IPFS Linked Data (IPLD) spec is actively being iterated on in the specs repository. Join the discussion [here!](//github.com/ipfs/specs/pull/37) + +### Active stuff + +- [@robcat](//github.com/robcat) and [@fazo](//github.com/fazo)96 have done great work integrating IPFS with pacman (the package manager for Arch Linux). They can now install arch packages straight from IPFS! For more details, see [this active discussion](//github.com/ipfs/notes/issues/84). +- [@Dignifiedquire](//github.com/Dignifiedquire) has been working on an attractive new distribution page for IPFS, which will be the new landing page to download all things IPFS. You can see the [latest screenshots here](//github.com/ipfs/distributions/issues/11). + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code since December 7th. (We're autogenerating this list using [this tool](//github.com/ipfs/weekly/pull/5), so please let us know if your name isn't here.) In the future, we will also include people who comment, as they are also super important; bear with us while we develop that technology. + +- [@alexmingoia](//github.com/alexmingoia) (Alex Mingoia) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@digital-dreamer](//github.com/digital-dreamer) +- [@Dignifiedquire](//github.com/Dignifiedquire) (Friedel Ziegelmayer) +- [@djdv](//github.com/djdv) (Dominic Della Valle) +- [@fazo96](//github.com/fazo96) (Enrico Fasoli) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) +- [@harlantwood](//github.com/harlantwood) (Harlan T Wood) +- [@hcs64](//github.com/hcs64) (Adam Gashlin) +- [@ianopolous](//github.com/ianopolous) (Ian Preston) +- [@ivilata](//github.com/ivilata) (Ivan Vilata-i-Balaguer) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@jedahan](//github.com/jedahan) (Jonathan Dahan) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@kyledrake](//github.com/kyledrake) (Kyle Drake) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@NeoTeo](//github.com/NeoTeo) (Teo Sartori) +- [@ralphtheninja](//github.com/ralphtheninja) (Lars-Magnus Skog) +- [@ReadmeCritic](//github.com/ReadmeCritic) +- [@rht](//github.com/rht) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@travisperson](//github.com/travisperson) (Travis Person) +- [@wasserfuhr](//github.com/wasserfuhr) (RainerWasserfuhr) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@zignig](//github.com/zignig) (Simon Kirkby) + +Thanks, and see you next week! + +- Richard Littauer and Andrew Chin + +[_Send us feedback about the Weekly_](//github.com/ipfs/weekly/issues/7) diff --git a/src/_blog/weekly-002/README.md b/src/_blog/weekly-002/README.md new file mode 100644 index 00000000..5cc774ea --- /dev/null +++ b/src/_blog/weekly-002/README.md @@ -0,0 +1,54 @@ +--- +date: 2016-01-13 +url: /5-ipfs-weekly-2/ +tags: weekly +title: IPFS Weekly 2 +description: +author: Richard Littauer, Andrew Chin +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +Here are some of the highlights for the [January 5th](//github.com/ipfs/pm/issues/77) Sprint: + +## Updates + +- [**(specs)**](//github.com/ipfs/specs) There was much debate in the [IPLD spec](https://github.com/ipfs/specs/pull/37) about pathing notation. [@mildred](//github.com/mildred) in particular did a lot of good work. +- [**(go-ipfs)**](//github.com/ipfs/go-ipfs) The IPFS Docker image is now tested automatically on Travis, thanks to [@ChristianKniep](//github.com/ChristianKniep), [@whyrusleeping](//github.com/whyrusleeping), and [@chriscool](//github.com/chriscool). For more, see the [go-ipfs#2064](//github.com/ipfs/go-ipfs/pull/2064) pull request. +- [**(js-ipfs)**](//github.com/ipfs/js-ipfs) Now you can do `npm i -g js-ipfs` and use jsipfs (the javascript impl of IPFS) with bootstrap + id + version commands, fully compatible with the go-ipfs repo, thanks to [@diasdavid](//github.com/diasdavid)! +- [**(project-repos)**](//github.com/ipfs/project-repos) A very cool [organization-wide dashboard](http://project-repos.ipfs.io/) that provides a status overview of all the IPFS repos was launched. By [@harlantwood](//github.com/harlantwood). +- [**(community)**](//github.com/ipfs/community) [@RichardLitt](//github.com/RichardLitt) merged the pull request for [JavaScript guidelines](//github.com/ipfs/community/blob/master/js-contribution-guidelines.md) for IPFS repos. This is a major step towards standard JavaScript repositories within IPFS. +- [**(community)**](//github.com/ipfs/community#meetups) [@NeoTeo](//github.com/NeoTeo), [@whyrusleeping](//github.com/whyrusleeping), and [@diasdavid](//github.com/diasdavid) hosted a small meetup in Copenhagen! Eight people in total showed up for an intro to IPFS, a Q&A session, and some good conversation! + +## Work in Progress + +- [**(distributions)**](//github.com/distributions) [@Dignifiedquire](//github.com/Dignifiedquire) further developed the distributions page. [Click here](http://v04x.ipfs.io/ipfs/QmZyvWokPYGg6DrjE6o2V7qhThzZQZ8QCWqdd2U3S75HXC/index.html) for a preview! +- [**(go-ipfs)**](//github.com/ipfs/go-ipfs) [@lgierth](//github.com/lgierth) continued the work towards the dev040 migration. Notably we have two new gateways to aid in the transition: [http://v04x.ipfs.io](http://v04x.ipfs.io) and [http://v03x.ipfs.io](http://v03x.ipfs.io) +- [**(archives)**](//github.com/ipfs/archives/) [@Dignifiedquire](//github.com/Dignifiedquire) has added to IPFS a dump of the Stackexchange archives! Details are [in the archives repo](//github.com/ipfs/archives/issues/50). We are always looking for more help with archiving important datasets, so feel free to join us in the [archives repo](//github.com/ipfs/archives/)! + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code since January 4th. (We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py), so please let us know if your name isn't here.) In the future, we will also include people who comment, as they are also super important; bear with us while we develop that technology. + +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@ChristianKniep](//github.com/ChristianKniep) (Christian Kniep) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@Dignifiedquire](//github.com/Dignifiedquire) (Friedel Ziegelmayer) +- [@eminence](//github.com/eminence) (Andrew Chin) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) +- [@ianopolous](//github.com/ianopolous) (Ian Preston) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@ralphtheninja](//github.com/ralphtheninja) (Lars-Magnus Skog) +- [@ReadmeCritic](//github.com/ReadmeCritic) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@yuvallanger](//github.com/yuvallanger) (Yuval Langer) + +Thanks, and see you next week! If you have cool things to share for the next weekly, drop us a line in the [next weekly sprint issue](//github.com/ipfs/pm/issues/79)! + +- Richard Littauer and Andrew Chin + +_Submit feedback about this issue [here](//github.com/ipfs/weekly/issues/10), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-003/README.md b/src/_blog/weekly-003/README.md new file mode 100644 index 00000000..f3338e56 --- /dev/null +++ b/src/_blog/weekly-003/README.md @@ -0,0 +1,150 @@ +--- +date: 2016-02-01 +url: /6-ipfs-weekly-3/ +tags: weekly +title: IPFS Weekly 3 +description: +author: Richard Littauer, Andrew Chin +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +This is a double weekly: here are some of the highlights for the [January 12th](//github.com/ipfs/pm/issues/79) and the [January 19th](https://github.com/ipfs/pm/issues/83) sprints: + +## Updates + +- [**dist.ipfs.io**](http://dist.ipfs.io) A distributions page has been shipped! This was largely spearheaded by [@dignifiedquire](//github.com/dignifiedquire). This is the new one-stop-shop for finding and downloading all official binaries that IPFS produces. Each project has: + + - The distribution name and a short description; + - The current version number and release date; + - A download button that detects your platform and automatically suggests the appropriate distribution for you; + - A grid with download links for all supported platforms (operating system and architectures); + - A `Changelog`, a link to a summary of all version changes; + - An `All Versions`, a link to view and download previous versions. + + The site is also hosted on IPFS, and is used by [`ipfs-update`](https://github.com/ipfs/ipfs-update) to update IPFS. Check it out at http://dist.ipfs.io. + +- [**go-ipfs**](//github.com/ipfs/go-ipfs) 0.3.11 is shipped! Also, we merged 0.4.0 into master. [@jbenet](//github.com/jbenet), [@Dignifiedquire](//github.com/Dignifiedquire) and others [fixed appveyor](//github.com/ipfs/go-ipfs/pull/2137). And finally the latest webui by [@Dignifiedquire](//github.com/Dignifiedquire) was pushed in 0.3.11. Check out the [changelog](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md). +- [**js-ipfs-merkle-dag**](//github.com/vijayee/js-ipfs-merkle-dag/) [@diasdavid](//github.com/diasdavid) worked on merkle-dag implementation interoperabolity, by enabling you to successfully read (and write) MerkleDAG nodes that were stored into an IPFS Repo through go-ipfs, [in JavaScript](https://github.com/vijayee/js-ipfs-merkle-dag/pull/6). +- [**py-ipfs**](//github.com/ipfs/py-ipfs) Thanks to [@candeira](//github.com/candeira) and [@ivilata](//github.com/ivilata), we now have a much more filled out plan for the Python implementation of IPFS. Join in if you are a pythonista. +- [**js-mafmt**](//github.com/whyrusleeping/js-mafmt) [@whyrusleeping](//github.com/whyrusleeping) is working on a multiaddr validator in js, after his go work in [mafmt](//github.com/whyrusleeping/mafmt) +- [**infrastructure**](//github.com/ipfs/infrastructure) The public gateway at [ipfs.io](https://ipfs.io) is now backed by both v0.4.0-dev and v0.3.11 at the same time. Requests are proxied to both, and the first successful response wins. ipfs.io will be backed by v0.4.x alone eventually. What this means is that if you want to target your requests at one specific version, use v04x.ipfs.io or v03x.ipfs.io, respectively. The latter will stop returning DNS records when v03x isn't supported on the public gateway. Also, while we're releasing v0.4.0 and for a while after, the default bootstrap nodes are divided among v03x and v04x. Most can be used by v04x nodes, and a few by v03x nodes. The latter will be phased out over time. +- [**ipfs-firefox-addon**](//github.com/lidel/ipfs-firefox-addon#ipfs-firefox-addon) The Firefox addon that provides transparent access to IPFS resources via local HTTP2IPFS gateway has been updated to [release 1.4.2](https://github.com/lidel/ipfs-firefox-addon/releases/tag/v1.4.2). This is the first time we've mentioned this in this newsletter; go check it out. The addon enables you to load content via IPFS instead of HTTP. For example, if you open a resource from a public gateway (eg. https://ipfs.io/ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg) and have addon enabled, the request will not hit public gateway, but data will be loaded from IPFS swarm, in a decentralized and distributed way. It also now supports the IPFS protocol scheme, meaning that can look up a hash by going to `fs:/ipfs/` directly. +- [**go-multiaddr**](//github.com/jbenet/go-multiaddr) go-multiaddr now supports the adding of new protocols on the fly. This allows us to build in new protocols without having to force everyone to update the multiaddr library itself. +- [**community**](//github.com/ipfs/community) The labels 'help wanted' and 'difficulty:easy', ':hard', and ':moderate' have been added to every IPFS repository, to help out contributors know what are some low-hanging fruit they can help with. As well, [@RichardLitt](//github.com/RichardLitt) has created a [Docs Styleguide](https://github.com/ipfs/community/blob/master/docs-styleguide.md) to help standardize how we use English in all of our tools. It'll grow as time goes on. +- [**ipfs-dht**](//github.com/whyrusleeping/ipfs-dht) [@whyrusleeping](//github.com/whyrusleeping) wrote a 'just a dht' binary. This means you can help out the network without running a full ipfs node. It also takes less memory and bandwidth, and having more dht nodes will speed up lookups. +- [**js-ipfsd-ctl**](//github.com/ipfs/js-ipfsd-ctl) The Node module able to control an IPFS daemon was [updated to 0.3.11](//github.com/ipfs/js-ipfsd-ctl/pull/47). +- [**webui**](//github.com/ipfs/webui) The webui no long depends on [jQuery](//github.com/ipfs/webui/pull/215), thanks to a lot of work from [@luigiplr](//github.com/luigiplr), [@travisperson](//github.com/travisperson), and [@dignifiedquire](//github.com/dignifiedquire). + +## Work in Progress + +- [**js-ipfs**](//github.com/ipfs/pm) [@diasdavid](//github.com/diasdavid) has merged in the roadmaps for js-ipfs and libp2p, which he'll update as more details become apparent. Take a look. +- [**weekly**](//github.com/ipfs/weekly) [@RichardLitt](//github.com/RichardLitt) put a lot of work in getting various sorts of attribution for contributors to IPFS, currently available as [name-your-contributors](//github.com/RichardLitt/name-your-contributors). This is almost done, but there are a few tweaks left to do. + +## Meetups and Conferences + +- [**ArcticJS**](http://arcticjs.club) [@diasdavid](//github.com/diasdavid), [@whyrusleeping](//github.com/whyrusleeping), [@RichardLitt](//github.com/RichardLitt), and [@noffle](//github.com/noffle) were all able to meet up for the first time as a group and hack together at [ArcticJS](http://arcticjs.club), the first JavaScript conference above the Arctic circle, in Svalbard. Around 15 attended, and there was a lot of hacking, snow, talking about buffers, and swimming in the ocean at midnight underneath the Aurora Borealis (no, really). Most of the work done at the conference was conversations, but included [@diasdavid](//github.com/diasdavid) and [@RichardLitt](//github.com/RichardLitt) working on the API together, [@whyrusleeping](//github.com/whyrusleeping) learning how to javascript, and [@diasdavid](//github.com/diasdavid) and [@xicombd](//github.com/xicombd) working on IPFS together. All in all, it was an incredible trip. The videos for the actual talks (given in the most Northernmost church in the world) are [here](https://www.youtube.com/playlist?list=PL3bvPCw5QCLLJUL2Q_bBI1bi9bYQ-4hci). + +## Shoutouts + +- Joe Armstrong, inventor of Erlang, [mentioned](https://twitter.com/joeerl/status/692065172609994752) the importance of permanence and IPFS in a recent, and fantastic [series of posts about organizing software](http://joearms.github.io/2016/01/26/The-Unintentional-Side-Effects-of-a-Bad-Concurrency-Model.html). Thanks for the kind mention, Joe! + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between January 11th and January 25. (We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py), so please let us know if your name isn't here.) + +- [@adrian-bl](//github.com/adrian-bl) (Adrian Ulrich) +- [@alexeicolin](//github.com/alexeicolin) +- [@ali](//github.com/ali) (Ali Ukani) +- [@amstocker](//github.com/amstocker) (Andrew Stocker) +- [@anarcat](//github.com/anarcat) (anarcat) +- [@ansuz](//github.com/ansuz) (ansuz) +- [@Ape](//github.com/Ape) (Lauri Niskanen) +- [@area](//github.com/area) +- [@AtnNn](//github.com/AtnNn) (Etienne Laurin) +- [@Azulan](//github.com/Azulan) (Frank Flores) +- [@Balancer](//github.com/Balancer) (Balancer) +- [@bcg-didi](//github.com/bcg-didi) +- [@benjaminbollen](//github.com/benjaminbollen) (Benjamin Bollen) +- [@brailateo](//github.com/brailateo) (Constantin Teodorescu) +- [@btrask](//github.com/btrask) (Ben Trask) +- [@CaioAlonso](//github.com/CaioAlonso) (Caio Alonso) +- [@chpio](//github.com/chpio) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@ConsciousCode](//github.com/ConsciousCode) (Conscious Code) +- [@CrowdHailer](//github.com/CrowdHailer) (Peter Saxton) +- [@dandart](//github.com/dandart) (Dan Dart) +- [@david415](//github.com/david415) (David Stainton) +- [@davidar](//github.com/davidar) (David A Roberts) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@digital-dreamer](//github.com/digital-dreamer) +- [@dignifiedquire](//github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@djdv](//github.com/djdv) (Dominic Della Valle) +- [@dylanPowers](//github.com/dylanPowers) (Dylan Powers) +- [@eminence](//github.com/eminence) (Andrew Chin) +- [@Faleidel](//github.com/Faleidel) +- [@fazo96](//github.com/fazo96) (Enrico Fasoli) +- [@findkiko](//github.com/findkiko) +- [@Foxcool](//github.com/Foxcool) (Alexander Babenko) +- [@GitCop](//github.com/GitCop) +- [@goog](//github.com/goog) (Jay Cheng) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) (Greenkeeper) +- [@harlantwood](//github.com/harlantwood) (Harlan T Wood) +- [@ikreymer](//github.com/ikreymer) (Ilya Kreymer) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@jbshirk](//github.com/jbshirk) (Joe) +- [@jedahan](//github.com/jedahan) (Jonathan Dahan) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@kyledrake](//github.com/kyledrake) (Kyle Drake) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@lidel](//github.com/lidel) (Marcin Rataj) +- [@lovelaced](//github.com/lovelaced) +- [@luigiplr](//github.com/luigiplr) (Luigi Poole) +- [@Luzifer](//github.com/Luzifer) (Knut Ahlers) +- [@matshenricson](//github.com/matshenricson) (Mats Henricson) +- [@MChabez](//github.com/MChabez) +- [@Mec-iS](//github.com/Mec-iS) (Lorenzo) +- [@MichaelMure](//github.com/MichaelMure) (Michael Muré) +- [@mildred](//github.com/mildred) (Mildred Ki'Lya) +- [@Mithgol](//github.com/Mithgol) +- [@NDuma](//github.com/NDuma) (NDuma) +- [@NeoTeo](//github.com/NeoTeo) (Teo Sartori) +- [@nginnever](//github.com/nginnever) (Nathan Ginnever) +- [@nicola](//github.com/nicola) (Nicola Greco) +- [@NightRa](//github.com/NightRa) (Ilan Godik) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@Patagonicus](//github.com/Patagonicus) (Philipp Adolf) +- [@peerchemist](//github.com/peerchemist) +- [@peteygao](//github.com/peteygao) (Peter Gao) +- [@PlanetPlan](//github.com/PlanetPlan) +- [@pra85](//github.com/pra85) (Prayag Verma) +- [@prusnak](//github.com/prusnak) (Pavol Rusnak) +- [@ralphtheninja](//github.com/ralphtheninja) (Lars-Magnus Skog) +- [@ReadmeCritic](//github.com/ReadmeCritic) +- [@Red5d](//github.com/Red5d) +- [@reit-c](//github.com/reit-c) +- [@rht](//github.com/rht) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@richardschneider](//github.com/richardschneider) (Richard Schneider) +- [@rugk](//github.com/rugk) (rugk) +- [@SCBuergel](//github.com/SCBuergel) (Sebastian C. Bürgel) +- [@seclorum](//github.com/seclorum) (seclorum) +- [@thelinuxkid](//github.com/thelinuxkid) (Andres Buritica) +- Thomas Gardner +- [@travisperson](//github.com/travisperson) (Travis Person) +- [@tv42](//github.com/tv42) (Tommi Virtanen) +- [@void4](//github.com/void4) +- [@WeMeetAgain](//github.com/WeMeetAgain) (Cayman) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@windemut](//github.com/windemut) +- [@wking](//github.com/wking) (W. Trevor King) +- [@xicombd](//github.com/xicombd) (Francisco Baio Dias) +- [@zignig](//github.com/zignig) (Simon Kirkby) + +Thanks, and see you next week! If you have cool things to share for the next weekly, drop us a line in the [next weekly sprint issue](//github.com/ipfs/pm/issues/83)! + +- Richard Littauer and Andrew Chin + +_Submit feedback about this issue [here](//github.com/ipfs/weekly/pull/14), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-004/README.md b/src/_blog/weekly-004/README.md new file mode 100644 index 00000000..59b97d65 --- /dev/null +++ b/src/_blog/weekly-004/README.md @@ -0,0 +1,113 @@ +--- +date: 2016-02-05 +url: /7-ipfs-weekly-4/ +tags: weekly +title: IPFS Weekly 4 +description: +author: Richard Littauer, Andrew Chin +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +Here are some of the highlights for the [January 25th](//github.com/ipfs/pm/issues/84) sprint: + +## Updates + +- [**js-ipfs**](//github.com/ipfs/js-ipfs): [@diasdavid](//github.com/diasdavid) and [@vijayee](//github.com/vijayee) created [js-ipfs-merkle-dag](//github.com/vijayee/js-ipfs-merkle-dag) and [js-ipfs-blocks](//github.com/ipfs/js-ipfs-blocks), which will help IPFS deal with [MerkleDAGs](https://github.com/ipfs/specs) and are extensible enough to allow others to build their own MerkleDAG structures. Also, js-ipfs is now able to import a file into the MerkleDAG, an important milestone. An architecture graph has been spec'ed out [here](https://github.com/ipfs/js-ipfs#ipfs-core-implementation-architecture) to help newcomers understand how js-ipfs works. Finally, lots of new issues and low-hanging fruit have been tagged for [contributors to tackle](//github.com/ipfs/js-ipfs/issues). + [**idb-plus-blob-store**](https://github.com/dignifiedquire/idb-plus-blob-store): The [substack/idb-blob-store](https://github.com/substack/idb-blob-store) had issues regarding emitting the `finish` event on the `createWritableStream` result due to internal issues in streams and the way `.end` is handled. So [@dignifiedquire](//github.com/dignifiedquire) wrote this module that fixes this and now allows us to test all parts of js-ipfs in the browser using IndexedDB as the storage. +- [**go-ipfs**](//github.com/ipfs/go-ipfs): Thanks to [@Kubuxu](//github.com/Kubuxu), dnslink was extended by dedicated subdomain (`_dnslink.`). This allows users to alias (using CNAME) their domain to gateway.ipfs.io while still being able to to set the dnslink to content they wish. Also, [@whyrusleeping](//github.com/whyrusleeping) has [an open PR](https://github.com/ipfs/go-ipfs/pull/2256) to pull libp2p out of go-ipfs and put it into a module on [gx](https://github.com/whyrusleeping/gx), the IPFS native package manager. This is part of a larger effort to whittle go-ipfs down into smaller, extensible modules. Finally, [@whyrusleeping](//github.com/whyrusleeping) did a clean up of the go-ipfs pull requests, closing all pull requests or pinging their authors for updates as needed. +- [**notes**](//github.com/ipfs/notes): [@noffle](//github.com/noffle) began a discussion about revamping the `ipfs mount` interface. Join in to voice your thoughts [here](//github.com/ipfs/notes/issues/105). +- [**community**](//github.com/ipfs/community): [@diasdavid](//github.com/diasdavid) has written a [guide to writing captain.logs](https://github.com/ipfs/community/blob/master/captain.log.md), which are short gists written by maintainers about IPFS projects, their status, and how to help. We plan to have more of these in different projects. + +## Community + +- [**Lisbon**](//github.com/ipfs/community/issues/103): [@diasdavid](//github.com/diasdavid) hosted a Lisbon IPFS Sunday Hack Day this week. A few people came, and [@xicombd](//github.com/xicombd) made [this Chrome Extension](https://chrome.google.com/webstore/detail/ipfs-station/kckhgoigikkadogfdiojcblegfhdnjei/related), which lets you access IPFS urls from your local IPFS daemon ([source code](https://github.com/xicombd/ipfs-chrome-station)). +- [**Coffee Talks**](https://www.youtube.com/watch?v=dL9siwm03H4): [@whyrusleeping](//github.com/whyrusleeping) has hosted another "Coffee Talk", this time on [gx](https://github.com/whyrusleeping/gx), the IPFS package manager. +- [**NYC Meet-up**](//github.com/ipfs/community/issues/102): A NYC meet-up is planned for the end of February. Help us plan it and show your interest [here](https://github.com/ipfs/community/issues/102). +- [**Desert Blockchain**](https://twitter.com/DesertBlockHack/status/693520940504784896): IPFS was presented at the last [Desert Blockchain](https://twitter.com/DesertBlockHack) miniconference. + +## Tools + +- There was an unfortunate GitHub outage and many people started using IPFS to move around their repos, with [@whyrusleeping](//github.com/whyrusleeping)'s simple [git-ipfs-rehost](https://github.com/whyrusleeping/git-ipfs-rehost) [(view on IPFS)](http://gateway.ipfs.io/ipfs/QmNxF69vkC53ZBgXKHXBRbDWk2ELJeP5ohbPXtdYRRUgmN/git-ipfs-rehost) and [@cryptix](//github.com/cryptix)'s excellent [git-remote-ipfs](https://github.com/cryptix/git-remote-ipfs) [(view on IPFS)](http://gateway.ipfs.io/ipfs/QmbUruSDckF2HqjEBhq3tbtmHjCRAseCFDSDqbWSWE7CoV/git-remote-ipfs). +- [@pipermerriam](//github.com/pipermerriam) created [ipfs-persistence-consortium](https://github.com/pipermerriam/ipfs-persistence-consortium) to create networks of IPFS nodes which persist each other's content. This is similar to [@victorbjelkholm](//github.com/victorbjelkholm)'s [pincoop](https://github.com/victorbjelkholm/pincoop). Perhaps there can be some cooperation in these efforts? 😎 +- The [FullNode](https://github.com/MrChrisJ/fullnode) Project -- which includes IPFS, Tor, Bitcoin, OpenVPN and more -- [is having a crowdfund](https://www.startjoin.com/protip2) -- go get one! Thanks for making it [@MrChrisJ](//github.com/MrChrisJ)! + +## Other + +- It was [Ralph Merkle's](https://en.wikipedia.org/wiki/Ralph_Merkle) birthday on February 2nd! He is the creator of the [Merkle tree](https://en.wikipedia.org/wiki/Merkle_tree), which are a crucial part of how IPFS works. Happy Birthday, Ralph! 🎂 +- Our friends at [Mine](http://mine.nyc) are using IPFS for the excellent [Mediachain metadata protocol](https://medium.com/mine-labs/introducing-mediachain-a696f8fd2035) ([protocol proposal here](https://medium.com/mine-labs/mediachain-483f49cbe37a#.h6wrzm3ze)), a protocol to track media creation, attribution, and more. They have published [several great articles](https://medium.com/mine-labs?source=logo-lo_8f8cb62ab817-6838e0c89092) about it. This week [@denisnazarov](//github.com/denisnazarov) wrote about [The GIF That Fell To Earth](https://medium.com/mine-labs/the-gif-that-fell-to-earth-eae706c72f1f#.s0c7x59he), and [@parkan](//github.com/parkan) gave a [Developer Update](https://medium.com/mine-labs/mediachain-developer-update-i-911c9e7a4524#.zc984cqen) that discusses [pHash](http://www.phash.org/), [IPLD](https://github.com/ipfs/specs/blob/ipld-spec/merkledag/ipld.md), and more. +- [@lexansoft](//github.com/lexansoft) created a new Ethereum name registrar called [EtherID](http://etherid.org) ([repo here](https://github.com/lexansoft/etherid.org)), which uses IPFS for storing users' content. Then [@btsfav](https://twitter.com/btsfav) wrote an article about [Personal Websites on EtherID with IPFS](http://favs.pw/time-for-some-interplanetary-etheral-magic/). + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between January 25th (noon, GMT) and February 1st. We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py), so please let us know if your name isn't here. + +- [@alexAubin](//github.com/alexAubin) (Alexandre Aubin) +- [@andreiamatuni](//github.com/andreiamatuni) (Andrei Amatuni) +- [@area](//github.com/area) +- [@AtnNn](//github.com/AtnNn) (Etienne Laurin) +- [@bdunlay](//github.com/bdunlay) (Brian Dunlay) +- [@BigBlueHat](//github.com/BigBlueHat) (BigBlueHat) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@ConsciousCode](//github.com/ConsciousCode) (Conscious Code) +- [@cryptix](//github.com/cryptix) (Henry) +- [@davidar](//github.com/davidar) (David A Roberts) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@dignifiedquire](//github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@dysbulic](//github.com/dysbulic) (Will Holcomb) +- [@eminence](//github.com/eminence) (Andrew Chin) +- [@fazo96](//github.com/fazo96) (Enrico Fasoli) +- [@GitCop](//github.com/GitCop) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) (Greenkeeper) +- [@harlantwood](//github.com/harlantwood) (Harlan T Wood) +- [@Hexagon6](//github.com/Hexagon6) +- [@IanCal](//github.com/IanCal) (Ian Calvert) +- [@ion1](//github.com/ion1) (Johan Kiviniemi) +- [@JAremko](//github.com/JAremko) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@jedahan](//github.com/jedahan) (Jonathan Dahan) +- [@kazarena](//github.com/kazarena) +- [@kpcyrd](//github.com/kpcyrd) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@lidel](//github.com/lidel) (Marcin Rataj) +- [@lockedshadow](//github.com/lockedshadow) +- [@Luzifer](//github.com/Luzifer) (Knut Ahlers) +- [@MartinThoma](//github.com/MartinThoma) (Martin Thoma) +- [@MichaelMure](//github.com/MichaelMure) (Michael Muré) +- [@mildred](//github.com/mildred) (Mildred Ki'Lya) +- [@mindhog](//github.com/mindhog) +- [@Mithgol](//github.com/Mithgol) +- [@mortonfox](//github.com/mortonfox) (Morton Fox) +- [@MrChrisJ](//github.com/MrChrisJ) (Chris Ellis) +- [@NDuma](//github.com/NDuma) (NDuma) +- [@NeoTeo](//github.com/NeoTeo) (Teo Sartori) +- [@nikhilshekhawat](//github.com/nikhilshekhawat) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@palesz](//github.com/palesz) (Palesz) +- [@Patagonicus](//github.com/Patagonicus) (Philipp Adolf) +- [@ralphbean](//github.com/ralphbean) (Ralph Bean) +- [@randomshinichi](//github.com/randomshinichi) +- [@rht](//github.com/rht) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@Shaaah](//github.com/Shaaah) (Shaaah) +- [@sivachandran](//github.com/sivachandran) (Sivachandran) +- [@slothbag](//github.com/slothbag) +- [@thelinuxkid](//github.com/thelinuxkid) (Andres Buritica) +- [@tilgovi](//github.com/tilgovi) (Randall Leeds) +- [@tommg](//github.com/tomgg) (Thomas Gardner) +- [@VertigoRay](//github.com/VertigoRay) (Raymond Piller) +- [@w33tmaricich](//github.com/w33tmaricich) (Alexander Maricich) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@whyun7892](//github.com/whyun7892) +- [@willeponken](//github.com/willeponken) (William Wennerström) +- [@willglynn](//github.com/willglynn) (Will Glynn) +- [@xicombd](//github.com/xicombd) (Francisco Baio Dias) + +Thanks, and see you next week! If you have cool things to share for the next weekly, drop us a line in the [next weekly sprint issue](//github.com/ipfs/pm/issues/88)! + +- Richard Littauer and Andrew Chin + +_Submit feedback about this issue [here](https://github.com/ipfs/weekly/pull/16), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-005/README.md b/src/_blog/weekly-005/README.md new file mode 100644 index 00000000..97c71da0 --- /dev/null +++ b/src/_blog/weekly-005/README.md @@ -0,0 +1,250 @@ +--- +date: 2016-03-04 +url: /10-ipfs-weekly-5/ +tags: weekly +title: IPFS Weekly 5 +description: +author: Richard Littauer, Andrew Chin +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +This weekly covers the last month. Here are some of the highlights for the February sprints! + +## Highlight + +![](https://cdn-images-1.medium.com/max/2000/1*czZJ7mvEAqL4wNAg-jt9Ow.jpeg) + +Our friends and users at ConsenSys wrote an excellent "[Introduction to IPFS](https://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0#.48ki3fymw)", which starts with a less-technical preface, and then dives deep into a full explanation of how the IPFS object model works. It walks through multiple examples, including directory structures, version control systems, and blockchains. This is a great post to familiarize yourself with how the low level IPFS objects work, with graph visualizations and in-depth explanations. It also features a fantastic cover image! Thanks [@ChrisLundkvist](https://twitter.com/ChrisLundkvist) and [@ConsenSysAndrew](https://twitter.com/ConsenSysAndrew)! + +## Updates + +#### [**go-ipfs**](//github.com/ipfs/go-ipfs) + +- [@lgierth](//github.com/lgierth) improved the automated [docker image](https://github.com/ipfs/go-ipfs/pull/2308) for go-ipfs, which is now named `ipfs/go-ipfs`. Give it a try: `docker run -i --net=host ipfs/go-ipfs`. The new image is built automatically for every commit, and has automatic tags for the coming releases. It's also a few MB smaller, and doesn't require mounting a volume for the IPFS repository anymore. Instead, if there's no volume mounted, it'll generate an ephemeral identity and configuration which will be lost when the container exits. This is ideal for testing or just trying something out real quick. Images for go-ipfs 0.3.x are not provided, because the Dockerfile shipped with these version isn't suitable for Docker Hub automatic builds. +- [@noffle](//github.com/noffle), [@whyrusleeping](//github.com/whyrusleeping) and [@chriscool](//github.com/chriscool) have been improving the test suite, fixing flaky tests which used to fail inaccurately. This will let us merge PRs faster, as CI should correctly categorize success and failure. +- [@noffle](//github.com/noffle) also made progress toward getting `go-ipfs` compatible with vanilla `go get` installation. Hope to have more tangible results to show by end of the month. +- [@RichardLitt](//github.com/RichardLitt) made a lot of documentation fixes to the CLI while working on the IPFS HTTP API. +- [@chriscool](//github.com/chriscool) rewrote [the build documentation for Windows](//github.com/ipfs/go-ipfs/blob/master/docs/windows.md), which enabled [@slothbag](//github.com/slothbag) to get Windows builds working again with minimal fuss. +- [@lgierth](//github.com/lgierth) posted a writeup on the [migration from 0.3.x to 0.4.0](https://ipfs.io/blog/9-v04x-migration/). +- [@noffle](//github.com/noffle) improved FUSE connection termination. + +#### [**GX**](//github.com/whyrusleeping) + +[@whyrusleeping](//github.com/whyrusleeping) shipped a PR that introduces the use of a tool called `gx`, for vendoring our project dependencies. Previously we used godeps, and saved all of the code required indirectly to build ipfs in the go-ipfs repository itself. This was very difficult to work with for a few different reasons, first off, it made the size of the repository bloat way more than the original size of our codebase, causing clones to take longer, and making CI slower all around. Second, updating these dependencies was a hassle: this was partially the fault of go's poor package management choices and partially that we found godeps UX to be unfriendly. To solve the problem, [@whyrusleeping](//github.com/whyrusleeping) create gx. Gx is a package management tool based on ipfs. Package references are all hashes linked in a merkletree, and resolving all the dependencies of a given project is as easy as an ipfs fetch. Now that we are using gx, the main go-ipfs repo is much smaller, dependencies can be easily fetched and installed (and shared across projects), and we also get to essentially bootstrap ipfs with ipfs. + +From the average users perspective, there are a few small changes; `go get` is no longer a viable way to install ipfs, and users will now need to run `make install` as is common on other large golang projects (docker and kubernetes among them). You can read more about gx over here at its repo: [github.com/whyrusleeping/gx](//github.com/whyrusleeping/gx) and about gx-go (the subtool of gx specifically for go) here: [github.com/whyrusleeping/gx-go](//github.com/whyrusleeping/gx-go). + +[@RichardLitt](//github.com/RichardLitt) improved the `gx` README document to better explain its goals, and help people get started. Take a look and give us feedback through an issue if you think anything could be improved. + +#### [**ipns-pub**](//github.com/whyrusleeping/ipns-pub) + +[@whyrusleeping](//github.com/whyrusleeping) wrote a tool called `ipns-pub` to allow people to publish IPNS entries to the network without actually running a node. You can generate keypairs with [ipfs-key](//github.com/whyrusleeping/ipfs-key) and then use those keys to publish any ipfs path you like. Be aware though that entries published with this tool expire every 24 hours, so to keep them alive on the network, the tool has a `--daemon` option that will republish your entry every twelve hours automatically. + +#### [**specs**](//github.com/ipfs/specs/pull/37) + +The IPLD spec was merged, after months of thoughtful design. The bulk of the work was achieved by [@mildred](//github.com/mildred) and [@jbenet](//github.com/jbenet), with lots of comments and design opinions from many other contributors. The [IPLD spec](https://github.com/ipfs/specs/blob/master/merkledag/ipld.md). The "thin-waist" Merkle DAG format, defines merkle-links, -dags, and -paths, as well as the IPLD Data model and formats. In short: JSON documents with named merkle-links that can be traversed. Stay tuned for more information in the future. + +#### [**http-api-spec**](//github.com/ipfs/http-api-spec) + +[@RichardLitt](//github.com/RichardLitt) finished logging all existing `ipfs` commands for the HTTP API Spec. This means that if you have any questions about how the HTTP API should work, you can see them either in master or as open PRs to that issue. If you are interested in how the HTTP API should work, or have any specific questions, please see the [current version](//github.com/ipfs/http-api-spec/blob/master/apiary.apib), and explore the [open PRs](https://github.com/ipfs/http-api-spec/pulls) on that repo. + +#### [**distributions**](//github.com/ipfs/distributions) + +[dist.ipfs.io](http://dist.ipfs.io/) _almost_ has [signed releases](https://github.com/ipfs/distributions/pull/51) thanks to [@dignifiedquire](//github.com/dignifiedquire). This will be coming soon. + +#### [**js-ipfs**](//github.com/ipfs/js-ipfs) + +Thanks to [@diasdavid](//github.com/diasdavid), the DAG object manipulation commands now work, with tests and all. As well, thanks to [@dignifiedquire](//github.com/dignifiedquire)'s efforts, the js-ipfs API now returns promises if there isn't a specified callback, allowing both major methods used by the Javascript community to work equally well. + +#### [**registry-mirror**](//github.com/diasdavid/registry-mirror) + +[@diasdavid](//github.com/diasdavid) improved [registry-mirror](//github.com/diasdavid/registry-mirror) performance and robustness by removing the dependency on registry-static. The few necessary parts were copied in. This is a huge step in reliability and performance cloning the registry with registry-mirror. + +#### [**station**](//github.com/ipfs/station) + +[@dignifiedquire](//github.com/dignifiedquire) fixed drag and drop +file uploading, and some dependency issues. So go ahead and try it +out. + +#### [**ipfs-geoip**](//github.com/ipfs/ipfs-geoip) + +[@dignifiedquire](//github.com/dignifiedquire) rewrote the generation +script and cleaned up the code so that now the data is consistently +reproducible and fully stored on IPFS. This ensures that geoip lookups +over IPFS will work in all future releases. + +#### [**fs-repo-migrations**](//github.com/ipfs/fs-repo-migrations) + +[@chriscool](//github.com/chriscool) improved important tests for fs-repo-migrations -- tests verify more edge cases when migrating forward and backward, through various sample workloads. + +#### [**ipfs-hyperlog**](//github.com/noffle/ipfs-hyperlog) + +[@noffle](//github.com/noffle) built `ipfs-hyperlog`, and ipfs-compatible fork of hyperlog, a DAG that replicates based on scuttlebutt logs and causal linking. `ipfs-hyperlog` is a drop-in replacement for [@mafintosh](https://github.com/mafintosh)'s [`hyperlog`](https://github.com/mafintosh/hyperlog). Its key difference is that it creates a Merkle DAG that is _binary compatible_ with IPFS objects. This means any node of any DAG built using ipfs-hyperlog can be replicated to and from the IPFS network as well! + +#### [**Logo**](//github.com/ipfs/logo) + +[@Kubuxu](//github.com/Kubuxu) worked on a new [IPFS logo](https://ipfs.io/ipfs/QmTgtbb4LckHaXh1YhpNcBu48cFY8zgT1Lh49q7q7ksf3M/). Check it out. + +## Community + +- If you have any suggestions for conferences, there is a [new issue](https://github.com/ipfs/community/issues/105) where you can submit your proposals. The IPFS community will see if we can get to that conference and have a presence there. +- We now have [a list of community events](https://github.com/ipfs/community#events-calendar) for IPFS on the ipfs/community README. Do you have any that you'd like to add? Check out past events, too. +- [@RichardLitt](//github.com/RichardLitt) proposed using the new [GitHub Templates](//github.com/ipfs/community/issues/108) for IPFS. What do you think about this idea? Chime in [here](https://github.com/ipfs/community/issues/108). + +## IPFS In The Wild + +- [**Marmot Image Checker**](https://github.com/eris-ltd/marmot): This takes an image, asks the Google Cloud Vision API for three descriptions of the image, and compares those descriptions to a chosen list of words. If there is match, the image is added to the [toadserver](https://github.com/eris-ltd/toadserver), a smart contract and IPFS-Backed download server. [From Twitter](https://twitter.com/asciinema/status/701730719589126146) +- [**asciienema**](https://github.com/asciinema/asciinema/releases/tag/v1.2.0) now allows playback on IPFS. [From Twitter](https://twitter.com/asciinema/status/701730719589126146) + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between February 1st (noon, GMT) and February 29th. We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py) and [this other tool](//github.com/richardlitt/name-your-contributors), so please let us know if your name isn't here. + +- [@abacon](//github.com/abacon) (Bacon) +- [@almereyda](//github.com/almereyda) (jon r) +- [@amstocker](//github.com/amstocker) (Andrew Stocker) +- [@anacrolix](//github.com/anacrolix) (Matt Joiner) +- [@anarcat](//github.com/anarcat) (anarcat) +- [@Ape](//github.com/Ape) (Lauri Niskanen) +- [@area](//github.com/area) +- [@ARezaK](//github.com/ARezaK) +- [@Asgraf](//github.com/Asgraf) (Michal Turek) +- [@Balancer](//github.com/Balancer) (Balancer) +- [@balupton](//github.com/balupton) (Benjamin Lupton) +- [@bierlingm](//github.com/bierlingm) +- [@BigBlueHat](//github.com/BigBlueHat) (BigBlueHat) +- [@boergsen](//github.com/boergsen) +- [@boxxa](//github.com/boxxa) (Boxxa) +- [@briantigerchow](//github.com/briantigerchow) (Brian Tiger Chow) +- [@brimstone](//github.com/brimstone) (Matt) +- [@bussiere](//github.com/bussiere) (bussiere) +- [@bzz](//github.com/bzz) (Alexander) +- [@chpio](//github.com/chpio) +- [@chris-martin](//github.com/chris-martin) (Christopher Martin) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@christianlundkvist](//github.com/christianlundkvist) (Christian Lundkvist) +- [@ChristopherA](//github.com/ChristopherA) (Christopher Allen) +- [@cjcase](//github.com/cjcase) (Cj Case) +- [@cleichner](//github.com/cleichner) (Chas) +- [@codeburd](//github.com/codeburd) +- [@Crest](//github.com/Crest) (Crest) +- [@cryptix](//github.com/cryptix) (Henry) +- [@daveajones](//github.com/daveajones) (Dave Jones) +- [@David-Leudolph](//github.com/David-Leudolph) (David Leudolph) +- [@david415](//github.com/david415) (David Stainton) +- [@davidar](//github.com/davidar) (David A Roberts) +- [@denisnazarov](//github.com/denisnazarov) (Denis Nazarov) +- [@dginev](//github.com/dginev) (Deyan Ginev) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@dignifiedquire](//github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@djdv](//github.com/djdv) (Dominic Della Valle) +- [@dominictarr](//github.com/dominictarr) (Dominic Tarr) +- [@Dumptel](//github.com/Dumptel) +- [@dylanPowers](//github.com/dylanPowers) (Dylan Powers) +- [@edent](//github.com/edent) (Terence Eden) +- [@ehd](//github.com/ehd) (Stephan Seidt) +- [@EliasGabrielsson](//github.com/EliasGabrielsson) (Elias Gabrielsson) +- [@emardee](//github.com/emardee) +- [@eminence](//github.com/eminence) (Andrew Chin) +- [@faebser](//github.com/faebser) (Fabian Frei) +- [@fazo96](//github.com/fazo96) (Enrico Fasoli) +- [@Fil](//github.com/Fil) (Fil) +- [@frabrunelle](//github.com/frabrunelle) (Francis Brunelle) +- [@GitCop](//github.com/GitCop) +- [@GravisZro](//github.com/GravisZro) (Gravis) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) (Greenkeeper) +- [@halseth](//github.com/halseth) +- [@harlantwood](//github.com/harlantwood) (Harlan T Wood) +- [@hitchcott](//github.com/hitchcott) (Chris Hitchcott) +- [@hosh](//github.com/hosh) (Ho-Sheng Hsiao) +- [@hutenosa](//github.com/hutenosa) +- [@IanCal](//github.com/IanCal) (Ian Calvert) +- [@ianopolous](//github.com/ianopolous) (Ian Preston) +- [@ingokeck](//github.com/ingokeck) (Ingo Keck) +- [@insanity54](//github.com/insanity54) (Chris Grimmett) +- [@ion1](//github.com/ion1) (Johan Kiviniemi) +- [@j-h-scheufen](//github.com/j-h-scheufen) +- [@j4nu5](//github.com/j4nu5) (Kushagra Sinha) +- [@jamescarlyle](//github.com/jamescarlyle) (James Carlyle) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@jbshirk](//github.com/jbshirk) (Joe) +- [@jedahan](//github.com/jedahan) (Jonathan Dahan) +- [@jeffscottward](//github.com/jeffscottward) (Jeff Ward) +- [@jefft0](//github.com/jefft0) (Jeff Thompson) +- [@johncant](//github.com/johncant) (John Cant) +- [@kalmi](//github.com/kalmi) (Tarnay Kálmán) +- [@Kolomona](//github.com/Kolomona) (Kolomona Myer) +- [@krl](//github.com/krl) (kristoffer) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@kyledrake](//github.com/kyledrake) (Kyle Drake) +- [@kyrias](//github.com/kyrias) (Johannes Löthberg) +- [@lamarpavel](//github.com/lamarpavel) +- [@lernisto](//github.com/lernisto) (Terrel Shumway) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@lidel](//github.com/lidel) (Marcin Rataj) +- [@lockedshadow](//github.com/lockedshadow) +- [@lovelaced](//github.com/lovelaced) +- [@mappum](//github.com/mappum) (ᴍᴀᴛᴛ ʙᴇʟʟ) +- [@matshenricson](//github.com/matshenricson) (Mats Henricson) +- [@MichaelMure](//github.com/MichaelMure) (Michael Muré) +- [@micxjo](//github.com/micxjo) (Micxjo Funkcio) +- [@mildred](//github.com/mildred) (Mildred Ki'Lya) +- [@mindhog](//github.com/mindhog) +- [@Mithgol](//github.com/Mithgol) +- [@mnp](//github.com/mnp) (Mitchell Perilstein) +- [@montagsoup](//github.com/montagsoup) +- [@MrChrisJ](//github.com/MrChrisJ) (Chris Ellis) +- [@mseri](//github.com/mseri) +- [@NDuma](//github.com/NDuma) (NDuma) +- [@nginnever](//github.com/nginnever) (Nathan Ginnever) +- [@NightRa](//github.com/NightRa) (Ilan Godik) +- [@NodeGuy](//github.com/NodeGuy) (David Braun) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@odipar](//github.com/odipar) (rapido) +- [@olizilla](//github.com/olizilla) (Oli Evans) +- [@palesz](//github.com/palesz) (Palesz) +- [@palkeo](//github.com/palkeo) (palkeo) +- [@parkan](//github.com/parkan) (Arkadiy Kukarkin) +- [@peerchemist](//github.com/peerchemist) +- [@pietsch](//github.com/pietsch) (Christian Pietsch) +- [@prusnak](//github.com/prusnak) (Pavol Rusnak) +- [@randomshinichi](//github.com/randomshinichi) +- [@reit-c](//github.com/reit-c) +- [@rethore](//github.com/rethore) (Pierre-Elouan Réthoré) +- [@rht](//github.com/rht) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@richardschneider](//github.com/richardschneider) (Richard Schneider) +- [@rsynnest](//github.com/rsynnest) +- [@rubiojr](//github.com/rubiojr) (Sergio Rubio) +- [@rwcarlsen](https://github.com/rwcarlsen) (Robert Carlsen) +- [@se3000](//github.com/se3000) (Steve Ellis) +- [@Shaaah](//github.com/Shaaah) (Shaaah) +- [@shtukas](//github.com/shtukas) (Pascal Honoré) +- [@sivachandran](//github.com/sivachandran) (Sivachandran) +- [@sleep-walker](//github.com/sleep-walker) (Tomáš Čech) +- [@slothbag](//github.com/slothbag) +- [@Stebalien](//github.com/Stebalien) (Steven Allen) +- [@suisha](//github.com/suisha) (David Mai) +- [@tcyrus](//github.com/tcyrus) (Timothy Cyrus) +- [@thelinuxkid](//github.com/thelinuxkid) (Andres Buritica) +- [@tidux](//github.com/tidux) (Todixu) +- [@tinybike](//github.com/tinybike) (Jack Peterson) +- [@tomgg](//github.com/tomgg) (tmg) +- [@tv42](//github.com/tv42) (Tv) +- [@void4](//github.com/void4) +- [@wanderer](//github.com/wanderer) +- [@wasserfuhr](//github.com/wasserfuhr) (RainerWasserfuhr) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@xicombd](//github.com/xicombd) (Francisco Baio Dias) +- [@yangwao](//github.com/yangwao) (Matej Nemček) +- [@zignig](//github.com/zignig) (Simon Kirkby) +- [@Zogg](//github.com/Zogg) + +This newsletter is also a community effort. If you have cool things to share for the next weekly, drop a comment about it in [the weekly repo](//github.com/ipfs/weekly! The more people mention items they want to see in the weekly there, the easier it is to make this and send it out. + +- Richard Littauer and Andrew Chin + +_Submit feedback about this issue [here](//github.com/ipfs/weekly/issues/10), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/8)._ diff --git a/src/_blog/weekly-006/README.md b/src/_blog/weekly-006/README.md new file mode 100644 index 00000000..4f599066 --- /dev/null +++ b/src/_blog/weekly-006/README.md @@ -0,0 +1,193 @@ +--- +date: 2016-03-09 +url: /11-ipfs-weekly-6/ +tags: weekly +title: IPFS Weekly 6 +description: +author: Richard Littauer, Andrew Chin +--- + +[IPFS](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](https://github.com/ipfs) or join us on [IRC](https://webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +Here are some of the highlights for the [first week of March](https://github.com/ipfs/pm/issues/93): + +## Updates + +#### [**station**](https://github.com/ipfs/station) + +![Station](https://ipfs.io/ipfs/QmZV7iGTu91w1YePo1EG98siCPxPFrw9Uzf7wAmARusET5) + +The new version of [station](https://github.com/ipfs/station) is ready for developer preview! `station` is one of the easiest ways to get an IPFS daemon running on your machine. It acts as a service and you get many convenient features, such as the ability to turn an IPFS node on through a GUI and drag and drop to share through IPFS. To try it out, you need Node.js 4 ([installation instructions here](https://nodejs.org/en/)) and npm 3 (which comes with Node) installed. Then, do the following: + +``` +> git clone https://github.com/ipfs/station.git && cd station +> npm install +> npm start +``` + +#### [**website**](https://github.com/ipfs/website) + +The list of [API Commands](https://ipfs.io/docs/commands/) on the website has been updated. This provides a single place to look through all of the CLI commands for go-ipfs, at once; it is a good reference point if you're not sure exactly which command to use next, and `ipfs commands` seems sparse. + +#### **AUR** + +[@Kubuxu](https://github.com/Kubuxu) has made sure that `gx`, `gx-go`, and `ipget` are available on [AUR](https://aur.archlinux.org), the arch-linux user repository. This means that it will be easier to get and install these on some linux platforms. + +#### [**karma-peer**](https://github.com/dignifiedquire/karma-peer) + +[@dignifiedquire](https://github.com/dignifiedquire)'s work on [karma-peer](https://github.com/dignifiedquire/karma-peer) means that it now has the ability to dynamically launch browsers, which will help [@diasdavid](https://github.com/diasdavid) (and hopefully more people!) write better tests for P2P browser applications. See an example of some tests, [here](https://github.com/dignifiedquire/karma-peer/blob/master/test/index.spec.js). You can also read [the discussion](https://github.com/diasdavid/piri-piri#why-does-it-exist) that lead to this module and the original tool to test P2P browser applications. + +#### [**randor**](http:https://github.com/dignifiedquire/randor) + +[@dignifiedquire](https://github.com/dignifiedquire) has been working on [randor](http:https://github.com/dignifiedquire/randor), a testing framework that will be able to send huge files and lots of requests into IPFS in order to test how it works for edge cases and how it scales. Randor is now able to rerun tests predictably based on stored data, so it's easy to find and fix bugs. [@whyrusleeping](https://github.com/whyrusleeping) is already working on the first bug that randor detected. To contribute, check out the repository. + +#### [**WebRTC Explorer**](https://github.com/diasdavid/webrtc-explorer) + +WebRTC Explorer 2.0.0 has been alpha released! WebRTC Explorer is a P2P Routing Overlay Network, using WebRTC Data Channels as the transportation layer between nodes. WebRTC Explorer enables communication between browsers without needing mediators (servers), enabling users to route packets between machines, using only Web technologies. WebRTC Explorer is inspired by the Chord DHT, to create a routing scheme with finger tables that are evenly balanced across nodes. [@diasdavid](https://github.com/diasdavid) wrote up a more extensive [blog post here](http://blog.daviddias.me/2016/02/28/webrtc-explorer-2-0-0-alpha-release), and has an introductory video [here](https://youtu.be/fNQGGGE__zI). + +#### [**libp2p**](https://github.com/diasdavid/js-libp2p) + +[@diasdavid](https://github.com/diasdavid) released versions of two modules for stream multiplexing: [libp2p-spdy](https://github.com/diasdavid/js-libp2p-spdy) and [libp2p-multiplex](https://github.com/diasdavid/js-libp2p-multiplex). As well, [libp2p-swarm](https://github.com/diasdavid/js-libp2p-swarm) has a new API, more tests, less magic, and more flexibility. There is an open PR to track these changes; if you'd like to get involved, [follow it](https://github.com/diasdavid/js-libp2p-swarm/pull/20). + +#### [**js-ipfs**](https://github.com/ipfs/js-ipfs) + +Some of you have been asking about ways to contribute to the JavaScript implementation of IPFS: well, wait no more! Now you can read the latest [captain.log](https://github.com/ipfs/js-ipfs/issues/30#issuecomment-187950929) entry and learn about the state of the project and have a list of issues of things that you can contribute. We appreciate all your help. + +#### **ipfs-pad** + +We want to build an Etherpad-like product on top of IPFS. There's a lot of +technical ground to cover to do this: how do we know how to sort edits? How do +we deal with high latencies (days/weeks), or with simultaneous edits? How is the +data transported? [@noffle](https://github.com/noffle) has been spearheading the process behind building +this, and this week made a host of modules to resolve some of its dependencies: + +- [bisecting-numbers](https://github.com/noffle/bisecting-numbers) - + Integer-like number system where any number can be bisected to form infinite + integer subsystems. +- [bisecting-between](https://github.com/noffle/bisecting-between) - Produces a + unique value that sorts between two other given values. +- [hyperswarm](https://github.com/noffle/hyperswarm) - Create a p2p webrtc swarm + around a [hyperlog](https://github.com/mafintosh/hyperlog). + +(He also wrote a little [README +generator](https://github.com/noffle/generate-readme) to help him out with his +JS module READMEs.) + +#### **pubsub** + +[@noffle](https://github.com/noffle) also published a couple of early mad science modules that enable a +peer-to-peer overlay network for gossip-based message exchange. These aren't +strictly built for IPFS, but are an experimental shim to enable projects like +[@haad](https://github.com/haad)'s [orbit-db](https://github.com/haadcode/orbit-db) to operate without a +central server for message exchange between peers. + +- [secure-gossip](https://github.com/noffle/secure-gossip) - Secure, transport + agnostic, message gossip protocol. Any peer in the network can publish + messages, which will eventually propagate to the entire network via rounds of + gossip between each node's peers. +- [pubsub-swarm](https://github.com/noffle/pubsub-swarm) - Form a p2p swarm of + nodes around a topic and exchange messages, with a traditional pubsub API. + +#### [**go-ipfs**](https://github.com/ipfs/go-ipfs) + +[@whyrusleeping](https://github.com/whyrusleeping) set up [Teamcity](https://www.jetbrains.com/teamcity/). This cuts down on the long waits for Travis to run, and hopefully will mean faster CI tests. Teamcity also gives us awesome metrics on our tests and nice statistics on failures and failure rates. Teamcity has nice integration with a large array of test runners, from go tests to karma and sharness. It will give us more detailed feedback about our test runs, even when successful. + +#### [**fc00**](https://github.com/fc00/spec) + +![lgierth in Paris](https://ipfs.io/ipfs/QmYBv9R3nHMm8XnTHuNhFDJeQxSE9g3G4edpL13eAje3Cc) + +[@lgierth](https://github.com/lgierth) spent a productive week in Paris, and chatted with [@cjdelisle](https://github.com/cjdelisle) and [@ansuz](https://github.com/ansuz) at [@xwiki](https://twitter.com/xwiki) about the state and future of cjdns/fc00, layed out ideas for routing improvements, and drafted spec documents for the switch and cryptoauth layers. You can find those specs [here](https://github.com/fc00/spec/pulls) (they'll be updated soon). Work will continue on these for the rest of March. The switch and routing layers of fc00 might be the foundation of a smarter swarm for IPFS/libp2p, so this is all very exciting. + +## Community + +#### [**name-your-contributors**](https://github.com/RichardLitt/name-your-contributors) + +[@RichardLitt](https://github.com/RichardLitt) gave a talk at [BostonJS](http://bostonjs.com/) on Thursday to around fifty people, about how the `name-your-contributors` module is used in this newsletter. The theme of the meetup was community building; if you have any ideas for improving the Contributor list below, check out [this repository](github.com/RichardLitt/name-your-contributors) and let us know. Since the talk, [@RichardLitt](https://github.com/RichardLitt) also added [get-pr-creators](https://github.com/RichardLitt/get-pr-creators) to the module, so that everyone who opens a PR (even if it isn't merged) gets added to the contributors list. Has your name been included? + +#### **dignifed hacks** + +[@dignifiedquire](https://github.com/dignifiedquire) launched a live-stream of him coding, which he is calling "dignified hacks". Last Monday he recorded himself doing a new feature for the [WebUI](https://github.com/ipfs/webui) in the first episode. He'll do another one this week. One of the viewers, [@nginnever](https://github.com/nginnever), said it "was helpful for a quick view of our components and data flow in the webui." He will announce regular showtimes on [Twitter](https://twitter.com/dignifiedquire) and you can subscribe to [IPFS on YouTube](https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew) where future episodes will be hosted. + +#### [**Lisbon Blockchain Workshop**](http://www.meetup.com/Lisbon-blockchain) + +[@diasdavid](https://github.com/diasdavid) participated on the last Lisbon Blockchain Workshop on March 5, hosted by Kwamecorp. The workshop gathered many Blockchain, IPFS, ethereum and zerocash enthusiasts that were organized in working groups to build solutions with these distributed technologies. + +#### [IPFS Dead drop](https://github.com/c-base/ipfs-deaddrop) + +![cbase deadrop](https://ipfs.io/ipfs/QmTK8Djb6hFfHD3hGLv4w3RRYsZXLsTkQ4hYzXuM7ba3Sk 'Photo taken and cropped from https://www.flickr.com/photos/bergie/24769765569/in/datetaken-public/') + +Some members of [c-base](http://www.c-base.org/) have written a dead drop-like system that automatically uploads files from a USB memory stick to IPFS. When you plug a USB memory into the device, it will automatically access the memory stick and publish all the files on the web. Thanks to IPFS the files are instantly available to the whole world. Check out [deaddrops.com](https://deaddrops.com/) for more information about dead drops. + +They also have an installation available: the node is run in the above device. When you plug it in, you get to [see this](https://www.flickr.com/photos/bergie/24857415123/in/datetaken-public/), too. If you're in Berlin or visiting soon, make sure to drop by. + +#### Interplanetary Wayback (IPWB) + +At [Archives Unleashed](https://artsweb.uwaterloo.ca/archivesunleashed/), a Web Archive Hackathon in Toronto, [Mat Kelly](https://twitter.com/machawk1) (@machawk1) and [Sawood Alam](https://twitter.com/ibnesayeed) (@ibnesayeed) from [ODU WSDL Research Group](https://github.com/oduwsdl) developed an IPFS based distributed and persistent archive replay system called [Interplanetary Wayback](https://github.com/oduwsdl/ipwb). + +#### **Science Data** + +@jbenet visited the [Janelia Research Campus](https://www.janelia.org) to learn about scientific data tools and use cases. He gave a talk about IPFS, data versioning, package management, and more (video forthcoming). He learned about [DVID](https://github.com/janelia-flyem/dvid), and the requirements of the amazing [FlyEM brain imaging effort](https://www.janelia.org/project-team/flyem). He got to see many fantastic open source research tools made by the [FlyEM Team](https://www.janelia.org/project-team/flyem) ([github](https://github.com/janelia-flyem)), the [Freeman Lab](http://thefreemanlab.com/) ([github](https://github.com/freeman-lab)), and other groups. Go check out their GitHub repos, and help them improve brain research! + +#### **Press** + +[Jeff Smith](http://www.sitepoint.com/author/jeffsmith/) of Sitepoint released a great article on IPFS: ["HTTP vs IPFS: is Peer-to-Peer Sharing the Future of the Web?"](http://www.sitepoint.com/http-vs-ipfs-is-peer-to-peer-sharing-the-future-of-the-web/). + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between February 29th (noon, GMT) and March 7th. We're autogenerating this list using [this tool](https://github.com/ipfs/weekly/blob/master/tools/get_commits.py) and [this other tool](https://github.com/richardlitt/name-your-contributors), so please let us know if your name isn't here. + +- [@adrian-bl](https://github.com/adrian-bl) (Adrian Ulrich) +- [@amstocker](https://github.com/amstocker) (Andrew Stocker) +- [@anarcat](https://github.com/anarcat) (anarcat) +- [@Beligertint](https://github.com/Beligertint) +- [@bergie](https://github.com/bergie) (Henri Bergius) +- [@cevin](https://github.com/cevin) (cevin) +- [@chriscool](https://github.com/chriscool) (Christian Couder) +- [@cinderblock](https://github.com/cinderblock) (Cameron Tacklind) +- [@clkao](https://github.com/clkao) (Chia-liang Kao) +- [@daveajones](https://github.com/daveajones) (Dave Jones) +- [@davidar](https://github.com/davidar) (David A Roberts) +- [@diasdavid](https://github.com/diasdavid) (David Dias) +- [@dignifiedquire](https://github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@greenkeeperio-bot](https://github.com/greenkeeperio-bot) (Greenkeeper) +- [@hjoest](https://github.com/hjoest) (Holger Joest) +- [@jbenet](https://github.com/jbenet) (Juan Benet) +- [@jedahan](https://github.com/jedahan) (Jonathan Dahan) +- [@knocte](https://github.com/knocte) (Andres G. Aragoneses) +- [@Kolomona](https://github.com/Kolomona) (Kolomona Myer) +- [@Kubuxu](https://github.com/Kubuxu) (Jakub Sztandera) +- [@lgierth](https://github.com/lgierth) (Lars Gierth) +- [@mappum](https://github.com/mappum) (ᴍᴀᴛᴛ ʙᴇʟʟ) +- [@mattseh](https://github.com/mattseh) +- [@MichaelMure](https://github.com/MichaelMure) (Michael Muré) +- [@micxjo](https://github.com/micxjo) (Micxjo Funkcio) +- [@mildred](https://github.com/mildred) (Mildred Ki'Lya) +- [@moritz121](https://github.com/moritz121) +- [@NeoTeo](https://github.com/NeoTeo) (Teo Sartori) +- [@Neurone](https://github.com/Neurone) (Giuseppe Bertone) +- [@nginnever](https://github.com/nginnever) (Nathan Ginnever) +- [@noffle](https://github.com/noffle) (Stephen Whitmore) +- [@peteygao](https://github.com/peteygao) (Peter Gao) +- [@randomshinichi](https://github.com/randomshinichi) +- [@RichardLitt](https://github.com/RichardLitt) (Richard Littauer) +- [@richardschneider](https://github.com/richardschneider) (Richard Schneider) +- [@sivachandran](https://github.com/sivachandran) (Sivachandran) +- [@suisha](https://github.com/suisha) (David Mai) +- [@thelinuxkid](https://github.com/thelinuxkid) (Andres Buritica) +- [@tinybike](https://github.com/tinybike) (Jack Peterson) +- [@whyrusleeping](https://github.com/whyrusleeping) (Jeromy Johnson) +- [@xicombd](https://github.com/xicombd) (Francisco Baio Dias) +- [@yangwao](https://github.com/yangwao) (Matej Nemček) +- [@yncyrydybyl](https://github.com/yncyrydybyl) (Yan Minagawa) +- [@zignig](https://github.com/zignig) (Simon Kirkby) +- [@Zogg](https://github.com/Zogg) + +This newsletter is also a community effort. If you have cool things to share for the next weekly, drop a comment about it in [the weekly repo](https://github.com/ipfs/weekly)! The more people mention items they want to see in the weekly there, the easier it is to make this and send it out. + +Thanks, and see you next week! + +- Richard Littauer and Andrew Chin + +_Submit feedback about this issue [here](https://github.com/ipfs/weekly/issues/24), or send us [feedback about the IPFS Weekly in general](https://github.com/ipfs/weekly/issues/8)._ diff --git a/src/_blog/weekly-007/README.md b/src/_blog/weekly-007/README.md new file mode 100644 index 00000000..fbc81d9d --- /dev/null +++ b/src/_blog/weekly-007/README.md @@ -0,0 +1,158 @@ +--- +date: 2016-03-17 +url: /12-ipfs-weekly-7/ +tags: weekly +title: IPFS Weekly 7 +description: +author: Richard Littauer, Andrew Chin +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +Here are some of the highlights for the [second week of March](//github.com/ipfs/pm/issues/97): + +## Updates + +### [Orbit](//github.com/haadcode/orbit) + +[Orbit](//github.com/haadcode/orbit), a distributed, peer-to-peer chat application built on IPFS, is back in active development and going through a major code base overhaul. It now uses [orbit-db](//github.com/haadcode/orbit-db) as it's database layer. [orbit-db](//github.com/haadcode/orbit-db) is a KV-store and Event Log on top of IPFS which allows developers to use IPFS as a database. Last week orbit-db got big performance and stability improvements and is now using CRDTs for eventual consistency. + +### [Go-IPFS](//github.com/ipfs/go-ipfs) + +A nasty bug in our networking code was fixed this week. An issue in yamux (our primary stream multiplexer) would cause code to hang when opening a new stream if there were too many in flight stream opens. As a result of this, large file transfers (`ipfs refs -r`, `ipfs get`, and so on) would hang. + +IPFS 0.4.0 is now very close to shipping, we ran [@dignifiedquire](//github.com/@dignifiedquire)'s [randor](//github.com/dignifiedquire/randor) tool quite extensively and are more confident in the repo operations that have changed since 0.3.11. The release now has a [somewhat short checklist of things](//github.com/ipfs/go-ipfs/issues/2334#issuecomment-195046511) that are blocking the official release. + +As a small side project, [@whyrusleeping](//github.com/@whyrusleeping) started benchmarking each of our possible datastore implementations with [ds-bench](//github.com/whyrusleeping/ds-bench). The results will help us improve the performance of our storage moving forward. On that same topic, he started an experiment in new and exciting datastores and wrote a [datastore implementation](//github.com/whyrusleeping/sql-datastore) that can be backed by a sql database. [@whyrusleeping](//github.com/@whyrusleeping) then spun up a postgresql database (from docker) and ran the benchmarks against it, without any sort of tuning the [initial performance metrics](https://gist.github.com/whyrusleeping/55e2759dfa4b5b60a2cf) showed that it was around three time as fast as our current on-disk datastore. (Note: the metrics are simply testing the performance of writing random 256k binary blobs to each datastore). + +### [js-multiaddr](//github.com/jbenet/js-multiaddr) + +The [js-multiaddr](//github.com/jbenet/js-multiaddr) implementation was upgraded, now that it now matches go-ipfs features. What this means is that js-multiaddr now supports protocols that need to be encoded with varints. A varint is a integer that uses only the number of bytes it needs to be described by using a continuation bit ([more details](http://web.stanford.edu/class/cs276/Jeff-Dean-compression-slides.pdf)). Before this addition, we were not able to declare http, websockets or even IPFS multiaddrs because these protocol have a code that doesn't fit in a byte - now we can. You can check the encoding table [here](//github.com/jbenet/js-multiaddr/blob/master/src/protocols.csv). + +### [mafmt](//github.com/whyrusleeping/mafmt) + +[mafmt](//github.com/whyrusleeping/mafmt), a module that [@whyrusleeping](//github.com/@whyrusleeping) wrote and which stands for _multiaddr format_, filters out different formats to use with certain transports. Thanks to [@daviddias](//github.com/@daviddias), this now does uTP and WebSockets validation, as well. + +### [libp2p-swarm](//github.com/diasdavid/js-libp2p-swarm) + +The new [libp2p-swarm](//github.com/diasdavid/js-libp2p-swarm) has been released; to reiterate last week, the module has been overauled to have a new API, to be agnostic about which transport an application has to use, and also to have more tests. This also exposes more internal processes, which makes error checking and logging more useful. Libp2p will eventually help users traverse IPFS for any node which allows their desired transport, meaning that we can have a more connected and less brittle web. + +## Community + +[@jbenet](//github.com/@jbenet) was in Boston this week for consensus research discussions. While in Boston, [@jbenet](//github.com/@jbenet) visited the [Digital Currency Initiative](https://www.media.mit.edu/research/highlights/media-lab-digital-currency-initiative) at the MIT Media Lab, where he spoke about IPFS and its implications for blockchains, for digital publishing, and for access to information. + +[c-base/ipfs-ringpin](//github.com/c-base/ipfs-ringpin) is a new set of tools for setting up an IPFS "file pinning ring" between multiple parties. This can be used, for example, for hackerspaces to provide redundancy by pinning each other's files. [pipermerriam/ipfs-persistence-consortium](//github.com/pipermerriam/ipfs-persistence-consortium) and [VictorBjelkholm/pincoop](//github.com/VictorBjelkholm/pincoop) do similar things. + +[the-gred/jsjob-ethereum](//github.com/the-grid/jsjob-ethereum) is an experiment at creating a computational market on top of Ethereum. Computational jobs are run in a JavaScript sandbox, and both input data, the algorithm to run, and the produced results are shared over IPFS. + +[@jbenet](//github.com/@jbenet) gave a talk [titled Datastructures In and On IPFS](http://www.infoq.com/presentations/data-ipfs-ipld) at last year's [QCon SF](https://qconsf.com/sf2015/schedule/tabular). [The video](http://www.infoq.com/presentations/data-ipfs-ipld) was released this week, so now you can all see it! The talk includes a typical introduction (skip if you know IPFS well), and then dives into datastructures, including Merkle Links, Mazieres links, how IPNS works, IPRS records, versioning, Keychain (PKI on IPFS), Persona (identity), and more. + +![datastructures-talk-img](https://ipfs.io/ipfs/QmXXvH1dZnM5powG7BTJw71zrzGS5Rq2RFUr56apqKeDxx/007_talk.png) + +The [IPFS powered USB deaddrop at c-base](//github.com/c-base/ipfs-deaddrop) was demonstrated at the [LoganCIJ 2016 Symposium](https://logancij.com/schedule/), in the Investigative Journalism conference. [More pictures here](https://www.flickr.com/photos/bergie/sets/72157665764801046). If you want to build your own IPFS USB deaddrops, check out the c-base project here: [c-base/ipfs-deaddrop](//github.com/c-base/ipfs-deaddrop). + +![c-base-deaddrop](https://ipfs.io/ipfs/QmXXvH1dZnM5powG7BTJw71zrzGS5Rq2RFUr56apqKeDxx/007_cbase_deaddrop.jpg) + +The [IPFS Copenhagen Meetup](http://www.meetup.com/Copenhagen-IPFS-Meetup/) organized by [@NeoTeo](//github.com/@NeoTeo) had another meeting a few days ago. If you're in the area, sign up at [the Meetup.com page](http://www.meetup.com/Copenhagen-IPFS-Meetup) so you don't miss the next one! + +Several core IPFS developers will be in NYC from March 28th to April 8. We will be organizing an IPFS Meetup within that time frame. If you would like to come, please follow [this github issue](//github.com/ipfs/community/issues/102) for the final details. If you would like to present, post in that issue. + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between March 7th (noon, GMT) and March 14th. We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py) and [this other tool](//github.com/richardlitt/name-your-contributors), so please let us know if your name isn't here. + +- [@42](//github.com/42) (42 Coffee Cups) +- [@aaannndddyyy](//github.com/aaannndddyyy) +- [@adamc199](//github.com/adamc199) +- [@anarcat](//github.com/anarcat) (anarcat) +- [@atondwal](//github.com/atondwal) (Anish Tondwalkar) +- [@basilmon92](//github.com/basilmon92) (Basil M Kuriakose) +- [@bergie](//github.com/bergie) (Henri Bergius) +- [@brailateo](//github.com/brailateo) (Constantin Teodorescu) +- [@candeira](//github.com/candeira) (Javier Candeira) +- [@chpio](//github.com/chpio) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@christianlundkvist](//github.com/christianlundkvist) (Christian Lundkvist) +- [@clkao](//github.com/clkao) (Chia-liang Kao) +- [@Crest](//github.com/Crest) (Crest) +- [@cryptix](//github.com/cryptix) (Henry) +- [@davidar](//github.com/davidar) (David A Roberts) +- [@DavidBooher](//github.com/DavidBooher) (David Booher) +- [@deawar](//github.com/deawar) (Dean Warren) +- [@deb0ch](//github.com/deb0ch) (Thomas de Beauchêne) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@dignifiedquire](//github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@djdv](//github.com/djdv) (Dominic Della Valle) +- [@doesntgolf](//github.com/doesntgolf) (Nate Dobbins) +- [@dontspamm](//github.com/dontspamm) +- [@dylanPowers](//github.com/dylanPowers) (Dylan Powers) +- [@eminence](//github.com/eminence) (Andrew Chin) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) (Greenkeeper) +- [@gritzko](//github.com/gritzko) (Victor Grishchenko) +- [@haadcode](//github.com/haadcode) (Haad) +- [@hutenosa](//github.com/hutenosa) +- [@ianopolous](//github.com/ianopolous) (Ian Preston) +- [@icf20](//github.com/icf20) +- [@Iyer-VivekAnand](//github.com/Iyer-VivekAnand) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@klauswuestefeld](//github.com/klauswuestefeld) (Klaus Wuestefeld) +- [@knocte](//github.com/knocte) (Andres G. Aragoneses) +- [@krl](//github.com/krl) (kristoffer) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@kyledrake](//github.com/kyledrake) (Kyle Drake) +- [@lamarpavel](//github.com/lamarpavel) +- [@lgarron](//github.com/lgarron) (Lucas Garron) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@lhenocque](//github.com/lhenocque) +- [@loadletter](//github.com/loadletter) +- [@matshenricson](//github.com/matshenricson) (Mats Henricson) +- [@mattseh](//github.com/mattseh) +- [@micahredding](//github.com/micahredding) (Micah Redding) +- [@MichaelMure](//github.com/MichaelMure) (Michael Muré) +- [@micxjo](//github.com/micxjo) (Micxjo Funkcio) +- [@mildred](//github.com/mildred) (Mildred Ki'Lya) +- [@Mithgol](//github.com/Mithgol) +- [@mklarmann](//github.com/mklarmann) (mklarmann) +- [@mnp](//github.com/mnp) (Mitchell Perilstein) +- [@moritz121](//github.com/moritz121) +- [@myleshorton](//github.com/myleshorton) +- [@Nadziv](//github.com/Nadziv) (Shahinaz) +- [@nginnever](//github.com/nginnever) (Nathan Ginnever) +- [@nicola](//github.com/nicola) (Nicola Greco) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@obvio171](//github.com/obvio171) (Helder Ribeiro) +- [@pietsch](//github.com/pietsch) (Christian Pietsch) +- [@plungu](//github.com/plungu) (Paul Lungu) +- [@pokeball99](//github.com/pokeball99) +- [@polycopter](//github.com/polycopter) +- [@rht](//github.com/rht) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@rsynnest](//github.com/rsynnest) +- [@SCBuergel](//github.com/SCBuergel) (Sebastian C. Bürgel) +- [@sdockray](//github.com/sdockray) +- [@sexybiggetje](//github.com/sexybiggetje) (Martijn de Boer) +- [@shalnoff](//github.com/shalnoff) +- [@sivachandran](//github.com/sivachandran) (Sivachandran) +- [@skippa](//github.com/skippa) +- [@slothbag](//github.com/slothbag) +- [@sptankard](//github.com/sptankard) +- [@Stebalien](//github.com/Stebalien) (Steven Allen) +- [@suisha](//github.com/suisha) (David Mai) +- [@thomas-gardner](//github.com/thomas-gardner) +- [@Unode](//github.com/Unode) (Renato Alves) +- [@wasserfuhr](//github.com/wasserfuhr) (RainerWasserfuhr) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@xicombd](//github.com/xicombd) (Francisco Baio Dias) +- [@yncyrydybyl](//github.com/yncyrydybyl) (Yan Minagawa) +- [@yuvallanger](//github.com/yuvallanger) (Yuval Langer) +- [@yuy168](//github.com/yuy168) + +This newsletter is also a community effort. If you have cool things to share for the next weekly, drop a comment about it in the [weekly sprint issue](//github.com/ipfs/pm/issues/97)! The more people mention items they want to see in the weekly there, the easier it is to make this and send it out. + +Thanks, and see you next week! + +- Richard Littauer and Andrew Chin + +_Submit feedback about this issue [here](//github.com/ipfs/weekly/issues/27), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-008/README.md b/src/_blog/weekly-008/README.md new file mode 100644 index 00000000..8d89f857 --- /dev/null +++ b/src/_blog/weekly-008/README.md @@ -0,0 +1,147 @@ +--- +date: 2016-03-22 +url: /13-ipfs-weekly-8/ +tags: weekly +title: IPFS Weekly 8 +description: +author: Richard Littauer +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +Here are some of the highlights for the [March 14](//github.com/ipfs/pm/issues/97) sprint: + +## Updates + +![webui](008_webui.gif) + +### [webui](//github.com/ipfs/webui) + +[@dignifiedquire](//github.com/dignifiedquire) has been working hard on the new webui, which will be coming soon. You'll be able to preview images, watch videos, create folders, drag and drop, and more. Here's a pretty gif. To help out, check out the [help wanted labels](//github.com/ipfs/webui/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) on the repo. + +### PubSub + +There are some active discussions on PubSub, following a good video chat last week during the hangouts. PubSub is the name we're using to talk about a simple protocol which will help facilitate easy publishing and subscribing on top of IPFS. Our requirements are that it must be easy to implement, well-layered, and mesh well with the rest of the IPFS abstractions. To join the conversation about the PubSub API, check out this [issue](//github.com/ipfs/notes/issues/118). For more discussions, check out all of the [PubSub issues in the notes repo](//github.com/ipfs/notes/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+pubsub). + +### [ipfs-log](//github.com/haadcode/ipfs-log) + +[@haadcode](//github.com/haadcode) has been working on and released [ipfs-log](//github.com/haadcode/ipfs-log), a partially ordered linked list of IPFS hashes. Each entry in the log points to all known heads or leaf nodes. It can be used as a building block for applications that need to track "dynamic content", eg. track a version of a file, create a feed of IPFS hashes, messaging or as a transport for CRDTs. THis was originally created for, and is currently used in, [orbit-db](//github.com/haadcode/orbit-db), a KV-store and Event Log on IPFS. + +### ipfs init + +`ipfs init` for js-ipfs [is almost complete](//github.com/ipfs/js-ipfs/pull/91), thanks to [@noffle](//github.com/noffle). This will have go-ipfs compatibility, but run using only JavaScript. If you like building tests and sharpening your semicolons, there's plenty of [opportunities to contribute](//github.com/ipfs/js-ipfs#contribute) in js-ipfs land. + +### [go-ipfs](//github.com/ipfs/go-ipfs) + +This week in go-ipfs, we prepped for shipping version 0.4.0. This included lots of testing, writing of information, and verification of different aspects of IPFS. [@whyrusleeping](//github.com/whyrusleeping) wrote a stress test for the fs-repo-migrations that adds a very large number of objects (over 200,000) and pins a couple thousand of them, runs the migration, verifies ​everything​, runs a gc, and then verifies everything again. Once that got working, he kicked off a test run of that with the numbers bumped by a factor of 10 (over two million objects!) and everything completed just fine. This robustness means that 0.4.0 will be ready to ship very, very soon. + +### [ipfs-firefox-addon](//github.com/lidel/ipfs-firefox-addon) + +There were some changes in [ipfs-firefox-addon](//github.com/lidel/ipfs-firefox-addon) since it was mentioned in Weekly No.3 (v1.4.2). + +The Firefox addon that provides transparent access to IPFS resources via local HTTP2IPFS gateway has been fully reviewed by Mozilla and updated to [v1.5.6](https://addons.mozilla.org/en-US/firefox/addon/ipfs-gateway-redirect/versions/1.5.6). On average it has [over 350 daily users](https://addons.mozilla.org/en-US/firefox/addon/ipfs-gateway-redirect/statistics/?last=365). + +The 1.5.x series brings various UX improvements such as Realtime Status and Diagnostics, along with experimental features that can be enabled on the Preferences screen. Check the full list [at Github](//github.com/lidel/ipfs-firefox-addon#features). Feature requests and bug reports [are welcome](//github.com/lidel/ipfs-firefox-addon/issues)! + +## Community + +### [Mediachain](https://medium.com/mine-labs/mediachain-483f49cbe37a#.50am8s6cw) + +Our friends at [Mine](http://www.mine.nyc/) [recently released](https://medium.com/mine-labs/mediachain-developer-update-vi-94d28cf6bc30#.kt6uoc9yk) +[L-SPACE](https://github.com/mediachain/L-SPACE), the Mediachain server. they +have also been writing great updates to [their blog](https://medium.com/mine-labs): +[How Mediachain works](https://medium.com/mine-labs/how-mediachain-works-5a5ccc1c3210#.tv0cv5kc8), +[Dev Update V](https://medium.com/mine-labs/mediachain-developer-update-v-a7f6006ad953#.j0esgkawa), +[Dev Update VI](https://medium.com/mine-labs/mediachain-developer-update-vi-94d28cf6bc30#.kt6uoc9yk), +and more. The press took notice and Mediachain has been featured in +[Nasdaq](http://www.nasdaq.com/article/mediachain-protect-digital-content-with-a-bitcoin-based-metadata-protocol-cm595895), +[Bitcoin Magazine](https://bitcoinmagazine.com/articles/mediachain-protect-digital-content-with-a-bitcoin-based-metadata-protocol-1458577763), +[CCN](https://www.cryptocoinsnews.com/protecting-rights-to-digital-works-with-blockchain-technology/), +and more! Congratulations, and thanks for the IPFS shoutouts there! + +### Lisbon + +[@diasdavid](//github.com/diasdavid) organized a research and development meeting for IPFS in Lisbon. If you're in the area, join [this meetup group](http://www.meetup.com/ipfs-lisbon-meetup/events/229530492/). + +## Press + +Bitcoin Magazine had a guest post by [Zach Ramsay](https://twitter.com/cerebralbosons), from Eris Industries, about [How Blockchains Can Further Public Science](http://www.nasdaq.com/article/how-blockchains-can-further-public-science-cm592775). Zach also published part two on the Eris blog: [Public Science: A Slightly More Practical Guide](https://db.erisindustries.com/science/2016/03/15/chains-and-science-how-to/). Both are well worth the read, especially if you're in academia. + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between March 14th (noon, GMT) and March 21st. We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py) and [this other tool](//github.com/richardlitt/name-your-contributors), so please let us know if your name isn't here. + +- [@amstocker](//github.com/amstocker) (Andrew Stocker) +- [@anarcat](//github.com/anarcat) (anarcat) +- [@ansuz](//github.com/ansuz) (ansuz) +- [@basile-henry](//github.com/basile-henry) (Basile Henry) +- [@bdunlay](//github.com/bdunlay) (Brian Dunlay) +- [@brainframe-me](//github.com/brainframe-me) (Cox Davy) +- [@candeira](//github.com/candeira) (Javier Candeira) +- [@chpio](//github.com/chpio) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@christianlundkvist](//github.com/christianlundkvist) (Christian Lundkvist) +- [@Cleric-K](//github.com/Cleric-K) +- [@clkao](//github.com/clkao) (Chia-liang Kao) +- [@davidar](//github.com/davidar) (David A Roberts) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@dignifiedquire](//github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@doesntgolf](//github.com/doesntgolf) (Nate Dobbins) +- [@ehd](//github.com/ehd) (Stephan Seidt) +- [@eminence](//github.com/eminence) (Andrew Chin) +- [@fazo96](//github.com/fazo96) (Enrico Fasoli) +- [@GoogilyBoogily](//github.com/GoogilyBoogily) (Derek Mayer) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) (Greenkeeper) +- [@haadcode](//github.com/haadcode) (Haad) +- [@harlantwood](//github.com/harlantwood) (Harlan T Wood) +- [@ianopolous](//github.com/ianopolous) (Ian Preston) +- [@ingokeck](//github.com/ingokeck) (Ingo Keck) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@jwsher](//github.com/jwsher) (Justin Sher) +- [@kalmi](//github.com/kalmi) (Tarnay Kálmán) +- [@kevina](//github.com/kevina) (Kevin Atkinson) +- [@klartext](//github.com/klartext) +- [@kseistrup](//github.com/kseistrup) (Klaus Alexander Seistrup) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@lhenocque](//github.com/lhenocque) +- [@lidel](//github.com/lidel) (Marcin Rataj) +- [@luigiplr](//github.com/luigiplr) (Luigi Poole) +- [@matshenricson](//github.com/matshenricson) (Mats Henricson) +- [@MaxEntropyy](//github.com/MaxEntropyy) +- [@Mec-iS](//github.com/Mec-iS) (Lorenzo) +- [@mildred](//github.com/mildred) (Mildred Ki'Lya) +- [@Mithgol](//github.com/Mithgol) +- [@mlbk0](//github.com/mlbk0) +- [@mnp](//github.com/mnp) (Mitchell Perilstein) +- [@montagsoup](//github.com/montagsoup) +- [@nginnever](//github.com/nginnever) (Nathan Ginnever) +- [@nicola](//github.com/nicola) (Nicola Greco) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@palkeo](//github.com/palkeo) (palkeo) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@rinpoo](//github.com/rinpoo) +- [@sahib](//github.com/sahib) (Chris Pahl) +- [@se3000](//github.com/se3000) (Steve Ellis) +- [@sexybiggetje](//github.com/sexybiggetje) (Martijn de Boer) +- [@sivachandran](//github.com/sivachandran) (Sivachandran) +- [@slothbag](//github.com/slothbag) +- [@Stebalien](//github.com/Stebalien) (Steven Allen) +- [@thelinuxkid](//github.com/thelinuxkid) (Andres Buritica) +- [@thomas-gardner](//github.com/thomas-gardner) +- [@wanderer](//github.com/wanderer) +- [@wasserfuhr](//github.com/wasserfuhr) (RainerWasserfuhr) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@willglynn](//github.com/willglynn) (Will Glynn) +- [@wking](//github.com/wking) (W. Trevor King) +- [@xicombd](//github.com/xicombd) (Francisco Baio Dias) + +This newsletter is also a community effort. If you have cool things to share for the next weekly, drop a comment about it in the [next weekly sprint issue](//github.com/ipfs/weekly/issues/31)! The more people mention items they want to see in the weekly there, the easier it is to make this and send it out. + +Thanks, and see you next week! + +- Richard Littauer + +_Submit feedback about this issue [here](//github.com/ipfs/weekly/issues/29), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-009/README.md b/src/_blog/weekly-009/README.md new file mode 100644 index 00000000..ed002ec0 --- /dev/null +++ b/src/_blog/weekly-009/README.md @@ -0,0 +1,239 @@ +--- +date: 2016-04-20 +url: /15-ipfs-weekly-9/ +tags: weekly +title: IPFS Weekly 9 +description: +author: Richard Littauer +--- + +[IPFS](//ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](//github.com/ipfs) or join us on [IRC](//webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +Here are some of the highlights for the [March 21st through March 28th](//github.com/ipfs/pm/issues/98) sprint: + +## Updates + +### Package Managers + +Package managers have been a large topic of discussion recently. Mostly, this is because of an issue with an author of some heavily used [npm](https://npmjs.com) packages unpublishing all of his modules simultaneously. One of these was `left-pad`, which was used by thousands of builds globally, all of which broke when the package was removed. A great writeup of what happened is on the [npm.js blog here](http://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm); they took this very seriously, and shortly after [changed their unpublish policy](http://blog.npmjs.org/post/141905368000/changes-to-npms-unpublish-policy) as a direct result. + +Many people jumped to IPFS as a possible solution to this problem. With a permanent filesystem, unpublishing wouldn't be possible. Here's one post titled [How to use IPFS to fix npm](http://amreldib.com/blog/HowToUseIpfsToFixNpm); here's [an issue](https://github.com/ipmjs/ipmjs/issues/9) on a new GitHub organization, ipmjs, trying to find consensus on how to fix npm using a permanent storage system; here's an npm module, [cowpen](https://www.npmjs.com/package/cowpen) that publishes modules directly to IPFS; here's [another decentralized package manager](https://github.com/mhhf/spore) that sprung up using IPFS and Ethereum. + +The IPFS community has been thinking about immutable package managers for a long time. IPFS itself began as an immutable package manager, and it is built to make writing them much easier. [@diasdavid](//github.com/diasdavid) has a project called `registry-mirror`, which allows you to run an npm registry locally that is backed by packages retrieved from IPFS instead of NPM directly. He's written about a presentation he gave for it, [here](http://blog.daviddias.me/2015/12/08/stellar-module-management); the source code is [here](https://github.com/diasdavid/registry-mirror). + +On a similar note, [gx](//github.com/whyrusleeping/gx), a package manager for Go made by [@whyrusleeping](//github.com/whyrusleeping), was also mentioned in a lot of the discussions about npm and package managers, especially on [Hacker News](https://news.ycombinator.com/item?id=11347163). In the past two weeks, the project went from 50 to 1000 stars, so people are clearly interested in this now. + +The discussion about how to best use IPFS as a package manager is ongoing. Jump on GitHub if you have something to say; we're listening in the [FAQ](https://github.com/ipfs/faq/issues) and in [the notes repo](https://github.com/ipfs/notes/issues). + +### DNS outage + +We're using DigitalOcean to provide ipfs.io DNS. On Tuesday, March 24th, DigitalOcean DNS was hit by a [severe outage](https://www.digitalocean.com/company/blog/update-on-the-march-24-2016-dns-outage/) lasting hours, which took the public gateway at ipfs.io down. We switched to [DNSimple](https://dnsimple.com) in an ad-hoc fashion and brought ipfs.io back while DigitalOcean was still down, but this incident obviously hit us on the wrong foot a bit. We'll be working to never get taken down this way again. It's HARD not to depend on any single points of failure. Here's a few things we'll do: + +- codify DNS zones, and tools to upload them to DNS providers +- keep one or two backup DNS providers +- update our monitoring and failover procedures + +We'll post a more detailed post-mortem on our blog in the next few days. + +### Captain.log + +#### Aye, you might want to check the new js-ipfs Captain.log entry, matey! + +Following [js-ipfs roadmap](https://github.com/ipfs/js-ipfs/blob/master/ROADMAP.md#milestone-1---js-ipfs-on-the-browser), we’re close™ to having a workable js-ipfs version that can be used in the browser and in Node.js. This will mark a very important milestone on the IPFS project and enable a whole set of new distributed web applications to be possible. If you want to be part of this effort, check out our [Captain.log](https://github.com/ipfs/js-ipfs/issues/30#issuecomment-205884015) entry to get a full update and a list of tasks you can contribute to. + +### [Orbit](//github.com/haadcode/orbit) + +![Orbit](009_orbit.png) + +[@haadcode](//github.com/haadcode) has been working on improvements to [orbit-db](https://github.com/haadcode/orbit-db), [ipfs-log](https://github.com/haadcode/ipfs-log/) and [Orbit](https://github.com/haadcode/orbit). The message history fetching is now more stable and the UI feedback for loading messages is fixed. All this work will improve the user experience of Orbit. + +### js-ipfs-init + +`js-ipfs init` works! [@noffle](//github.com/noffle) finished the remaining pieces this week, including CLI usage. This included a handful of [auxiliary](https://github.com/ipfs/js-ipfs/issue/91) [PRs](https://github.com/ipfs/js-ipfs/issue/96) that cascaded out of that work. This makes the `js-ipfs` init process produce IPFS repos that are compatible with go-ipfs'. + +#### Dictionary support for the zlib JavaScript Implementation, [`pako`](https://github.com/nodeca/pako) + +One of the significant contributions made this week was the addition of 'dictionary' support for `zlib` JavaScript implementation, `pako`. With this contribution, we are able to have a complete implementation of SPDY 3.1's framing layer running in the browser, the default stream muxing library used in IPFS. You can find more about this contribution in the following issue and PR discussions: + +- https://github.com/nodeca/pako/issues/69 +- https://github.com/diasdavid/js-libp2p-spdy/pull/6 +- https://github.com/nodeca/pako/pull/77 + +### [go-ipfs](//github.com/ipfs/go-ipfs) + +[@whyrusleeping](//github.com/whyrusleeping) wrote a tool to move content from 0.4.0 to 0.3.11 (see [levart-emit](https://github.com/whyrusleeping/levart-emit)). He also discovered a file descriptor leak bug in utp causing connectivity issues, and began work on datastore performance improvements. + +#### `jsipfs object` cli and http-api endpoints are complete + +Now you can use `jsipfs object` in the same way you would use `ipfs object`. Big thanks to [Francisco Dias](https://github.com/xicombd) for leading the last miles of this goal. The complete track of the development can be found at [github.com/ipfs/js-ipfs/issues/58](https://github.com/ipfs/js-ipfs/issues/58). + +### Nginx metrics + +The [infrastructure](https://github.com/ipfs/infrastructure) metrics dashboard didn't previously have HTTP request/response metrics from nginx's point of view, but only from IPFS's and [multireq](https://github.com/whyrusleeping/multireq)'s point of view. (Multireq is our v04x/v03x multiplexing proxy). Nginx itself provides finegrained metrics only through their commercial subscriptions. We're now using [mtail](https://github.com/google/mtail) to parse metrics from nginx access logs and expose them to [Prometheus](https://prometheus.io). [@lgierth](//github.com/lgierth) will also contribute the `nginx.mtail` program upstream with mtail. + +## Community + +### Upcoming talks + +On April 20th, IPFS will host a joint meetup with ConsenSys at MIT in Cambridge, Massachusetts. [Sign up here!](https://www.eventbrite.com/e/ipfs-ethereum-mit-meetup-tickets-24578852008) + +### First IPFS Meeting in NYC + +We had our first IPFS meetup in New York! It went fantastically; expect an upcoming post on the [Blog](http://blog.ipfs.io/) soon. + +### Meeting with NYC Mesh + +[@jbenet](//github.com/jbenet) and [@lgierth](//github.com/lgierth) met with the fine folks of [nycmesh.net](https://nycmesh.net). For the past two years they've been building a community Wifi network in New York City. We had lots of great conversation about wireless mesh networking and IPFS. If you live in NYC, you should come attend their [meetups](http://www.meetup.com/nycmesh/)! + +### [NYC Blockchain](http://nyc.blockchainworkshops.org/) + +Last Monday members of the IPFS comminuty attended a [blockchain workshop](http://nyc.blockchainworkshops.org/) event held by COALA, "a collaboration between academics, lawyers, technologists and entrepreneurs who have been driving research, policy and infrastructure-building in the blockchain ecosystem for the past three years" at the New York University School of Business. [@diasdavid](//github.com/diasdavid) [@haad](//github.com/haad) [@noffle](//github.com/noffle) and [@nginnever](//github.com/nginnever) were in attendance as [@jbenet](//github.com/jbenet) was a part of a protocols panel, speaking on scalability and the future of blockchain technology. A recording of the event should be available on youtube in the future [here](https://www.youtube.com/channel/UC9Lmf5FfNkSmYMoxhQh5ktA). + +### Lisbon Research and Development Meetup + +![Lisbon](009_lisbon.png) + +[The IPFS Lisbon community had their second "Research & Development Meetup"](http://www.meetup.com/ipfs-lisbon-meetup/events/229807984/), hosted by Uniplaces (https://www.uniplaces.com). The focus was "The Distributed Web" ([Slides](http://www.slideshare.net/DavidDias11/rdm2-the-distributed-web)) and "Machine Learning + Artificial Intelligence for Recommender Algorithms", with talks by [David Dias](https://github.com/diasdavid) and [João Ascensão](https://github.com/jtascensao), respectively. If you are around Lisbon, make sure to join http://www.meetup.com/ipfs-lisbon-meetup to get notified about the next one. Resources for this talk can be found [here](https://github.com/research-development-meetup/discussion/tree/master/rdm-2). + +### Seattle + +[@whyrusleeping](//github.com/whyrusleeping) gave a talk introducing IPFS at ta3m seattle - [Techno-Activism 3rd Mondays](https://wiki.openitp.org/events:techno-activism_3rd_mondays:seattle). Video links to come when they are posted. + +### BitCoin News + +BitCoin news had a discussion on using IPFS and Bitcoin for Decentralised Citizen Journalism. [Check it out](http://thebitcoinnews.com/decentralised-citizen-journalism-we-discuss-the-impact-of-bitcoin-and-ipfs/)! + +### BitDevsNYC + +[Christian Lundkvist](//github.com/christianlundkvist) gave a talk on IPFS at [BitDevsNYC](http://www.meetup.com/BitDevsNYC/events/229130058/). Christian works closely with IPFS at [ConsenSys](https://consensys.net/). + +## IPFS Meme of the Week + +![Hee hee](009_neo.jpg) + +From https://twitter.com/jplur_/status/712670265919086594. Thanks, jplur\_! + +## Content-Type of the Week + +Now that we're using mtail to make better sense of nginx serving the +IPFS-to-HTTP gateway, we can graph the frequency of content types served. +We'll showcase interesting content types served from the gateway in the coming +weeklies. + +The first Content-Type of the week is: application/x-chdr, which signifies a C source header file. + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between March 21st (noon, GMT) and March 28th. We're autogenerating this list using [this tool](//github.com/ipfs/weekly/blob/master/tools/get_commits.py) and [this other tool](//github.com/richardlitt/name-your-contributors), so please let us know if your name isn't here. + +- [@achin](//githublcom/achin) (Andrew Chin) +- [@AdamStone](//github.com/AdamStone) (Adam Stone) +- [@admiral-Guck](//github.com/admiral-Guck) (Gucky) +- [@alexAubin](//github.com/alexAubin) (Alexandre Aubin) +- [@amstocker](//github.com/amstocker) (Andrew Stocker) +- [@anarcat](//github.com/anarcat) (anarcat) +- [@Anthonyzou](//github.com/Anthonyzou) (Anthony Ou) +- [@area](//github.com/area) +- [@ARezaK](//github.com/ARezaK) +- [@atommixz](//github.com/atommixz) +- [@Azulan](//github.com/Azulan) (Frank Flores) +- [@balupton](//github.com/balupton) (Benjamin Lupton) +- [@bgrieder](//github.com/bgrieder) (Bruno Grieder) +- [@cb0](//github.com/cb0) (Marcus Puchalla) +- [@chinshiketsu](//github.com/chinshiketsu) (Sijie Chen) +- [@chpio](//github.com/chpio) +- [@chriscool](//github.com/chriscool) (Christian Couder) +- [@CMCDragonkai](//github.com/CMCDragonkai) (Roger Qiu) +- [@ComSecNinja](//github.com/ComSecNinja) (Timo Virkkunen) +- [@darkstar](//github.com/darkstar) (Michael D.) +- [@davidar](//github.com/davidar) (David A Roberts) +- [@diasdavid](//github.com/diasdavid) (David Dias) +- [@dignifiedquire](//github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@djdv](//github.com/djdv) (Dominic Della Valle) +- [@ehmry](//github.com/ehmry) (Emery Hemingway) +- [@fomkin](//github.com/fomkin) (Aleksey Fomkin) +- [@gerrickw](//github.com/gerrickw) (Gerrick W) +- [@greenkeeperio-bot](//github.com/greenkeeperio-bot) (Greenkeeper) +- [@haadcode](//github.com/haadcode) (Haad) +- [@harlantwood](//github.com/harlantwood) (Harlan T Wood) +- [@hshimo](//github.com/hshimo) (Hiroshi Shimo) +- [@hutenosa](//github.com/hutenosa) +- [@ianopolous](//github.com/ianopolous) (Ian Preston) +- [@iav](//github.com/iav) (iav) +- [@ibnesayeed](//github.com/ibnesayeed) (Sawood Alam) +- [@insanity54](//github.com/insanity54) (Chris Grimmett) +- [@jbenet](//github.com/jbenet) (Juan Benet) +- [@JGAntunes](//github.com/JGAntunes) (João Antunes) +- [@jmsmcfrlnd](//github.com/jmsmcfrlnd) +- [@josephholsten](//github.com/josephholsten) (Joseph Anthony Pasquale Holsten) +- [@julian-smith-code](//github.com/julian-smith-code) (Julian Smith) +- [@jwsher](//github.com/jwsher) (Justin Sher) +- [@kalmi](//github.com/kalmi) (Tarnay Kálmán) +- [@kevina](//github.com/kevina) (Kevin Atkinson) +- [@knocte](//github.com/knocte) (Andres G. Aragoneses) +- [@KrishnaPG](//github.com/KrishnaPG) (Gopalakrishna Palem) +- [@Kubuxu](//github.com/Kubuxu) (Jakub Sztandera) +- [@kumavis](//github.com/kumavis) (kumavis) +- [@kyledrake](//github.com/kyledrake) (Kyle Drake) +- [@kyrias](//github.com/kyrias) (Johannes Löthberg) +- [@lgierth](//github.com/lgierth) (Lars Gierth) +- [@lidel](//github.com/lidel) (Marcin Rataj) +- [@machawk1](//github.com/machawk1) (Mat Kelly) +- [@matshenricson](//github.com/matshenricson) (Mats Henricson) +- [@Mec-iS](//github.com/Mec-iS) (Lorenzo) +- [@micahredding](//github.com/micahredding) (Micah Redding) +- [@MichaelMure](//github.com/MichaelMure) (Michael Muré) +- [@micxjo](//github.com/micxjo) (Micxjo Funkcio) +- [@mildred](//github.com/mildred) (Mildred Ki'Lya) +- [@mitar](//github.com/mitar) (Mitar) +- [@Mithgol](//github.com/Mithgol) +- [@monoflash](//github.com/monoflash) (Alex Geer) +- [@montagsoup](//github.com/montagsoup) +- [@mpgn](//github.com/mpgn) (Martial Puygrenier) +- [@mrshu](//github.com/mrshu) (Marek Šuppa) +- [@nginnever](//github.com/nginnever) (Nathan Ginnever) +- [@nicola](//github.com/nicola) (Nicola Greco) +- [@NightRa](//github.com/NightRa) (Ilan Godik) +- [@noffle](//github.com/noffle) (Stephen Whitmore) +- [@nonchip](//github.com/nonchip) (Kyra Zimmer) +- [@novocodev](//github.com/novocodev) +- [@palkeo](//github.com/palkeo) (palkeo) +- [@pguth](//github.com/pguth) (Per) +- [@Piruzzolo](//github.com/Piruzzolo) +- [@pocketmax](//github.com/pocketmax) +- [@pokeball99](//github.com/pokeball99) +- [@polkovnikov-ph](//github.com/polkovnikov-ph) (Philip Polkovnikov) +- [@puffnfresh](//github.com/puffnfresh) (Brian McKenna) +- [@rht](//github.com/rht) +- [@RichardLitt](//github.com/RichardLitt) (Richard Littauer) +- [@rsynnest](//github.com/rsynnest) +- [@sdockray](//github.com/sdockray) +- [@se3000](//github.com/se3000) (Steve Ellis) +- [@Shikibashi](//github.com/Shikibashi) +- [@SilverWingedSeraph](//github.com/SilverWingedSeraph) (Leo Tindall) +- [@slothbag](//github.com/slothbag) +- [@Stebalien](//github.com/Stebalien) (Steven Allen) +- [@syang](//github.com/syang) +- [@tadfisher](//github.com/tadfisher) (Tad Fisher) +- [@thomas-gardner](//github.com/thomas-gardner) +- [@tinybike](//github.com/tinybike) (Jack Peterson) +- [@upfs](//github.com/upfs) +- [@voltrevo](//github.com/voltrevo) (Andrew Morris) +- [@whyrusleeping](//github.com/whyrusleeping) (Jeromy Johnson) +- [@willglynn](//github.com/willglynn) (Will Glynn) +- [@wking](//github.com/wking) (W. Trevor King) +- [@wmhilton](//github.com/wmhilton) (Will Hilton) +- [@xicombd](//github.com/xicombd) (Francisco Baio Dias) +- [@xsnk](//github.com/xsnk) (Sankrant Chaubey) +- [@yuvipanda](//github.com/yuvipanda) (Yuvi Panda) +- [@Zogg](//github.com/Zogg) + +This newsletter is also a community effort. If you have cool things to share for the next weekly, drop a comment about it in the [next weekly sprint issue](https://github.com/ipfs/weekly/issues/33)! The more people mention items they want to see in the weekly there, the easier it is to make this and send it out. + +Thanks, and see you next week! + +- Richard Littauer + +_Submit feedback about this issue [here](https://github.com/ipfs/weekly/issues/31), or send us [feedback about the IPFS Weekly in general](//github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-010/README.md b/src/_blog/weekly-010/README.md new file mode 100644 index 00000000..2a713ac6 --- /dev/null +++ b/src/_blog/weekly-010/README.md @@ -0,0 +1,205 @@ +--- +date: 2016-05-08 +url: /16-ipfs-weekly-10/ +tags: weekly +title: IPFS Weekly 10 +description: +author: Richard Littauer +--- + +[IPFS](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](https://github.com/ipfs) or join us on [IRC](https://webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). + +If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! + +Here are some of the highlights for the time period from [April 6th through April 25th](https://github.com/ipfs/pm/issues/101). + +## Updates + +### 0.4.0! + +[go-ipfs 0.4.0](http://dist.ipfs.io/#go-ipfs) has been released! Among the many changes are a revamped implementation of the IPFS communication protocols, increased performance, improvements to IPNS (the Interplanetary Naming System), many bugfixes, and lots of new features to make IPFS even more powerful. + +See the [blog](http://blog.ipfs.io/14-ipfs-0-4-0-released/) for more details. + +### Orbit + +[@haadcode](https://github.com/haadcode) upgraded all of his projects to use 0.4.0, got [orbit-db](https://github.com/haadcode/orbit-db) and [ipfs-log](https://github.com/haadcode/ipfs-log) working in the browser, and improved Orbit's UX. As a result, Orbit is much faster and more stable than it was under 0.3! We now have working distributables for [orbit-db](https://github.com/haadcode/orbit-db) and [ipfs-log](https://github.com/haadcode/ipfs-log) in the browser. They still require a local daemon to run to work but this will change when js-ipfs ships. [@haadcode](https://github.com/haadcode) added some new features to Orbit: preview files directly in the chat with code highlighting, players for audio and video, and improved the files browsing functionality in general. You can now also copy the hash of a file to clipboard. It looks like this: + +![Orbit](010_orbit.png) + +Finally, [@haadcode](https://github.com/haadcode) also created a simple JavaScript logging module called [logplease](https://github.com/haadcode/logplease), which works in Node.js and browsers. logplease does two simple things: output log messages to the console and/or to a file (Node.js only) and display the log messages with nice colors. It was inspired by [log4js](https://github.com/stritti/log4js) and [debug](https://github.com/visionmedia/debug). + +### [aegir](https://github.com/dignifiedquire/aegir) + +AEgir has been officially released. Formerly called dignified.js, this is our toolset for JavaScript modules, which cuts down on development time immensely by standardizing the process of testing, building, linting, releasing, and generally scaffolding out JS modules. It is now deployed over nearly all active JavaScript projects on IPFS. Check out the [npm package](https://npmjs.org/aegir) or the [github repo](https://github.com/dignifiedquire/aegir). + +We've also overhauled the community [JavaScript guidelines](https://github.com/ipfs/community/blob/master/js-project-guidelines.md) to reflect this change, and to make them more accessible to new developers. + +### go-libp2p and go-ipfs refactoring + +We're modularizing go-libp2p, aiming at module parity with js-ipfs. This makes the codebase less daunting to newcomers, and makes maintenance and testing of everything much easier. + +As part of this, [@whyrusleeping](https://github.com/whyrusleeping) removed over 9000 (yes, over 9000) lines of unused godeps dependencies from the go-ipfs repo. Its a good deal more manageable now, and we are getting ever closer to having a purely [gx](https://github.com/whyrusleeping/gx) managed package. + +### js-ipld + +![libp2p-cli](010_js-libp2p.png) + +[@dignifiedquire](https://github.com/dignifiedquire) shipped an updated version of [js-ipld](https://npmjs.org/ipld) which now conforms to the [latest spec of IPLD](https://github.com/ipfs/specs/tree/master/ipld). In addition [js-ipfs-ipld](https://npmjs.org/ipfs-ipld) was created, which implements the building blocks to use IPLD in js-ipfs. The third package that was published is [js-ipfs-cli](https://npmjs.org/ipld-cli) which gives you a cli tool to interact and experiment with IPLD. + +### `ipfs-blob-store` v1.0.0 released + +One of the benefits that comes from the new [Files API](https://github.com/ipfs/js-ipfs/issues/60) in 0.4.0, is that we can emulate any kind of file system expectations on top of IPFS, and by doing so, enable applications that use a file system, to use IPFS without any modification. One perfect example of that are all the applications that use a module that implements the [abstract-blob-store](https://github.com/maxogden/abstract-blob-store) interface, now with [ipfs-blob-store](https://github.com/ipfs/ipfs-blob-store), with a simple `npm install`, you can swap out your current blob-store implementation by the IPFS one. + +### `js-ipfs-api` now supports the Files API + +On the same lines, `js-ipfs-api` now offers all the Files API calls through a convenient and easy to use library. You can find all of the function declarations on the [`js-ipfs-api` docs](https://github.com/ipfs/js-ipfs-api/blob/master/API.md#files) + +### Making js-ipfs and js-libp2p modules awesome + +[@JGAntunes](https://github.com/JGAntunes), [@dignifiedquire](https://github.com/dignifiedquire), [@nginnever](https://github.com/nginnever), [@diasdavid](https://github.com/diasdavid), and [@noffle](https://github.com/noffle) have been working hard to bring [the pantheon of js-ipfs modules](https://github.com/ipfs/js-ipfs/issues?utf8=%E2%9C%93&q=is%3Aissue+coverage+dignified) up to snuff: detailed READMEs with examples and full API docs, as well as 100% test coverage. We made significant inroads last sprint on [js-peer-id](https://github.com/diasdavid/js-peer-id), [js-multiaddr](https://github.com/jbenet/js-multiaddr), [js-peer-info](https://github.com/diasdavid/js-peer-info), [js-ipfs-blocks](https://github.com/ipfs/js-ipfs-blocks/) and more! There are a lot more modules that still need good READMEs and docs, so [dive in](https://github.com/ipfs/js-ipfs/issues?utf8=%E2%9C%93&q=is%3Aissue+coverage+dignified+is%3Aopen) and give us a hand! + +### go-ipfs and the Prometheus monitoring system + +We've had [Prometheus](https://prometheus.io) integrated with go-ipfs for some time already. In case you're unfamiliar, Prometheus is an open-source systems monitoring and alerting toolkit. It allows you to monitor diverse services, visualize the collected metrics in dashboards, and define rules for alerting. Together with the Grafana dashboard UI, it's the perfect monitoring system. + +The scraping endpoint of go-ipfs is exposed at [:5001/debug/metrics/prometheus](http://localhost:5001/debug/metrics/prometheus) by your go-ipfs daemon. Check Prometheus' [Getting Started guide](https://prometheus.io/docs/introduction/getting_started/) to try it out. + +### go-ipfs and restricting dialing + +go-ipfs has support for restricting peer connections to certain IP address ranges, by using the `Swarm.AddrFilters` config setting. The following config example illustrates how to exclude all IPv4 peers, and all IPv6 link-local peers. + +```json +// .ipfs/config +"Swarm": { + "AddrFilters": [ + "/ip4/0.0.0.0/ipcidr/0", + "/ip6/fe80::/ipcidr/64" + ] +} +``` + +## Community + +### Berkman Center + +[@jbenet](https://github.com/jbenet) and [@nicola](https://github.com/nicola) spoke about IPFS with fellows at the Berkman Center. They discussed the core motivations of the IPFS Project, how it works, the state of the implementations, and a wide array of issues IPFS tackles. The discussion was excellent, starting with important ethical problems present in the web today, going through critical features our web should exhibit to solve them, and ending with how to get there. We look forward to tighter collaboration between our communities. Thank you very much for having us! + +### MIT Meetup + +![IPFS Meeting in Cambridge](010_ipfs-boston.jpg) + +We had the first ever IPFS meetup in Cambridge, at MIT. It was sponsored by [Consensys](https://consensys.net), and hosted by the [MIT Bitcoin Club](http://bitcoin.mit.edu/). [@jbenet](https://github.com/jbenet), [@nicola](https://github.com/nicola), and [@CReckhow](https://twitter.com/CReckhow) each gave talks. A full writeup will appear on the blog as soon as we have edited the videos and posted them on the IPFS YouTube channel. We'll let you know when that happens, here. + +_Photo by [@nicocesar\_](https://twitter.com/nicocesar_).\_ + +### Peergos + +Work on [Peergos](https://github.com/ianopolous/Peergos), a decentralised, secure file storage, sharing and social network using IPFS, is progressing well; [@ianopolous](https://github.com/ianopolous) is close to getting a FUSE binding working. Throughput hasn't been as bad as he was expecting with all the encryption and erasure coding, and it's looking likely that it will end up being network IO bound, instead of CPU bound for non trivial writes. + +### SpaceX Landing + +Things are awesome and getting awesomer. Specifically, SpaceX [landed a reusable Falcon 9 booster](http://www.space.com/32517-spacex-sticks-rocket-landing-sea-dragon-launch.html), which puts us that much closer to having a human colony on Mars. When that happens, we're betting they'll be using IPFS. + +### Content-Type of The Week + +This week's Content-Type is the non-standard `chemical/x-chemdraw`. ChemDraw is a molecule editor first released in 1985, and still maintained as of today. We don't know which molecules were added to IPFS, but will do our best for IPFS to be around in 30 years just like ChemDraw is still around. + +Every week we highlight a Content-Type that we've seen on the public HTTP-to-IPFS gateway at https://ipfs.io. If you're waiting to see one particularly interesting Content-Type in one of the next Weeklies, propose it by `ipfs add -w`'ing a file of that type, and requesting it from the public gateway: `https://ipfs.io/ipfs/`. + +## Contributors + +Across the entire IPFS GitHub organization, the following people have committed code, created issues, or made a comment on GitHub between April 6th (noon, GMT) and April 25th. We're autogenerating this list using [this tool](https://github.com/ipfs/weekly/blob/master/tools/get_commits.py) and [this other tool](https://github.com/richardlitt/name-your-contributors), so please let us know if your name isn't here. + +- [@AdamStone](https://github.com/AdamStone) (Adam Stone) +- [@amstocker](https://github.com/amstocker) (Andrew Stocker) +- [@ARezaK](https://github.com/ARezaK) +- [@atommixz](https://github.com/atommixz) +- [@atondwal](https://github.com/atondwal) (Anish Tondwalkar) +- [@bpcamac](https://github.com/bpcamac) (Brenton Camac) +- [@c-johnson](https://github.com/c-johnson) (Christopher Johnson) +- [@chriscool](https://github.com/chriscool) (Christian Couder) +- [@chrisvoncsefalvay](https://github.com/chrisvoncsefalvay) (Chris) +- [@chungy](https://github.com/chungy) (Mike Swanson) +- [@ComSecNinja](https://github.com/ComSecNinja) (Timo Virkkunen) +- [@cpacia](https://github.com/cpacia) (Chris Pacia) +- [@creckhow](https://github.com/creckhow) (Carolyn Reckhow) +- [@cusspvz](https://github.com/cusspvz) (José Moreira) +- [@diasdavid](https://github.com/diasdavid) (David Dias) +- [@dignifiedquire](https://github.com/dignifiedquire) (Friedel Ziegelmayer) +- [@eboto](https://github.com/eboto) (Erem Boto) +- [@edrex](https://github.com/edrex) (Eric Drechsel) +- [@EliasGabrielsson](https://github.com/EliasGabrielsson) (Elias Gabrielsson) +- [@eminence](https://github.com/eminence) (Andrew Chin) +- [@fazo96](https://github.com/fazo96) (Enrico Fasoli) +- [@felixonmars](https://github.com/felixonmars) (Felix Yan) +- [@FrauBienenstich](https://github.com/FrauBienenstich) (Susanne Dewein) +- [@fzzr-](https://github.com/fzzr-) (Alexander "FIZZΞR" Koz.) +- [@GitCop](https://github.com/GitCop) +- [@greenkeeperio-bot](https://github.com/greenkeeperio-bot) (Greenkeeper) +- [@groksie](https://github.com/groksie) (James McFarland) +- [@haadcode](https://github.com/haadcode) (Haad) +- [@hermanjunge](https://github.com/hermanjunge) (Herman Junge) +- [@hutenosa](https://github.com/hutenosa) +- [@ianopolous](https://github.com/ianopolous) (Ian Preston) +- [@ikreymer](https://github.com/ikreymer) (Ilya Kreymer) +- [@ingokeck](https://github.com/ingokeck) (Ingo Keck) +- [@interfect](https://github.com/interfect) +- [@jbenet](https://github.com/jbenet) (Juan Benet) +- [@jedahan](https://github.com/jedahan) (Jonathan Dahan) +- [@jefft0](https://github.com/jefft0) (Jeff Thompson) +- [@jerodsanto](https://github.com/jerodsanto) (Jerod Santo) +- [@JGAntunes](https://github.com/JGAntunes) (João Antunes) +- [@kbtombul](https://github.com/kbtombul) +- [@kevina](https://github.com/kevina) (Kevin Atkinson) +- [@kevinmartinmauro](https://github.com/kevinmartinmauro) +- [@krl](https://github.com/krl) (kristoffer) +- [@Kubuxu](https://github.com/Kubuxu) (Jakub Sztandera) +- [@kyledrake](https://github.com/kyledrake) (Kyle Drake) +- [@lgierth](https://github.com/lgierth) (Lars Gierth) +- [@lidel](https://github.com/lidel) (Marcin Rataj) +- [@machawk1](https://github.com/machawk1) (Mat Kelly) +- [@mariusdarila](https://github.com/mariusdarila) (Marius Darila) +- [@matshenricson](https://github.com/matshenricson) (Mats Henricson) +- [@mheiber](https://github.com/mheiber) (mheiber) +- [@MichaelMure](https://github.com/MichaelMure) (Michael Muré) +- [@micxjo](https://github.com/micxjo) (Micxjo Funkcio) +- [@mildred](https://github.com/mildred) (Mildred Ki'Lya) +- [@mitar](https://github.com/mitar) (Mitar) +- [@mitzip](https://github.com/mitzip) (mitzip) +- [@mrshu](https://github.com/mrshu) (Marek Šuppa) +- [@NDuma](https://github.com/NDuma) (NDuma) +- [@neko259](https://github.com/neko259) +- [@nginnever](https://github.com/nginnever) (Nathan Ginnever) +- [@nicola](https://github.com/nicola) (Nicola Greco) +- [@noffle](https://github.com/noffle) (Stephen Whitmore) +- [@pfista](https://github.com/pfista) (michael) +- [@Piruzzolo](https://github.com/Piruzzolo) +- [@plungu](https://github.com/plungu) (Paul Lungu) +- [@pokeball99](https://github.com/pokeball99) +- [@rht](https://github.com/rht) +- [@RichardLitt](https://github.com/RichardLitt) (Richard Littauer) +- [@SCBuergel](https://github.com/SCBuergel) (Sebastian C. Bürgel) +- [@SilverWingedSeraph](https://github.com/SilverWingedSeraph) (Leo Tindall) +- [@sivachandran](https://github.com/sivachandran) (Sivachandran) +- [@slang800](https://github.com/slang800) (Sean Lang) +- [@Stebalien](https://github.com/Stebalien) (Steven Allen) +- [@sterpe](https://github.com/sterpe) (Steve Terpe) +- [@stevenh512](https://github.com/stevenh512) (Steven Hancock) +- [@TheNain38](https://github.com/TheNain38) +- [@thomas-gardner](https://github.com/thomas-gardner) +- [@traverseda](https://github.com/traverseda) (Alex Davies) +- [@upfs](https://github.com/upfs) +- [@vijayee](https://github.com/vijayee) (Vijayee Kulkaa) +- [@vitzli](https://github.com/vitzli) +- [@whyrusleeping](https://github.com/whyrusleeping) (Jeromy Johnson) +- [@wzhd](https://github.com/wzhd) +- [@xicombd](https://github.com/xicombd) (Francisco Baio Dias) + +This newsletter is also a community effort. If you have cool things to share for the next weekly, drop a comment about it in the [next weekly sprint issue](https://github.com/ipfs/weekly/issues/39)! The more people mention items they want to see in the weekly there, the easier it is to make this and send it out. + +Thanks, and see you next week! + +- Richard Littauer + +_Submit feedback about this issue [here](https://github.com/ipfs/weekly/issues/35), or send us [feedback about the IPFS Weekly in general](https://github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-011/README.md b/src/_blog/weekly-011/README.md new file mode 100644 index 00000000..25c94af8 --- /dev/null +++ b/src/_blog/weekly-011/README.md @@ -0,0 +1,76 @@ +--- +date: 2018-09-25 +url: /45-ipfs-weekly-11/ +translationKey: 45-ipfs-weekly-11 +tags: weekly +title: IPFS Weekly 11 +description: +author: Jenn Turner +--- + +## Welcome back to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://webchat.freenode.net/?channels=ipfs_) (#ipfs on the Freenode network). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- [IPFS is now available in 22 languages and counting!](https://www.transifex.com/ipfs/public/) Thanks to the recent IPFS [localisation effort](https://github.com/ipfs/i18n), IPFS is making its way around the globe. +- [Cloudflare joined the InterPlanetary Mission.](https://blog.cloudflare.com/distributed-web-gateway/) Check out Cloudflare’s IPFS Gateway, announced during its first Crypto Week. +- Watch the latest [Dynamic Data and Capabilities Working Group meeting video](https://www.youtube.com/watch?v=EiJE59uYNAk) from September 18 for a sneak peek at demos of identity manager and discussify, plus more. +- The first Berlin IPFS Meetup is happening on October 11th! [Sign up to attend on Meetup.](https://www.meetup.com/IPFS-Berlin/events/254816369/) +- The JavaScript implementation of IPFS just got a new homepage last month: [js.ipfs.io](https://js.ipfs.io/). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Dweb: Creating Decentralized Organizations with Aragon](https://hacks.mozilla.org/2018/09/aragon-ethereum-dweb/), Mozilla Hacks, 19 Sep 2018 +- [End-to-End Integrity with IPFS](https://blog.cloudflare.com/e2e-integrity/), Cloudflare, 17 Sep 2018 +- [CloudFlare’s IPFS Gateway Makes it Easy to Create Distributed Web Sites](https://www.bleepingcomputer.com/news/technology/cloudflares-ipfs-gateway-makes-it-easy-to-create-distributed-web-sites/), 17 Sep 17 2018 +- [An Interview with Textile](https://medium.com/textileio/an-interview-with-textile-6d52632f611b), 13 Sep 2018 +- [The Centralized Secret](https://medium.com/@kyletut/the-centralized-secret-c7de795ddd9f), 12 Sep 2018 +- [Decentralisation: the next big step for the world wide web](https://www.theguardian.com/technology/2018/sep/08/decentralisation-next-big-step-for-the-world-wide-web-dweb-data-internet-censorship-brewster-kahle), The Guardian, 8 Sep 2018, +- [Swapping bits and distributing hashes on the decentralized web](https://medium.com/textileio/swapping-bits-and-distributing-hashes-on-the-decentralized-web-5da98a3507), 4 Sep 2018, +- [Introducing Origin Messaging: Decentralized, Secure, and Auditable](https://medium.com/originprotocol/introducing-origin-messaging-decentralized-secure-and-auditable-13c16fe0f13e), Origin, 29 Aug 2018 +- [Dweb: Building Cooperation and Trust into the Web with IPFS](https://hacks.mozilla.org/2018/08/dweb-building-cooperation-and-trust-into-the-web-with-ipfs/), Mozilla Hacks, 29 Aug 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [ipfs-cluster 0.5.0](https://github.com/ipfs/ipfs-cluster/releases/tag/v0.5.0) – IPFS Cluster is a stand-alone application and a CLI client that allocates, replicates, and tracks pins across a cluster of IPFS daemons. +- [go-ipfs 0.4.17](https://github.com/ipfs/go-ipfs/releases/tag/v0.4.17) – IPFS implementation in Go +- [ipfs-companion v2.5.0.11550 (Beta)](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.5.0.11550) – Browser extension that simplifies access to IPFS resources, developers and enthusiasts can opt-in for Beta channel with hand-picked Dev Builds of our browser extension. +- [js-ipfs v0.32.0](https://github.com/ipfs/js-ipfs/releases/tag/v0.32.0) – IPFS implementation in JavaScript +- [npm-on-ipfs v0.6.4](https://github.com/ipfs-shipyard/npm-on-ipfs/releases/tag/v0.6.4) – 📦 Install npm modules through IPFS! +- [Replicated Object Notation 2.1](https://github.com/gritzko/ron/blob/master/docs/Objectives%20for%20RON%2021.md) – Replicated Object Notation, a distributed live data format, golang/ragel lib +- DNSLink Detection in IPFS Companion: [Our browser extension](https://github.com/ipfs-shipyard/ipfs-companion) detects [DNSLink](http://docs.ipfs.io/guides/concepts/dnslink/) by default now. Visit [docs.ipfs.io](http://docs.ipfs.io) or [tr.wikipedia-on-ipfs.org](https://tr.wikipedia-on-ipfs.org) and you will load it from IPFS, not HTTP! For more details: [DNSLink Support in IPFS Companion](https://github.com/ipfs-shipyard/ipfs-companion/blob/master/docs/dnslink.md) +- [Qri 0.5.2](https://github.com/qri-io/qri/releases/tag/v0.5.2), or Prune Norwegian Buhund, is here! +- [The Graph Development Update](https://medium.com/graphprotocol/the-graph-development-update-d90321e22748), 13 Sept 2018 +- [Polkadot PoC-2 is here](https://medium.com/polkadot-network/polkadot-poc-2-is-here-parachains-runtime-upgrades-and-libp2p-networking-7035bb141c25): Parachains, runtime upgrades, and Libp2p networkin + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Neocities hit 200K sites this month!](https://twitter.com/neocities/status/1039204355763666945) +- [are we distributed yet?](https://arewedistributedyet.com/) +- [Pinata](https://www.pinata.cloud/), deploy to IPFS effortlessly. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [35th Chaos Communication Congress](https://events.ccc.de/2018/09/11/35c3-call-for-participation-and-submission-guidelines/) CFP is now open. +- New Meetup Alert!: [peer to peer ÖRESUND](http://p2p-oresund.org/), in Malmö, Swededn, on October 27. +- [Sign up to be notified for IPFS Conf in Lisbon.](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-012/README.md b/src/_blog/weekly-012/README.md new file mode 100644 index 00000000..45e59af5 --- /dev/null +++ b/src/_blog/weekly-012/README.md @@ -0,0 +1,75 @@ +--- +date: 2018-10-02 +url: /46-ipfs-weekly-12/ +tags: weekly +title: IPFS Weekly 12 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Meet folks from Protocol Labs next Thursday at our IPFS Social in Glasgow. [Register for the event here](https://www.eventbrite.com/e/protocol-labs-tech-drinkup-tickets-50860367729). +- See IPFS in action in the first episode of [Around the block](https://lab.paratii.video/play/GLdcTbPq9fXb), a docu-series of interviews featuring some of the most intriguing characters & stories “in crypto-land” by Paratii Video. The best part? Their content is streamed via a p2p app called [the Lab](https://lab.paratii.video). The Lab is a repository for high-quality crypto content that doesn’t spy on you and relies on IPFS. It’s also is open source and you can distribute the series yourself through embedding. +- Introducing [IpfsCloud: A Decentralised Cloud Storage Platform](https://medium.com/ipfscloud/ipfscloud-a-decentralised-cloud-storage-platform-caf000173cd4) – A decentralised cloud storage platform, or the IPFS alternative to Google Drive +- Check out the recent [Filecoin demos with Chinese subtitles](https://www.youtube.com/watch?v=x145fNl6uKU). Many thanks to [Neo Ge](https://twitter.com/NeoGe_IPFSMain), of IPFS Main, for the translation. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Build a Decentralized Chat App with Knockout and IPFS](https://medium.com/textileio/build-a-decentralized-chat-app-with-knockout-and-ipfs-fccf11e8ce7b), Textile.io, 28 Sep 2018 +- [IPFS: A Complete Analysis of The Distributed Web](https://medium.com/zkcapital/ipfs-the-distributed-web-e21a5496d32d), zK Capital, 28 Sep 2018 _(Clicking this link means you are already using IPFS!)_ +- [Introduction to IPFS: The New & Improved Web](https://medium.com/@rtradetechnologies/introduction-to-ipfs-the-new-improved-web-efc89f158e6f), 26 Sep 2018 +- [Crypto-Advocacy Comes Of Age As Trade Groups And Think Tanks Move On Washington](https://www.forbes.com/sites/astanley/2018/09/22/crypto-advocacy-comes-of-age-as-trade-groups-and-think-tanks-move-on-washington/#67ac823666b5), Forbes Magazine, 22 Sep 2018 +- [Presenting a United Front of Blockchain Companies to Work With Congress](https://bitcoinmagazine.com/articles/presenting-united-front-blockchain-companies-work-congress/), Bitcoin Magazine, 21 Sep 2018 +- [Walking the DWeb walk](https://medium.com/textileio/walking-the-dweb-walk-9abc8b6e2b20) – How we moved our website to secure IPFS thanks to Cloudflare, Textile.io, 20 Sep 2018 +- [What’s really happening when you add a file to IPFS?](https://medium.com/textileio/whats-really-happening-when-you-add-a-file-to-ipfs-ae3b8b5e4b0f), 28 Aug 2018 +- [IPFS & Libp2p Developer Meetings - Growing The Decentralized Tech That Helps OpenBazaar Work](https://openbazaar.org/blog/IPFS-Libp2p-Developer-Meetings-Growing-The-Decentralized-Tech-That-Helps-OpenBazaar-Work/), OpenBazaar, 30 Jul 2018 +- [Watch videos from Our Networks 2018](https://ournetworks.ca/conference/recorded-talks/), which were also live-streamed over IPFS. + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [ipld-explorer-cli 0.14](https://blog.ipfs.io/44-ipld-explorer-cli-0-14/) - IPLD (Inter Planetary Linked Data) is the underlying data structure used by IPFS that allows it to store, retrieve and traverse through any type of content-addressed data. +- [ipfs-cluster 0.6.0](https://github.com/ipfs/ipfs-cluster/blob/0.6.0/changelog/CHANGELOG.md) – Increased the minor release number to signal changes to the Go APIs after upgrading to the new cid package, but, other than that, this release does not include any major changes. +- [js-ipfs 0.32.3](https://github.com/ipfs/js-ipfs/releases/tag/v0.32.3) – Some bug fixes for the JavaScript implementation of the IPFS protocol. +- [qri-io 0.5.4](https://github.com/qri-io/qri/releases/tag/v0.5.4) - A very minor release that cleans up a few issues with the API to make the frontend editor work 😄 +- [Announcing the launch of 0x protocol v2.0!](https://blog.0xproject.com/0x-protocol-v2-0-is-live-183aac180149) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Download the Brave Beta](https://brave.com/download-beta/) and get an early preview for new versions of Brave. +- [Announcing Hyperswarm](https://pfrazee.hashbase.io/blog/hyperswarm), Paul Frazee, 26 Sep 2018 +- [Chattervox](https://github.com/brannondorsey/chattervox), 📡 An AX.25 packet radio chat protocol with support for digital signatures and binary compression. Like IRC over radio waves. 〰 24 Sep 2018 +- [Agoric Releases Distributed Smart Contract Proof of Concept](https://agoric.com/proof-of-concept-release/), 20 Sep 2018 +- This [0x v2.0 AMA on Reddit](https://www.reddit.com/r/0xProject/comments/9itlkl/the_0x_v20_ama_wednesday_september_26th_2018_10/) +- [Arbore](https://arbo.re/) is a free and open-source file sharing application that enables you to send your pictures, documents, files to your contacts privately and without limits. +- [Creativechain](https://www.creativechain.org/project/) – A tool for the empowerment of artists and all kinds of creative people who produce, share and distribute digital content. +- [Manyverse](https://www.manyver.se/) A social network off the grid, download the beta version for Android. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [Eth San Francisco](https://ethsanfrancisco.com/), 5-7 Oct 2018, San Francisco +- The first Berlin IPFS Meetup is happening on October 11th! [Sign up to attend on Meetup.](https://www.meetup.com/IPFS-Berlin/events/254816369/) +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-013/README.md b/src/_blog/weekly-013/README.md new file mode 100644 index 00000000..af504955 --- /dev/null +++ b/src/_blog/weekly-013/README.md @@ -0,0 +1,70 @@ +--- +date: 2018-10-09 +url: /47-ipfs-weekly-13/ +tags: weekly +title: IPFS Weekly 13 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Join us on Thursday for [Protocol Labs’ Tech Social](https://www.eventbrite.com/e/protocol-labs-tech-social-tickets-50860367729) in Glasglow at 6:30pm. We hope to see you there! +- The first Berlin IPFS Meetup is also this Thursday, October 11th! [Sign up to attend on Meetup.](https://www.meetup.com/IPFS-Berlin/events/254816369/) Come chat all things decentralised with the IPFS community. 😎 +- [IPFS Cluster 0.6.0 was released last week](https://cluster.ipfs.io/news/20181003_0.6.0_release/). Big thanks to the contributors who helped make it happen: [@lanzafame](https://github.com/lanzafame), [@meiqimichelle](https://github.com/meiqimichelle), [@kishansagathiya](https://github.com/kishansagathiya), [@cannium](https://github.com/cannium), [@jglukasik](https://github.com/jglukasik) and [@mike-ngu](https://github.com/mike-ngu) and others. +- [IPFS The Interplanetary File System Explained & Illustrated](https://achainofblocks.com/2018/10/05/ipfs-interplanetary-file-system-simply-explained/) A great explainer showing how centralized and distributed systems work and how IPFS is changing the game. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [A big tech company is working to free the internet from big tech companies](https://www.technologyreview.com/s/612240/a-big-tech-company-is-working-to-free-the-internet-from-big-tech-companies/) MIT Technology Review, 05 Oct 2018 +- [Someone used my IPFS gateway for phishing](https://incoherency.co.uk/blog/stories/hardbin-phishing.html), James Stanley, 04 Oct 2018 +- [Phishing Attacks Distributed Through CloudFlare's IPFS Gateway](https://www.bleepingcomputer.com/news/security/phishing-attacks-distributed-through-cloudflares-ipfs-gateway/), 04 Oct 2018 +- [Brewster Kahle on What’s Next for the Decentralized Web Movement](https://spectrum.ieee.org/view-from-the-valley/telecom/internet/brewster-kahle-on-whats-next-for-the-decentralized-web-movement), 04 Oct 2018 +- Video: [FuseBox Ask Me Anything: Dat Protocol](https://www.youtube.com/watch?v=EwZ-CcxaG6s), Watch the round table event for anyone interested in learning about peer-to-peer “dweb” file sharing protocols, particularly Dat, 02 Oct 2018 +- [Tutorial: How to host your own file transfer service on your pc](https://blog.florence.chat/tutorial-how-to-host-your-own-file-transfer-service-on-your-pc-22698c9d6362), 28 Sep 2018 +- Video: [How to Leverage Libp2p for Blockchain Applications](https://www.infoq.com/presentations/blockchain-libp2p), Chris Pacia, 18 Sep 2018 +- [CloudFlare's IPFS Gateway Makes it Easy to Create Distributed Web Sites](https://www.bleepingcomputer.com/news/technology/cloudflares-ipfs-gateway-makes-it-easy-to-create-distributed-web-sites/), 17 Sep 2018 +- Video: [Creating a truly decentralized Ethereum Dapp using IPFS](https://www.recallact.com/presentation/creating-truly-decentralized-ethereum-dapp-using-ipfs), Brian Wentzloff, 06 Sep 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [ipwb v0.2018.10.01.1947](https://github.com/oduwsdl/ipwb/releases/tag/v0.2018.10.01.1947) – InterPlanetary Wayback: A distributed and persistent archive replay system using IPFS +- [js-datastore-s3 0.2.0](https://github.com/ipfs/js-datastore-s3/releases/tag/v0.2.0) – Datastore implementation with S3 backend (Also check out [go-ds-s3](https://github.com/ipfs/go-ds-s3), an implementation of the datastore interface backed by amazon s3.) +- [npm-on-ipfs 0.10.0](https://github.com/ipfs-shipyard/npm-on-ipfs/releases/tag/v0.10.0) – Added an s3 storage option +- [qri 0.5.5](https://github.com/qri-io/qri/releases/tag/v0.5.5) – 0.5.5 Smokey Topaz German Shorthaired Pointer is out, a.k.a. a patch release with some small features and a few bugfixes. +- [The Graph Development Update](https://medium.com/graphprotocol/the-graph-development-update-dbede6136dab), 03 Oct 2018 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [IPLD Mindmap](https://github.com/arxiu/ipld-mindmap) – Mindmap application using IPLD as underlying datastructure +- [Sourcegraph](https://about.sourcegraph.com/blog/discuss-code-and-docs-in-repositories/), Discuss code and docs in repositories +- [Numerai reveals Erasure: unstoppable, peer to peer data feeds](https://medium.com/numerai/numerai-reveals-erasure-unstoppable-peer-to-peer-data-feeds-4fbb8d92820a). + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- Introducing Decentralized Camp’s second yearly hackathon Nov 9-11 https://medium.com/buildyourthing/introducing-decentralized-camps-second-yearly-hackathon-9de20516a321 +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- [Git Merge 2019](https://git-merge.com/) – This year’s event takes place in Brussels, Belgium, and features a full-day offering technical content and user case studies, plus a day of workshops for Git users of all levels. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-014/README.md b/src/_blog/weekly-014/README.md new file mode 100644 index 00000000..19ac5a10 --- /dev/null +++ b/src/_blog/weekly-014/README.md @@ -0,0 +1,65 @@ +--- +date: 2018-10-16 +url: /48-ipfs-weekly-14/ +tags: weekly +title: IPFS Weekly 14 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Join us in London for an [IPFS Show and Tell](https://www.meetup.com/london-ipfs/events/255386386/) this Thursday! A bunch of IPFS Core Contributors and Developers of Distributed Applications will be there. +- Juan Benet will be speaking at [Web3 Summit in Berlin](https://web3summit.com/speakers/) later this month. [Tickets are still available](https://web3summit.com/tickets/). +- [DNSLink and IPNS availability survey](https://www.ctrl.blog/entry/dnslink-ipns-top1m-websites): 10 out of the top 1M sites had an IPNS DNSLink entry, but only 5 actually worked 🙃 +- WikiLeaks is now using [an experimental IPFS gateway](https://ipfs.wikileaks.org/) +- There’s an ongoing discussion of IPFS in [the Guix development mailing list](https://lists.gnu.org/archive/html/guix-devel/2018-10/msg00220.html) +- Take a deep dive with IPFS at [the next Munich IPFS meetup](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/255295895/), 28 Nov 2018 + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [libp2p: the modular P2P network stack by IPFS for better decentralized computing](https://hub.packtpub.com/libp2p-the-modular-p2p-network-stack-by-ipfs-for-better-decentralized-computing/), 09 Oct 2018 +- Slidedeck: [Peer-to-Peer Protocols for Our Cyber Commons](https://live.deprecated.systems/presentation.html#1), Benedict Lau, 09 Oct 2018, or see the presentation [here](https://www.youtube.com/watch?v=Ivd5LwlR1is) +- [The end of summer brings new updates to Textile and Textile Photos](https://medium.com/textileio/textile-update-september-2018-d0d00cca917), Textile Update | September 2018, 09 Oct 2018 +- [The Inter-Planetary File System](https://medium.com/@ben.little6/the-inter-planetary-file-system-fee2d3d0e8d6), Ben Little, 09 Oct 2018 +- [Take control of your photos](https://technology.mb.com.ph/2018/10/08/take-control-of-your-photos/), 08 Oct 2018 +- [How the Digital World of Data Storage is Changing Fast - The Biggest Decentralized Disruptors of Today](https://medium.com/aconomylabs/how-the-digital-world-of-data-storage-is-changing-fast-the-biggest-decentralized-disruptors-of-bf833440ea99), 05 Oct 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [qri 0.5.6](https://github.com/qri-io/qri/releases/tag/v0.5.6) – This patch release is focused on making inroads on some long-standing issues with peer discovery. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- Discover your next favorite decentralized application on [app.co](https://app.co/). +- Video: [CURIOSITY](https://www.youtube.com/watch?v=UjEngEpiJKo), see Richard Feynman doing what he does best - sharing his contagious fascination with the world. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- The Web3 Foundation has offered to fund ticket reductions for attendees at the [inaugural Web3 Summit](https://medium.com/web3foundation/endowing-an-open-inclusive-community-at-web3-summit-3013456f4f84) +- Cambrial x Blockstack Present: [The Case Against Individual Data Ownership](https://www.eventbrite.com/e/cambrial-x-blockstack-present-the-case-against-individual-data-ownership-tickets-51151166516), 24 Oct 2018, Berlin, Germany. +- Introducing [Decentralized Camp’s second yearly hackathon](https://medium.com/buildyourthing/introducing-decentralized-camps-second-yearly-hackathon-9de20516a321), 9-11 Nov 2018 +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on 29-30 Jan 2019. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-015/README.md b/src/_blog/weekly-015/README.md new file mode 100644 index 00000000..4a760551 --- /dev/null +++ b/src/_blog/weekly-015/README.md @@ -0,0 +1,65 @@ +--- +date: 2018-10-23 +url: /49-ipfs-weekly-15/ +tags: weekly +title: IPFS Weekly 15 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- In August, Protocol Labs held [Lab Day](https://protocol.ai/blog/august-2018-lab-day/) in San Francisco, and [the presentations and photos](https://lab-day.com/aug-03-2018/media) are available to check out now. +- The [IPFS Twitter pinbot](https://twitter.com/ipfspin/status/1053376847596187648) (@ipfspin) now supports adding content directly from tweets and a bunch of other improvements, check it out :) +- Video: IPFS: [A Sneakernet for your geodata](https://t.co/lLTf1IaZBk) Volker Mische, 18 Oct 2018 +- Check out [public-gateway-checker](https://github.com/ipfs/public-gateway-checker), which checks which public gateways are online or not +- Dan’s Dev series reviewed the GitHub libp2p library [in this video](https://www.youtube.com/watch?v=hP0hSZ7E7_Y)! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Why bother with P2P when you still need to guarantee uptime?](https://pfrazee.hashbase.io/blog/why-bother-with-p2p), Paul Frazee, 22 Oct 2018 +- [How to Keep Your IPFS Nodes Connected to Ensure Fast Content Discovery](https://medium.com/pinata/how-to-keep-your-ipfs-nodes-connected-and-ensure-fast-content-discovery-7d92fb23da46?_branch_match_id=371334966290849970), An IPFS Tutorial, Matt Ober, 19 Oct 2018 +- [How We Sped Up Unit Test Performance by 10x at Qri](https://qri.io/blog/unit_test_performance/), Dustin Long, 17 Oct 2018 +- [Introduction to Blockchain Governance](https://blog.district0x.io/introduction-to-blockchain-governance-bc6eea42ada3), P.J. Leimgruber, 17 Oct 2018 +- [hastebin.com clone using ipfs-companion for writing](https://ipfs.io/ipfs/QmUtKaW3MQ9b5R623V7VU1Grz4WosKA7KNKsgYVWxBqT5u/#) + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Version 0.33.0 of js-ipfs](https://github.com/ipfs/js-ipfs/issues/1635) is upon us! Check out the upcoming release notes. +- [textile-mobile android_1.6.14_262](https://github.com/textileio/textile-mobile/releases/tag/android_1.6.14_262) – Encrypted, secure, decentralized personal data wallet -- technology behind textile.photos + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Dark Crystal](https://darkcrystal.pw/) – Back up your secrets using the trust in your social network +- [Aldous Huxley on decentralization](https://twitter.com/hecturchi/status/1052328904373997568) (1946, Foreword to Brave New World) +- Brave [announced](https://brave.com/new-brave-browser-release-available-for-general-download/) first release of redesigned Chromium-based desktop version that replaces previous Muon-based browser and delivers 22% faster load time. It supports [IPFS Companion](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch) as well. [Give it a try](https://brave.com/)! +- [TEMPORAL](https://nuts.rtradetechnologies.com:6771/) is an enterprise-grade storage solution featuring an easy to consume API that can be easily integrated into your existing application stack, providing all the benefits of the distributed web, without any of the overhead that comes with running distributed storage nodes. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [Blockstack Featuring The Blockchain Association](https://blockstackhowardblockchainlab.splashthat.com/), A panel on Decentralization & Regulation with The Blockchain Association, 25 Oct 2018, 6pm +- Introducing [Decentralized Camp’s second yearly hackathon](https://medium.com/buildyourthing/introducing-decentralized-camps-second-yearly-hackathon-9de20516a321), 9-11 Nov 2018 +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-016/README.md b/src/_blog/weekly-016/README.md new file mode 100644 index 00000000..f4d8ea4c --- /dev/null +++ b/src/_blog/weekly-016/README.md @@ -0,0 +1,68 @@ +--- +date: 2018-10-30 +url: /50-ipfs-weekly-16/ +tags: weekly +title: IPFS Weekly 16 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- VIDEOS: See [Juan Benet’s talk](https://web3summit.com/speaker/juan-benet/) from the recent Web3 Summit, [“What exactly is Web3?”](https://www.youtube.com/watch?v=l44z35vabvA) and [Mike Goelzer’s talk](https://web3summit.com/speaker/mike-goelzer/), [“Libp2p: A Modular, P2P Networking Stack.”](https://www.youtube.com/watch?v=xqVmEzsin3Y&list=PLxVihxZC42nHlc7J-UqeS-asagbehBeh3&index=30) +- This week folks from [Protocol Labs](https://protocol.ai/) will be hanging out at [devcon](https://devcon4.ethereum.org/) in Prague. If you’re around town be sure to reach out and chat IPFS with them. +- [Sweet IPFS](https://discuss.ipfs.io/t/sweet-ipfs-full-ipfs-node-for-android/3779?u=lidel) is finally here. Download the full (beta) IPFS node for Android at [Google Play](https://play.google.com/store/apps/details?id=fr.rhaz.ipfs.sweet). +- Check out the [new media section](https://libp2p.io/media/) of the libp2p site for the latest videos and articles on all things libp2p. +- Learn how to [implement a payment channel with Libp2p](https://www.youtube.com/watch?v=t2qCmwUlY2Q) in this video from Lucas Vogelsang, also from the Web3 Summit. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Manyverse and Scuttlebutt: A human-centric technology stack for social applications](https://www.zdnet.com/article/manyverse-and-scuttlebutt-a-human-centric-technology-stack-for-social-applications/), 25 Oct 2018 +- Check out this [IPLD demo](https://twitter.com/jimpick/status/1055249910914633729), 24 Oct 2018 +- [YottaChain unlocks the potential of the IPFS protocol](http://www.digitaljournal.com/pr/3990415), 23 Oct 2018 +- [The 5 steps to end-to-end encrypted photo storage and sharing](https://medium.com/textileio/the-5-steps-to-end-to-end-encrypted-photo-storage-and-sharing-45ad4aad6b14), Textile.io, 23 Oct 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [go-ipfs 0.4.18-rc1](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#0418-2018-10-26-rc1) - First Release Candidate of largest go-ipfs release to date, 3 months in the making. If you are okay with living on the bleeding edge, please install and test! 😎 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Introducing Agora v2: Get ready to cast your vote](https://decentraland.org/blog/announcements/agora-v2-announcement), 24 Oct 2018 +- [Go Demo Rock-Paper-Scissors with libp2p](https://github.com/mikiquantum/rock-paper-scissors-demo), 24 Oct 2018 +- [Small Focused Modules](https://blog.sindresorhus.com/small-focused-modules-9238d977a92a), Sindre Sorhus, 25 Oct 2018 +- [Human Rights Review of QUIC](https://tools.ietf.org/html/draft-martini-hrpc-quichr-00), a new encrypted-by-default transport protocol aiming to make traffic more secure – and much more. +- [Coinbase and Circle announce the launch of USDC — a Digital Dollar](https://blog.coinbase.com/coinbase-and-circle-announce-the-launch-of-usdc-a-digital-dollar-2cd6548d237), 23 Oct 2018 +- [This new zine Oh Shit, Git! Recipes for gitting out of a git mess](https://gumroad.com/l/oh-shit-git), 21 Oct 2018 +- [How CryptoSource Eliminates Fake News with BloomID](https://blog.hellobloom.io/how-cryptosource-eliminates-fake-news-with-bloomid-c0d6b3b50dc4), Bloom Blog, 16 Oct 2018 +- Mozilla’s [libdweb](https://github.com/mozilla/libdweb), an extension containing experimental libdweb APIs. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [devcon iv](https://devcon4.ethereum.org/) is sold out, but lots of IPFS fans will be there, so keep an eye out! Oct 30 - Nov 2, Prague, Czech Republic +- [Dapp Dev & Crypto Games Hack Berlin](https://www.eventbrite.com/e/dorahacks-dapp-devcrypto-games-hackberlinfree-with-10000-prize-pool-tickets-49168232507) 3-4, Nov 2018 +- Introducing [Decentralized Camp’s](https://medium.com/buildyourthing/introducing-decentralized-camps-second-yearly-hackathon-9de20516a321) second yearly hackathon, 9-11 Nov 2018 +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-017/README.md b/src/_blog/weekly-017/README.md new file mode 100644 index 00000000..f19b0c6c --- /dev/null +++ b/src/_blog/weekly-017/README.md @@ -0,0 +1,70 @@ +--- +date: 2018-11-06 +url: /52-ipfs-weekly-17/ +tags: weekly +title: IPFS Weekly 17 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Releases abound! [js-ipfs 0.33.0](https://blog.ipfs.io/51-js-ipfs-0-33/) was released and features a lot of massive changes, including a total UI revamp, API updates and a new command line tool. Check it out! +- [ipfs-cluster 0.7.0](https://cluster.ipfs.io/news/0.7.0_release/) was also released to issue some bugfixes and some improvements you’ll enjoy. +- Microsoft launched an [IPFS template on Azure](https://azure.microsoft.com/en-us/blog/devcon4/) during devcon4. +- See [go-ipfs](https://go-city.github.io/#/github.com/ipfs/go-ipfs) as a codebase visualisation at GoCity. Like the Sims, but better! + +## Meet David Dahl 🙋‍♂️ + +Last week, during the [IPFS All Hands](https://www.youtube.com/watch?v=o1tUzgThZK0) meeting, viewers were treated to an introduction to establishing identities on IPFS by [David Dahl](https://keybase.io/ddahl). David is a Software Engineering Researcher at IBM, self-proclaimed Decentralized Enthusiast and frequent contributor to IPFS. Check out his work on creating a Keybase-like [social proof and Identity](https://github.com/IBM/ipfs-social-proof/blob/master/PLAN.md) for people and organizations via IPFS. And be sure to [say hi to David](https://twitter.com/deezthugs) on Twitter. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Textile Threads whitepaper… just kidding… a deeper look at the tech behind Textile’s Threads protocol](https://medium.com/textileio/wip-textile-threads-whitepaper-just-kidding-6ce3a6624338), 31 Oct 2018 +- [The Decentralized Web powered by Ravencoin & IPFS](https://blog.goodaudience.com/the-decentralized-web-powered-by-ravencoin-ipfs-79c0086b6340), 31 Oct 2018 +- [Decentralized Exchange with Open API To Facilitate Security Token Trading](https://www.coinspeaker.com/decentralized-exchange-with-open-api-to-facilitate-security-token-trading/), 30 Oct 2018 +- [Datasets Are Books, Not Houses](https://qri.io/blog/datasets_are_books/), qri Blog, 30 Oct 2018 +- [Hacking Graphite: Store a Document on IPFS](https://medium.com/the-lead/hacking-graphite-store-a-document-on-ipfs-82a53f777b6d), 30 Oct 2018 +- [Exploring Decentralized and Distributed Healthcare IT](https://medium.com/@loudsunday/exploring-decentralized-and-distributed-healthcare-it-3877f2e153b5), 30 Oct 2018 +- [Decentralized or Centralized: Why Not Hybrid?](https://medium.com/kzen-networks/decentralized-or-centralized-why-not-hybrid-daf082dfbabc), 24 Oct 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- Check out the massive changelog of highlights in the upcoming release of [go-ipfs 0.4.18](https://github.com/ipfs/go-ipfs/blob/b6f784814b69a029c149c5dc808d71d9da569ef9/CHANGELOG.md), one of the largest go-ipfs releases in recent history! +- The :100:th release of [IPFS Companion landed in beta channel](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.5.1.11970), give your feedback before it gets pushed to stable. +- [gatsby-plugin-ipfs 2.0.2](https://github.com/moxystudio/gatsby-plugin-ipfs) – Adds support for deploying Gatsby to IPFS by ensuring that assets are relative. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Redecentralize.org](https://www.patreon.com/redecentralize) is creating a community and platform to support a fair, empowering internet. +- [MetaMask mobile](https://metamask.io/) was launched last week. Both the mobile and the browser extension now integrate IPFS natively, resolving websites with ENS domains (.eth) from IPFS. +- [Topaz tells the truth.](https://medium.com/topaztellsthetruth/topaz-tells-the-truth-f7e1eb996893) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [Internet of Trust](https://www.meetup.com/Meetup-Blockstack-Paris/events/255913213/), Blockstack Paris, 13 Nov 2018 +- Introducing [Decentralized Camp’s second yearly hackathon](https://medium.com/buildyourthing/introducing-decentralized-camps-second-yearly-hackathon-9de20516a321), 9-11 Nov 2018 +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-018/README.md b/src/_blog/weekly-018/README.md new file mode 100644 index 00000000..25788c99 --- /dev/null +++ b/src/_blog/weekly-018/README.md @@ -0,0 +1,71 @@ +--- +date: 2018-11-13 +url: /54-ipfs-weekly-18/ +tags: weekly +title: IPFS Weekly 18 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Read more about [the release of go-ipfs 0.4.18](https://blog.ipfs.io/53-go-ipfs-0-4-18/), including details on the Experimental QUIC support! +- Have you watched the [Lab Day 2018 videos](https://www.youtube.com/channel/UCJvMzILpV3b4AWXTEeQjcng/videos) yet? If you missed the August event, catch up on all the great talks now. +- In case you missed it, the IPLD community has a [bi-weekly meeting to sync up on all IPLD related topics](https://www.youtube.com/watch?v=DFo4jtIEz_w&feature=youtu.be). It’s open for everyone and recorded. Check it out! +- Check out [this recap of the Decentralized Web Summit](https://ws-dl.blogspot.com/2018/11/2018-11-08-decentralized-web-summit.html), titled Shaping the Next Web by Sawood Alam, for a behind the scenes look at the Summit and IPFS Lab Day. + +## Meet Nicolás Pace + +[Nicolás Pace](https://twitter.com/nicopace) is a member of [AlterMundi A.C.](http://altermundi.net/prensa), a grassroots organization supporting rural underserved communities in their pursue for creating their own telecommunications infrastructure, their own piece of internet. He also happens to be an IPFS contributor, and spoke at the last IPFS All Hands On Call about “Hearing the Communities, Learning Through Grassroots.” [See the video from his talk here.](https://www.youtube.com/watch?v=4gVUKbXT0cM) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Is peer-to-peer the solution for open source software distribution?](https://medium.com/@probonopd/is-peer-to-peer-the-solution-for-open-source-software-distribution-ae92065cbf61), 12 Nov 2018 +- [Can Decentralization Impact And Enhance Geo-Location Data Privacy?](https://www.forbes.com/sites/yoavvilner/2018/11/10/can-decentralization-impact-and-enhance-geo-location-data-privacy/#60f6619863f8), Forbes, 10 Nov 2018 +- [Thai Rappers Adds Song on Zcoin’s Blockchain to Fight Censorship](https://coinjournal.net/thai-rappers-adds-song-on-zcoins-blockchain-to-fight-censorship/), 5 Nov 2018 +- [IBF launches a new distributed website with IPFS 🎉](https://medium.com/icelandic-blockchain-foundation/ibf-launches-a-new-distributed-website-with-ipfs-5d67536816bd), Icelandic Blockchain Foundation, 4 Nov 2018 +- [Build a Decentralized react-native application](https://blog.usejournal.com/build-a-decentralized-react-native-application-9897b5d88641), Noteworthy, 4 Nov 2018 +- [Why we’re rolling our own “intra-planetary” node discovery at NuCypher](https://blog.nucypher.com/why-were-rolling-our-own-intra-planetary-node-discovery-at-nucypher-beeb53018b0), Nu Cypher, 2 Nov 2018 +- [Special Update from the Dev Cave: Keeping Things Simple With IPFS](https://medium.com/xyonetwork/special-update-from-the-dev-cave-keeping-things-simple-with-ipfs-208ee0c9d0d8), XYO Network, 1 Nov 2018 +- [Practicing environmental data justice: From DataRescue to Data Together](https://rgs-ibg.onlinelibrary.wiley.com/doi/10.1002/geo2.61), Royal Geographical Society with IBG, 31 Oct 2018. Our collaborators at EDGI have published a paper about Data Together in the Royal Geographical Society’s open access journal Geo. + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [IPFS Companion v2.6.0](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.6.0) shipped with the new Web UI, revamped context menus and [new languages](https://www.transifex.com/ipfs/ipfs-companion)! +- [qri 0.6.0](https://github.com/qri-io/qri/releases/tag/v0.6.0) – AKA the Rifle Green Harrier release is a big ’ol release! Check out the release notes for the full details. +- [spdy-transport 3.0.0](https://www.npmjs.com/package/spdy-transport) – Many thanks to [Jacob Heun](https://twitter.com/jacobheun) for making node-spdy v4.0.0 and spdy-transport v3.0.0 ready for Node.js LTS! Check it out. 😎 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Aegeus](https://aegeus.io/), A New Era of Data Management – Building a completely distributed and secure means of sharing and storing data using IPFS. +- [Measurement Lab](https://www.measurementlab.net/) is a partnership between New America’s Open Technology Institute, Google Open Source Research, Princeton University’s PlanetLab, and others with the goal of measuring the Internet, saving the data and making it universally accessible and useful! + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- The Internet Archive is hosting a [Decentralized Web Meetup](https://www.eventbrite.com/e/decentralized-web-meet-up-tickets-52509395014) on 11 December 2018, in San Francisco, California. +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. Don’t miss it! +- [Data Terra Nemo](https://dtn.is/) is coming up in May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-019/README.md b/src/_blog/weekly-019/README.md new file mode 100644 index 00000000..c1290363 --- /dev/null +++ b/src/_blog/weekly-019/README.md @@ -0,0 +1,71 @@ +--- +date: 2018-11-20 +url: /56-ipfs-weekly-19/ +tags: weekly +title: IPFS Weekly 19 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- WATCH THIS: See David Dias present an update on his [past presentations about IPFS and Protocol Labs](https://www.youtube.com/watch?v=M4W6rzTOtP4&feature=youtu.be) at the latest Telecom Application Development Summit (TADS), plus introduce a little something new! +- IPFS got a shoutout during the [Chrome Dev Summit 2018](https://www.youtube.com/watch?v=Ai4aZ9Jbsys) because the platform folks are looking into IPFS as alternative distribution transport for [Signed HTTP Exchanges](https://developers.google.com/web/updates/2018/11/signed-exchanges). +- IPFS has made the [ThoughtWorks Technology Radar](https://www.thoughtworks.com/radar/platforms). Find us under “Assess.” +- Hello from Harvard! [Michelle Brous](https://twitter.com/itsemmdeebee/status/1063139004604923904) and Marvin Ammori were recently at Harvard Business School to talk about IPFS and Protocol Labs. + +## Meet Irakli Gozala 🎉 + +We’re in awe of the work IPFS contributor [Irakli Gozala](https://gozala.io/) is doing. Currently, he’s spearheading the effort to implement experimental APIs for Firefox WebExtensions with the goal of enabling dweb protocols in Firefox through browser add-ons. Check out his [libweb repo](https://github.com/mozilla/libdweb/) if you’re interested in contributing or see him chat more about it at the latest [IPFS All Hands call](https://youtu.be/0fT9HC2Crqw). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Breaking The Ice: A Crash Course In IPFS, Ethereum And Fat Protocols Of The Future](https://hackernoon.com/breaking-the-ice-a-crash-course-in-ipfs-ethereum-and-fat-protocols-of-the-future-eb9bd15eb96e), Hackernoon, 17 Nov 2018 +- [TADSummit 2018: Web3](http://blog.tadsummit.com/2018/11/16/tadsummit-2018-web3/), TADS Blog, 16 Nov 2018 +- [Distributed Web: host your website with IPFS clusters, Cloudflare, and DevOps](https://withblue.ink/2018/11/14/distributed-web-host-your-website-with-ipfs-clusters-cloudflare-and-devops.html), With Blue Ink, 14 Nov 2018 +- [Thailand Uses Blockchain-Supported Electronic Voting System in Primaries](https://www.nasdaq.com/article/thailand-uses-blockchain-supported-electronic-voting-system-in-primaries-cm1055512), Nasdaq, 13 Nov 2018 +- [Ethereum + IPFS + React DApp Tutorial Pt. 3](https://medium.com/@alexma6614/ethereum-ipfs-react-dapp-tutorial-pt-3-dc091408db64), Alexander Ma, 13 Nov 2018 +- [Can Decentralization Impact And Enhance Geo-Location Data Privacy?](https://www.forbes.com/sites/yoavvilner/2018/11/10/can-decentralization-impact-and-enhance-geo-location-data-privacy/#45217d3c63f8) Forbes, 10 Nov 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [js-libp2p 0.24.0 was released!](https://blog.ipfs.io/55-js-libp2p-0-24/) The best part? They added support for custom routers, turned relay on by default and threw in some extra goodies and improvements. Check it out! + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Siderus Orion v1.0](https://blog.siderus.io/sneak-peek-of-siderus-orion-v1-0-32dd545d6269), redesigned and restructured! +- [Introduction to MedPass](https://medium.com/@santiagocammi/introducci%C3%B3n-a-medpass-51c918b2b0b5), an application that stores medical information in emergencies and quickly makes it available to the doctors on call, enabling medical professionals to make better decisions with greater speed. +- [PMPeople to trust Projectized Organizations](https://medium.com/@pmpeople/pmpeople-to-trust-projectized-organizations-ed2ed80ea28e), this collaboration tool trusts IPFS to get the job done. +- [Cryptomapia –The Blockchain Ecosystem](https://cryptomapia.org/), explore, interact with and read the latest news of the Blockchain ecosystem with our interactive map. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- An [IPFS+Filecoin meetup is happening in Hong Kong](https://www.meetup.com/en-AU/Hong-Kong-IPFS-Meetup/events/256402950/), 24 Nov 2018 +- Get started with IPFS at the [Contribute to Open Source Project IPFS](https://www.meetup.com/en-AU/IPFS-Berlin/events/255970865/) in Berlin on Dec 9! +- The Internet Archive is hosting a [Decentralized Web Meetup](https://www.eventbrite.com/e/decentralized-web-meet-up-tickets-52509395014) on 11 December 2018, in San Francisco, California. +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- [Data Terra Nemo](https://dtn.is/) is coming up in May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-020/README.md b/src/_blog/weekly-020/README.md new file mode 100644 index 00000000..8b711c32 --- /dev/null +++ b/src/_blog/weekly-020/README.md @@ -0,0 +1,68 @@ +--- +date: 2018-11-27 +url: /57-ipfs-weekly-20/ +tags: weekly +title: IPFS Weekly 20 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Did you know there’s an [IPFS Weekly Call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call)? Mondays at 5pm, UTC join IPFS contributors around the globe for a face to face meeting that also features one or more short talks from guest presenters! Next week, December 3, presenter Jacob Heun will talk about the recent JS-Libp2p release, and the week after that Sander Pick will share about Textile photos. Check out the [IPFS Community Calendar](https://calendar.google.com/calendar/embed?src=ipfs.io_eal36ugu5e75s207gfjcu0ae84@group.calendar.google.com&ctz=UTC) for more dates and info! +- If you are newer to tech but passionate about decentralization you should apply for the [IT Engineer role](https://jobs.lever.co/protocol/6f389ca4-3c43-44a5-8695-63f7b023ecb2) at Protocol Labs. It’s a remote position helping empower the team working on IPFS, Filecoin, libp2p, and more! + +## Meet Mikeal Rogers 😎 + +Mikeal Rogers, or @mikeal everywhere online, is a creator of NodeConf and the popular npm package [`request`](https://www.npmjs.com/package/request). Among his many other achievements, he is a founding member of the Node.js Foundation and currently is the head of community at Protocol Labs. Follow Mikeal on Twitter for insights into open source, IPFS, and even occasionally, fine dining! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [This single-page web app can edit itself](https://medium.com/textileio/this-single-page-web-app-can-edit-itself-62734dac2700), Textile, 26 Nov 2018 +- [Tutorial: Host your own IPFS node and help the next generation of web](https://blog.florence.chat/tutorial-host-your-own-ipfs-node-and-help-the-next-generation-of-web-2860eb59e45e), Pact, 25 Nov 2018 +- [What’s the Real Cost of IPFS?](https://medium.com/pinata/whats-the-real-cost-of-ipfs-3623f274cfaa), Pinata, 22 Nov 2018 +- [KeySpace: End-to-End Encryption Using Ethereum and IPFS](https://medium.com/fluidity/keyspace-end-to-end-encryption-using-ethereum-and-ipfs-87b04b18156b), Fluidity, 20 Nov 2018 +- [Adding a file to IPFS remotely via the API with rails and rest-client](https://medium.com/@cvcassano/adding-a-file-to-ipfs-remotely-via-the-api-with-rails-and-rest-client-79f6b9ac11c0), 20 Nov 2018 +- [Protecting an IPFS node with nginx reverse proxy and http basic auth on Ubuntu 18.04](https://medium.com/@cvcassano/protecting-an-ipfs-node-with-nginx-reverse-proxy-on-ubuntu-18-04-e56685a10bcc), 20 Nov 2018 +- [What the Tech? MATRIX supports IPFS](https://medium.com/@matrixainetwork/what-the-tech-matrix-supports-ipfs-fe05e01ed5be), 17 Nov 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [IPFS Companion v2.6.2](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.6.2) shipped with [Web UI v2.2](https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v2.2.0) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- Check out the demo for [ipfs-live-streaming](https://github.com/tomeshnet/ipfs-live-streaming), created by [@ASoTNetworks](https://github.com/ASoTNetworks) and [@darkdrgn2k](https://github.com/darkdrgn2k) to stream videos over IPFS! +- [Introducing Subby](https://medium.com/@subby/introducing-subby-e8b2baf4124d), an uncensorable publishing platform for content creators. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [OPO.js on December 7](https://www.meetup.com/opo-js/events/256434646/) features Alex Potsides of Protocol Labs and some other awesome speaker so if you’re in Porto, check it out. +- Get started with IPFS at the [Contribute to Open Source Project IPFS](https://www.meetup.com/en-AU/IPFS-Berlin/events/255970865/) in Berlin on December 9! +- The Internet Archive is hosting a [Decentralized Web Meetup](https://www.eventbrite.com/e/decentralized-web-meet-up-tickets-52509395014) on 11 December 2018, in San Francisco, California. +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- Introducing [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- [Data Terra Nemo](https://dtn.is/) is coming up in May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-021/README.md b/src/_blog/weekly-021/README.md new file mode 100644 index 00000000..2b24e17a --- /dev/null +++ b/src/_blog/weekly-021/README.md @@ -0,0 +1,67 @@ +--- +date: 2018-12-04 +url: /59-ipfs-weekly-21/ +tags: weekly +title: IPFS Weekly 21 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- The [HTTP client libraries are being renamed](https://blog.ipfs.io/58-http-client-rename/)! The important news is that the HTTP client libraries are changing from `ipfs-api` to `ipfs-http-client`. True, it’s longer but way better at describing what the module is! Read the blog for more info. +- Look at [these amazing cookies](https://twitter.com/momack28/status/1069510119132516352) from @momack28’s holiday baking adventures. 😋 +- Don’t forget Sander Pick is presenting Textile photos at next week’s [IPFS Weekly Call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call), Monday at 5pm UTC. + +## Meet Yurko 👾 + +Last week, we mentioned [live-streaming over IPFS](https://github.com/tomeshnet/ipfs-live-streaming), and as it just so happens, at last week’s IPFS Weekly Call, Yurko was on hand to share it with us. Yurko is an IT native with two decades of experience and an active IPFS contributor. They are also a member of [Toronto Mesh](https://tomesh.net/), a group of folks building a mesh network for, you guessed it, Toronto! To learn more about live-streaming over IPFS, [check out the video](https://www.youtube.com/watch?v=VFsKl6UMwqM&feature=youtu.be&t=435) from last week’s meeting to see Yurko explain it. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Introduction to IPFS: Run Nodes on Your Network, with HTTP Gateways](https://medium.com/@rossbulat/introduction-to-ipfs-set-up-nodes-on-your-network-with-http-gateways-10e21ea689a4), Medium, 03 Dec 2018 +- [Curatorial Enclaves](https://medium.com/@odomojuli/curatorial-enclaves-cf595e5d099d), Medium, 03 Dec 2018 +- [BCH-Powered Bitcoin Files Project Adds IPFS Support](https://news.bitcoin.com/bch-powered-bitcoin-files-project-adds-ipfs-support/), Bitcoin News, 28 Nov 2018 +- [Stream videos from IPFS like on Youtube using Subby](https://medium.com/@subby/stream-videos-from-ipfs-like-on-youtube-using-subby-32b8df17ad03), 28 Nov 2018 +- [The Decentralized Internet: An HBO Tale?](https://medium.com/datadriveninvestor/the-decentralized-internet-an-hbo-tale-1c4247efdb44), Data Driven Investor, 27 Nov 2018 +- [Tutorial: How to host your own distributed website in just a few seconds](https://blog.florence.chat/tutorial-how-to-create-your-own-distributed-website-in-just-a-few-seconds-5100ccf068bc), Pact, 27 Nov 2018 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- Check out [`textile-go`](https://github.com/textileio/textile-go) and the [Files API](https://www.youtube.com/watch?v=5HnpMrvkWoo) for interacting with IPFS. +- [Neilos](https://medium.com/@marco.castignoli/neilos-bfda3f0137c6) offers a safer way to browse the web in which there is no risk of running malicious code on devices. Inspired by the concepts of the first World Wide Web, there is no need to run arbitrary code if we have powerful components! +- Here’s your invitation to [cyberc0n: Distributed search conference organized by a code](https://medium.com/@21xhipster/invitation-to-cyberc0n-first-distributed-search-conference-23863bbfa1d9). +- What exactly are the [advantages of Authpaper Delivery](https://medium.com/@icoauthpapercoin/advantages-of-authpaper-delivery-over-online-storage-solutions-and-ipfs-de9b251f6ecd) over online storage solutions and IPFS? +- A use-case for a [decentralized distributed healthcare ecosystem](https://medium.com/@loudsunday/use-case-for-a-ddhe-1a94529d2a4d 'DDHE') +- Enjoy your self hosted music with [Diffuse Music Player](https://ownyourbits.com/2018/11/16/enjoy-your-self-hosted-music-with-diffuse-music-player/), brought to you by sunjam. +- The [Avado Genesis Edition](https://ava.do/) has arrived just in time for Christmas, with an IPFS node, an Ethereum full node and a VPN standard. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [OPO.js on December 7](https://www.meetup.com/opo-js/events/256434646/) features Alex Potsides of Protocol Labs and some other awesome speaker so if you’re in Porto, check it out. +- Get started with IPFS at the [Contribute to Open Source Project IPFS](https://www.meetup.com/en-AU/IPFS-Berlin/events/255970865/) in Berlin on December 9! +- The Internet Archive is hosting a [Decentralized Web Meetup](https://www.eventbrite.com/e/decentralized-web-meet-up-tickets-52509395014) on 11 December 2018, in San Francisco, California. +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- [Data Terra Nemo](https://dtn.is/) is coming up in May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-022/README.md b/src/_blog/weekly-022/README.md new file mode 100644 index 00000000..44d76905 --- /dev/null +++ b/src/_blog/weekly-022/README.md @@ -0,0 +1,61 @@ +--- +date: 2018-12-11 +url: /60-ipfs-weekly-22/ +tags: weekly +title: IPFS Weekly 22 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- IPFS popped up on the [front page of Hacker News](https://news.ycombinator.com/item?id=18650375) this week. +- Last week was the 5th anniversary of [this commit](https://github.com/ipfs/ipfs/commit/e9aa7b298ac6f56764ac7adcfec51bdae80662a4) to the IPFS repository. 🎉 +- Protocol Labs, a team of folks behind IPFS, is [hiring right now](https://twitter.com/raulvk/status/1071172004320083968) for several roles, [check them out](https://jobs.lever.co/protocol?lever-via=Ggw2fUd2-n)! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Federated Meets P2P](https://medium.com/@RangerMauve/federated-meets-p2p-3a357145e7c0), Medium, 07 Dec 2018 +- [Radium 2.0 Development & Expansion Roadmap](https://blog.radiumcore.org/radium-2-0-development-expansion-roadmap-updated-dec-2018-46e89b5419b4), Radium Core, 07 Dec 2018 +- [Textile Update | November 2018](https://medium.com/textileio/textile-update-november-2018-a20282462af7), Textile, 07 Dec 2018 +- [Redecentralize.org Meetup](https://medium.com/@bryankam8/redecentralize-org-meetup-f13b1aaabcbd), Bryan Kam, 06 Dec 2018 +- [4 Decentralized Cloud Storage Platforms That Are Shaking Up The Industry](https://www.investinblockchain.com/decentralized-cloud-storage-platforms/), Invest in Blockchain, 05 Dec 2018 +- [Epicenter.tv featuring Nick Sullivan of Cloudflare, talking about The Internet’s (De)centralized Security Blanket](https://epicenter.tv/episode/264/), Epicenter, 04 Dec 2018 +- [The IPFS Cloud](https://medium.com/pinata/the-ipfs-cloud-352ecaa3ba76), Pinata, 04 Dec 2018 +- [Easy integrations with Textile Thread subscriptions](https://medium.com/textileio/easy-integrations-with-textile-thread-streams-7f1e3ce5c9b4), Textile, 03 Dec 2018 +- [How IPFS is Challenging the Web as We Know It](https://blog.rubiksdigital.com/how-ipfs-is-disrupting-the-web-e10857397822), Rubiks Digital, 04 May 2018 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Announcing PhysX SDK 4.0, an Open-Source Physics Engine](https://news.developer.nvidia.com/announcing-physx-sdk-4-0-an-open-source-physics-engine/) +- [Ether-1 Node Network](https://nodes.ether1.org/), gateway node beta testing is live! +- File synchronization on top of IPFS with git-like interface and fuse filesystem written in golang: [brig](https://github.com/sahib/brig) +- [This research paper](https://scholarworks.rit.edu/cgi/viewcontent.cgi?article=11070&context=theses) cites IPFS in its references to a Wikipedia page. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- TONIGHT: The Internet Archive is hosting a [Decentralized Web Meetup](https://www.eventbrite.com/e/decentralized-web-meet-up-tickets-52509395014) on 11 December 2018, in San Francisco, California. +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- [Data Terra Nemo](https://dtn.is/) is coming up in May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-023/README.md b/src/_blog/weekly-023/README.md new file mode 100644 index 00000000..c990199b --- /dev/null +++ b/src/_blog/weekly-023/README.md @@ -0,0 +1,71 @@ +--- +date: 2018-12-18 +url: /61-ipfs-weekly-23/ +tags: weekly +title: IPFS Weekly 23 +description: +author: Jenn Turner +--- + +## Welcome to the last IPFS Weekly of 2018! 🎉 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly, and remember, we’ll be back with more news on January 8th!👋 + +## The latest + +- IPLD gets a shout out in Mikeal Rogers’ talk from CascadiaJS 2018, [“The Future of the Web.”](https://www.youtube.com/watch?v=83Gws-dPL8A) +- Miss the last IPFS Weekly Call? Catch up by watching [this video from the December 17th call](https://www.youtube.com/watch?v=_ucs3Iipuw8&feature=youtu.be). And mark your calendars for the first call of 2019 on [Monday, January 7th](https://discuss.ipfs.io/t/ipfs-all-hands-on-meeting/4146/11) when Rüdiger Klaehn will be presenting on a prototype of an IPFS-based manufacturing execution system. See you then! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [The four factors to consider for optimal IPFS node distribution](https://medium.com/@kyletut/the-ipfs-network-c815a735bd0d), Textile, 18 Dec 2018 +- [BCH Devs Publish Bi-Directional Payment Concept Based on IPFS](https://news.bitcoin.com/bch-devs-publish-bi-directional-payment-concept-based-on-ipfs/), Bitcoin News, 18 Dec 2018 +- [A Distributed Search Engine for the Distributed Web](https://blog.florence.chat/a-distributed-search-engine-for-the-distributed-web-39c377dc700e), Pact, 13 Dec 2018 +- [Just recorded a Todo DApp based on peer-base working in a plane without internet connection.](https://twitter.com/satazor/status/1073017115282673664) They were both connected via a WIFI hotspot. André Cruz, 12 Dec 2018 +- [Entering the world of IPFS](https://medium.com/zinc_work/entering-the-world-of-ipfs-6755cd10c462), Zinc, 07 Sep 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [New Release! Qri 0.6.1 (dataset publication & versioning)](https://discuss.ipfs.io/t/new-release-qri-0-6-1-dataset-publication-versioning/4459), Qri, 13 Dec 2018 + +## In progress + +_What’s coming up next for the IPFS community and ecosystem._ + +- Check out this WIP to [add go-ipfs to openbsd ports](https://marc.info/?l=openbsd-ports-cvs&m=154513430817876&w=2) +- Look at the progress the js-ipfs dev team has made on the [upcoming release of v0.34.0](https://github.com/ipfs/js-ipfs/issues/1721) 😍 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [The public release of the Aegeus 1.0.0 Beta has arrived!](https://twitter.com/Aegeus_Coin/status/1074920193019781122) +- Check out [qtum-ipfs](https://github.com/qtumproject/qtum-ipfs), a demo for sharing files via Qtum and IPFS. +- [Quasar](https://clusterlabs.io/quasar/), by ClusterLabs, is an open, decentralized, anonymous search engine on IPFS. +- [Learn to Build Decentralized Applications In an Hour: Introducing ‘Zero-to-Dapp’](https://blog.blockstack.org/learn-to-build-decentralized-applications-in-an-hour-introducing-zero-to-dapp/), via Blockstack +- [Why digital tokens are the foundation for a new Internet](https://medium.com/@BlockchainAssoc/why-digital-tokens-are-the-foundation-for-a-new-internet-7a2dbbceb4f5), Blockchain Association, 13 Dec 2018 + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- The [Stanford Blockchain Conference 2019](https://cyber.stanford.edu/sbc19) is January 30th-February 1st 2019, Arrillaga Alumni Center, Stanford University. +- IPFS will be a topic of discussion at FOSDEM 2&3 February 2019 in Brussels. [Join us there!](https://fosdem.org/2019/) +- [Sign up to be notified for IPFS Conf 2019](https://docs.google.com/forms/d/e/1FAIpQLSfJVVPwvp6RY3MUg1zAVl1g_5y2nGb7WJIMI1Hs6glzm7FLHQ/viewform), in Lisbon. +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- [Data Terra Nemo](https://dtn.is/) is coming May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-024/README.md b/src/_blog/weekly-024/README.md new file mode 100644 index 00000000..74e4305e --- /dev/null +++ b/src/_blog/weekly-024/README.md @@ -0,0 +1,351 @@ +--- +date: 2019-01-08 +url: /62-ipfs-weekly-24/ +tags: weekly +title: IPFS Weekly 24 +description: +author: Jenn Turner +--- + +# Welcome to the first IPFS Weekly of 2019! 🎉 + +For this first week back, we’ve put together a very special issue looking back on all that you, the [InterPlanetary File System (IPFS)](https://ipfs.io/) community, accomplished in the last year. + +## 2018 was a year of significant milestones + +**January:** Mozilla adds [support for Decentralization Protocols](https://blog.mozilla.org/addons/2018/01/26/extensions-firefox-59/) in popular web browser, Firefox. + +**February:** The world was introduced to [libp2p](https://blog.keep.network/introduction-to-libp2p-57ce6527babe), a peer-to-peer networking stack built modularly, with IPFS. + +**March:** [js-ipfs v0.28.0](https://github.com/ipfs/js-ipfs/issues/1228) was released, Juan Benet presented [Redecentralizing the Web](https://www.youtube.com/watch?v=eeN_d4MpnNI) to MIT’s largest research lab, the Computer Science & Artificial Intelligence Lab, and go-ipfs released [version 0.4.14](https://blog.ipfs.io/34-go-ipfs-0.4.14). + +**April:** We introduced [IPFS Companion 2.2.0](https://blog.ipfs.io/35-ipfs-companion-2-2-0/) and gave folks a look at [go-ipfs on Windows](https://blog.ipfs.io/36-a-look-at-windows/). + +**May:** We announced the first ever [IPFSConf](https://twitter.com/IPFSbot/status/998964366077816832), Textile introduced [a personal IPFS](https://medium.com/textileio/your-photos-decentralized-and-encrypted-a-first-look-at-the-tech-inside-textile-photos-9b0155c25f15) that runs on your mobile device for true decentralized storage. [js-ipfs 0.29.0 was released](https://github.com/ipfs/js-ipfs/issues/1320) and we closed out the month by getting the [IPFS Cluster 0.4.0 release candidates](https://twitter.com/hecturchi/status/1001074944481120256) out with a newly launched [IPFS Cluster website](https://cluster.ipfs.io/) to boot. + +**July:** The [Awesome IPFS list](https://github.com/ipfs/awesome-ipfs) on GitHub was [relaunched as a website](https://twitter.com/daviddias/status/1024281949416771584). Released [js-ipfs v0.30.0](https://github.com/ipfs/js-ipfs/issues/1375) and [v0.31.0](https://github.com/ipfs/js-ipfs/issues/1458) back to back. js-libp2p had its first [_official_ release](https://github.com/libp2p/js-libp2p/issues/226), and lastly, [go-ipfs v0.4.17](https://twitter.com/Whyrusleeping/status/1023116433113247746) was released. + +**August:** We celebrated [Lab Day 2018](https://lab-day.com/aug-03-2018/) in San Francisco, California (see the talks from Lab Day [here](https://www.youtube.com/playlist?list=PLhuBigpl7lqvIymGaM7A_VT4CYZW3R_4Q)) and released both the [InterPlanetary Linked Data (IPLD)](https://explore.ipld.io/) explorer site and the official site for js-ipfs: [js.ipfs.io](https://js.ipfs.io/). We closed out the summer with the release of [IPFS Cluster 0.5.0](https://cluster.ipfs.io/news/20180824_0.5.0_release/). + +**September:** Cloudflare announced [their IPFS gateway](https://blog.cloudflare.com/distributed-web-gateway/) and the [IPFS Weekly Newsletter returned](https://blog.ipfs.io/45-ipfs-weekly-11/). [js-ipfs 0.32.0](https://github.com/ipfs/js-ipfs/issues/1497) was released and so was [ipld-explorer-cli 0.14](https://blog.ipfs.io/44-ipld-explorer-cli-0-14/). + +**October:** [IPFS Pinbot](https://twitter.com/ipfspin/status/1053376847596187648) emerged on Twitter. + +**November:** A big month for releases! [js-ipfs 0.33](https://github.com/ipfs/js-ipfs/issues/1635) and [go-ipfs 0.4.18](https://blog.ipfs.io/53-go-ipfs-0-4-18/) and [js-libp2p v0.24.0](https://github.com/libp2p/js-libp2p/issues/249) were all released. + +**December:** We ended the year with a bit of organization, by [renaming the HTTP client libraries](https://blog.ipfs.io/58-http-client-rename/). + +## Some cool news + +Some of our milestones were covered by major publications, so here’s a look back at some of the news we made. + +**August:** Mozilla Hacks, [Dweb: Building Cooperation and Trust into the Web with IPFS](https://hacks.mozilla.org/2018/08/dweb-building-cooperation-and-trust-into-the-web-with-ipfs/) + +**September:** The Guardian, [Decentralisation: the next big step for the world wide web](https://www.theguardian.com/technology/2018/sep/08/decentralisation-next-big-step-for-the-world-wide-web-dweb-data-internet-censorship-brewster-kahle) + +**October:** MIT Technology Review, [A big tech company is working to free the internet from big tech companies](https://www.technologyreview.com/s/612240/a-big-tech-company-is-working-to-free-the-internet-from-big-tech-companies/) + +**November:** Forbes Magazine, [Can Decentralization Impact And Enhance Geo-Location Data Privacy?](https://www.forbes.com/sites/yoavvilner/2018/11/10/can-decentralization-impact-and-enhance-geo-location-data-privacy/#60f6619863f8), Nasdaq, [Thailand Uses Blockchain-Supported Electronic Voting System in Primaries](https://www.nasdaq.com/article/thailand-uses-blockchain-supported-electronic-voting-system-in-primaries-cm1055512), and Hackernoon, [Breaking The Ice: A Crash Course In IPFS, Ethereum And Fat Protocols Of The Future](https://hackernoon.com/breaking-the-ice-a-crash-course-in-ipfs-ethereum-and-fat-protocols-of-the-future-eb9bd15eb96e). + +## Community events around the globe + +Throughout the year people were excited to meet and chat about IPFS. Here are some of the events we saw each other at, and if you missed these, there’s always 2019! + +**January:** [Lisbon IPFS](https://www.meetup.com/lisbon-ipfs/events/246513999/), 2018 is the year of the Distributed Web 🙌🏽 🌐 (see talks [here](https://twitter.com/daviddias/status/953388140785418240) and [IoT Dev Fest](https://twitter.com/chrismatthieu/status/957350700303794176) in Tempe, Arizona. + +**February:** The workshop [WebVR/AR III: Mixed Reality Networks](https://www.eventbrite.com/e/webvrar-iii-mixed-reality-networks-cc360-tickets-40763651178#) in Portland, Oregon. + +**May:** [Baltimore/DC IPFS](https://gateway.ipfs.io/ipfs/QmccuDo37eDmmWBRjJcpLJXiADnmRy7f59RWkkJQU7Jm97/) held a meet-up. + +**August**: [The IPFS community](https://twitter.com/IPFSbot/status/1024724255043280896) descended upon Decentralized Web Summit 2018 in San Francisco, California. + +**October**: The first [IPFS Berlin meetup](https://www.meetup.com/IPFS-Berlin/events/254816369/) and [IPFS Show & Tell in London](https://www.meetup.com/london-ipfs/events/255386386/) took place (see the talks from London [here](https://www.youtube.com/playlist?list=PLuhRWgmPaHtRdiy0HKNy4UZ4dKVUVL_KG)). + +## 2018 by the names and numbers + +All told 261 contributors produced 8417 commits across 167 repositories in the IPFS project this year. Thanks to the following folks for helping make this such an amazing year for IPFS. + +- 0xflotus +- abitrolly +- achingbrain +- acruikshank +- adamgall +- Admin-DataRoads +- ahazrat +- akrych +- alanshaw +- aleph2012 +- aleybovich +- alexander255 +- AliabbasMerchant +- amar-laksh +- anacrolix +- andreasolund +- andrewxhill +- aphelionz +- b5 +- bartcoelus +- bastiao +- bigs +- bjzhang +- bmuller +- bvand +- camelmasa +- carsonfarmer +- cboddy +- chenminjian +- chriscool +- chrismatthieu +- Coderlane +- contrun +- da2x +- daftaupe +- daijiale +- daviddahl +- daviddias +- davideicardi +- davidgilbertson +- DavidHuie +- DBLouis +- demmojo +- dignifiedquire +- dirkmc +- djdv +- dheatovwil +- dongtianyi +- dordille +- dorstu +- dreadhello +- drgrisham +- drozdziak1 +- dryajov +- dsemenovsky +- dustmop +- ebastos +- ebpa +- edsgerlin +- eefahy +- eingenito +- Elexy +- eordano +- erciccione +- fazo96 +- fbaiodias +- ffrist +- fiatjaf +- flipflopsimsommer +- flokli +- flyingzumwalt +- fluency03 +- FrankPetrilli +- fsdiogo +- garrensmith +- germeuser +- gjeanmart +- gpestana +- grokcoder +- groksrc +- hacdias +- hannahhoward +- hinshun +- hsanjuan +- hugomrdias +- ianopolous +- ibnesayeed +- ivan386 +- IvanLuLyf +- j-cr +- jacobheun +- jackloughran +- jamiejn +- jamiew +- jbenet +- JGAntunes +- jfranciscosousa +- jonafato +- jonahweissman +- JonKrone +- jonnycrunch +- justinmchase +- kamaci +- Kcchouette +- keks +- kevina +- kevinsimper +- kishansagathiya +- kjzz +- klueq +- koalalorenzo +- Kubuxu +- kyledrake +- Laevos +- lanzafame +- laser +- leekt216 +- leerspace +- leo6104 +- LEonGAo1991 +- lexrus +- lidel +- LinusU +- litzenberger +- lgierth +- luizirber +- machawk1 +- magik6k +- maksimyugai +- manandbytes +- marcooliveira +- marpett +- marten-seeman +- matrushka +- mburns +- mcollina +- meiqimichelle +- mhchia +- mishmosh +- michaelavila +- michaelmcandrew +- MichaelMure +- MidnightLightning +- mikeal +- miyazono +- mgoelzer +- mkg20001 +- momack2 +- Mr0grog +- My9Bot +- ncocchiaro +- negamaxi +- NeoTeo +- nGoline +- nicola +- Nipol +- nstrelow +- oed +- olebedev +- olizilla +- OR13 +- Otto-AA +- overbool +- parkan +- PascalPrecht +- passerby888 +- PedroMiguelSS +- petethomas +- pgte +- phritz +- pkafei +- PlayerWithoutName +- pmthomps +- pors +- postables +- Powersource +- preetsinojiya +- prettymuchbryce +- PunkChameleon +- qpakzk +- racin +- raoulmillais +- raulk +- renrutnnej +- requilence +- RichardLitt +- richardschneider +- ridewindx +- rjharmon +- rjrbt +- rob-deutsch +- robbsolter +- robotamer +- rodolfo-r +- Rokko11 +- romaric-juniet +- rwv +- s1na +- sahib +- sameer +- samli88 +- satazor +- satoru +- sbani +- schomatis +- seungwon-kang +- shunkino +- skylarnorris +- slandau3 +- soupdiver +- Stebalien +- steefmin +- steveruckdashel +- sublimino +- suzaku +- taigrr +- tarekbadrshalaan +- taylormike +- terichadbourne +- tdiesler +- the-owl +- thiagodelgardo111 +- thomasbeta +- Tirz +- travisperson +- TroyWilson1 +- TUSF +- ult-yole +- Varunram +- vasco-santos +- victorb +- vmx +- vukovinski +- vutsalsinghal +- vyzo +- wanderingstan +- warpfork +- waynewyong +- webmaniak +- wei-1 +- whereswaldon +- whilei +- whyrusleeping +- wraithgar +- ya7ya +- zbigniewzolnierowicz +- zcstarr +- ZenGround0 + +Huge thanks to all of you for your time, your expertise, and your contributions. We couldn’t do it without each and every one of you. ❤️ + +## Building the web with Awesome IPFS + +These are just a few of the new apps and tools that were submitted to the [new Awesome IPFS](https://awesome.ipfs.io/) site, showing that people are excited about building things with IPFS. + +- [brig](https://brig.readthedocs.io/en/latest) - File synchronization with git like interface and FUSE filesystem. + +- [IPFSStore](https://ipfsstore.it) - Pinning paid with Steem + +- [Autonomica “IPFS Social Proof”](https://github.com/IBM/ipfs-social-proof) - Autonomica is a Keybase-like Dapp for creating an identity and proving this identity via published social media and web proofs. + +- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and everything. + +- [Pinata](https://pinata.cloud) - Build and manage your dapp through Pinata’s REST API and IPFS toolkit. + +- [enzypt.io](https://enzypt.io/) - A website to buy and sell files through Ethereum and IPFS. + +- [qri](https://qri.io) - Dataset creation, collaboration, and discovery on the distributed web. + +- [Peer Bandwidth Demo](https://ipfs.io/ipfs/QmVaVXbLdw4R5NqAiiQoTWtitxo5g7FS31PQmCLbH9p8Fu/) - An demo app that uses window.ipfs, provided by the IPFS Companion web extension to get and graph bandwidth info for your IPFS node + +- [killcord](https://killcord.io/) - A censorship resistant deadman’s switch + +- [Philes](https://github.com/chrismatthieu/philes) - A simple browser-based IPFS notepad app. + +- [Arpadyne](https://arpadyne.computes.com) - The New Internet - DNS powered by OrbitDB. Content delivered via IPFS. + +## Thanks for reading ☺️ + +That’s it for this special edition of the IPFS Weekly. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! Next week we’ll return with all the news that’s happened across the ecosystem since the last Weekly of 2018. + +If this is your first time reading the IPFS Weekly, you can learn more or get involved by checking out the project on [GitHub](https://github.com/ipfs), or joining us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +See you next week! 👋 diff --git a/src/_blog/weekly-025/README.md b/src/_blog/weekly-025/README.md new file mode 100644 index 00000000..4c3f7059 --- /dev/null +++ b/src/_blog/weekly-025/README.md @@ -0,0 +1,72 @@ +--- +date: 2019-01-15 +url: /63-ipfs-weekly-25/ +tags: weekly +title: IPFS Weekly 25 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## Announcing ProtoSchool + +This week we’re excited to announce the launch of [ProtoSchool](https://proto.school/), an educational community that teaches decentralized web protocols and tools through online tutorials and local chapter events. + +[Self-guided interactive tutorials](https://proto.school/#/tutorials) teach new concepts through code challenges completed in the browser, with feedback to help you track your progress. Tutorials are built by community members like you with an interest in helping others learn about IPFS and other decentralized web projects such as IPLD, LibP2P, Multiformats, and Filecoin. + +[Local chapter events](https://proto.school/#/chapters) around the world use ProtoSchool tutorials as curriculum, with mentors available to help participants work through the challenges. ProtoSchool chapters operate independently, but each has its own repo in our org to facilitate chapter discussions and event planning, as well as easy hosting of a chapter website via GitHub Pages. [Start your own chapter today!](https://proto.school/#/host) Check out our [launch video](https://youtu.be/G5aiLkHZ7CM) to learn more about how you can get involved with the ProtoSchool community. + +## Meet Jordyn Bonds and Mark Henderson of TallyLab + +At next week’s IPFS Weekly Call, creators of [TallyLab](https://tallylab.com/), Jordyn Bonds and Mark Henderson will be on hand to explain how they used IPFS to help them build the encrypted diary app. Besides being CTO for TallyLab, Mark is also Distributed Systems Engineer at Haja Networks (working on OrbitDB) and is an active IPFS contributor. On the side, he makes podcasts and runs a marine science hackathon. Jordyn is TallyLab’s CEO – which, on any given day can mean building the UI, talking to customers, bookkeeping, or anything else under the sun. On the side, she is an instructor for Girls Who Code and throws a monthly karaoke party out of her living room. See their presentation next Monday at 5pm UTC [here](https://protocol.zoom.us/j/443621844). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [2018 in Decentralization](https://inthemesh.com/archive/2018-in-decentralization/), In the Mesh, 09 Jan 2019 +- [Introduction to InterPlanetary File System](https://medium.com/@kishansagathiya/interplanetary-file-system-c30ba165e499), Kishan Sagathiya, 09 Jan 2019 +- [Easy personal IPFS pinning service with Textile](https://medium.com/textileio/easy-personal-ipfs-pinning-service-with-textile-9d366da4e420), Textile, 04 Jan 2019 +- [Blockchain Storage: Data Integrity Certification Is the Key](https://ethereumworldnews.com/blockchain-storage-data-integrity-certification-is-the-key/), Ethereum World News, 03 Jan 2019 +- [Civil-Backed News Site Stores Full Article on Ethereum Blockchain](https://www.coindesk.com/civil-backed-news-site-archives-article-on-ethereum-blockchain), CoinDesk, 21 Dec 2018 +- [How one of the winning hacks beat the IPFS out of ETHBerlin… (and other hackathons)](https://medium.com/ethberlin/how-one-of-the-winning-hacks-beat-the-ipfs-out-of-ethberlin-and-other-hackathons-26d8be9408c2), ETHBerlin, 20 Dec 2018 +- [Sludge Publishes Full Text of Investigation to Ethereum Blockchain](https://readsludge.com/2018/12/19/sludge-publishes-full-text-of-investigation-to-ethereum-blockchain/), Sludge, 19 Dec 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [IPFS Cluster 0.8.0-rc1](https://dist.ipfs.io/ipfs-cluster-service) is here! For more, [check out the changelog](https://github.com/ipfs/ipfs-cluster/blob/0.8.0/changelog/CHANGELOG.md). + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Sweet IPFS](https://f-droid.org/app/fr.rhaz.ipfs.sweet) – Run and manage an IPFS node from your device +- [Dweb.page (previously Pact.online)](https://github.com/PACTCare/Dweb.page) is an open source webpage that lets you share and search content on the distributed web based on IPFS. +- [brig](https://github.com/sahib/brig): Ship your data around the world + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- [Graph Day](https://thegraph.com/graphday) was recently announced and will take place at the historic Grand Theater in San Francisco, California on January 25th, 2019. +- [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany on January 29-30, 2019. +- IPFS will be a topic of discussion at FOSDEM 2&3 February 2019 in Brussels. [Join us there!](https://fosdem.org/2019/) +- [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) will be on Saturday March 2nd. In 2019 there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- [Data Terra Nemo](https://dtn.is/) is coming May 2019, and [they’ve announced Juan Benet](https://twitter.com/juanbenet/status/1059987667377577985) as their first speaker. + +And lastly, IPFS Conf will take place at LX Factory in Lisbon on Wed 26th - Friday 28th June, 2019. More info about our CFP and early bird tickets coming soon! + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-026/README.md b/src/_blog/weekly-026/README.md new file mode 100644 index 00000000..6abe233f --- /dev/null +++ b/src/_blog/weekly-026/README.md @@ -0,0 +1,78 @@ +--- +date: 2019-01-22 +url: /65-ipfs-weekly-26/ +tags: weekly +title: IPFS Weekly 26 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Last week, [JS IPFS 0.34](https://blog.ipfs.io/64-js-ipfs-0-34/) was released. It’s fast, small, supports big dirs, is flexible with CID versions and more! Read the full release notes [here](https://github.com/ipfs/js-ipfs/issues/1721). +- Check out this video, [Making the Web Work Offline](https://www.youtube.com/watch?list=PLuhRWgmPaHtRdiy0HKNy4UZ4dKVUVL_KG&time_continue=7&v=VllPpxVNH5k) from Molly Mackinlay, and if you’re interested in joining the conversation, come to [the working group meetup](https://github.com/ipfs/local-offline-collab/issues/7), tomorrow, Jan 23. +- We’re excited about [let’s talk about IPFS](https://fosdem.org/2019/schedule/event/the_new_internet/), an upcoming talk at FOSDEM 2019! +- ICYMI: [Introducing ProtoSchool](https://www.youtube.com/watch?v=G5aiLkHZ7CM), learn about [ProtoSchool](https://proto.school/#/), an educational community that teaches decentralized web protocols and tools through online tutorials and local chapter events, in this introduction video. + +## Meet Matt Ober 😸 + +[Matt Ober](https://twitter.com/MattOber1) comes from Omaha, Nebraska, where he spends most of his days coding everything that goes into [Pinata](https://pinata.cloud/), a pinning service for the IPFS ecosystem. Pinata makes managing content on IPFS easy through a variety of tools and API endpoints. When Matt isn’t developing Pinata, he’s usually hanging out with his dog Winston or trying out some random dinner recipe he found on the internet. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [How Blockchain Technology Can Help Cannabis Recovery Efforts In Natural Disasters](https://www.forbes.com/sites/andrebourque/2019/01/21/how-blockchain-technology-can-help-recovery-efforts-in-natural-disasters/#74c6b2ec1b54), Forbes, 21 Jan 2019 +- [Torrent Paradise Creates Decentralized ‘Pirate Bay’ with IPFS](https://torrentfreak.com/torrent-paradise-creates-decentralized-pirate-bay-with-ipfs-190120/), TorrentFreak, 20 Jan 2019 +- [Building The World’s First IPFS Data Center — Part 1](https://medium.com/@rtradetech/building-the-worlds-first-ipfs-data-center-part-1-6da08133b77c), 18 Jan 2019 +- [IPFS vs HTTP: How distributed networks make the internet great again](https://cryptoinsider.com/distributed-networks-internet/), Crypto Insider, 11 Jan 2019 +- [Deploy a private IPFS network on Ubuntu in 5 steps](https://medium.com/@s_van_laar/deploy-a-private-ipfs-network-on-ubuntu-in-5-steps-5aad95f7261b), 11 Jan 2019 +- The Egyptian company [Elkrem](https://twitter.com/ElkremInc), will be exhibiting its top-notch technology at CES2018, 10 Jan 2019 +- VIDEO: [IPFS in Azure](https://channel9.msdn.com/Shows/Blocktalk/IPFS-in-Azure), Block Talk, 3 Jan 2019 +- PODCAST: [Calling the Zaif Exchange Hack and a Look at the Interplanetary File System (IPFS)](https://medium.com/@QuantLayer/zaif-exchange-hack-and-how-we-called-it-two-months-ago-and-the-interplanetary-file-system-ipfs-532e742c4f53), Quantlayer, 3 Jan 2019 +- VIDEO: [IPFS Web 3.0 and the future of human civilization](https://www.youtube.com/watch?v=xmAedcmhUvI&feature=youtu.be) with Eric Des Courtis, 3 Jan 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [IPFS Cluster 0.8.0 is out!](https://cluster.ipfs.io/news/0.8.0_release/) +- [Textile Photos Release Version 0.5.0](https://medium.com/textileio/textile-photos-release-version-0-5-0-5baed6a9d993) +- [IPFS Desktop Client: Orion v1.0](https://blog.siderus.io/ipfs-desktop-client-orion-v1-0-b9c63411b732) +- [OneLoveDTube IPFS uploader 0.8.3](https://steemit.com/onelovedtube/@techcoderx/onelovedtube-ipfs-uploader-0-8-3-mobile-optimizations-multi-resolution-upload-support-and-more): Mobile optimizations, multi-resolution upload support, and more! + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Someone created a Udemy course on IPFS!](https://www.udemy.com/ipfs-nextgen-web-develop-deploy-integrate/) +- [2read](https://addons.mozilla.org/en-US/firefox/addon/2read/) – Convert article in current tab to readable form and upload it to P2P network (IPFS). +- [Haven](https://bitcoinmagazine.com/articles/haven-new-app-ob1-lets-users-chat-shop-and-send-crypto-privately/), a new app from OB1, lets users chat, shop and send crypto privately. +- [PirlTube WebView Beta is Released!](https://pirltube.com/ipns/QmPq5wsJx28EJaGHHxkBzbRgufVK3scJey2oM886iUQ175/#/videos) Access the immutable and decentralized video content shared on PirlTube through your browser! The most decentralized video sharing platform has no SPF and is completely hosted on Pirl Infrastructure +- [Nile](https://medium.com/nile-shopping/nile-954c92a56d93) - A decentralized, commission-free, local-economy focused online shopping platform. (And blockchain free) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- 24 Jan 2019: [Decentralization: What Have You Done For Me Lately? (part 1 of 2)](https://www.meetup.com/Blockstack-Newark-the-New-Internet-for-Decentralized-Apps/events/257129587/?_xtd=gqFyqTE4NzU3MjE5NKFwo3dlYg&from=ref), the meetup that’s not only for developers 👨‍💻/ designers 👨‍🎨/ marketers 👨‍💼 / engineers 👩🏽‍🔧 / entrepreneurs 👩‍💼 but also for the “curious” 🦄mind out there, in Newark, New Jersey. +- 25 Jan 2019: [Graph Day](https://thegraph.com/graphday) was recently announced and will take place at the historic Grand Theater in San Francisco, California. +- 29-30 Jan 2019: [AraCon](https://blog.aragon.org/announcing-aracon-the-aragon-conference/), the first Aragon Conference, will take place in Berlin, Germany. +- 2-3 Feb 2019: IPFS will be a topic of discussion at FOSDEM in Brussels. [Join us there!](https://fosdem.org/2019/) +- 6 Feb 2019: Qri: A bleeding-edge open source data science tool on the distributed web, hosted by [New York Artificial Intelligence in Healthcare](https://www.meetup.com/NYHAIS/events/257935451/). +- 2 Mar 2019: On [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- 17-18 May 2019: [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-027/README.md b/src/_blog/weekly-027/README.md new file mode 100644 index 00000000..82076a75 --- /dev/null +++ b/src/_blog/weekly-027/README.md @@ -0,0 +1,79 @@ +--- +date: 2019-01-29 +url: /67-ipfs-weekly-27/ +tags: weekly +title: IPFS Weekly 27 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- This weekend the IPFS Community will be at [FOSDEM 2019](https://github.com/ipfs/community/issues/378#issuecomment-458439399), will you? [Follow this issue](https://github.com/ipfs/community/issues/378#issuecomment-458439399) for updates on an IPFS Meetup at the event. +- David Dias wrote up a fantastic [2018 Q4 London Hack Week Summary](https://blog.ipfs.io/65-london-hack-week-report/) on the IPFS blog last week. Read the full recap for photos, details about the community show and tell, and more. +- [ProtoSchool](https://proto.school/#/chapters) is off and running. There are now eight local chapters across three continents! Check it out! + +## Meet Paula de la Hoz + +Next week, [Paula de la Hoz](https://terceranexus6.github.io/) will be joining the [IPFS All Hands weekly call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) to present on “Decentralized Internet and Privacy.” Paula has been a security auditor for the past few years, investigating and researching security and internet censorship. She is studying engineering and has a background in investigative journalism. Paula co-founded a privacy and digital rights awareness association called [Interferencias](https://twitter.com/Inter_ferencias). She is passionate about freedom of software and hardware, so her talk will be a fantastic one! Join the IPFS All Hands call next Monday, 5pm UTC. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [IPFS: A Distributed File Store](https://medium.com/block360-labs/ipfs-a-distributed-file-store-533cda4c6047), Block360 Labs, 29 Jan 2019 +- [How to build a completely free Dapp](https://blog.florence.chat/tutorial-how-to-build-a-completely-free-dapp-11a4ddf5959c), Pact.Care, 29 Jan 2019 +- [Blockchain and the Next Cold War](https://medium.com/@johnstonmike/ipfs-next-cold-war-f4470dbd5f0f), 27 Jan 2019 +- TUTORIAL: [Installing an IPFS Server on Debian 9 and Updating](https://www.abyssproject.net/2019/01/installation-dun-serveur-ipfs-sous-debian-9-et-mise-a-jour/), Abyss Project, 24 Jan 2019 +- VIDEO: [“Decentralization and the Great Pendulum of History” | Blockstack Tour - Hong Kong](https://www.youtube.com/watch?v=o2HxOqZzR1U), Daniel Jeffries, 23 Jan 2019 +- VIDEO: [Tensions Inherent to Building on Blockchains](https://blog.blockstack.org/nick-grossman-on-tensions-inherent-to-building-on-blockchains/), Nick Grossman, 23 Jan 2019 +- [IPFS-powered Torrent Paradise is decentralized and invulnerable](https://medium.com/chainrift-research/ipfs-powered-torrent-paradise-is-decentralized-and-invulnerable-fde51a0bc4d6), ChainRift Research, 22 Jan 2019 +- PODCAST: [Developers Corner #5 featuring Alexandre ‘Postables’ Trottier - IPFS expert](https://www.youtube.com/watch?v=TDvgcdMxmzo&feature=youtu.be), 28 Dec 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Qri 0.6.2: IPFS HTTP API Support](https://github.com/qri-io/qri/releases/tag/v0.6.2) + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [Is there a peer to peer backup system build on IPFS yet?](https://www.reddit.com/r/ipfs/comments/aifgtc/is_there_a_peer_to_peer_backup_system_build_on/) +- [Are there any non-technical obstacles (e.g., administrative barriers) to using IPFS?](https://www.reddit.com/r/ipfs/comments/ahgexw/are_there_any_nontechnical_obstacles_eg/) +- [How secret are CIDs and what should I think about hosting user uploaded media on IPFS?](https://discuss.ipfs.io/t/how-secret-are-cids-and-what-should-i-think-about-hosting-user-uploaded-media-on-ipfs/4740) +- [Social Media Architecture with IPFS](https://discuss.ipfs.io/t/social-media-architecture-with-ipfs/4625/2) +- [Is there any IPFS based application for private folder sharing, with GUI, available for Linux and Windows?](https://www.reddit.com/r/ipfs/comments/acw116/ipfs_based_file_sharing_application_with_gui/) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Temporal-JS SDK (Full Public IPFS+IPNS Usage)](https://rtradetechnologies.atlassian.net/wiki/spaces/TEM/blog/2019/01/29/57671683/Temporal-JS+SDK+Full+Public+IPFS+IPNS+Usage): Not only can you pin content with the SDK, you have complete usage of all our public IPFS, and IPNS API calls. This means you can create and export keys, publish IPNS records, upload files, download files, use pubsub, retrieve IPLD objects, and object statistics. +- [exoHash](https://galactictalk.org/d/1815-exohash-a-token-driven-data-science-product) – A token driven data science product. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- 2 Feb 2019: [IPFS Bootstrapping - 2019 edition](https://www.meetup.com/it-IT/copenhagen-ipfs/events/258321153/) is coming to the Copehagen IPFS community. +- 2-3 Feb 2019: IPFS will be a topic of discussion at FOSDEM in Brussels. [Join us there!](https://fosdem.org/2019/) +- 6 Feb 2019: Qri: A bleeding-edge open source data science tool on the distributed web, hosted by [New York Artificial Intelligence in Healthcare](https://www.meetup.com/NYHAIS/events/257935451/). +- 15-17 Feb 2019: [ETHDenver 2019](https://www.ethdenver.com/#venue), The ETHDenver #BUIDLATHON is about bringing together like minds around a common purpose. +- 2 Mar 2019: On [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- 17-18 May 2019: [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-028/README.md b/src/_blog/weekly-028/README.md new file mode 100644 index 00000000..98553c86 --- /dev/null +++ b/src/_blog/weekly-028/README.md @@ -0,0 +1,79 @@ +--- +date: 2019-02-05 +url: /68-ipfs-weekly-28/ +tags: weekly +title: IPFS Weekly 28 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- [js.ipfs.io](https://js.ipfs.io/) is now translated in 9 languages!! The latest addition being Chinese. All thanks to the [Transifex project that the Web Browsers Working Group kicked off](https://github.com/ipfs/js.ipfs.io#internationalization-i18n) and our amazing community of contributors 👏👏👏 +- Manage your IPFS installs with [this new CLI tool](https://www.youtube.com/watch?v=C7A3-ycCRWU), [iim](https://github.com/alanshaw/iim), created by [Alan Shaw](https://twitter.com/_alanshaw/status/1090754167512145920). + +## Meet Michelle Hertz + +Michelle Hertz works on the IPFS [Decentralized Data Stewardship working group](https://github.com/ipfs/decentralized-data-stewardship) at Protocol Labs. Before Protocol Labs, Michelle worked at [18F](https://18f.gsa.gov/) as a UX developer and Front End Design Supervisor. At 18F, she assisted in helping various government departments in the United States create more user-centric web interfaces. She is passionate about building products that meets the needs of the user. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Future implementations of Callisto Network IPFS](https://medium.com/@thespigfish/future-implementations-of-callisto-network-ipfs-8acc34f2e715), 3 Feb 2019 +- [Decentralization is Not Enough](https://medium.com/offline-camp/decentralization-is-not-enough-75b15b8bc230), Interview with Nolan Lawson, 1 Feb 2019 +- [Soy is the Secret Sauce for the Unstoppable Web](https://medium.com/web3studio/soy-is-the-secret-sauce-for-the-unstoppable-web-6e2c1f37430b), ConsenSys Web3Studio, 31 Jan 2019 +- [Aragon comes back to the desktop](https://blog.aragon.org/aragon-desktop/), 30 Jan 2019 +- [IPFS in a Nutshell](https://medium.com/@seraya/ipfsf-abd5fccf528), 30 Jan 2019 +- [Hosting Slate Documentation On IPFS](https://rtradetechnologies.atlassian.net/wiki/spaces/TEM/blog/2019/01/30/58261558/Hosting+Slate+Documentation+On+IPFS), Temporal, 29 Jan 2019 +- [Introducing the Origin Marketplace Creator: Instant Peer-to-Peer Marketplaces](https://medium.com/originprotocol/introducing-the-origin-marketplace-creator-instant-peer-to-peer-marketplaces-c7f58bb576c4), Origin, 28 Jan 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [qri 0.7.0](https://github.com/qri-io/qri/releases/tag/v0.7.0) is packed mostly with stability improvements, but we also shipped support for Excel! + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [Would I be able to build a completely decentralized Wiki using IPFS?](https://discuss.ipfs.io/t/decentralized-wiki/4786/2) +- [I want to create a record in this public database and link to their also public solutions... there is a way to do it on IPFS?](https://www.reddit.com/r/ipfs/comments/al8429/help_neededdapps_solvo_spread_knowledge_p2p/) +- [If a node requests data from another cluster in which it is a member, is this data also distributed in the new cluster?](https://discuss.ipfs.io/t/data-replication-among-multiple-ipfs-clusters/4781) +- [What motivates people to use IPFS for large volumes of data?](https://www.reddit.com/r/ipfs/comments/am42wf/what_motivates_people_to_use_ipfs_for_large/) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Dogenealogy](https://dogenealogy.netlify.com/) is a decentralized breed registry made by Lorenzo Zaccagnini, uses Etherum blockchain and IPFS in order to track the animal pedigree. +- [Temporal.cloud](https://medium.com/@rtradetech/temporal-cloud-walk-through-c477568be551) Walk-Through: IPFS at the click of a button with the best free usage tier of any IPFS service: Free 3GB/Monthly, 5 Free IPNS record creation a month, 100 Free pubSub messages a month and 5 Free IPFS keys. +- [Ethereum Primer now available on Zastrin!](https://www.zastrin.com/#courses) +- [Ultimate Guide to Filecoin: Breaking Down Filecoin Whitepaper & Economics](https://medium.com/swlh/ultimate-guide-to-filecoin-breaking-down-filecoin-whitepaper-economics-9212541a5895), The Startup, 30 Jan 2019 +- [Introducing Web3 Labs](https://medium.com/web3labs/introducing-web3-labs-e5f809fc2b7c) +- [Menlo](https://www.menlo.one/docs/#/?id=see-the-post-content-on-ipfs) is a framework for rapidly developing decentralized applications (dApps). This framework is designed to provide users with a user experience on-par with the centralized apps they’re used to. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- 6 Feb 2019: Qri: A bleeding-edge open source data science tool on the distributed web, hosted by [New York Artificial Intelligence in Healthcare](https://www.meetup.com/NYHAIS/events/257935451/). +- 11-14 Feb 2019: [#BUIDLWeek Colorado](https://www.ethdenver.com/buidlweek/), a series of blockchain events (Blockchain Meetups, Workshops & Connections) open to the public, leading up to the ETHDenver 2019 main stage event. +- 15-17 Feb 2019: [ETHDenver 2019](https://www.ethdenver.com/#venue), The ETHDenver #BUIDLATHON is about bringing together like minds around a common purpose. +- 2 Mar 2019: On [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- 17-18 May 2019: [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-029/README.md b/src/_blog/weekly-029/README.md new file mode 100644 index 00000000..d2c8e0d3 --- /dev/null +++ b/src/_blog/weekly-029/README.md @@ -0,0 +1,71 @@ +--- +date: 2019-02-12 +url: /69-ipfs-weekly-29/ +tags: weekly +title: IPFS Weekly 29 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- [CIDv1](https://github.com/multiformats/cid) is coming soon™ by default to IPFS and you can read all about [the proposed plan here](https://github.com/ipfs/ipfs/issues/337). +- Did you notice that [ipfs.io got an implementations section](https://ipfs.io/#implementations)? There’s also an integrations section too, check it out! +- This is cool, the new [IPFS Companion Chrome Extension](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch/): A Chrome Extension that can work with a locally running IPFS daemon. +- [Introducing dpip](https://github.com/AuHau/dpip/issues/1): an initiative to bring Python’s package ecosystem into IPFS. + +## Meet Brian Hoffman + +The next guest presenter at the IPFS Weekly Call is [Brian Hoffman](https://twitter.com/brianchoffman). Brian began OpenBazaar when he forked the open source code from the 2014 Toronto Hackathon award winning DarkMarket, a decentralized Bitcoin marketplace, and went on to raise \$1M from notable VCs Union Square Ventures and Andreessen Horowitz to found [OB1](https://ob1.io/). Mark your calendar for Monday, 5pm UTC, and catch up on this week’s meeting [here](https://github.com/ipfs/team-mgmt/issues/866). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- PODCAST: [Web3 Summit Decentralize NOW! #13 - IPFS and Decentralized File Storage](http://dattpodcastnetwork.libsyn.com/web3-summit-decentralize-now-13-ipfs-and-decentralized-file-storage), 11 Feb 2019 +- [The IPFS Gateway Problem](https://medium.com/pinata/the-ipfs-gateway-problem-64bbe7eb8170), Pinata, 7 Feb 2019 +- [Why libp2p?](https://medium.com/paritytech/why-libp2p-13085ed0c9c8) Parity Technologies, 6 Feb 2019 +- [Textile Update | January 2019](https://medium.com/textileio/textile-update-january-2019-fa4203c4856a), 6 Feb 2019 +- [What is Ethereum’s Infura? Scalable Access to Ethereum and IPFS](https://blockonomi.com/ethereum-infura/), 6 Feb 2019 +- [Development update, Feb 2019](https://peergos.org/blog), Peergos +- [What is IPFS: overview and use cases](https://dao.casino/blog/what-is-ipfs/), 20 Dec 2018 + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [How do I go about saving user’s data in a completely decentralized manner using IPFS?](https://www.reddit.com/r/ipfs/comments/ao4qwj/possible_to_use_ipfs_for_user_authentication/) +- [Do more nodes always help?](https://www.reddit.com/r/ipfs/comments/ansg57/do_more_nodes_always_help/) +- [I need WebRTC signaling and after looking around and trying many things](https://discuss.ipfs.io/t/using-pubsub-in-js-ipfs-for-webrtc-signaling/4848) +- [I’m trying to figure out if OrbitDB would be a good match for some DApp ideas I’ve been formulating](https://www.reddit.com/r/ipfs/comments/apu2t7/technical_orbitdb_overviewguidelines/) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Prattle Network](https://prattle.tk/) is a social network which stores the content entirely on the users devices and cannot be censored. +- If you still want to use [oasis.direct](http://oasis.direct) you can do it through DAppNode! They deployed it to http://oasis.dappnode.eth (using Ethereum + IPFS) and it’s gonna be there forever! Welcome to a decentralized world in with no one can shut down a great service anymore. 😀 + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- 11-14 Feb 2019: [#BUIDLWeek Colorado](https://www.ethdenver.com/buidlweek/), a series of blockchain events (Blockchain Meetups, Workshops & Connections) open to the public, leading up to the ETHDenver 2019 main stage event. +- 15-17 Feb 2019: [ETHDenver 2019](https://www.ethdenver.com/#venue), The ETHDenver #BUIDLATHON is about bringing together like minds around a common purpose. +- 26 Feb 2019: [IPFS 2nd Hong Kong Meetup](https://www.meetup.com/Hong-Kong-IPFS-Meetup/events/258784575/) + Introducing Protoschool HK +- 2 Mar 2019: On [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- 17-18 May 2019: [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-030/README.md b/src/_blog/weekly-030/README.md new file mode 100644 index 00000000..0c8b3e2c --- /dev/null +++ b/src/_blog/weekly-030/README.md @@ -0,0 +1,75 @@ +--- +date: 2019-02-19 +url: /70-ipfs-weekly-30/ +tags: weekly +title: IPFS Weekly 30 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- [IPDR: InterPlanetary Docker Registry](https://github.com/miguelmota/ipdr) is a Docker Registry tool that proxies Docker registry requests to IPFS for pushing and pulling images. IPDR allows you to store Docker images on IPFS instead of a central registry like Docker Hub or Google Container Registry. + +## Meet Cale Teeter + +Next week, [Cale Teeter](https://github.com/caleteeter), Senior Software Blockchain Engineer at Azure will be joining the IPFS Weekly Call to talk about “IPFS in the Enterprise.” Enterprise consortiums have been asking for the option of decentralized storage to complement the solutions they are building. Microsoft built on the private options made available, to make it easy for companies to create these networks. Cale is also one of the hosts of [“The Azure Podcast.”](http://azpodcast.azurewebsites.net/) Meet Cale at the [IPFS Weekly Call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) next Monday at 5pm UTC. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Understanding IPFS in Depth (1/6): A Beginner to Advanced Guide](https://hackernoon.com/understanding-ipfs-in-depth-1-5-a-beginner-to-advanced-guide-e937675a8c8a), Hackernoon, 16 Feb 2019 +- VIDEO: [A quick tour of Peergos](https://vimeo.com/316903779), 13 Feb 2019 +- [Distributed web not ready for Runet cutoff from the Internet](https://www.ctrl.blog/entry/dweb-readiness-runet), Daniel Aleksandersen, 13 Feb 2019 +- [Introducing the Textile Mobile SDK](https://medium.com/textileio/introducing-the-textile-mobile-sdk-d77c246f8d51), Textile, 13 Feb 2019 +- [The Graph’s Research and Specifications Are Now Open Source](https://medium.com/graphprotocol/the-graphs-research-and-specifications-are-now-open-source-4e9edb279790), The Graph, 13 Feb 2019 +- [Creating an Instagram-like DApp with IPFS + Vue.js](https://medium.com/openberry/https-medium-com-creating-an-instagram-like-dapp-with-ipfs-cc4fac85cbfe), 12 Feb 2019 +- [Status Town Hall #27 - February 4, 2019](https://our.status.im/status-town-hall-27-february-4-2019/), Our Status, 4 Feb 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Orion v1.1 — Welcome Friends! 🤝](https://blog.siderus.io/orion-v1-1-welcome-friends-59ffc698dfe0) + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [I need to migrate an IPFS server now. What do I need to copy? Is the copy ~/.ipfs directory?](https://discuss.ipfs.io/t/questions-about-using-ipfs/4603) +- [What the purpose of self-certifying path names?](https://discuss.ipfs.io/t/what-the-purpose-of-self-certifying-path-names/4866) +- [Do IPFS public gateways retrieve data automatically from ipfs nodes?](https://discuss.ipfs.io/t/content-management-in-ipfs-public-gateways/4858) +- [When following the 101 tutorial for starting a node and deploying a file I’m getting an error on my browser (using Angular with webpack)...](https://discuss.ipfs.io/t/referenceerror-when-using-js-ipfs/4868) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [🎉Opening the Filecoin Project Repos 🎉](https://filecoin.io/blog/opening-filecoin-project-repos/) +- [IPFS / IPNS peer ID generator](https://github.com/meehow/peer-id-generator/): This tool generates IPFS public and private keypair until it finds public key which contains required substring. +- [With the ENVIENTA Platform developer eye](https://medium.com/envienta-magyarorsz%C3%A1g/az-envienta-platform-fejleszt%C5%91i-szemmel-180356ed8790) +- See this [STORJ Backed IPFS node Prototype](https://gateway.temporal.cloud/ipfs/QmeFisZdZuHmnwaXEUBCaMJmoHQLLPn3DJfNiYwdCug5iG) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **2 Mar 2019:** On [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- **5-7 Mar 2019:** [Ethereum Community Conference](https://ethcc.io/), or EthCC, is the second edition of a series of conferences and workshops that bring together and strengthen the international Ethereum community. EthCC 2019 will take place in Paris +- **27-28 Mar 2019:** [C3 Crypto Conference](https://crypto-conference.com/) is not only focused on blockchain companies and projects but also extends to topics on new technology. C3 Crypto Conference 2019 is also Berlin's first large-scale crypto conference. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-031/README.md b/src/_blog/weekly-031/README.md new file mode 100644 index 00000000..167071e5 --- /dev/null +++ b/src/_blog/weekly-031/README.md @@ -0,0 +1,81 @@ +--- +date: 2019-02-26 +url: /71-ipfs-weekly-31/ +tags: weekly +title: IPFS Weekly 31 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- We’re excited to announce the inaugural **IPFS Camp**, a three-day hacker retreat for the creators and builders of the distributed web. Join us on June 27-20th at the amazing Campus La Mola in Barcelona for an action-packed program of workshops, talks and deep dives on everything IPFS. More information, including registration, will be available on the [IPFS blog soon](https://blog.ipfs.io/)! +- [IPFS Cluster version 0.9.0](https://cluster.ipfs.io/news/0.9.0_release/) comes with one big new feature, OpenCensus support! Happy Measured Pinning! +- Last week, the IPFS research team released a paper on [Merkle-CRDTs](https://github.com/ipfs/research-CRDT/issues/45), that is, CRDTs backed by Merkle-DAGs. The paper formalizes what the team calls a Merkle-Clock (a logical clock) and goes on to describe Merkle-CRDTs as CRDTs on Merkle-Clocks. +- Introducing [IPFS Stash](https://medium.com/twos-complement/ipfs-stash-local-ipfs-for-everyone-ethdenver2019-b5b45ae0d5c9) — Local IPFS for everyone created during #ETHDenver2019. +- Update dnslink TXT records in Cloudflare with [dnslink-cloudflare](https://github.com/ipfs-shipyard/dnslink-cloudflare). + +## Meet Kevin Wong 👋 + +[Kevin Wong](https://twitter.com/kk3wong) works for Bitwork, the largest Blockchain Community in Hong Kong, as a Community Manager, helping out with all kinds of potential blockchain projects, education, promotion and solution to both individuals/ corporations. As the organizer of [Hong Kong IPFS Community](https://www.meetup.com/Hong-Kong-IPFS-Meetup/), he regularly hosts meetups/events to promote IPFS & Filecoin to our community, educate and motivate members to help with the ecosystem. In addition, Kevin also participated in hosting [Protoschool Hong Kong](https://github.com/protoschool/hong-kong) and the [Shenzhen, China](https://github.com/protoschool/shenzhen) Chapters. Be sure to meet Kevin at next week’s [IPFS Weekly Call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call), Monday, 5pm UTC. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Marvin Ammori’s Next Act: A Net Neutrality Vet on Blockchain—and Why the Internet Is Still Great](http://fortune.com/2019/02/23/marvin-ammori-blockchain-net-neutrality/), Fortune, 23 Feb 2019 +- [Understanding IPFS in Depth(2/6): What is InterPlanetary Linked Data(IPLD)?](https://hackernoon.com/understanding-ipfs-in-depth-2-6-what-is-interplanetary-linked-data-ipld-c8c01551517b), Hackernoon, 23 Feb 2019 +- VIDEO: [The Distributed Web + IPFS at #BUIDLweek #ETHDenver](https://www.youtube.com/watch?v=JKcHmloxpLw), 21 Feb 2019 +- [Ethereum Foundation Grants Program Wave 5](https://blog.ethereum.org/2019/02/21/ethereum-foundation-grants-program-wave-5/), Ethereum Blog, 21 Feb 2019 +- [Mapping out projects using IPFS](https://www.theblockcrypto.com/2019/02/19/mapping-out-projects-using-ipfs/), The Block Crypto, 19 Feb 2019 +- [A thread covering some of the coolest submissions from Eth Denver](https://twitter.com/KyleSamani/status/1097937605533069319) by Kyle Samani, 19 Feb 2019 +- WHITEPAPER: [IPLD as a general pattern for DID documents and Verifiable Claims](https://github.com/WebOfTrustInfo/rwot7-toronto/blob/master/final-documents/ipld-did.md), jonnycrunch, Anthony Ronning, Kim Duffy, Christian Lundkvist, 19 Feb 2019 +- VIDEO: [What is Decentralized Storage?](https://www.youtube.com/watch?v=I5M8bXQR9uA), Blockchain WTF, 19 Feb 2019 +- [Well-Known URI vs DNS-SD for routing distributed web service discovery around internet censorship](https://www.ctrl.blog/entry/wellknown-vs-dnssd-for-dweb), Ctrl blog, 13 Feb 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [go-ipfs 0.4.19-rc1 has been released](https://dist.ipfs.io/go-ipfs/v0.4.19-rc1), read more about the details on features [in the changelog](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#0419-2018-02-14-unreleased). + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [Is the concept of anonymous editing of text files, HTML, or markdown possible with IPFS?](https://www.reddit.com/r/ipfs/comments/au2lpx/is_an_editable_wiki_hosted_on_ipfs_possible/) +- [I was trying out IPFS the other day and the file retrieval is very slow...](https://discuss.ipfs.io/t/ipfs-gateway-very-slow/4928) +- I don’t even know what this error means, my / directory is definitely not a file, /ipfs and /ipns are both certainly directories and not files, I have no idea what this is even in reference to. [Any guesses?](https://discuss.ipfs.io/t/error-root-cant-be-a-file-when-trying-to-mount/3912) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [AirSecure](https://github.com/airsecure/airsecure) – Decentralized two factor authentication app built on Textile & IPFS. +- [HyperSpace](https://site.hyperspace.app/) – HyperSpace, previously Synereo, redefines content publishing and distribution with Blockchain-enabled solutions that efficiently underlie and support a decentralized attention economy. +- [Anonymize.com](https://anonymize.com/) – Announcing DNS for IPFS. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **2 Mar 2019:** On [Global Diversity CFP Day 2019](https://www.globaldiversitycfpday.com/) there will be numerous workshops hosted around the globe encouraging and advising newbie speakers to put together your very first talk proposal and share your own individual perspective on any subject of interest to people in tech. +- **2 Mar 2019:** [NYC School of Data](https://schoolofdata.nyc/) is a community driven conference with a focus on open data, civic technology and design conference. +- **5-7 Mar 2019:** [Ethereum Community Conference](https://ethcc.io/), or EthCC, is the second edition of a series of conferences and workshops that bring together and strengthen the international Ethereum community. EthCC 2019 will take place in Paris +- **14 Mar 2019:** [Data Jam! Topic: NYC Transportation Data](https://www.meetup.com/Qri-Data-Jam/events/259095254/) hosted by Qri. We’ll hack on (build, archive, synch, play with, analyze) interesting open datasets. +- **27-28 Mar 2019:** [C3 Crypto Conference](https://crypto-conference.com/) is not only focused on blockchain companies and projects but also extends to topics on new technology. C3 Crypto Conference 2019 is also Berlin’s first large-scale crypto conference. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-032/README.md b/src/_blog/weekly-032/README.md new file mode 100644 index 00000000..4da024fd --- /dev/null +++ b/src/_blog/weekly-032/README.md @@ -0,0 +1,90 @@ +--- +date: 2019-03-05 +url: /73-ipfs-weekly-32/ +tags: weekly +title: IPFS Weekly 32 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +
+ + + +
+ +## Join us at the first ever IPFS Camp + +**Last week we announced [IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/), taking place June 27th-30th in beautiful Barcelona.** This event is specifically for you, the IPFS community! Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## The latest + +- Last week, [ipfs-webut v2.4](https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v2.4.0) was released, including an improved and simplified file manager, some tweaks to usage analytics, and more. Read the full release notes for details. +- The long awaited release of 🎉[go-ipfs 0.4.19 has arrived](https://github.com/ipfs/go-ipfs/releases/tag/v0.4.19)🎉! This release includes loads of new features, perf improvements, refactors and more. Read the announcement and the looong changelog for the full rundown. +- Did you know about [ipfs-publish](https://github.com/AuHau/ipfs-publish)? Created by Adam Uhlir, it allows you to enable automatic publishing of static webpages from Git repositories into IPFS. Check it out! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Speeding Up IPFS Through Swarm Connections](https://medium.com/pinata/speeding-up-ipfs-pinning-through-swarm-connections-b509b1471986), Matt Ober, 4 Mar 2019 +- Check out the [DTube IPFS public community node contest!](https://steemit.com/dtube/@vaultec/dtube-ipfs-full-community-node-contest), 1 Mar 2019 +- [Understanding IPFS in Depth(3/6): What is InterPlanetary Naming System(IPNS)?](https://hackernoon.com/understanding-ipfs-in-depth-3-6-what-is-interplanetary-naming-system-ipns-9aca71e4c13b) Hackernoon, 1 Mar 2019 +- [Introducing Graphite V2](https://medium.com/the-lead/introducing-graphite-v2-c4ce3f58e0f2), 1 Mar 2019 +- PAPER: [Asterism: Decentralized File Sharing Application for Mobile Devices](https://www.researchgate.net/publication/330758943_Asterism_Decentralized_File_Sharing_Application_for_Mobile_Devices), Olli-Pekka Heinisuo, Valentina Lendarduzzi, Davide Taibi, 27, Feb 2019 +- [AirSecure — Own Your One-Time Passwords](https://medium.com/textileio/airsecure-own-your-one-time-passwords-a65efd612dc6), Textile, 27 Feb 2019 +- [P2P Inboxes](https://medium.com/@RangerMauve/p2p-inboxes-be0f02083223), 27 Feb 2019 +- [CREARY.NET IS LIVE [LOVE ART, EARN CRYPTO]](https://thecreativecrypto.com/creary-net-is-live-love-art-earn-crypto/), The Creative Crypto, 26 Feb 2019 +- [IPFS, the new resilient web](https://blog.elevenpaths.com/2019/01/ipfs-web-resiliente-ciberseguridad.html), ElevenPaths, 4 Jan 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- Textile released [advanced-react-native-boilerplace](https://github.com/textileio/advanced-react-native-boilerplate) last week. + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [If there are too many pubsub topics in IPFS system, will it make the system too slow ,eventually unusable?](https://www.reddit.com/r/ipfs/comments/awre05/does_pubsub_have_an_upper_limit/) +- [I’m using the Python client to communicate with my Go IPFS daemon...](https://discuss.ipfs.io/t/python-public-subscribe-server-client/4965) +- [I am developing an application in Go that uses IPFS to add files and to send messages through pubsub feature...](https://discuss.ipfs.io/t/ipfs-start-ipfs-daemon-direct-from-the-go-application/4952) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- Check out [Discussify](https://chrome.google.com/webstore/detail/discussify/bfmnjjkobeboejeocbompgljbiafbgcc), from our friends at Moxy Studios. Built on IPFS, Discussify provides a real-time, peer to peer, and permanent discussion platform for anyone to join and participate. +- [Elea](https://www.elea.io/) is live, a platform for property data, where property documents get hashed with IPFS. +- [Lander](https://www.producthunt.com/posts/lander-2) is your landing page on the decentralized internet. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **5-7 Mar 2019:** [Ethereum Community Conference](https://ethcc.io/), or EthCC, is the second edition of a series of conferences and workshops that bring together and strengthen the international Ethereum community. EthCC 2019 will take place in Paris +- **8 Mar 2019:** [‘Web3 stack, what’s next for developers?’](https://www.eventbrite.com/e/web3-stack-whats-next-for-developers-consensys-tickets-57699644189) ConsenSys invites you to get together to challenge the current limits of a decentralized world with a diversity of BUIDLing approaches. Join them for tech breakdowns on the latest developments across the decentralized stack solutions. +- **10 Mar 2019:** [The first IPFS Hangzhou meetup](https://www.meetup.com/IPFS-Hangzhou/events/259468613/) is this Sunday, come discuss IPFS and MMO (Massively Multiplayer Online)! Hangzhou Shi, China +- **14 Mar 2019:** [Data Jam! Topic: NYC Transportation Data](https://www.meetup.com/Qri-Data-Jam/events/259095254/) hosted by Qri. We’ll hack on (build, archive, synch, play with, analyze) interesting open datasets. +- **27-28 Mar 2019:** [C3 Crypto Conference](https://crypto-conference.com/) is not only focused on blockchain companies and projects but also extends to topics on new technology. C3 Crypto Conference 2019 is also Berlin’s first large-scale crypto conference. + **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-033/README.md b/src/_blog/weekly-033/README.md new file mode 100644 index 00000000..844d3d1b --- /dev/null +++ b/src/_blog/weekly-033/README.md @@ -0,0 +1,86 @@ +--- +date: 2019-03-12 +url: /74-ipfs-weekly-33/ +tags: weekly +title: IPFS Weekly 33 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- Announcing [IPFS Cluster v0.10.0](https://github.com/ipfs/ipfs-cluster/blob/master/CHANGELOG.md), a release with major changes under the hood that will make the IPFS Cluster perform significantly faster with larger pinsets and less memory demanding. Get all the details in the [release notes](https://cluster.ipfs.io/news/0.10.0_release/), and congrats on the hard work! +- Continuing with the announcement of cool, new things, introducing [go-libp2p workspace](https://github.com/libp2p/workspace-go-libp2p)! If you contribute to go-libp2p you want to check this out. +- Have you seen [The Decentralized Web Primer](https://dweb-primer.ipfs.io/)? If you’ve been searching for a series of tutorials explaining IPFS, Merkle Trees and the Decentralized Web, look no further. +- The [first IPFS meetup in Hangzhou](https://twitter.com/DataHome2/status/1104706359541391364) was a success! Here’s to many more to come. 🎉 + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- VIDEO: [Decentralized Dapp Scaling with IPFS!](https://www.youtube.com/watch?time_continue=2&v=-XdVnK22mZc) Everything EOS, 11 Mar 2019 +- VIDEO: [Web3 stack, what’s next for developers?](https://www.youtube.com/watch?v=N76-HcQDuhQ&feature=youtu.be) Fluence, IPFS, NuCypher Meetup Paris Blockchain Week, 8 Mar 2019 +- [RTrade Launches Temporal: A Cloud Suite for Decentralized and Blockchain-Based Applications](https://cryptoslate.com/press-releases/rtrade-launches-temporal-a-cloud-suite-for-decentralized-and-blockchain-based-applications/), Crypto Slate, 7 Mar 2019 +- VIDEO: [In Depth Introduction to IPFS](https://www.youtube.com/watch?v=GJ2980DWdyc), Polycode, 7 Mar 2019 +- [Decentralized Data Storage](https://theyellowbitroad.com/blog/2019/03/07/decentralized-data-storage/), The Yellow Bit Road, 7 Mar 2019 +- [A Coder’s Diary 4 (How I finally got IPFS working)](https://blog.goodaudience.com/a-coders-diary-4-how-i-finally-got-ipfs-working-60f1fb6a4972), Good Audience, 6 Mar 2019 +- [Coin Spotlight: district0x](https://medium.com/coinplan-insights/coin-spotlight-district0x-4abf46d102e2), a cooperative network of decentralized marketplaces and communities powered by Ethereum, Aragon, and IPFS. 6 Mar 2019 +- [NuCypher + CoinList Hackathon launches March 11](https://medium.com/@coinlist/nucypher-coinlist-hackathon-launches-march-11-6265d2368443), 6 Mar 2019 +- [How Graphite Manages IPFS Content Availability](https://medium.com/the-lead/how-graphite-manages-ipfs-content-availability-17443ef1e959), Graphite, 5 Mar 2019 +- [Review of BitTube : A Decentralized Blockchain project Looking to Substitute YouTube](https://www.cryptonewsz.com/review-of-bittube-a-decentralized-blockchain-project-looking-to-substitute-youtube/10611/), 5 Mar 2019 +- [Opera is integrating IPFS and ENS](https://twitter.com/ensdomains/status/1102884419017297921), 5 Mar 2019 +- VIDEO: [Robot-as-a-service experiment: ROS + IPFS + Ethereum](https://www.youtube.com/watch?v=-GgnykaVWeQ), Airalab, 5 Mar 2019 +- [Intro to The Graph: Indexed Data for dApps](https://medium.com/quiknode/an-intro-to-the-graph-indexed-data-for-dapps-4d83011d0d99), QuikNode, 5 Mar 2019 +- [libp2p in a Nutshell](https://medium.com/@seraya/libp2p-in-a-nutshell-2cfbcb519c87), 5 Mar 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Neocities](https://blog.neocities.org/blog/2018/03/06/cdn-and-file-improvements.html) has released an update on some recent small improvements. +- [Graphite V2 Architecture](https://medium.com/the-lead/graphite-v2-architecture-cae4dacb375) includes support for IPFS as a storage provider. +- [qri 0.7.1](https://github.com/qri-io/qri/releases/tag/v0.7.1) includes shipping fixes and features aimed at doing more with datasets. + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [Is it possible to run IPFS directly from a USB key or from html file?](https://discuss.ipfs.io/t/run-ipfs-from-a-usb-key-or-a-html-file/5011) +- [I’ve played around a bit with IPFS using Go, and I’m asking for advice...](https://discuss.ipfs.io/t/learn-to-use-ipfs-with-go/5010) +- [What does “pin” really mean?](https://discuss.ipfs.io/t/i-am-new-to-this-and-i-have-several-questions/4982) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Multilogue](https://github.com/assemblaj/Multilogue): libp2p non-simultaneous p2p chat protocol +- [Radicle](http://www.radicle.xyz/): A decentralized alternative to GitHub built on IPFS +- Introducing [Kraken](https://eng.uber.com/introducing-kraken/), an Open Source Peer-to-Peer Docker Registry +- [Starlog](https://github.com/PACTCare/Starlog): IPFS Metadata Blockchain based on Substrate. The goal of Starlog is to research and develop an open source solo chain or potential parachain, which stores metadata for IPFS as non-fungible tokens. +- [Gage.app](https://github.com/tunnckoCore/gage): Fast, secure, distributed, decentralized and everlasting InterPlanetary storage. An app, service, API and CLI. +- [Ethereum IPFS Buidl Experiments](https://medium.com/@megaadmin/ethereum-ipfs-buidl-experiments-e97f546b21a0) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **12 Mar 2019:** [Decentralized Web SF Meet Up—March](https://www.eventbrite.com/e/decentralized-web-sf-meet-upmarch-tickets-56515197477), hosted by the Internet Archive, 6-9pm. +- **12 Mar 2019:** [IPFS and Digital Content Distribution in Blockchain](https://www.meetup.com/DECENT/events/259500556/): During this Meetup, DECENT’s Technical Consultant, Michal Stančík, will elaborate on how data on blockchain is secured, how keys are transferred through the network and more. 6pm, hosted by DECENT and Romana Figerova. +- **14 Mar 2019:** [Data Jam! Topic: NYC Transportation Data](https://www.meetup.com/Qri-Data-Jam/events/259095254/) hosted by Qri. We’ll hack on (build, archive, synch, play with, analyze) interesting open datasets. +- **27-28 Mar 2019:** [C3 Crypto Conference](https://crypto-conference.com/) is not only focused on blockchain companies and projects but also extends to topics on new technology. C3 Crypto Conference 2019 is also Berlin’s first large-scale crypto conference. + **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-034/README.md b/src/_blog/weekly-034/README.md new file mode 100644 index 00000000..81a8899b --- /dev/null +++ b/src/_blog/weekly-034/README.md @@ -0,0 +1,79 @@ +--- +date: 2019-03-19 +url: /75-ipfs-weekly-34/ +tags: weekly +title: IPFS Weekly 34 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +- [`ipfs-http-client` is significantly smaller now](https://twitter.com/_alanshaw/status/1106500694452985856), v30.1.0 is about 33% smaller than when we started working on bundle size at v28.1.0. 🙀 +- [Looks like ENS + IPFS are coming to the Brave browser!](https://twitter.com/ensdomains/status/1105565560224563202) + +## Meet Olivier Sarrouy 👋 + +Next Monday, [Olivier Sarrouy](https://twitter.com/osarrouy), creator or Pando Protocol will be joining the IPFS Weekly Call. He is a serial entrepreneur and founder of Distributed Gallery and Pando Network. Oliver also has a PhD in Communications Sciences from Université Rennes 2, where he once served as a professor. Olivier will be on the [IPFS Weekly Call next Monday](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) to introduce the IPFS Community to Pando, so join us at 5pm UTC! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- VIDEO: [IPFS - Hands-On Tutorial](https://www.youtube.com/watch?v=KIEq2FyMczs), Polycode, 19 Mar 2019 +- [ScryptaChain, DApp Smart Contract and a Smart Card as a gift!](https://fabryprog.blogspot.com/2019/03/scrypta-chain-dapp-smart-contract-smart-card.html) 19 Mar 2019 +- [Carson Farmer on IPFS — The essential reading list](https://medium.com/textileio/carson-farmer-on-ipfs-the-essential-reading-list-57c978cfb951), 18 Mar 2019 +- [DECENT 101: Is IPFS the Ultimate Storage System?](https://decent.ch/decent101/decent-101-is-ipfs-the-ultimate-storage-system/) 18 Mar 2019 +- [Graph Day Video Highlights](https://medium.com/graphprotocol/graph-day-video-highlights-eee20074a9c7), 18 Mar 2019 +- [IPFS got a shoutout from Future Blockchain Summit in Dubai](https://twitter.com/NovaCryptoLTD/status/1106861718544760832), CNN, 16 Mar 2019 +- [Textile makes it easy to run IPFS peers in your mobile apps](https://medium.com/textileio/textile-makes-it-easy-to-run-ipfs-peers-in-your-mobile-apps-f797af98311b), 14 Mar 2019 +- [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a), The Graph, 13 Mar 2019 +- [Better late than never… here’s your February Textile update, in March](https://medium.com/textileio/textile-update-february-2019-71dea91c084a), 12 Mar 2019 +- [A Better Mousetrap Podcast featuring Qri](https://qri.io/blog/a_better_mousetrap_podcast/), 11 Mar 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [brig 0.4.0](https://github.com/sahib/brig/blob/master/CHANGELOG.md): distributed, versioned & secure file synchronization + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Meet the decentralized versions of YouTube, Google Docs, and Google Photos!](https://en.softonic.com/articles/decentralized-apps) +- [dFile.space](https://dfile.space/): Decentralised File Hosting in Space +- [DoublePlus](https://ipfs.io/ipns/ipfs.doubleplus.io): Completely decentralized social network hosted over IPFS +- [Almonit](almonit.eth): A decentralized website made with ENS + IPFS +- Deploy DNSLink TXT Records To AWS Route53 Domains with [dnslink-route53](https://github.com/RTradeLtd/dnslink-route53) + +![](https://ipfs.io/ipfs/Qmd11gtyigpCjo4MfzXuj9MKuMF3Dj1EZEvbNRZeQE1jd4) + +## Join us at the first ever IPFS Camp + +[IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/) is taking place June 27th-30th in beautiful Barcelona. Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **26 Mar 2019:** [ProtoSchool Munich: 101 IPFS Workshop](https://www.meetup.com/Munich-IPFS-User-Group/events/259839294), ProtoSchool Munich is open for any topic of the so-called Decentralized Revolution. This event is a workshop so, please, bring your laptop. +- **27-28 Mar 2019:** [C3 Crypto Conference](https://crypto-conference.com/) is not only focused on blockchain companies and projects but also extends to topics on new technology. C3 Crypto Conference 2019 is also Berlin’s first large-scale crypto conference. +- **28 Mar 2019:** [Creating a Decentralized App!](https://www.meetup.com/Blockstack-Newark-the-New-Internet-for-Decentralized-Apps/events/257563100/?_xtd=gqFyqTE4NzU3MjE5NKFwo3dlYg&from=ref), Jude Nelson from Blockstack will come and explain in a light and friendly way how to build a decentralized app on Blockstack, 6pm, Newark (NJ), US. +- **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **2 May 2019:** [Munich IPFS User Group](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/259762490/): [Pierre Krieger](https://twitter.com/tomaka17) from [parity](https://www.parity.io/) talks about Rust libp2p. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-035/README.md b/src/_blog/weekly-035/README.md new file mode 100644 index 00000000..5ddd0592 --- /dev/null +++ b/src/_blog/weekly-035/README.md @@ -0,0 +1,87 @@ +--- +date: 2019-03-26 +url: /76-ipfs-weekly-35/ +tags: weekly +title: IPFS Weekly 35 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Introducing the new IPFS Desktop + +With the 0.7.1 release of the IPFS Desktop, we now have one simple interface! This is a pre-release, so check out [all of the details in the changelog](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.7.1) and if you find bugs or have some feedback, [drop a line here](https://github.com/ipfs-shipyard/ipfs-desktop/issues/new). + +### Curious about CRDTs? + +We <3 Conflict-free Replicated Data Types so much so that last April we hosted the [2018 CRDT Research Meetup](https://blog.ipfs.io/67-crdt-research-meetup/) in Lisbon. Authors of the CRDT research literature and representatives from the Labs it originated were in attendance, and some gave talks that you can watch the videos for by following [this link!](https://blog.ipfs.io/67-crdt-research-meetup/) + +### Revisiting IPFS Hack Week in Lisbon + +Last spring IPFS held a [Hack Week in Lisbon](https://blog.ipfs.io/74-lisbon-hack-week/) to bring together core developers, contributors, researchers, and IPFS community members to sync, hang, and work on some problem solving together IRL. If you missed it, many of the presentations were recorded so you can watch [those videos here](https://blog.ipfs.io/74-lisbon-hack-week/). If you’re interested in attending the next IPFS Community event, check out IPFS Camp (more details below) and get [registered here](https://camp.ipfs.io/). + +## Meet Jia Le Dai + +[Jiale Dai](https://twitter.com/daijiale6239) used to work on mapping applications as a backend engineer at Baidu. In 2017 he became interested in IPFS, libp2p, and multiformats. Jiale eventually started organizing [IPFS meetups for Chinese developers and enthusiasts](https://mp.weixin.qq.com/s/NrvZo5_hLD_CIXpZFPARbg). His goal is to get more Chinese developers interested in distributed web technologies like IPFS. Jiale joins the [IPFS Weekly Call next Monday at 5pm UTC](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) to present on IPFS in China. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [How to Deploy an Unstoppable Angular App to IPFS](https://medium.com/gochain/how-to-deploy-an-unstoppable-angular-app-to-ipfs-c2dabb52e517), GoChain, 26 Mar 2019 +- [Sunsetting Mist: What’s ahead for our team](https://medium.com/@avsa/sunsetting-mist-da21c8e943d2), 22 Mar 2019 +- [IPFS Encryption](https://medium.com/@theotherfruit/ipfs-encryption-492b004659d1), 21 Mar 2019 +- [Numerai raises \$11M with ICO & prepares to launch prediction marketplace](https://ayo.news/2019/03/22/numerai-raises-11m-with-ico-prepares-to-launch-prediction-marketplace/), 22 Mar 2019 +- [Hugo and IPFS: how this blog works (and scales to serve 5,000% spikes instantly!)](https://withblue.ink/2019/03/20/hugo-and-ipfs-how-this-blog-works-and-scales.html) 20 Mar 2019 +- [Textile Notes: A minimalist tool for your creative ideas](https://medium.com/textileio/textile-notes-a-minimalist-tool-for-your-creative-ideas-68b9357d5cd0), 19 Mar 2019 +- PODCAST: [WR 79: Another internet is possible: IPFS](https://www.danielprimo.io/blog/otra-internet-es-posible-ipfs), Web Reactiva, 19 Mar 2019 +- [Society Desperately Needs An Alternative Web](https://www.forbes.com/sites/cognitiveworld/2019/03/15/society-desperately-needs-an-alternative-web/#155cd17424e3), Forbes, 15 Mar 2019 +- [A picture is worth a thousand crypto](https://thecreativecrypto.com/creating-a-creative-economy-interview-with-the-founders-of-crea/), The Creative Crypto, 1 Jan 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Pony version 0.28.0 has been released.](https://www.ponylang.io/blog/2019/03/0.28.0-released/) Pony is the type safe, memory safe, exception-safe, data-race free, deadlock-free, open-source, object-oriented, actor-model, capabilities-secure, high-performance programming language. +- [DTube IPFS Discord Bot March 2019 Update!](https://steemit.com/ipfs/@techcoderx/dtube-ipfs-discord-bot-march-2019-update-improved-file-pinning-node-stats-usage-data-command-and-more) +- [Radium 2.0 Development & Expansion Roadmap](https://blog.radiumcore.org/radium-2-0-development-expansion-roadmap-updated-march-2019-382041249cf7) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Our friends at Qri, the global dataset version control system, were on the front page of Hacker News!](https://news.ycombinator.com/item?id=19470064) +- [IPFS-Lite is an embeddable, lightweight IPFS-network peer for IPLD applications](https://github.com/hsanjuan/ipfs-lite) +- [Happy 5th birthday, 18F!](https://18f.gsa.gov/2019/03/19/18F-5-Anniversary-achieve/) + +![](https://ipfs.io/ipfs/Qmd11gtyigpCjo4MfzXuj9MKuMF3Dj1EZEvbNRZeQE1jd4) + +## Join us at the first ever IPFS Camp + +[IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/) is taking place June 27th-30th in beautiful Barcelona. Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **27-28 Mar 2019:** [C3 Crypto Conference](https://crypto-conference.com/) is not only focused on blockchain companies and projects but also extends to topics on new technology. C3 Crypto Conference 2019 is also Berlin’s first large-scale crypto conference. +- **28 Mar 2019:** [Creating a Decentralized App!](https://www.meetup.com/Blockstack-Newark-the-New-Internet-for-Decentralized-Apps/events/257563100/?_xtd=gqFyqTE4NzU3MjE5NKFwo3dlYg&from=ref) Jude Nelson from Blockstack will come and explain in a light and friendly way how to build a decentralized app on Blockstack, 6pm, Newark (NJ), US. +- **4 Apr 2019:** [Where is the data bazaar?](https://www.meetup.com/Deep-Learning-NYC/events/zztcfqyzgbgb/) Join Brendan O’Brien of QRI as he presents his thoughts on this and dataset versioning with QRI. AWS Pop-up Loft, NYC. +- **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **2 May 2019:** [Munich IPFS User Group](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/259762490/): [Pierre Krieger](https://twitter.com/tomaka17) from [parity](https://www.parity.io/) talks about Rust libp2p. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-036/README.md b/src/_blog/weekly-036/README.md new file mode 100644 index 00000000..12a79ab7 --- /dev/null +++ b/src/_blog/weekly-036/README.md @@ -0,0 +1,88 @@ +--- +date: 2019-04-02 +url: /77-ipfs-weekly-36/ +tags: weekly +title: IPFS Weekly 36 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### IPFS distributions + +Wondering where you can find all of the official software distributions for IPFS? Check out [IPFS distributions](https://dist.ipfs.io/), where the current versions of the software projects across IPFS are all available for download now. + +### Initial draft of an introspection data model for libp2p + +Late last week, @raulk posted an initial draft of thoughts and ideas for the libp2p network visualizer [{Phantom}Drift](https://github.com/libp2p/notes/pull/9/files). Take a look and give some constructive criticism if you have it. + +### The Ethereum Name Service team will host an AMA on Friday + +Have questions for the folks at ENS? This Friday, they’ll be hosting [a reddit AMA](https://www.reddit.com/r/ethereum/comments/b8ahym/the_ethereum_name_service_ens_team_will_host_an/) where you can ask questions (including questions about IPFS and IPNS) and follow along as they answer. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Using IPFS Messaging For Referral Networks](https://medium.com/2key/using-ipfs-messaging-for-referral-networks-aa1f11220a77), 2 Apr 2019 +- [Enterprise IPFS, Why Organizations Will Adopt IPFS](https://medium.com/pinata/enterprise-ipfs-6afcf76b28a0), Textile, 1 Apr 2019 +- [Radicle Architecture](http://radicle.xyz/blog/index.html), Radicle Blog, 28 Mar 2019 +- [InterPlanetary File System](https://medium.com/@snehal1798/interplanetary-file-system-1c00196ae52c), 28 Mar 2019 +- VIDEO: [Lightning Demos - PEERGOS - Dr. Ian Preston](https://www.youtube.com/watch?v=Z_tOw1mUyLE), recorded at Berlin Developers Meetings, 28 Mar 2019 +- VIDEO: [How Merkle Trees Enable the Decentralized Web!](https://www.youtube.com/watch?v=YIc6MNfv5iQ) Coding Tech, 23 Jan 2018 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [go-filecoin 0.1.4 was released!](https://filecoin.io/blog/go-filecoin-0.1.4-release/) + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [I’m interested in a list of examples for dynamic websites hosted entirely over IPFS...](https://discuss.ipfs.io/t/looking-for-examples-of-functional-sites-hosted-on-ipfs/4841) +- [I’m trying to standardize blob storage in IPFS for the data I create.](https://discuss.ipfs.io/t/adding-ipfs-support-to-known-publishing-system/4862) +- [I am wondering how I can use the new feature AutoRelay.](https://discuss.ipfs.io/t/feature-autorelay/5094) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [The Ultimate Guide To Understanding The Differences Between PPIO, Filecoin, and Storj](https://medium.com/@ppio/differences-between-ppio-filecoin-storj-20cdf7b3b02e), 27 Mar 2019 +- [LineageOS on IPFS](https://lineageos-on-ipfs.com/) – A permanent solution to LineageOS' storage problem. +- The [AKASHA Foundation](https://akasha.org/about/), a non-profit born at the intersection of blockchain and collective intelligence, is currently hiring! +- Check out this web app to check [a public IPFS gateway state](https://ipfs.fooock.com/) + +![](https://ipfs.io/ipfs/Qmd11gtyigpCjo4MfzXuj9MKuMF3Dj1EZEvbNRZeQE1jd4) + +## Join us at the first ever IPFS Camp + +[IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/) is taking place June 27th-30th in beautiful Barcelona. Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **4 Apr 2019:** [Where is the data bazaar?](https://www.meetup.com/Deep-Learning-NYC/events/zztcfqyzgbgb/) Join Brendan O’Brien of QRI as he presents his thoughts on this and dataset versioning with QRI. AWS Pop-up Loft, NYC. +- **9 Apr 2019:** [ProtoSchool Munich: 101 IPFS Workshop](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/260198694/) is open for any topic of the so-called Decentralized Revolution. It is, not least, a playground to investigate decentralized technologies in the practice of a network of peers. Munich, Germany. +- **10 Apr 2019:** [Blockstack and Beyond](https://www.meetup.com/Blockstack-SF/events/260072145/), hosted by Blockstack SF, is back to begin a new 4 month series focused on supporting dAPP developers, San Francisco (CA), US. +- **17 Apr 2019:** [Decentralized Apps w/ Blockstack & IOC with Loopback](https://www.meetup.com/austinnodejs/events/plgxbqyzgbwb/), join the folks at the Austin Node.js meetup to talk dapps and blockstack! Austin (TX), US. +- **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **2 May 2019:** [Munich IPFS User Group](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/259762490/): [Pierre Krieger](https://twitter.com/tomaka17) from [parity](https://www.parity.io/) talks about Rust libp2p. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-037/README.md b/src/_blog/weekly-037/README.md new file mode 100644 index 00000000..f1c2b4b5 --- /dev/null +++ b/src/_blog/weekly-037/README.md @@ -0,0 +1,250 @@ +--- +date: 2019-04-10 +url: /79-ipfs-weekly-37/ +tags: weekly +title: Recapping IPFS in Q1 2019 🎉 +description: +author: Jenn Turner +--- + +We’ve put together a very special issue looking back on all that you, [the InterPlanetary File System (IPFS)](https://ipfs.io/) community, accomplished so far, in 2019. From milestones like releases, projects like ProtoSchool, to the many new (and awesome) contributors who have joined us, and what’s to come for the rest of this year, we hope you enjoy this quarterly recap. + +Thanks for being part of our community, we truly couldn’t make IPFS what is without you. ❤️ + +## Milestones + +_As far as shipping goes, yeah we did that._ + +### Introducing ProtoSchool + +In January, we announced [the ProtoSchool project](https://blog.ipfs.io/63-ipfs-weekly-25/), aimed at bringing education teaching decentralized web protocols and tools through online tutorials and local chapter events to folks across the web. So far there are SIXTEEN chapters worldwide! + +### js-ipfs 0.34.0 released + +[This release of the JavaScript implementation of IPFS](https://blog.ipfs.io/64-js-ipfs-0-34/) has it all: reading Protobuf DAG nodes became super fast, adding content became “blazingly” fast, HAMT support was added to MFS, added IPNS over pubsub and DHT, plus dep upgrades, API changes and more! + +### ipfs.io has implementations _and_ integrations now + +Speaking of _implementations_ [the official IPFS website](https://ipfs.io/#implementations) received a whole section devoted to both the current implementations (JavaScript and Go), plus some cool integrations, like our browser companion. + +### Announcing the 1st ever 🌌 IPFS Camp + +We hope you join us for [a three day hacker retreat for the builders of the Distributed Web](https://blog.ipfs.io/72-ann-ipfs-camp/) that will happen between June 27th to 30th, also known as the first ever [IPFS Camp](https://camp.ipfs.io/)! Register now to join us. + +### 🎉go-ipfs 0.4.19 arrived🎉 + +The Go implementation of IPFS also got some love this quarter, with a new release in March. [Version 0.4.19](https://github.com/ipfs/go-ipfs/releases/tag/v0.4.19) includes NEW features like file listing and initializing with random ports, reliabilility and perf improvements, plus a pretty significant refactor of CoreAPI. + +### The ✨new✨ IPFS Desktop + +Springtime also saw [a new release of the IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.7.1), which, in case you missed it, is the [menubar app](https://github.com/ipfs-shipyard/ipfs-desktop) that allows you to access IPFS straight from the desktop instead of having to deal with that command line business. Check it out! + +## Remember these IPFS videos? + +_What better way to catch up on Q1 than by the videos that have helped the community learn more about IPFS? Here’s what was shared so far:_ + +- [Making the Web Work Offline](https://www.youtube.com/watch?list=PLuhRWgmPaHtRdiy0HKNy4UZ4dKVUVL_KG&time_continue=7&v=VllPpxVNH5k) - by Molly Mackinlay +- [IPFS in Azure](https://channel9.msdn.com/Shows/Blocktalk/IPFS-in-Azure) - Block Talk +- [IPFS Web 3.0 and the future of human civilization with Eric Des Courtis](https://www.youtube.com/watch?v=xmAedcmhUvI&feature=youtu.be) - by Georges Landry +- [“Decentralization and the Great Pendulum of History”](https://www.youtube.com/watch?v=o2HxOqZzR1U) - by Daniel Jeffries +- [Tensions Inherent to Building on Blockchains](https://blog.blockstack.org/nick-grossman-on-tensions-inherent-to-building-on-blockchains/) - by Nick Grossman +- [The Distributed Web + IPFS at #BUIDLweek #ETHDenver](https://www.youtube.com/watch?v=JKcHmloxpLw) - by Dan Shields +- [What is Decentralized Storage?](https://www.youtube.com/watch?v=I5M8bXQR9uA) - Blockchain WTF +- [Decentralized Dapp Scaling with IPFS!](https://www.youtube.com/watch?time_continue=2&v=-XdVnK22mZc) - by Peter Keay +- [Web3 stack, what’s next for developers?](https://www.youtube.com/watch?v=N76-HcQDuhQ&feature=youtu.be) - by Portia Burton +- [In Depth Introduction to IPFS](https://www.youtube.com/watch?v=GJ2980DWdyc) - Polycode +- [Robot-as-a-service experiment: ROS + IPFS + Ethereum](https://www.youtube.com/watch?v=-GgnykaVWeQ) - by Sergei Lonshakov +- [IPFS Hands-On Tutorial](https://www.youtube.com/watch?v=KIEq2FyMczs) - Polycode +- [CRDT Video playlist](https://blog.ipfs.io/67-crdt-research-meetup/) - curated by Protocol Labs +- [How Merkle Trees Enable the Decentralized Web!](https://www.youtube.com/watch?v=YIc6MNfv5iQ) - by Tara Vancil + +## Q1 by the names and numbers + +All told **104** contributors produced approximately **2,152** commits across **133** repositories in the IPFS project so far this year. Thanks to the following folks for helping make this such an amazing start to the year. 👏 + +[@0xf77](https://github.com/0xf77) +[@achingbrain](https://github.com/achingbrain) +[@agentofuser](https://github.com/agentofuser) +[@aknudsl](https://github.com/aknuds1) +[@alanshaw](https://github.com/alanshaw) +[@AlbertoElias](https://github.com/AlbertoElias) +[@alekswn](https://github.com/alekswn) +[@alexander255](https://github.com/alexander255) +[@anacrolix](https://github.com/anacrolix) +[@andrew](https://github.com/andrew) +[@aphelionz](https://github.com/aphelionz) +[@arhuman](https://github.com/arhuman) +[@aschmahmann](https://github.com/aschmahmann) +[@autonome](https://github.com/autonome) +[@bpot](https://github.com/bpot) +[@BunnyPowah](https://github.com/BunnyPowah) +[@burdakovd](https://github.com/burdakovd) +[@chenminjian](https://github.com/chenminjian) +[@cwaring](https://github.com/cwaring) +[@cwchristerw](https://github.com/cwchristerw) +[@daviddias](https://github.com/daviddias) +[@dirkmc](https://github.com/dirkmc) +[@djdv](https://github.com/djdv) +[@drew-512](https://github.com/drew-512) +[@eingenito](https://github.com/eingenito) +[@Elexy](https://github.com/Elexy) +[@emceeaich](https://github.com/emceeaich) +[@emmnx](https://github.com/emmnx) +[@ericronne](https://github.com/ericronne) +[@filips123](https://github.com/filips123) +[@fooock](https://github.com/fooock) +[@frrist](https://github.com/frrist) +[@fsdiogo](https://github.com/fsdiogo) +[@Gozala](https://github.com/Gozala) +[@grassias](https://github.com/grassias) +[@GriffinMB](https://github.com/GriffinMB) +[@hacdias](https://github.com/hacdias) +[@HamedSepehr](https://github.com/HamedSepehr) +[@hannahhoward](https://github.com/hannahhoward) +[@hdriqi](https://github.com/hdriqi) +[@hinshun](https://github.com/hinshun) +[@hsanjuan](https://github.com/hsanjuan) +[@hugomrdias](https://github.com/hugomrdias) +[@ianopolous](https://github.com/ianopolous) +[@Isan-Rivkin](https://github.com/Isan-Rivkin) +[@jacobhuen](https://github.com/jacobheun) +[@jamiew](https://github.com/jamiew) +[@jbenet](https://github.com/jbenet) +[@jimpick](https://github.com/jimpick) +[@jmank88](https://github.com/jmank88) +[@Jorropo](https://github.com/Jorropo) +[@joshfraser](https://github.com/joshfraser) +[@Kcchouette](https://github.com/Kcchouette) +[@kevina](https://github.com/kevina) +[@kishansagathiya](https://github.com/kishansagathiya) +[@koalalorenzo](https://github.com/koalalorenzo) +[@Kubuxu](https://github.com/Kubuxu) +[@kyledrake](https://github.com/kyledrake) +[@lanzafame](https://github.com/lanzafame) +[@lgierth](https://github.com/lgierth) +[@lidel](https://github.com/lidel) +[@magik6k](https://github.com/magik6k) +[@manandbytes](https://github.com/manandbytes) +[@MattSkala](https://github.com/MattSkala) +[@mcollina](https://github.com/mcollina) +[@meehow](https://github.com/meehow) +[@meiqimichelle](https://github.com/meiqimichelle) +[@michaelavila](https://github.com/michaelavila) +[@mikeal](https://github.com/mikeal) +[@momack2](https://github.com/momack2) +[@Mr0grog](https://github.com/Mr0grog) +[@multikatt](https://github.com/multikatt) +[@NeoTeo](https://github.com/NeoTeo) +[@niinpatel](https://github.com/niinpatel) +[@obo20](https://github.com/obo20) +[@olizilla](https://github.com/olizilla) +[@optman](https://github.com/optman) +[@overbool](https://github.com/overbool) +[@parkan](https://github.com/parkan) +[@PedroMiguelSS](https://github.com/PedroMiguelSS) +[@pgte](https://github.com/pgte) +[@pkafei](https://github.com/pkafei) +[@postables](https://github.com/postables) +[@raulk](https://github.com/raulk) +[@renrutnnej](https://github.com/renrutnnej) +[@RestitutorOrbis](https://github.com/RestitutorOrbis) +[@rgardaphe](https://github.com/rgardaphe) +[@roignpar](https://github.com/roignpar) +[@rvagg](https://github.com/rvagg) +[@sameer](https://github.com/sameer) +[@satazor](https://github.com/satazor) +[@schomatis](https://github.com/schomatis) +[@scout](https://github.com/scout) +[@Stebalien](https://github.com/Stebalien) +[@svallebro](https://github.com/svallebro) +[@terichadbourne](https://github.com/terichadbourne) +[@vasco-santos](https://github.com/vasco-santos) +[@victorb](https://github.com/victorb) +[@vmx](https://github.com/vmx) +[@wgxli](https://github.com/wgxli) +[@whyrusleeping](https://github.com/whyrusleeping) +[@zachferland](https://github.com/zachferland) +[@ZenGround0](https://github.com/ZenGround0) +[@zquestz](https://github.com/zquestz) + +### Please help us in welcoming these new contributors 👋 + +IPFS wouldn’t be the same without your help! We’re so grateful to have you onboard. Thank you. + +[@0xf77](https://github.com/0xf77) +[@agentofuser](https://github.com/agentofuser) +[@aknudsl](https://github.com/aknuds1) +[@AlbertoElias](https://github.com/AlbertoElias) +[@alekswn](https://github.com/alekswn) +[@andrew](https://github.com/andrew) +[@arhuman](https://github.com/arhuman) +[@aschmahmann](https://github.com/aschmahmann) +[@autonome](https://github.com/autonome) +[@bpot](https://github.com/bpot) +[@BunnyPowah](https://github.com/BunnyPowah) +[@burdakovd](https://github.com/burdakovd) +[@cwaring](https://github.com/cwaring) +[@cwchristerw](https://github.com/cwchristerw) +[@drew-512](https://github.com/drew-512) +[@emceeaich](https://github.com/emceeaich) +[@emmnx](https://github.com/emmnx) +[@ericronne](https://github.com/ericronne) +[@filips123](https://github.com/filips123) +[@fooock](https://github.com/fooock) +[@frrist](https://github.com/frrist) +[@Gozala](https://github.com/Gozala) +[@grassias](https://github.com/grassias) +[@GriffinMB](https://github.com/GriffinMB) +[@HamedSepehr](https://github.com/HamedSepehr) +[@hdriqi](https://github.com/hdriqi) +[@Isan-Rivkin](https://github.com/Isan-Rivkin) +[@jimpick](https://github.com/jimpick) +[@jmank88](https://github.com/jmank88) +[@Jorropo](https://github.com/Jorropo) +[@joshfraser](https://github.com/joshfraser) +[@MattSkala](https://github.com/MattSkala) +[@meehow](https://github.com/meehow) +[@multikatt](https://github.com/multikatt) +[@niinpatel](https://github.com/niinpatel) +[@obo20](https://github.com/obo20) +[@optman](https://github.com/optman) +[@RestitutorOrbis](https://github.com/RestitutorOrbis) +[@rgardaphe](https://github.com/rgardaphe) +[@roignpar](https://github.com/roignpar) +[@rvagg](https://github.com/rvagg) +[@scout](https://github.com/scout) +[@svallebro](https://github.com/svallebro) +[@wgxli](https://github.com/wgxli) +[@zachferland](https://github.com/zachferland) +[@zquestz](https://github.com/zquestz) + +### Contributors by the numbers + +Here are the 10 contributors who touched the most repos in the project so far: + +1. @Kubuxu ...63 +2. @Stebalien ...50 +3. @hsanjuan ...23 +4. @alanshaw ...15 +5. @magik6k ...13 +6. @daviddias ...12 +7. @hugomrdias ...10 +8. @lidel ...9 +9. @jacobheun/ @olizilla/ @achingbrain/ @whyrusleeping ...8 +10. @andrew/ @schomatis ...7 + +Once again, thanks for all of your hard work and contributions in Q1. Keep up the great job! + +## Coming up in 2019 + +In case you missed it, we recently presented [The 2019 IPFS Roadmap](https://blog.ipfs.io/78-ipfs-2019-roadmap/), which introduces a brand new mission statement, as well as 16 goals for the project. Discover those goals plus the 2019 Epics (what does _that_ mean?) in [Achievement Unlocked: The 2019 IPFS Roadmap!](https://blog.ipfs.io/78-ipfs-2019-roadmap/) + +We would also be remiss if we didn’t share that ENS + IPFS are coming to [the Brave browser!](https://twitter.com/ensdomains/status/1105565560224563202) Very exciting stuff for the start of 2019. + +## Thanks for reading ☺️ + +That’s it for this special edition of the IPFS Weekly. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! Next week we’ll return with all the news that’s happened across the ecosystem since the last weekly. + +If this is your first time reading the IPFS Weekly, you can learn more or get involved by checking out [the project on GitHub](https://github.com/ipfs), or joining us [on IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +See you next week! 👋 diff --git a/src/_blog/weekly-038/README.md b/src/_blog/weekly-038/README.md new file mode 100644 index 00000000..32a78def --- /dev/null +++ b/src/_blog/weekly-038/README.md @@ -0,0 +1,90 @@ +--- +date: 2019-04-16 +url: /82-ipfs-weekly-38/ +tags: weekly +title: IPFS Weekly 38 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### The 2019 IPFS Roadmap + +Wondering what comes next for IPFS? Look no further than [the newly released 2019 IPFS Roadmap](https://blog.ipfs.io/78-ipfs-2019-roadmap/), shared earlier this month. Not only did we create a roadmap, but we also revised and clarified a mission statement and expanded some of the IPFS goals. We are very excited for the rest of 2019. 😊 + +### js-ipfs v0.35.0 RELEASED 🚀 + +Last week, js-ipfs v0.35.0 was released, adding API changes and recursive DNS link loops, and decreasing approximately half of the bundle size of js-ipfs since v0.33! [Read the full blog announcement for all of the details](https://blog.ipfs.io/80-js-ipfs-0-35/). + +### Follow IPFS Events on Twitter + +Be the first to know about all of the upcoming IPFS events by following the [IPFS Events Twitter account](https://twitter.com/IPFSevents). Also, they’ll be posting about [IPFS News](https://twitter.com/IPFSevents/status/1117864101089140745), so check it out. 😸 + +## Meet Bogdan Habić + +Next Monday, [Bogdan Habić](https://twitter.com/bogdanhabic) will be joining [the IPFS Weekly Call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) to talk about IPFS and [Tenderly](https://tenderly.dev/), the first Ethereum Smart Contracts monitoring platform. Bogdan is a software engineer, experienced in building, maintaining and scaling large-scale distributed systems. He is passionate when it comes to enabling his team, sharing knowledge, and the people side of software. Meet Bogdan on Monday, April 22 at 5pm UTC! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Pyramids!](https://medium.com/coinmonks/pyramids-f73b20c3aa2d) Coinmonks, 15 Apr 2019 +- [INTERPLANETARY FILE SYSTEM (IPFS), or a file system for the blockchain](http://hu.envienta.net/envienta/interplanetary-file-system-ipfs/), Envienta, 15 Apr 2019 +- [Exclusive: XYO head of community explains why they chose IPFS, not build out own blockchain](https://cryptoinsider.com/exclusive-xyo-head-of-community-explains-why-they-chose-ipfs-not-blockchain/), Crypto Insider, 10 Apr 2019 +- [IPFS VS. Blockchain](https://medium.com/@snehal1798/ipfs-vs-blockchain-f9407447fb47), Snehal Phatangare, 9 Apr 2019 +- [Should Independent Creators like PewDiePie Support Free Software?](https://steemit.com/pewdiepie/@gray00/should-independent-creators-like-pewdiepie-support-free-software) 9 Apr 2019 +- [Copyright and the distributed peer-to-peer web](https://www.ctrl.blog/entry/copyright-p2p-dweb), 8 Apr 2019 +- [OpenBazaar to Launch New Platform, Mulls Own Token](https://cryptosumer.com/2019/04/07/openbazaar-to-launch-new-platform-mulls-own-token/), Cryptosumer, 7 Apr 2019 +- [Telos IPFS Prepares to Launch for Dapps](https://medium.com/goodblock-io/telos-ipfs-prepares-to-launch-for-dapps-fc652e58bbf8), 5 Apr 2019 +- [IPFS Privacy](https://medium.com/pinata/ipfs-privacy-711f4b72b2ea), Pinata, 5 Apr 2019 +- [Introducing the Textile Desktop Series](https://medium.com/textileio/introducing-the-textile-desktop-series-f9eb14e1349e), 4 Apr 2019 +- [The Decentralized Internet: An HBO Tale?](https://www.ondiflo.com/blog/the-decentralized-internet-an-hbo-tale) 4 Apr 2019 +- [Using IPFS Messaging For Referral Networks](https://medium.com/2key/using-ipfs-messaging-for-referral-networks-aa1f11220a77), 2key, 2 Apr 2019 +- [Enterprise IPFS – Why Organizations Will Adopt IPFS](https://medium.com/pinata/enterprise-ipfs-6afcf76b28a0), Pinata, 1 Apr 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [js-libp2p 0.25 is out now!](https://blog.ipfs.io/81-js-libp2p-0-25/) They’ve added auto dialing to discovered peers and have made a ton of improvements to connection management. +- The Graph’s [March Development Update](https://medium.com/graphprotocol/march-development-update-c6342fd7168e) was recently released, including info on the addition of IPFS stream processing. 🙌 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Introducing Hako](https://hackernoon.com/hako-3825c3a033d7) – A super secure decentralized file sharing application powered by Web 3.0 +- [libp2p discussion boards are open!](https://discuss.libp2p.io/) +- [Public Gateway Cacher](https://gitlab.com/NatoBoram/public-gateway-checker) – Cache a specific hash on a bunch of public gateways. +- [Genobank DNA Wallet](https://coinlist.co/build/nucypher/projects/a9f305f4-d0ff-4501-840e-4566608303ab) – A Decentralised and anonymous DNA wallet. Enables users to extract DNA, establish ownership, share (P2P) & control using Nucypher and Blockchain. +- [deima](https://boramalper.github.io/deima/) is a decentralised image host that allows you to upload your images to IPFS distributed network. + +![](https://ipfs.io/ipfs/Qmd11gtyigpCjo4MfzXuj9MKuMF3Dj1EZEvbNRZeQE1jd4) + +## Join us at the first ever IPFS Camp + +[IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/) is taking place June 27th-30th in beautiful Barcelona. Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **17 Apr 2019:** [Decentralized Apps w/ Blockstack & IOC with Loopback](https://www.meetup.com/austinnodejs/events/plgxbqyzgbwb/), join the folks at the Austin Node.js meetup to talk dapps and blockstack! Austin (TX), US. +- **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **2 May 2019:** [Munich IPFS User Group](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/259762490/): [Pierre Krieger](https://twitter.com/tomaka17) from [parity](https://www.parity.io/) talks about Rust libp2p. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-039/README.md b/src/_blog/weekly-039/README.md new file mode 100644 index 00000000..3d69f648 --- /dev/null +++ b/src/_blog/weekly-039/README.md @@ -0,0 +1,78 @@ +--- +date: 2019-04-23 +url: /84-ipfs-weekly-39/ +tags: weekly +title: IPFS Weekly 39 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### go-ipfs 0.4.20 released + +Highlights from the latest release of the Go implementation, go-ipfs, include support for Docker commands, a major WebUI release, some improved _and_ new commands, plus perf and reliability improvements. Read the full release notes on [the IPFS blog](https://blog.ipfs.io/83-go-ipfs-0-4-20/). + +### Introducing IPFS-lite: embeddable, lightweight IPFS-network peer for IPLD applications + +Last week, Hector Sanjuan shared [IPFS-lite](https://github.com/hsanjuan/ipfs-lite), an embeddable, lightweight IPFS-network peer for IPLD applications. It allows to ipfs-ify any libp2p application but also to run lightweight embedded peers that can read and write files to IPFS but not do all the other things. [Read more about IPFS-lite](https://discuss.ipfs.io/t/ipfs-lite-embeddable-lightweight-ipfs-network-peer-for-ipld-applications/5237). + +### go-ds-crdt: A distributed key-value store implementation for IPFS + +[go-ds-crdt](https://discuss.ipfs.io/t/go-ds-crdt-a-distributed-key-value-store-implementation-for-ipfs/5239) is the new datastore backend for the IPFS Cluster shared state. go-ds-crdt provides a distributed key-value store using CRDTs and implements the Datastore interface. The idea is that any datastore can now be replaced by a replicated datastore. [Read more about go-ds-crdt](https://github.com/ipfs/go-ds-crdt). + +### Storage Driver: Add an IPFS driver + +Earlier this week, Docker received [a pull request](https://github.com/docker/distribution/pull/2906) to add an IPFS storage driver to the Docker registry. The pr would allow for a swarm of Docker registries to share an underlying, content-addressed storage layer out of the box. Pretty exciting stuff! + +## Meet Pedro Santos, developer of Discussify + +Next week, [the IPFS Weekly call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) welcomes [Pedro Santos](https://github.com/pedromiguelss), a front-end developer holding Advanced Studies (3rd cycle) in Informatics Engineering (having already completed his first year in the Doctoral Program in Informatics Engineering). Pedro graduated in Computer Engineering from the Integrated Masters in Informatics and Computing Engineering, at the Faculdade de Engenharia da Universidade do Porto (FEUP). Pedro is joining the weekly call to present a walkthrough on [IPFS and Discussify’s browser extension app](https://github.com/ipfs-shipyard/discussify-browser-extension). Don’t miss it! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [IPSE: A Safe Search Engine Based On IPFS and Blockchain](https://medium.com/@ipse_io/ipse-a-safe-search-engine-based-on-ipfs-and-blockchain-91b7b4644a3c), 19 Apr 2019 +- [Make A Discord Bot That Can Upload, Pin, and Search IPFS](https://medium.com/@rtradetech/make-a-discord-bot-that-can-upload-pin-and-search-ipfs-7ec59c070cda), 17 Apr 2019 +- [Aragon Network IPFS Pinning](https://forum.aragon.org/t/aragon-network-ipfs-pinning/824/14), 15 Apr 2019 +- SLIDES: [libp2p](https://slides.com/ryotakogaenzawa/deck-a513a966-bccb-4dc0-a44a-aad0a9353d7b#/), Ryota Kogaenzawa, 15 Apr 2019 +- [What do you think about this idea of a self contained docker image for blogging on IPFS?](https://twitter.com/Smashnet/status/1115627495964008449) Nicolas Inden, 9 Apr 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- qri (“query”) is versioned, scriptable, exportable, collaborative datasets and [version 0.7.1](https://github.com/qri-io/frontend/releases/tag/v0.7.1) is out now. +- The [Textile team](https://www.textile.photos/) recently shipped the latest [Textile Update | March 2019](https://medium.com/textileio/textile-update-march-2019-5da0c1581d3e). + +![](https://ipfs.io/ipfs/Qmd11gtyigpCjo4MfzXuj9MKuMF3Dj1EZEvbNRZeQE1jd4) + +## Join us at the first ever IPFS Camp + +[IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/) is taking place June 27th-30th in beautiful Barcelona. Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **24 Apr 2019:** Introducing [Hackboat](https://hackboat.org/), an afternoon cruise along the beautiful Willamette river while enjoying awesome infosec presentations, Portland, Oregon. +- **25 Apr 2019:** [Diving into the Decentralized Web: ProtoSchool Learns IPFS!](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/259938521) What is the decentralized web? What is it good for, and how does it work? Let’s find out together! Seattle, Washington. +- **2 May 2019:** [Munich IPFS User Group](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/259762490/): [Pierre Krieger](https://twitter.com/tomaka17) from [parity](https://www.parity.io/) talks about Rust libp2p. +- **2-3 May 2019:** [Uphill Conf](https://uphillconf.com/) – The inspiring frontend conference on top of beautiful mount Gurten, Bern Switzerland. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them, Berlin, Germany. +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-040/README.md b/src/_blog/weekly-040/README.md new file mode 100644 index 00000000..7238ce88 --- /dev/null +++ b/src/_blog/weekly-040/README.md @@ -0,0 +1,65 @@ +--- +date: 2019-04-30 +url: /85-ipfs-weekly-40/ +tags: weekly +title: IPFS Weekly 40 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Efficient, Usable, And Cheap Storage of IPFS Hashes In Solidity Smart Contracts](https://medium.com/@rtradetech/efficient-usable-and-cheap-storage-of-ipfs-hashes-in-solidity-smart-contracts-795d1b52ace0), Alexandre Trottier, 29 Apr 2019 +- [Flowchain Foundation Releases Video about its Distributed Leger Technology](https://medium.com/flowchain/flowchain-foundation-releases-video-about-its-distributed-leger-technology-44f0a600ed20), Flowchain Global, 29 Apr 2019 +- VIDEO: [What is IPFS? Explaining The Interplanetary File System](https://www.youtube.com/watch?time_continue=58&v=jWqLjwqS3ok), A Chain of Blocks, 26 Apr 2019 +- [Unstoppable Domains and the End of Internet Censorship](https://medium.com/hedgetradehq/unstoppable-domains-and-the-end-of-internet-censorship-241feff0b253), HedgeTrade, 22 Apr 2019 +- VIDEO: [Vaibhav Saini of Towards Blockchain - InterPlanetary File System (IPFS)](https://www.youtube.com/watch?time_continue=3&v=MvGJhlvrQlA), Let’s Talk ETC! 19 Apr 2019 +- VIDEO: [Where is the data bazaar?](https://www.youtube.com/watch?time_continue=1745&v=GcPU1Os2-Q8) Kris Skrinak, 10 Apr 2019 + +## Questions from the community 🤔 + +_Here are some questions folks are discussing in the IPFS ecosystem._ + +- [I tried to upload a file from local system to IPFS using Script CDN link but can’t](https://discuss.ipfs.io/t/how-to-upload-a-file-from-local-storage-to-ipfs-by-using-cdn-link/5313) +- [In the GNU/Linux repos, do we have any IPFS clients?](https://www.reddit.com/r/ipfs/comments/bj0vn4/in_the_gnulinux_repos_do_we_have_any_ipfs_clients/) +- [What would be a smart way of integrating IPFS into PeerTube?](https://www.reddit.com/r/ipfs/comments/bfar8o/what_would_be_a_smart_way_of_integrating_ipfs/) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Open-Registry](https://open-registry.dev/), a JavaScript Package Registry funded, developed and maintained by the community, for the community. +- [Matters.news](https://matters.news/faq) is a news publishing site hosted on IPFS with approximately 10K+ active users! +- [galacteek](https://github.com/eversum/galacteek) is an experimental multi-platform Qt5-based browser/toolbox for the IPFS peer-to-peer network. + +![](https://ipfs.io/ipfs/Qmd11gtyigpCjo4MfzXuj9MKuMF3Dj1EZEvbNRZeQE1jd4) + +## Join us at the first ever IPFS Camp + +[IPFS Camp](https://blog.ipfs.io/72-ann-ipfs-camp/) is taking place June 27th-30th in beautiful Barcelona. Meet the core developers and contributors to the IPFS project, community leaders, and builders on of the Distributed Web, but only if you register to attend. [Registration is open now!](https://camp.ipfs.io/) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **2 May 2019:** [Munich IPFS User Group](https://www.meetup.com/de-DE/Munich-IPFS-User-Group/events/259762490/): [Pierre Krieger](https://twitter.com/tomaka17) from [parity](https://www.parity.io/) talks about Rust libp2p. +- **2-3 May 2019:** [Uphill Conf](https://uphillconf.com/) – The inspiring frontend conference on top of beautiful mount Gurten, Bern Switzerland. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them, Berlin, Germany. +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-041/README.md b/src/_blog/weekly-041/README.md new file mode 100644 index 00000000..481804c7 --- /dev/null +++ b/src/_blog/weekly-041/README.md @@ -0,0 +1,64 @@ +--- +date: 2019-05-07 +url: /86-ipfs-weekly-41/ +tags: weekly +title: IPFS Weekly 41 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## Meet the Community: Edgar Lee @ Software Developer at Netflix + +This week for [`Meet the Community`, we had Edgar Lee, a Software Developer at Netflix](https://blog.ipfs.io/meet-the-community-edgar-lee) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/categories/articles/)._ + +- [Building the Firebase for CRDTs](https://medium.com/textileio/building-the-firebase-for-crdts-7dd8dea8953a), Textile, 3 May 2019 +- [Filling in the GraphQL pipeline: Ready-to-use code generation](https://www.onegraph.com/blog/2019/05/03_Filling_in_the_GraphQL_Pipeline_Ready_to_use_code_generation.html), OneGraph, 3 May 2019 +- [Notes on OrbitDB and Textile](https://medium.com/open-work-labs/notes-on-orbitdb-and-textile-55f07db7fb03), Open Work Labs, 2 May 2019 +- [Understanding distributed storage systems on blockchain](https://yourstory.com/2019/04/distributed-data-storage-systems-blockchain), Prashant Shah, 1 May 2019 +- [There’s an ongoing discussion about IPFS-based npm dependencies over on pacote](https://github.com/zkat/pacote/pull/173), 30 Apr 2019 +- [Local-first software, You own your data, in spite of the cloud](https://www.inkandswitch.com/local-first.html), Ink & Switch, April 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [OpenBazaar, but Fast: New Release Dramatically Improves Speed](https://openbazaar.org/blog/openbazaar-but-fast-new-release-dramatically-improves-speed/). This is a minor release, but delivers substantial improvements to the user experience, such as rapid loading of listings from search. +- [OrbitDB 0.20.0 released!](https://github.com/orbitdb/orbit-db) It’s the biggest release since OrbitDB was created. +- [ipfs_cluster_api v0.0.2 (unofficial)](https://github.com/cluster-labs/ipfs-cluster-api) – A JavaScript client library for the IPFS Cluster HTTP API. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Stars Network](https://github.com/PACTCare/Stars-Network), a first draft of research on how to deal with metadata on the web3/dweb on GitHub. +- [ipfs-deploy npm package](https://discuss.ipfs.io/t/ann-ipfs-deploy-npm-package-helps-deploy-static-websites-to-free-ipfs-pinning-services/5318) helps deploy static websites to free IPFS pinning services. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **9 May 2019:** [Blockchain, Cryptocurrencies & IPFS: revisiting IPFS and Bottle the IPFS Browser](https://www.meetup.com/Blockchain-Cryptocurrencies-Interplanetary-File-System/events/vldkqqyzhbgc/), San Diego, California. +- **11 May 2019:** [IPFS Shenzhen Meetup & Introducing ProtoSchool Shenzhen Chapter](https://www.meetup.com/Hong-Kong-IPFS-Meetup/events/260780205/), hosted by Hong Kong IPFS, Shenzhen, China. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them, Berlin, Germany. +- **23 May 2019:** [May p2p // dweb meetup](https://www.meetup.com/p2p-and-dweb-toronto/events/258520223/), hosted by Peer-to-peer and Decentralized Web Toronto and held at Mozilla. +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-042/README.md b/src/_blog/weekly-042/README.md new file mode 100644 index 00000000..200c9dd7 --- /dev/null +++ b/src/_blog/weekly-042/README.md @@ -0,0 +1,84 @@ +--- +date: 2019-05-14 +url: /87-ipfs-weekly-42/ +tags: weekly +title: IPFS Weekly 42 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### IPFS Working Group OKR Update Videos + +Catch up on the latest IPFS Working Group goals and ships for Q2 in [this playlist of working group videos](https://www.youtube.com/playlist?list=PLuhRWgmPaHtRUYCD_RyUw2ldU4lyoSXR1) now! + +### Introducing IPFS Office Hours for Contributors + +Are you keen to contribute to IPFS but don’t know where to start? Come and ask at [Contributor Office Hours](https://github.com/ipfs/community/issues/412) starting the hour before the IPFS Weekly Calls on Mondays. Join us ☺️ + +### Initial Implementation of GraphSync Wire Protocol is here + +Pretty self explanatory but the [Initial Implementation of the GraphSync Wire Protocol in Go](https://github.com/ipfs/go-graphsync) has arrived. Check it out! + +## Meet the Community: Carson Farmer, Core Developer @ Textile.io + +This week for [`Meet the Community`, we had Carson Farmer, a Core Developer at Textile](https://blog.ipfs.io/meet-the-community-carson-farmer/) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [We Made A Dashboard for IPFS Clusters and Now We Want You to Check it Out](https://hackernoon.com/we-made-a-dashboard-for-ipfs-clusters-and-now-we-want-you-to-check-it-out-a87234629908), Hackernoon, 14 May 2019 +- [XR Web: A Decentralized Protocol for Spatial XR apps](https://medium.com/@melodygrey/xr-web-a-decentralized-protocol-for-spatial-xr-apps-d1538bfd80a7), Melody Grey, 14 May 2019 +- [The Complete Beginner’s Guide to Deploying Your First Static Website to IPFS](https://medium.com/interplanetary-gatsby/the-complete-beginners-guide-to-deploying-your-first-static-website-to-ipfs-103b27e8822e), Interplanetary Gatsby, 12 May 2019 +- [Ghost 2 Blog on Heroku](https://blog.fission.codes/ghost2-blog-on-heroku/), FISSION, 11 May 2019 +- [On-premise To Cloud To Serverless To Cloud Native To Serverless Less Applications??](https://medium.com/techietalks/on-premise-to-cloud-to-serverless-to-cloud-native-to-serverless-less-applications-7b80bf3e83d1) A story on digital transformation, 9 May 2019 +- [Run Your Own IPFS Search Engine With Lens](https://medium.com/@rtradetech/run-your-own-ipfs-search-engine-with-lens-c262fd9e5cc), 9 May 2019 +- [Call for Alpha Testers](https://blog.fission.codes/call-for-alpha-testers-heroku-ipfs-add-on/) We’re building a Heroku add-on that makes it easy to integrate InterPlanetary File System (IPFS) into apps you host there. 8 May 2019 +- [Foreword: Space-Ready Publishing with Gatsby and IPFS](https://medium.com/interplanetary-gatsby/foreword-space-ready-publishing-with-gatsby-and-ipfs-6afdcfec87f8), Interplanetary Gatsby, 7 May 2019 +- [Ethereum 2.0’s Nodes Need to Talk – A Solution Is ‘Hobbits’](https://finance.yahoo.com/news/ethereum-2-0-nodes-talk-123055815.html), Yahoo Finance, 5 May 2019 +- [Notes on 3Box](https://medium.com/open-work-labs/notes-on-3box-eba7cda4634b), Open Work Labs, 2 May 2019 +- [How We Built autom(8) So Fast](https://medium.com/fnproject/how-we-built-autom-8-so-fast-c4220b1160c2), Fn, 24 Apr 2019 +- [The Case for a Decentralized Social Network](https://medium.com/@npfoss/the-case-for-a-decentralized-social-network-2683b727abf5), Nate Foss, 10 Mar 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Textile has docs!](https://docs.textile.io/) +- [OMGoodness it’s May! Here’s the Textile April update.](https://medium.com/textileio/omgoodness-its-may-here-s-the-textile-april-update-98f77b3b4f32) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [[Contest] libp2p+noise](https://github.com/libp2p/go-libp2p/issues/631): Win a Data Terra Nemo’19 conference ticket! +- [Indrive](https://lndrive.space/), host files on IPFS using Bitcoin Lightning +- [Alita.global](https://medium.com/@RalapXStartUp/alita-global-decentralized-computing-dx-chain-based-on-ipfs-cad0fc6133bb): Decentralized computing Dx chain based on IPFS + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **16 May 2019:** Calling all dweb enthusiasts to come meet and mingle at the first [Berlin Lab Social](https://www.meetup.com/IPFS-Berlin/events/261347119/). It’s going to be a good time to check-in with the community and update everyone on the latest efforts underway in the IPFS, IPLD, Libp2p, IPFS Cluster, and Filecoin communities. +- **17-18 May 2019:** [Data Terra Nemo](https://dtn.is/) is a technical conference about decentralized protocols and the software built on top of them, Berlin, Germany. +- **23 May 2019:** [May p2p // dweb meetup](https://www.meetup.com/p2p-and-dweb-toronto/events/258520223/), hosted by Peer-to-peer and Decentralized Web Toronto and held at Mozilla. +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-043/README.md b/src/_blog/weekly-043/README.md new file mode 100644 index 00000000..87966f38 --- /dev/null +++ b/src/_blog/weekly-043/README.md @@ -0,0 +1,59 @@ +--- +date: 2019-05-21 +url: /88-ipfs-weekly-43/ +tags: weekly +title: IPFS Weekly 43 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## Meet the Community: Alan Shaw, Core Developer of the IPFS Protocol @ IPFS / Protocol Labs + +This week for [`Meet the Community`, we had Alan Shaw, a Core Developer of the IPFS Protocol @ IPFS / Protocol Labs](https://blog.ipfs.io/meet-the-community-alan-shaw) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Starlog: Aiming for the Stars](https://blog.florence.chat/starlog-aiming-for-the-stars-f4d1775f8528), 21 May 2019 +- [How to Start Contributing to Textile Photos](https://medium.com/textileio/how-to-start-contributing-to-textile-photos-b626c3f63493), Textile, 20 May 2019 +- [An Inter-Plantary Journey with LineageOS](https://discuss.ipfs.io/t/an-inter-plantary-journey-with-lineageos/5442), 19 May 2019 +- VIDEO: [IPFS Tutorial - Upload Files With IPFS & JavaScript](https://www.youtube.com/watch?v=I0UolzV3ico&feature=share), CodingSrc, 17 May 2019 +- [OrbitDB: Serverless, Distributed, Peer-to-Peer Database](https://kauri.io/article/6ae5ffa612044a09be856ff390ce6990), Kauri, 16 May 2019 +- [Introducing a Tour of Textile](https://medium.com/textileio/introducing-a-tour-of-textile-92f02969a4d8), The fastest way to build your next decentralized app using IPFS, Textile, 15 May 2019 +- [Microsoft wants to protect your identity with Bitcoin](https://www.wired.com/story/microsoft-wants-protect-identity-bitcoin/), Wired, 14 May 2019 +- [Why Microsoft is building a Bitcoin-based ID verification system](https://www.computerworld.com/article/3394686/why-microsoft-is-building-a-bitcoin-based-id-verification-system.html), Computerworld, 14 May 2019 + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [SourceCred](https://medium.com/sourcecred/introduction-to-sourcecred-7665297af715) is an open-source technology for organizing communities. +- [Peermaps](https://peermaps.org/) is a distributed, offline-friendly alternative to commercial map providers such as google maps. Instead of fetching data from a centralized tile service, your computer fetches map data from other peers across the network. +- [Peepeth](https://peepeth.com/welcome) is a blockchain-based microblogging platform similar to Twitter, but focused on meaningful content and powered with Ethereum and IPFS. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **23 May 2019:** [May p2p // dweb meetup](https://www.meetup.com/p2p-and-dweb-toronto/events/258520223/), hosted by Peer-to-peer and Decentralized Web Toronto and held at Mozilla. +- **27 May 2019:** [Papers We Love – Berlin](https://www.meetup.com/Papers-We-Love-Berlin/events/261542382/), We’ll be learning about the paper “Merkle-CRDTs” presented by one of its authors, Héctor Sanjuán! +- **29 May 2019:** [ProtoSchool Taipei](https://www.meetup.com/IPFS-Taiwan/events/261636809/) is launching, so join their first event at the AppWorks Taipei office! +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [reply to this email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-044/README.md b/src/_blog/weekly-044/README.md new file mode 100644 index 00000000..7fd82d78 --- /dev/null +++ b/src/_blog/weekly-044/README.md @@ -0,0 +1,67 @@ +--- +date: 2019-05-28 +url: /90-ipfs-weekly-44/ +tags: weekly +title: IPFS Weekly 44 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### js-ipfs 0.36.0 released 🎉 + +Last week, a new update for the [JS implementation of IPFS was released](https://ipfs.io/blog/89-js-ipfs-0-36/)! Version 0.36.0 has added refs and refs local commands, Base32 encoding for v1 CIDs, updated MDNS discovery compatibility, and more. Read the full details on [the IPFS blog](https://ipfs.io/blog/89-js-ipfs-0-36/). + +### Missed registration for IPFS Camp? Join the waitlist + +It might not be the last chance to attend IPFS Camp this June, in fact, this could be your lucky day! If you missed registration earlier this month, [sign up now to get on the waitlist](https://camp.ipfs.io/)! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- SLIDES: [libp2p](https://speakerdeck.com/wshino/libp2p), Shinohara Wataru, 23 May 2019 +- [IPFS: Technology that’s out of this world](https://business.sprint.com/blog/ipfs-technology/?ECID=MA:SM:05222019:TW:BLG:ENT:NAT:Organic), Sprint Business Blog, 22 May 2019 +- [Introducing the Textile Javascript Client](https://medium.com/textileio/introducing-the-textile-javascript-client-873c1a31d939), Textile, 22 May 2019 +- [How To Successfully Hosting A Decentralized Website Using ENS/IPFS.](https://medium.com/@rakeshkumar_64243/how-to-successfully-hosting-a-decentralized-website-using-ens-ipfs-b8f1830a5c49) Rakesh Kumar, 21 May 2019 +- [Golem’s short recap on their favorite DTNConf talks!](https://twitter.com/golemproject/status/1130791087851868161) 21 May 2019 +- [IPFS projects @ ETHNewYork](https://blog.fission.codes/fission-ethnewyork/), FISSION, 21 May 2019 +- [DTN Recap](https://hx.ht/#post-04-dtn-recap), 20 May 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [go-filecoin 0.2.2 is released](https://filecoin.io/blog/go-filecoin-0.2.2-release/). + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [LineageOS on IPFS](https://lineageos-on-ipfs.com/): A permanent solution to LineageOS’ storage problem. +- [Peergos’ Alpha Release, June 2019](https://peergos.org/blog#alpha_release_june_2019_). Learn more about the end-to-end encrypted, peer-to-peer file storage, sharing and communication network. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **29 May 2019:** [ProtoSchool Taipei](https://www.meetup.com/IPFS-Taiwan/events/261636809/) is launching, so join their first event at the AppWorks Taipei office! +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-045/README.md b/src/_blog/weekly-045/README.md new file mode 100644 index 00000000..0a5a24de --- /dev/null +++ b/src/_blog/weekly-045/README.md @@ -0,0 +1,118 @@ +--- +date: 2019-06-11 +url: /94-ipfs-weekly-45/ +tags: weekly +title: IPFS Weekly 45 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### go-ipfs 0.4.21 released 🎉 + +Last week, the go-ipfs team celebrated the release of [version 0.4.21](https://blog.ipfs.io/93-go-ipfs-0.4.21), which includes some major bug fixes and new features like experimental TLS1.3 support. Read the full release notes on the IPFS blog. + +### 🖥 ipfs-desktop 0.8.0 released + +Enjoying the ipfs-desktop experience? Prepare to love it just a little bit more with [the release of version 0.8.0](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.8.0). Now featuring the ability to add the command `ipfs` to your system, as well as support for dark mode. 🙌 + +### Recapping the July 2018 IPFS Developer Meetings + +Did you miss the IPFS and Libp2p developer meeting we held last July? Now you can catch up on all of the project updates, lightning demos and poster sessions held there. Check out [the recap on the IPFS blog](https://blog.ipfs.io/91-ipfs-2018-dev-meetings/). + +## Meet the Community, David Dias @ Protocol Labs + +With the first-ever IPFS Camp right around the corner, we’re interviewing some of the community members who are making this highly anticipated event a reality. Visit [camp.ipfs.io](https://camp.ipfs.io/) to learn more about IPFS Camp, scholarships, and what’s included in your conference pass. + +### Tell us a bit about yourself and your background. How did you get involved with IPFS and end up joining the team at Protocol Labs? + +Hi I’m [David](http://daviddias.me/)! + +I joined the IPFS project back in 2015. At the time, I was focused on [building a distributed computing network on top of the Web Platform](https://github.com/daviddias/thesis.browserCloud.js/blob/master/document.pdf). I was heavily inspired by the developments on [European Community Networks](https://confine-project.eu/) and with the rise of P2P Browser connectivity using WebRTC and native like performance with ASM.js, bringing the ideas of voluntary resource sharing and fully distributed systems to the Web felt like the right next path. + +Through my journey, I found IPFS and it matched exactly a big important piece I would eventually need for my project. I started by jumping in and contributing to build a full [JavaScript implementation of the protocol (JS IPFS)](https://js.ipfs.io/), and eventually joined Protocol Labs to dedicate 100% of my energy to it. + +### Why should people be excited about IPFS? + +IPFS is a fundamental building block, a protocol, to create powerful and distributed experiences for humans across the planet-wide nervous system that we call the “Internet”. + +Before IPFS, developing a P2P application implied having years of experience building networking applications, going deep on technical protocols and fighting complexity at every step on the way. Building with Centralized Infrastructure had exactly if not even more complex hurdles, then HTTP and all the conventions on how to build Web Applications came along and now, everything is so much more simple. HTTP was instrumental in powering multiple waves of applications and services over the last 2 decades. IPFS will do the same for the DWeb (Distributed Web). + +### What projects are really exciting you in the IPFS Ecosystem at the moment and why? + +All of them? Ahaha but seriously, it’s pretty much impossible to do a fair selection when there are so many exciting projects appearing every week. We actually created a community driven repo so that folks can share when they discover or create something awesome using IPFS - you can find the current list at [awesome.ipfs.io](https://awesome.ipfs.io). Also, there is [www.app.co/ipfs](https://www.app.co/ipfs) that is maintained by Blockstack. Both are worth checking out. + +Just a few that come top of my mind are: + +- DTube (https://d.tube), a video distribution and monetization platform for the DWeb. +- Tally Lab (https://tallylab.com), a diary application for all the “Quantified Self” enthusiasts or Researchers that need a way to track data without compromising privacy and ownership. +- QRI (https://qri.io), one of the most exciting projects for data scientists out there. QRI offers a way to version and collaborate on distributed datasets. +- Orion (https://orion.siderus.io), a friendly IPFS Desktop client that enables everyone to use IPFS in their personal machines with a graphical user interface. +- Textile (https://www.textile.photos), a photo sharing application that is powered by an open DApp building toolkit, also built by Textile. +- DSound (https://dsound.audio), an audio distribution and monetization platform for the DWeb +- OpenBazaar (https://openbazaar.org), a P2P marketplace that puts the users and the customers in control of their experience. +- Decentraland (https://decentraland.org/), a virtual world where you can buy and sell land where you can then build your own experiences for others. + +### Without giving too much away what should folks expect from IPFS Camp? + +Lazers and Space Travel! I meant it! 😁 IPFS Camp will be an event focused on knowledge sharing and collaborative thinking to onboard new and current DWeb builders, and set up the community to overcome the next challenges in making the Web fully Distributed. + +You can expect Workshops, small group Protocol design sessions and of course, myriad talks from the community sharing the latest and greatest on the DWeb space. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [What is IPFS Blockchain gateway development?](https://www.sparkouttech.com/ipfs-blockchain-gateway-development/) Sparkout, 10 June 2019 +- VIDEO: [Andrew Hall of Textile.io Explains IPFS](https://www.youtube.com/watch?v=a1qVSs-poLY), MacVoices #19152: WWDC/AltConf, 8 June 2019 +- [IPFS, Again](https://macwright.org/2019/06/08/ipfs-again.html), Tom MacWright, 8 June 2019 +- [Decentralized, offline-first, cmd-line chat app in < 100 lines of code](https://medium.com/textileio/decentralized-offline-first-cmd-line-chat-app-in-100-lines-of-code-43ed71a70950), Textile, 5 June 2019 +- VIDEO: [Foundations for Decentralization: Data with IPLD](https://media.ccc.de/v/gpn19-105-foundations-for-decentralization-data-with-ipld), Eric Myhre, 30 May 2019 +- [Education Records on IPFS](https://odem.io/education-records-on-ipfs/), Odem, 30 May 2019 +- [Textile’s network of cafes are now open to developers!](https://medium.com/textileio/textiles-network-of-cafes-are-now-open-to-developers-4a6df3a04b4) Textile, 30 May 2019 +- [Hydras and IPFS: A Decentralised Playground for Malware](https://arxiv.org/abs/1905.11880), Constantinos Patsakis, Fran Casino, 28 May 2019 +- [Introducing the Textile SDK for iOS](https://medium.com/textileio/introducing-the-textile-sdk-for-ios-e180e5c16461), Textile, 28 May 2019 +- [Online Censorship Problems & The Promise of Decentralized Content Distribution](https://blockonomi.com/online-censorship-decentralized-content-distribution/), Blockonomi, 18 May 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- DEMO: [HTTP Signed Exchanges and IPFS Publishing Prototype](https://github.com/ipfs/integration-mini-projects/issues/3#issuecomment-497837449) +- [ipfs-deploy 7.7.0](https://github.com/agentofuser/ipfs-deploy/releases/tag/v7.7.0) – Zero-Config CLI to Deploy Static Websites to IPFS +- [qri 0.8.0](https://github.com/qri-io/qri/releases/tag/v0.8.0) – Our best-effort to close out the first set of public features for the global dataset version control system (GDVCS) built on the distributed web. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Unwalled.Garden: souped-up RSS for P2P social apps](https://pfrazee.hashbase.io/blog/unwalled-garden) +- [Entropic: a federated package registry for anything](https://github.com/entropic-dev/entropic) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **15 June 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 3](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/261891470/), Protoshool Shanghai Chapter is a group of people passionate about the Decentralized Web and excited to learn, teach, and share ideas. Everyone is welcome! +- **19 June 2019:** [OPO.js Meetup #9](https://www.meetup.com/opo-js/events/261996897/) welcomes Vasco Santos, Software Engineer at MOXY and Victor Bjelkholm, Creator of Open-Services, who’ll be gracing us with two tech talks, and a lot of unexpected errors. Porto, Portugal. +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **25 June 2019:** [IPFS Core Developers & Community Meetup + IPFS Community](https://www.meetup.com/barcelona-ipfs/events/262101190/) – Connect with the larger IPFS Community on Tuesday, June 25 for an event starting at 17:30 at MOB Bailen, Barcelona, Spain. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-046/README.md b/src/_blog/weekly-046/README.md new file mode 100644 index 00000000..9cc27d5a --- /dev/null +++ b/src/_blog/weekly-046/README.md @@ -0,0 +1,68 @@ +--- +date: 2019-06-18 +url: /95-ipfs-weekly-46/ +tags: weekly +title: IPFS Weekly 46 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Check the video recap from Poster Projects from the IPFS Berlin Developers Meetings 2018 + +If you’ve ever wanted to know what a developer’s poster project session is like, look no further. [Watch this fun recap!](https://www.youtube.com/watch?v=Fpoo3iJjtcY&feature=youtu.be) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [June 2019 MIX Update](https://medium.com/mix-blockchain/june-2019-mix-update-7872391ae655), MIX Blockchain, 16 June 2019 +- [An In-Depth Look at Iris, a New Decentralized Social Network](https://news.bitcoin.com/an-in-depth-look-at-iris-a-new-decentralized-social-network/), Bitcoin.com, 13 June 2019 +- [FISSION Interviews: Diffuse](https://blog.fission.codes/fission-interviews-diffuse/), 13 June 2019 +- [How to install Qri for Windows](https://medium.com/@jbutler18/how-to-install-qri-for-windows-83b019c79320), Jonathan Butler, 11 June 2019 +- [The Graph: An open-source query protocol for blockchains, using GraphQL](https://www.zdnet.com/article/the-graph-an-open-source-query-protocol-for-blockchains-using-graphql/), ZDNet, 11 June 2019 +- [Introducing the Textile Android SDK](https://medium.com/textileio/introducing-the-textile-android-sdk-dd20eca0c19a), Textile, 10 June 2019 +- [Managing IPFS Image Uploads With Angular NgRx v8](https://medium.com/better-programming/manage-the-ipfs-image-uploading-with-angular-ngrx-v8-61aaaf0be0d5), BetterProgramming, 8 June 2019 +- [Understanding IPFS Circuit Relay](https://blog.aira.life/understanding-ipfs-circuit-relay-ccc7d2a39), Robonomics Network by Airalab, 29 May 2019 +- [We Made A Dashboard for IPFS Clusters and Now We Want You to Check it Out](https://medium.com/towardsblockchain/we-made-a-dashboard-for-ipfs-clusters-and-now-we-want-you-to-check-it-out-a87234629908), Towards Blockchain, 14 May 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [go-textile v0.4](https://github.com/textileio/go-textile/releases/tag/v0.4.0) is now out with a more consistent CLI experience and a few bugfixes. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [galacteek](https://github.com/eversum/galacteek) is an experimental multi-platform Qt5-based browser/toolbox for the IPFS peer-to-peer network. +- [Pinion](https://github.com/joincolony/pinion) is a lightweight pinning service that supports both IPFS content and orbit-db stores. It relies solely on ipfs-pubsub-peer-monitor, orbit-db, and js-ipfs-http-client to communicate with an IPFS node. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **19 June 2019:** [OPO.js Meetup #9](https://www.meetup.com/opo-js/events/261996897/) welcomes Vasco Santos, Software Engineer at MOXY and Victor Bjelkholm, Creator of Open-Services, who’ll be gracing us with two tech talks, and a lot of unexpected errors. Porto, Portugal. +- **22 June 2019:** [Commit Porto '19](https://commitporto.com/) is a tech conference that brings together professionals who tackle challenges in software development with the latest technologies, Porto, Portugal. +- **25 June 2019:** [IPFS Core Developers & Community Meetup + IPFS Community](https://www.meetup.com/barcelona-ipfs/events/262101190/) – Connect with the larger IPFS Community on Tuesday, June 25 for an event starting at 17:30 at MOB Bailen, Barcelona, Spain. +- **26 June 2019:** [DATA JAM! Presidential Primary Candidate Data](https://www.meetup.com/Qri-Data-Jam/events/262417151), Get ready & educated for the debates! Brooklyn, New York. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-047/README.md b/src/_blog/weekly-047/README.md new file mode 100644 index 00000000..1caa4d1e --- /dev/null +++ b/src/_blog/weekly-047/README.md @@ -0,0 +1,72 @@ +--- +date: 2019-06-25 +url: /96-ipfs-weekly-47/ +tags: weekly +title: IPFS Weekly 47 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### TUTORIAL: How to Host Your Dapp With IPFS and ENS + +We love seeing the ways folks use IPFS, and this recent tutorial from The Ethereum Name Service is no different. Check out [How to Host Your Dapp With IPFS+ENS and Access It Via EthDNS](https://medium.com/the-ethereum-name-service/how-to-host-your-dapp-with-ipfs-ens-and-access-it-via-ethdns-c96046059d87) by Makoto Inoue. + +### Cloudflare improves IPFS Gateway + +Last week [Cloudflare announced their continued support for IPFS](https://blog.cloudflare.com/continuing-to-improve-our-ipfs-gateway/) during their annual Crypto Week. Read how their IPFS gateway has grown, what they’ve done to improve it, and the many valuable suggestions for improvement and contributions from the Cloudflare community. + +### IPFS Camp is this week! 🏕 + +Stay tuned for all of the awesome content (and announcements!) that will be coming out of the event. 🎉 + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [What is the InterPlanetary File System (IPFS)?](https://hackernoon.com/what-is-the-interplanetary-file-system-ipfs-2da976e35d05) Hackernoon, 22 June 2019 +- [eosDAC Makes Every Effort Possible to Decentralise - How The DAC Host Its Website](https://steemit.com/eosio/@eosdac/eosdac-makes-every-effort-possible-to-decentralise-how-the-dac-host-its-website), 22 June 2019 +- [Cloudflare’s Ethereum Gateway](https://blog.cloudflare.com/cloudflare-ethereum-gateway/), 19 June 2019 +- [Web Server Security Firm Cloudflare Announces Launch of Ethereum Gateway](https://finance.yahoo.com/news/server-security-firm-cloudflare-announces-154600946.html), Yahoo Finance, 19 June 2019 +- [CMO Of AXEL.Network, Jeremy Forsberg Speaks Exclusively With CryptoNewsZ](https://www.cryptonewsz.com/cmo-of-axel-network-jeremy-forsberg-speaks-exclusively-with-cryptonewsz/26428/), 18 June 2019 +- [Substitutes are now available as lzip](https://www.gnu.org/software/guix/blog/2019/substitutes-are-now-available-as-lzip/), Guix, 17 June 2019 +- [How to Easily Host a Website on IPFS](https://medium.com/pinata/how-to-easily-host-a-website-on-ipfs-9d842b5d6a01), Pinata, 14 June 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [New v 1.0.0 of Textile.io js-http-client](https://www.npmjs.com/package/@textile/js-http-client) is out, just in time for IPFS Camp! +- [go-filecoin 0.2.4 is live!](https://github.com/filecoin-project/go-filecoin/blob/master/CHANGELOG.md#go-filecoin-024) This is a patch release with upgrades to block validation. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Tank Wars](http://mymobiservices.com:9001/ipfs/QmRWCov9MFoGXWYaJoUei1m7geeHVLvGNgwfrgbx49hqqZ/), a full fledged HTML5 game that sits entirely on IPFS + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **25 June 2019:** [IPFS Core Developers & Community Meetup + IPFS Community](https://www.meetup.com/barcelona-ipfs/events/262101190/) – Connect with the larger IPFS Community on Tuesday, June 25 for an event starting at 17:30 at MOB Bailen, Barcelona, Spain. +- **26 June 2019:** [DATA JAM! Presidential Primary Candidate Data](https://www.meetup.com/Qri-Data-Jam/events/262417151), Get ready & educated for the debates! Brooklyn, New York. +- **27-30 June 2019:** [IPFS Camp](https://camp.ipfs.io/) is a 3 day hacker retreat designed for the builders of the Distributed Web! Barcelona, Spain. +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-048/README.md b/src/_blog/weekly-048/README.md new file mode 100644 index 00000000..3edb395b --- /dev/null +++ b/src/_blog/weekly-048/README.md @@ -0,0 +1,67 @@ +--- +date: 2019-07-02 +url: /97-ipfs-weekly-48/ +tags: weekly +title: IPFS Weekly 48 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## IPFS Camp Highlights + +If you missed the first ever IPFS Camp, not to worry! We’ll be releasing videos and content from the 4-day event to catch you up. But first, we wanted to share [this amazing recap of the event](https://medium.com/textileio/ipfs-camp-2019-the-highlights-and-takeaways-2b3cb4f42513) from Andrew Hill of [Textile](https://textile.io/) (seriously where did you get the energy to do this??). Andrew created an excellent highlight piece, complete with photos, links to projects and code, and summaries of crucial discussions and themes throughout. Thanks for putting this fantastic recap piece together, Andrew! + +You should also take a look at [these](https://twitter.com/onion797jp/status/1144730847276412933), [this](https://twitter.com/_alanshaw/status/1145785015357366274?s=20), [this](https://twitter.com/momack28/status/1145621516752699392?s=20), [this](https://twitter.com/satazor/status/1145319379082649601?s=20), [this](https://twitter.com/adria0/status/1144617640440344576?s=20), and definitely [watch this](https://twitter.com/ChrisPacia/status/1144291810874920967?s=20). + +More to come soon, so watch this space for IPFS Camp updates! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Web3 Foundation Grants — Wave Two Recipients](https://medium.com/web3foundation/web3-foundation-grants-wave-two-recipients-16d9b996501d), 2 Jul 2019 +- [Arweave+IPFS: Persistence for the InterPlanetary File System](https://medium.com/@arweave/arweave-ipfs-persistence-for-the-interplanetary-file-system-9f12981c36c3?sk=69276dae8cb9a160c426fd277ab7dae7), The Arweave Project, 27 June 2019 +- [So You Want to Leave Facebook](https://hackernoon.com/so-you-want-to-leave-facebook-1ab3603f164a), Hackernoon, 27 June 2019 +- [Infura June 2019 Update](https://blog.infura.io/infura-june-2019-update-9528c388a3b4), 26 June 2019 +- [Updating your Website for IPFS](https://developers.cloudflare.com/distributed-web/ipfs-gateway/updating-for-ipfs/), Cloudflare Developers, 25 June 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- New release of [ipfs-deploy v7.8.0](https://github.com/agentofuser/ipfs-deploy/) includes the long-awaited feature of allowing dnslinked subdomains on Cloudflare. Really cool way to do staging and share files! +- [qri v0.8.2](https://github.com/qri-io/qri/releases/tag/v0.8.2) – + Qri Backend and CLI, a global dataset version control system (GDVCS) built on the distributed web! + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Preview Berty](https://airtable.com/shrMCOLfOentZZC0V), a new free [messaging app built on IPFS](https://berty.tech/), you can use on mobile or from your desktop! + +## Join in the community discussions happening right now! + +- [IPFS as a storage option on Kubernetes?](https://discuss.ipfs.io/t/ipfs-as-a-storage-option-on-kubernetes/4506/3) 1 July 2019 +- [Proposal Implementing History Aware IPNS Via Certificate Transparency Log Data Structure Trillian](https://discuss.ipfs.io/t/implementing-history-aware-ipns-via-certificate-transparency-log-data-structure-trillian/5756), 28 June 2019 +- [How to Solve Scalability in IPFS?](https://discuss.ipfs.io/t/how-to-solve-scalability-in-ipfs/5712) 22 June 2019 + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-049/README.md b/src/_blog/weekly-049/README.md new file mode 100644 index 00000000..8b15f048 --- /dev/null +++ b/src/_blog/weekly-049/README.md @@ -0,0 +1,283 @@ +--- +date: 2019-07-09 +url: /98-ipfs-weekly-49/ +tags: weekly +title: Recapping IPFS in Q2 2019 🎉 +description: +author: Jenn Turner +--- + +We’re officially halfway through 2019! To celebrate, we put together a very special issue looking back on all that the [InterPlanetary File System (IPFS)](https://ipfs.io/) community has accomplished so far in 2019. From milestones like shipping IPFS Camp and new releases, to the many awesome (and new!) contributors who have joined us, and what’s to come for the rest of this year, we hope you enjoy this quarterly recap. + +Thanks for being part of our community, we truly couldn’t make IPFS what it is without you. ❤️ + +# Milestones + +[![](https://media.giphy.com/media/mGW5xq4SwlqnSTxwtb/giphy.gif)](img/060-ipfs-camp-recap/camp-gif.gif) + +## The first IPFS Camp was a blast + +Last month, 160 attendees traveled from 22+ countries to the 3-day hacker retreat, marking the first official IPFS Camp. Attendees enjoyed core and elective courses, poster sessions, lightning talks, a Sci-Fi Fair, an unconf and more! If you couldn’t be there, check out the recap (with video) of the event [on the blog](https://blog.ipfs.io/2019-07-08-ipfs-camp-recap/). + +## New releases of js-ipfs 0.35.0 and js-ipfs 0.36.0 + +In April and May, the IPFS community received two new releases of js-ipfs. The first, [js-ipfs 0.35.0](https://blog.ipfs.io/80-js-ipfs-0-35/) cut the bundle size by half and the second, [version 0.36.0](https://blog.ipfs.io/89-js-ipfs-0-36/), added URL safe CIDs, refs commands, DOM File support and more. Great work everyone! + +## More releases: go-ipfs 0.4.20 and go-ipfs 0.4.21 + +The team working on the Go implementation of the IPFS Protocol also shipped two releases this quarter. [go-ipfs 0.4.20](https://blog.ipfs.io/83-go-ipfs-0-4-20/) included critical performance and stability fixes, as well as a major WebUI release. [Version 0.4.21](https://blog.ipfs.io/93-go-ipfs-0.4.21) brought key bug fixes, experimental TLS1.3 support, reduced memory usage, base32 CIDv1 CIDs and more new features. We can’t wait to see what’s next. + +## Plus js-libp2p 0.25.0 released + +[Version 0.25.0 of js-libp2p](https://blog.ipfs.io/81-js-libp2p-0-25/), released in April, featured auto-dialing to discovered peers by default, better connection management, blacklisting undialable nodes, and more! This version was automagically included in js-ipfs 0.35.0, so you’ve probably been reaping the benefits of our awesome libp2p team for awhile. Enjoy! + +## New ProtoSchool tutorial shipped on the IPFS Mutable File System (MFS) + +Last month, [ProtoSchool](https://proto.school/#/) added a brand new tutorial to their collection of decentralized web protocol tutorials. This 11-session tutorial on [the Mutable File System (MFS)](https://proto.school/#/mutable-file-system/) teaches you how to work with files and directories as if you were using a traditional name-based file system. Check it out, or show it to someone you know. + +## IPFS contributor office hours began in May + +The IPFS Weekly community call takes place on Mondays at 17:00 UTC and has for awhile, but in May, Oli Evans started hosting the [IPFS contributor office hours](https://twitter.com/olizilla/status/1125418073689817088) during the hour beforehand. Starting at 16:00, IPFS contributors, or would-be contributors can tune in to talk IPFS and ask questions. It’s open to everyone so please join us! + +# We approve this awesome IPFS content + +- [The Complete Beginner’s Guide to Deploying Your First Static Website](https://interplanetarygatsby.com/ipfs-deploy/) +- [IPFS: Technology that’s out of this world](https://business.sprint.com/blog/ipfs-technology/) +- [How to Host Your Dapp With IPFS+ENS and Access It Via EthDNS](https://medium.com/the-ethereum-name-service/how-to-host-your-dapp-with-ipfs-ens-and-access-it-via-ethdns-c96046059d87) +- [Continuing to Improve our IPFS Gateway](https://blog.cloudflare.com/continuing-to-improve-our-ipfs-gateway/) +- [We Made A Dashboard for IPFS Clusters and Now We Want You to Check it Out](https://medium.com/towardsblockchain/we-made-a-dashboard-for-ipfs-clusters-and-now-we-want-you-to-check-it-out-a87234629908) + +# Q2 by the names and numbers + +All told **129 contributors** produced approximately **2,080 commits** across **96 repositories** in the IPFS project this past quarter. Thank you to the following folks for making it happen: + +@0xf77 +@achingbrain +@aeddi +@agentofuser +@alanshaw +@alari +@alexander255 +@AliMirlou +@ana0 +@andrew +@arku +@aschmahmann +@AuHau +@autonome +@b5 +@bigs +@CameronNemo +@campoy +@carsonfarmer +@cbuesser +@chirag-shinde +@cwaring +@cwchristerw +@da2x +@DavidBurela +@daviddias +@deshmukhmayur +@dirkmc +@djdv +@eingenito +@elopio +@eric wu +@fd +@fsdiogo +@gilesbradshaw +@gjeanmart +@gnunicorn +@gorhgorh +@Gozala +@greenkeeper +@hacdias +@hannahhoward +@hsanjuan +@hugomrdias +@ianopolous +@imjoshholloway +@jacobheun +@jamiew +@jessicaschilling +@jimpick +@jkami +@jmank88 +@JonahAragorn +@Jonybang +@josselinchevalay +@kishansagathiya +@koalalorenzo +@KonoromiHimaries +@kpcyrd +@KrishnaPG +@Kubuxu +@lanzafame +@lemmi +@leshokunin +@lidel +@lordcirth +@m-rey +@magik6k +@magnshen +@makoto +@maparent +@MarneeDear +@marten-seemann +@MasashiSalvador57f +@MattSkala +@mburns +@meiqimichelle +@mib-kd743naq +@michaelavila +@MichealMure +@michaelsbradleyjr +@mikeal +@momack2 +@Monotox +@niinpatel +@NukeManDan +@myself659 +@obo20 +@olibye +@olizilla +@parkan +@PedroMiguelSS +@pepoospina +@pgte +@pkafei +@postables +@Prabhakar-Poudel +@Qmstream +@raulk +@reinerRubin +@renrutnnej +@requilence +@rduplain +@rklaehn +@romaric-juniet +@run-ze +@rvagg +@sanderpick +@satazor +@smwa +@Stebalien +@stefanhans +@studyzy +@teran-mckinney +@terichadbourne +@tmcw +@travisperson +@vanjan +@vasa-develop +@vasco-santos +@victorb +@vikramsk +@vmx +@whyrusleeping +@Wondertan +@xaionaro +@xuhcc +@yrliou +@zer + +## Please help us in welcoming these 72 new contributors 👏 + +@aeddi +@alari +@AliMirlou +@ana0 +@arku +@AuHau +@b5 +@bigs +@CameronNemo +@campoy +@carsonfarmer +@cbuesser +@chirag-shinde +@da2x +@DavidBurela +@deshmukhmayur +@elopio +@eric wu +@fd +@gilesbradshaw +@gjeanmart +@gnunicorn +@gorhgorh +@imjoshholloway +@jessicaschilling +@jkami +@JonahAragorn +@Jonybang +@josselinchevalay +@KonoromiHimaries +@kpcyrd +@KrishnaPG +@lemmi +@leshokunin +@lordcirth +@m-rey +@magnshen +@makoto +@maparent +@MarneeDear +@marten-seemann +@MasashiSalvador57f +@mburns +@mib-kd743naq +@MichealMure +@michaelsbradleyjr +@Monotox +@NukeManDan +@myself659 +@pepoospina +@Prabhakar-Poudel +@Qmstream +@reinerRubin +@requilence +@rduplain +@rklaehn +@romaric-juniet +@run-ze +@sanderpick +@smwa +@stefanhans +@studyzy +@teran-mckinney +@tmcw +@travisperson +@vanjan +@vasa-develop +@vikramsk +@Wondertan +@xaionaro +@xuhcc +@yrliou +@zer + +Once again, thanks for all of your hard work and contributions in Q2. Keep up the great job! + +# Coming up next in 2019 + +## New Package Managers Group researching needs & use cases + +- Research on distributed package management needs, pain points, and best practices +- Experiments and demos pushing the limits like [npm-on-ipfs](https://github.com/ipfs-shipyard/npm-on-ipfs), [apt-on-ipfs](https://github.com/ipfs-shipyard/apt-on-ipfs), & [ipfs-npm-republish](https://github.com/andrew/ipfs-npm-republish) +- Ongoing performance optimizations & collabs with package manager ecosystems using IPFS to mirror and content-address package in the wild + +## Progress on our top 2019 priority is accelerating! + +- Critical performance improvements for bitswap and IPNS are scoped and underway +- Multiple package managers are using IPFS for better mirroring and addressing/deduplication +- Better communication tools, recommendations, & documentation for package managers on IPFS +- Improved understanding of package manager needs and constraints = more feedback for IPFS core protocol improvements + +# Thanks for reading ☺️ + +That’s it for this special edition of the IPFS Weekly. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! Next week we’ll return with all the news that’s happened across the ecosystem since the last weekly. + +If this is your first time reading the IPFS Weekly, you can learn more or get involved by checking out [the project on GitHub](https://github.com/ipfs), or joining us [on IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +See you next week! 👋 diff --git a/src/_blog/weekly-050/README.md b/src/_blog/weekly-050/README.md new file mode 100644 index 00000000..cef7b088 --- /dev/null +++ b/src/_blog/weekly-050/README.md @@ -0,0 +1,86 @@ +--- +date: 2019-07-16 +url: /weekly-50/ +tags: weekly +title: IPFS Weekly 50 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### 2019 IPFS Camp Recap + +In case you missed it, David Dias and the IPFS Camp team wrote up a recap of last month’s event with links to talks, resources and more, so [check it out on the IPFS blog.](https://blog.ipfs.io/2019-07-08-ipfs-camp-recap/) + +### Announcing the arrival of js-ipfs-http-client-lite + +[js-ipfs-http-client-lite](https://github.com/ipfs-shipyard/js-ipfs-http-client-lite) is the proof of concept IPFS pubsub finally working in the browser using fetch and streams APIs. An alternative client library for the IPFS HTTP API, aiming to be as lightweight as possible (<20kB) in the browser. Check it out! + +### New ProtoSchool IPFS Mutable File System (MFS) tutorial and Resources pages + +Check out ProtoSchool’s new interactive tutorial on the IPFS Mutable File System, which lets you work with IPFS files and directories as if you were using a traditional name-based file system. Then take a look at the [new Resources page](https://proto.school/#/tutorials), which can now be found at the end of all existing tutorials moving forward. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- THREAD: [What’s the coolest thing you’ve seen done with IPFS?](https://www.reddit.com/r/ipfs/comments/cchr8b/whats_the_coolest_thing_youve_seen_done_with_ipfs/) 13 July 2019 +- [Multicoin, Coinbase Ventures Invest \$1.5 Million in ‘Decentralized Flickr’](https://www.coindesk.com/multicoin-coinbase-ventures-invest-1-5-million-in-decentralized-flickr), CoinDesk, 11 July 2019 +- [INTfs — Protocol for encrypted, private and anonymous distributed file sharing in the INT Network](https://medium.com/@grayblock/intfs-protocol-for-encrypted-private-and-anonymous-distributed-file-sharing-in-the-int-network-7dc8e34ac287), Grayblock, 9 July 2019 +- [As summer continues to heat up, so too does Textile!](https://medium.com/textileio/textile-update-june-2019-d596343ad67e) Textile Update | June 2019, 9 July 2019 +- [Understanding IPFS in Depth(4/6): What is MultiFormats?](https://hackernoon.com/understanding-ipfs-in-depth-4-6-what-is-multiformats-cf25eef83966) Hackernoon, 8 July 2019 +- [Introducing The Gathering: IPFS Camp, 2019](https://medium.com/@victorrortvedt/introducing-the-gathering-ipfs-camp-2019-b33fe8493f1b), Victor Rortvedt, 8 July 2019 +- [Deep Dives: Decentralized Data Processing](https://github.com/ipfs/camp/blob/master/DEEP_DIVES/44-decentralized-data-processing.md), 7 July 2019 +- [The need for Decentralized Identity](https://medium.com/moxystudio/the-need-for-decentralized-identity-4d369408e10e), MOXY, 5 July 2019 +- [IPFS Camp 2019: The Highlights and Takeaways](https://medium.com/textileio/ipfs-camp-2019-the-highlights-and-takeaways-2b3cb4f42513), Textile, 1 July 2019 +- SLIDES: [go-ds-crdt](https://hector.link/presentations/go-ds-crdt-ligthning/), Héctor Sanjuán, 28 June 2019 +- [Implementing History Aware IPNS Via Certificate Transparency Log Data Structure Trillian](https://discuss.ipfs.io/t/implementing-history-aware-ipns-via-certificate-transparency-log-data-structure-trillian/5756), Sawood Alam, 28 June 2019 +- [VR Hackfest: Behind Palo Alto City Library’s Exhibit](https://library.cityofpaloalto.org/news/vr-hackfest/), 27 June 2019 +- [Temporal’s IPFS HTTP API endpoint is in production now!](https://gateway.temporal.cloud/ipns/docs.api.temporal.cloud/ipfs.html#ipfs-http-api-proxy) 26 June 2019 +- [Peergos Security Audit, June 2019](https://peergos.org/blog#security_audit_june_2019_), 14 June 2019 +- VIDEO: [Integrating IPFS With Hyperledger](https://www.reddit.com/r/ipfs/comments/bnt2w0/integrating_ipfs_with_hyperledger/), Temporal, June 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [go-filecoin 0.3.2 is released](https://filecoin.io/blog/go-filecoin-0.3.2-release/) +- [v0.6 of go-textile](https://github.com/textileio/go-textile/releases/tag/v0.6.0) is now out which fixes `textile profile set —{name|avatar}` + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Interplanetary Tag](https://medium.com/textileio/building-peer-to-peer-games-on-ipfs-a-look-at-interplanetary-tag-52d081ee1d32) – Building peer-to-peer games on IPFS +- [go-ds-bbolt](https://github.com/RTradeLtd/go-ds-bbolt) – Datastore implementation using bbolt as a backend +- [pinatapinner](https://github.com/ItalyPaleAle/pinatapinner) – Publish folders on IPFS using Pinata +- Decentralized Websies Portal: [almonit.club](http://almonit.club/). It’s a directory of decentralized websites. +- [ENS+IPFS Firefox Plugin](https://addons.mozilla.org/en-US/firefox/addon/almonit/): Lets you access decentralized websites from Firefox browser. + +## Web3 Conference p2p node + +IPFS, Ethereum and others will have a a peer2peer focused node in the Web3 conference hackerspace. Do you have an idea, a presentation, a workshop, a game or anything p2p related that you would like to talk about? Grab a spot in the node’s schedule by [submitting your proposal here](https://forms.gle/SXcXEBXLanJ9CP5R8). + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **18-21 July 2019:** [DWeb Camp](https://dwebcamp.org/) is a chance for dreamers and builders to come together in one of the most beautiful spots on earth for a 4-day retreat to reimagine and build the web we want and deserve, location south of San Francisco, California. +- **28 July 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 4](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/262866233/) will focus on technical deep dives and evangelize decentralized storage network and its developing ecosystem. Hosted by Shanghai Decentralized Systems Meetup Group. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) +- **7 August 2019:** [Paris P2P](https://p2p.paris/en/) is holding its first event, [Paris P2P #0](https://www.meetup.com/Paris-P2P/events/263089573/) to discuss the topics of peer-to-peer (P2P), decentralization, networks and autonomous communities, distributed and decentralized systems, and more. [Submit your talk ideas here](https://p2p.paris/en/) for future events. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-051/README.md b/src/_blog/weekly-051/README.md new file mode 100644 index 00000000..900700e3 --- /dev/null +++ b/src/_blog/weekly-051/README.md @@ -0,0 +1,75 @@ +--- +date: 2019-07-23 +url: /weekly-51/ +translationKey: ipfs-weekly-51 +tags: weekly +title: IPFS Weekly 51 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### The IPFS Camp’s first batch of recordings are out! + +You read it right, the recordings from IPFS Camp are starting to be released! For this first batch we have: [Lightning Talks and Poster Projects](https://blog.ipfs.io/2019-07-22-ipfs-camp-content-first-batch/), so go check them out. + +### Join the IPFS, libp2p and IPLD Communities on IRC \o/ + +Friendly reminder to our awesome community that IRC and Matrix are still one of the best places to experience the IPFS, libp2p and IPLD communities! Join our many channels [through this link](https://riot.im/app/#/group/+ipfs:matrix.org). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- VIDEO: [Privacy in Peer To Peer Networks](https://www.youtube.com/watch?time_continue=26&v=nCCkwU4JPcY), Gonçalo Pestana at Data Terra Nemo, 22 July 2019 +- [Understanding IPFS in Depth(5/6): What is Libp2p?](https://medium.com/coinmonks/understanding-ipfs-in-depth-5-6-what-is-libp2p-f8bf7724d452) Coinmonks, 21 July 2019 +- [Interplanetary Hash Tables…](https://medium.com/textileio/how-the-ipfs-dht-works-47af8bfd3c6a), Textile, 18 July 2019 +- [IPFS Scalability: Building an IPFS Layer 2](https://medium.com/pinata/ipfs-scalability-f0a6f8a7d42b), Pinata, 17 July 2019 +- [WORBLI to Power EDNA](https://finance.yahoo.com/news/worbli-power-edna-124800977.html), Yahoo! Finance, 17 July 2019 +- [Who is Memo Labs?](https://medium.com/@memolabs/who-is-memo-labs-d0a94bffad6a) 15 July 2019 +- [Conceiving The Gathering](https://medium.com/the-gathering/conceiving-the-gathering-4b78db8dbd03), Justin Maier, 12 July 2019 +- [\$1.5 Million in Funding and the Start of a New Chapter](https://medium.com/textileio/1-5-million-in-funding-and-the-start-of-a-new-chapter-439a23682df), Textile, 11 July 2019 +- [Building The World’s First IPFS Data Center — Part 1](https://medium.com/rtrade-technologies/building-the-worlds-first-ipfs-data-center-7a01d055cde8), RTrade Technologies, 9 July 2019 +- [Efficient, Usable, And Cheap Storage of IPFS Hashes In Solidity Smart Contracts](https://medium.com/temporal-cloud/efficient-usable-and-cheap-storage-of-ipfs-hashes-in-solidity-smart-contracts-eb3bef129eba), Temporal, 9 July 2019 +- [Introduction to IPFS: The New & Improved Web](https://medium.com/temporal-cloud/introduction-to-ipfs-the-new-improved-web-f9790f3dff18), Temporal, 9 July 2019 +- [Make A Discord Bot That Can Upload, Pin, and Search IPFS](https://medium.com/temporal-cloud/make-a-discord-bot-that-can-upload-pin-and-search-ipfs-41c33f5faa56), Temporal, 9 July 2019 +- [Run Your Own IPFS Search Engine With Lens](https://medium.com/temporal-cloud/run-your-own-ipfs-search-engine-with-lens-a2b0950ee5f1), Temporal, 9 July 2019 +- [Temporal.cloud Walk-Through](https://medium.com/temporal-cloud/temporal-cloud-walk-through-366a2ba4f86a), 9 July 2019 +- [Tutorial: Hosting Slate Documentation On IPFS](https://medium.com/temporal-cloud/tutorial-hosting-slate-documentation-on-ipfs-9bc54272ca18), 9 July 2019 +- VIDEO: [MIX Acuity, Mining, Encrypted Accounts](https://www.youtube.com/watch?v=eXWDjq6pkSg), 3 July 2019 +- [Staked Competitions by Stove Labs & Tezos Commons](https://medium.com/tezoscommons/staked-competitions-by-stove-labs-tezos-commons-7af39d30dd56), Tezos Insights & Updates, 1 July 2019 + +## Open Positions working on IPFS + +- [Textile.io Lead Engineer,](https://jobs.github.com/positions/e9c8539c-dc85-4f38-8e00-6ce530aba409) Textile, Remote +- [IPFS Documentation & Technical Content Strategist,](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289) Protocol Labs, Remote +- [UI/UX Designer,](https://www.linkedin.com/jobs/view/1335924519/) Qri, Brooklyn, New York (US) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [go-stellar-ipfs](https://github.com/aanupam23/go-stellar-ipfs) is a library that acts as a bridge between Stellar and IPFS. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **28 July 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 4](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/262866233/) will focus on technical deep dives and evangelize decentralized storage network and its developing ecosystem. Hosted by Shanghai Decentralized Systems Meetup Group. +- **2-5 August 2019:** [Offline Camp](http://offlinefirst.org/camp/) is a 4-day retreat to explore Offline First development and design in Grants Pass, Oregon. [Learn more about the event here.](https://medium.com/offline-camp/announcing-offline-camp-v5-eb9111fdcc94) +- **7 August 2019:** [Paris P2P](https://p2p.paris/en/) is holding its first event, [Paris P2P #0](https://www.meetup.com/Paris-P2P/events/263089573/) to discuss the topics of peer-to-peer (P2P), decentralization, networks and autonomous communities, distributed and decentralized systems, and more. [Submit your talk ideas here](https://p2p.paris/en/) for future events. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-052/README.md b/src/_blog/weekly-052/README.md new file mode 100644 index 00000000..9619f3fe --- /dev/null +++ b/src/_blog/weekly-052/README.md @@ -0,0 +1,75 @@ +--- +date: 2019-07-30 +url: /weekly-52/ +translationKey: ipfs-weekly-52 +tags: weekly +title: IPFS Weekly 52 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Installing IPFS & IPFS-Cluster on Raspberry Pi + +Ever wanted to hack on IPFS and IoT? Aadhi Manivannan recently wrote a great tutorial on how to get started by installing IPFS and IPFS-Cluster on a Raspberry Pi. [Check out the full tutorial for more details](https://aadhi.rocks/installing-ipfs-ipfs-cluster-on-raspberry-pi/). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Decentralized Cloud Storage is changing the face of the internet](https://hackernoon.com/decentralized-cloud-storage-how-it-will-change-the-face-of-the-internet-22-np1f2349h), Hackernoon, 26 July 2019 +- [Now publishing pre-cached Prelude on IPFS](https://discourse.dhall-lang.org/t/now-publishing-pre-cached-prelude-on-ipfs/52), Dhall Discourse, 26 July 2019 +- [RTrade Announces Temporal Website Redesign, IPFS API, Enterprise Nodes and New Pricing](https://medium.com/temporal-cloud/rtrade-announces-temporal-website-redesign-ipfs-api-enterprise-nodes-and-new-pricing-c0b1fe8a83a), Temporal, 26 July 2019 +- [Unbundling Vectors of Centralization in Web3](https://multicoin.capital/2019/07/25/unbundling-vectors-of-centralization-in-web3/), Multicoin Capital, 25 July 2019 +- Check out [Elk: The Dev Board for the Decentralized World](https://www.kickstarter.com/projects/233173198/elk-the-dev-board-for-the-decentralized-world), Kickstarter, 25 July 2019 +- [Report: A study of libp2p and ETH2](https://discuss.libp2p.io/t/report-a-study-of-libp2p-and-eth2/229), Raúl Kripalani, 24 July 2019 +- [Re-decentralizing the Web](https://medium.com/@hajanetworks/re-decentralizing-the-web-54678a1e4848), Haja Networks, 24 July 2019 +- [Smart Contract Based IPFS Storage for DAOs](https://medium.com/open-work-labs/smart-contract-based-ipfs-storage-for-daos-39c145f3042d), Open Work Labs, 24 July 2019 +- [ARK Core: Path And Vision To V3](https://blog.ark.io/ark-core-path-and-vision-to-v3-7a8bc3338d5a), ARK.io, 24 July 2019 +- [10+ Resources Every IPFS Developer Should Know About](https://medium.com/swlh/10-resources-to-get-started-with-ipfs-5f429dc8a841), The Startup, 23 July 2019 +- [Peergos at IPFS Camp, July 2019](https://peergos.org/blog#ipfs_camp_new_features_july_2019_), Peergos, 22 July 2019 +- [The Graph (Part 1): How to Deploy a Subgraph on Ethereum](https://medium.com/protofire-blog/the-graph-part-1-how-to-deploy-a-subgraph-on-ethereum-71e2d8094e1a), ProtoFire.io, 18 July 2019 + +## Open Positions working on IPFS + +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS,](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist,](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289) Protocol Labs, Remote +- [UI/UX Designer,](https://www.linkedin.com/jobs/view/1335924519/) Qri, Brooklyn, New York (US) + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Peergos: v0.0.11](https://alpha.peergos.net/public/peergos/releases/v0.0.11): now with QR code friend verification, folder upload and more! + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [MetaMask Mobile Beta](https://medium.com/metamask/metamask-mobile-public-beta-a-feature-guide-and-walkthrough-9d01de7190ae) — a bridge to the decentralized web, with a dapp-centric browsing experience, intuitive on-boarding, and features that sync with your desktop MetaMask accounts. +- Recently released: [THC (Temporal HTTP Client)](https://github.com/RTradeLtd/thc#examples) is a Golang library and CLI for common Temporal API calls +- [Minerva](https://discuss.ipfs.io/t/minerva-build-the-hadoop-hive-on-ipfs/5832): Build the Hadoop-Hive on IPFS, using Minerva, you could use standard SQL to query the file content on IPFS (json, csv format). +- [Pinata Pinner](https://github.com/ItalyPaleAle/pinatapinner): Small utility that adds an entire directory recursively to IPFS using the Pinata pinning service. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **7 August 2019:** [Paris P2P](https://p2p.paris/en/) is holding its first event, [Paris P2P #0](https://www.meetup.com/Paris-P2P/events/263089573/) to discuss the topics of peer-to-peer (P2P), decentralization, networks and autonomous communities, distributed and decentralized systems, and more. [Submit your talk ideas here](https://p2p.paris/en/) for future events. +- **14 August 2019:** Join [Women Who Code Cloud](https://www.womenwhocode.com/cloud/events) for an [Introduction to IPFS](https://zoom.us/webinar/register/WN_jnKnkxjJR3OOxf3kPa7Xfg) inspiring women to excel in technology careers. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-053/README.md b/src/_blog/weekly-053/README.md new file mode 100644 index 00000000..f09c68d2 --- /dev/null +++ b/src/_blog/weekly-053/README.md @@ -0,0 +1,97 @@ +--- +date: 2019-08-06 +url: /weekly-53/ +translationKey: ipfs-weekly-53 +tags: weekly +title: IPFS Weekly 53 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Announcing the IPFS Project Q3 Priorities & Working Groups + +Earlier this summer, the IPFS team got together to create a plan to make IPFS performant, stable, high quality and updated regularly - and ready to grow even more. [Check out the plan](https://ipfs.io/blog/2019-07-31-operation-task-force/), along with remixed working groups and more! + +### Introducing Multiple-Choice Lessons in ProtoSchool + +Did you know that not every lesson in ProtoSchool includes a coding challenge? ProtoSchool has long supported both coding exercises and text-based lessons, but today we're introducing [a new lesson type: multiple-choice](https://twitter.com/ProtoSchool/status/1156942749595312128). 🎉 + +As the author of a tutorial, you can now present the learner with a multiple-choice quiz after she reads the text of your lesson, adding some interactivity and a chance to check comprehension before moving on to the next topic. Learn more about [building ProtoSchool tutorials](https://proto.school/#/build). + +### Learn about Supporting Web Archiving via Web Packaging in the 2019-07-29 IPFS Weekly Call + +Last week during the IPFS Weekly Call, Sawood Alam was on hand to give a fantastic presentation on Web Packaging and how it can support web archiving. [Check it out!](https://www.youtube.com/watch?v=u57MerV0PJM) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Peergos - fast seeking and encrypted history](https://peergos.org/blog#fast_seeking_and_encrypted_history_), 1 August 2019 +- [The Gnosis Monthly Development Update](https://blog.gnosis.pm/august-2019-the-gnosis-monthly-development-update-6c9be6fb7610), 1 August 2019 +- [Ethereum Grid 1.5.0 Release Announcement](https://medium.com/ethereum-grid/ethereum-grid-1-5-0-release-announcement-993c7047560a), 1 August 2019 +- [The first Redecentralize Digest is out now!](https://redecentralize.org/redigest/2019/07) 31 July 2019 +- [Accessing Temporal’s I2P IPFS Infrastructure](https://medium.com/temporal-cloud/accessing-temporals-i2p-ipfs-infrastructure-7d9c90204dd7), 31 July 2019 +- [Modern Tech Problems and Web 3.0 Solutions](https://medium.com/temporal-cloud/modern-tech-problems-and-web-3-0-solutions-enter-ipfs-30ce5d3e9a45), Temporal, 31 July 2019 +- [New tools and a new look for textile.io](https://blog.textile.io/a-tools-and-a-new-look-for-textile-io/), 30 July 2019 +- [5 Trends Impacting Blockchain Developers Right Now](https://media.consensys.net/5-trends-impacting-blockchain-developers-right-now-3174146eabf1), ConsenSys, 22 July 2019 + +## Open Positions working on IPFS + +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote +- [UI/UX Designer](https://www.linkedin.com/jobs/view/1335924519/), Qri, Brooklyn, New York (US) + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +### COMING SOON: ⚡️js-ipfs v0.37.0 🚀 + +[This next release for js-ipfs](https://github.com/ipfs/js-ipfs/issues/2192) includes a new constructor, support for DNSLink IPNS name resolution, delegated peer and content routing, and more! + +- [Haven has landed](https://gethaven.app/blog/haven-has-landed-download-now-for-ios-and-android/) – The first full-featured mobile app for OpenBazaar (proudly powered by IPFS!) is now available. Shop, chat and send cryptocurrencies privately from wherever you are with your iOS or Android device. +- [Peergos v0.1.0](https://alpha.peergos.net/public/peergos/releases/v0.1.0/) - Fast seeking, encrypted history, and space usage display +- Textile has a [new blog](https://blog.textile.io/), a [new forum](https://community.textile.io/) and a [new website](https://textile.io/)! + +## IPFS in progress + +_These IPFS projects have the potential to be amazing, but they need a little help from you!_ + +- [IPFS Distributions: It’d be great to get an RSS feed for our releases.](https://github.com/ipfs/distributions/issues/241) +- [IPFS for flashcards. Cards could be used by any program.](https://www.reddit.com/r/ipfs/comments/cjm1c5/ipfs_for_flashcards_cards_could_be_used_by_any/) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [anytype.io](https://anytype.io/): Like Notion but self hosted, private, and free! +- [Decentralized Browser MIX Acuity 1.0 Released](https://medium.com/mix-blockchain/decentralized-browser-mix-acuity-1-0-released-827e17353b54) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **7 August 2019:** [Paris P2P](https://p2p.paris/en/) is holding its first event, [Paris P2P #0](https://www.meetup.com/Paris-P2P/events/263089573/) to discuss the topics of peer-to-peer (P2P), decentralization, networks and autonomous communities, distributed and decentralized systems, and more. [Submit your talk ideas here](https://p2p.paris/en/) for future events. Paris, France. +- **8 August 2019:** [IPFS Meet & Hack](https://www.meetup.com/San-Francisco-IPFS/events/261811887/) is a monthly get-together to discuss all things IPFS. Hosted by San Francisco IPFS, [sign up to present](https://docs.google.com/forms/d/e/1FAIpQLSdgolK13Bq7w9MkPMn4uJ7cuf_Q3YDu27_PgCStQ6glki_g_Q/viewform?usp=sf_link). San Francisco (CA), United States. +- **14 August 2019:** Join [Women Who Code Cloud](https://www.womenwhocode.com/cloud/events) for an [Introduction to IPFS](https://zoom.us/webinar/register/WN_jnKnkxjJR3OOxf3kPa7Xfg) inspiring women to excel in technology careers. Remote event. +- **21-23 August 2019:** [DappCon Berlin](https://www.dappcon.io/): A global developer conference for Ethereum Dapps, Infrastructure, and token engineering, Berlin Germany. +- **23-25 August 2019:** [ETHBerlinZwei](https://ethberlinzwei.com/) is the second iteration of ETHBerlin, a hackathon, a culture festival, an educational event, a platform for hacktivism, and a community initiative to push the decentralized ecosystem forward. Berlin, Germany. +- **RESCHEDULED – 27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-054/README.md b/src/_blog/weekly-054/README.md new file mode 100644 index 00000000..ef53ef2a --- /dev/null +++ b/src/_blog/weekly-054/README.md @@ -0,0 +1,97 @@ +--- +date: 2019-08-13 +url: /weekly-54/ +translationKey: ipfs-weekly-54 +tags: weekly +title: IPFS Weekly 54 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### As promised, js-ipfs 0.37.0 has been released + +The latest release of js-ipfs introduces a brand new constructor, better DNSLink support and delegated routing! [See the IPFS blog](https://blog.ipfs.io/2019-08-06-js-ipfs-0-37/) for the full release details. + +### js-libp2p adds Gossipsub support and Promisify API + +The folks working on Libp2p have been busy too! Last week, they announced the release of [js-libp2p version 0.26.0](https://blog.ipfs.io/2019-08-07-js-libp2p-0-26/) which adds support for a more efficient pubsub router (Gossipsub) and Promisify for the time being. Check it out! + +### Hello ipfs-cohost 👋 + +Created by @olizilla, [ipfs-cohost](https://github.com/olizilla/ipfs-cohost#ipfs-cohost-) is a CLI to co-host websites published to IPFS. If your domain has a DNSlink to a CID, then ipfs-cohost will let others pin it to their IPFS node. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [The Great Calamity Circumvention Assembly at IPFS Camp 2019](https://ipfs.io/blog/2019-08-12-great-calamity-circumvention-assembly-at-ipfs-camp/), Alan Shaw, 11 August 2019 +- VIDEO: [David from TAU Coin talks Mobile Mining, IPFS, Proof of Transaction, KYC, Aging Escape Velocity](https://www.youtube.com/watch?time_continue=4&v=8atG0zW50Uo), Crypto Grownups, 11 August 2019 +- [IPFS Production Configuration](https://medium.com/coinmonks/ipfs-production-configuration-57121f0daab2), Coinmonks, 9 August 2019 +- [Applications on Peergos](https://peergos.org/blog#applications_on_peergos_august_2019_), Peergos, 9 August 2019 +- [libp2p devgrants](https://github.com/libp2p/devgrants): A meeting point between co-funders (Protocol Labs, Ethereum, Polkadot, others) and aspiring grantees to openly discuss, scope and spec projects to be incentivised. 8 August 2019 +- [Kenya Blockchain & AI Taskforce Report on IPFS](https://medium.com/@bitsoko/kenya-blockchain-ai-taskforce-report-on-ipfs-3361eb8c8e41), Bits Wallet, 8 August 2019 +- [My IPFS Hosting Setup](https://coolvibe.org/posts/my-ipfs-hosting-setup-hugo/), Emiel Kollof, 8 August 2019 +- [Technologies Defining the Next Generation of the Web](https://medium.com/temporal-cloud/technologies-defining-the-next-generation-of-the-web-a0d0f053629f), Temporal, 8 August 2019 +- [How To Get Started With IPFS and Node](https://medium.com/better-programming/how-to-get-started-with-ipfs-and-node-fa04baec6b3a), BetterProgramming, 7 August 2019 +- [RTrade Announces CEO & CTO to Deliver ‘Dawn of the Distributed Internet’ Speech at Futurist 2019 Toronto](https://medium.com/rtrade-technologies/rtrade-announces-ceo-cto-to-deliver-dawn-of-the-distributed-internet-speech-at-futurist-2019-b39fcdc94e11), 7 August 2019 +- [What is Web3? (Transcript)](https://medium.com/@onion797jp/what-is-web3-transcript-7e867e96ddb1), Juan Benet at Web3 Summit 2018, translated into Japanese, 28 July 2019 +- _#tbt_ [IPFS 👽 and Merkle Forest🌳](https://hackernoon.com/ipfs-and-merkle-forest-a6b7f15f3537), Hackernoon, 14 April 2018 + +## Open Positions working on IPFS + +- [Senior Golang Engineer](https://www.zhipin.com/job_detail/738dc685f000763e1XFy3Ny7EFI~.html?ka=search_list_6), IPFS-Force, Shanghai, China +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote +- [UI/UX Designer](https://www.linkedin.com/jobs/view/1335924519/), Qri, Brooklyn, New York (US) + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [IPFS Laravel Library](https://gitlab.com/andach/ipfs-laravel): a simple library to access IPFS services in Laravel. It works via use of the HTTP API to give simple access to IPFS functions including navigating content, retrieving pictures and files, and adding text and files to the IPFS network. +- [Peergos v0.1.1](https://alpha.peergos.net/public/peergos/releases/v0.1.1) - including PDF viewer and text/code editor + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [SourceCred 0.4.0](https://github.com/sourcecred/sourcecred/releases/tag/v0.4.0) is shipped! SourceCred aims to empower open-source developers and communities by creating a project-specific reputation metric called cred. +- [Ambients](https://ambients.org/) is a protocol for distributed computation. It allows developers to build decentralized applications, databases and services and to deploy and run them in a peer-to-peer network. +- [Librem 5](https://puri.sm/products/librem-5/) – The only modern smartphone you can (truly) own. +- [The Nethereum playground](http://playground.nethereum.com/) now loads the Nethereum assemblies and dependencies from IPFS, making it much faster the initial load and caching of assemblies for compilation. +- [The Eternal Word of God](http://eternalword.eth.link/) – The un-censorable Bible in 20+ languages, built on IPFS. +- [OwnPaste](https://ownpaste.com/) - Decentralized pseudonymous pastebin +- [Permanent Upload](https://permanentupload.com/) is a simple, secure, and easy tool to upload any file onto the IPFS. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **14 August 2019:** Join [Women Who Code Cloud](https://www.womenwhocode.com/cloud/events) for an [Introduction to IPFS](https://zoom.us/webinar/register/WN_jnKnkxjJR3OOxf3kPa7Xfg) inspiring women to excel in technology careers. Remote event. +- **16 August 2019:** [Blockchain, Cryptocurrencies & IPFS](https://www.meetup.com/Blockchain-Cryptocurrencies-Interplanetary-File-System/events/vldkqqyzlbfc/): As usual we will discuss the latest events that are changing and shaping the world Crypto and WEB 3.0, a decentralized everything. San Diego, CA (US). +- **21-23 August 2019:** [DappCon Berlin](https://www.dappcon.io/): A global developer conference for Ethereum Dapps, Infrastructure, and token engineering, Berlin Germany. +- **22 August 2019:** ProtoSchool Seattle is hosting an + [August Decentralized Web Meetup](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/262328555/), details TBA! Seattle, WA (US). +- **23-25 August 2019:** [ETHBerlinZwei](https://ethberlinzwei.com/) is the second iteration of ETHBerlin, a hackathon, a culture festival, an educational event, a platform for hacktivism, and a community initiative to push the decentralized ecosystem forward. Berlin, Germany. +- **31 August 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 5](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/263835810/): Protoshool Shanghai Chapter is a group of people passionate about the Decentralized Web and excited to learn, teach, and share ideas. Everyone is welcome! Shanghai, China. +- **4 September 2019:** [Paris P2P](https://www.meetup.com/Paris-P2P/events/263171540/) is a monthly meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **RESCHEDULED – 27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-055/README.md b/src/_blog/weekly-055/README.md new file mode 100644 index 00000000..6492e915 --- /dev/null +++ b/src/_blog/weekly-055/README.md @@ -0,0 +1,93 @@ +--- +date: 2019-08-20 +url: /weekly-55/ +translationKey: ipfs-weekly-55 +tags: weekly +title: IPFS Weekly 55 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Improving the IPFS Release Process + +go-ipfs is introducing a new release cycle and process to ensure more reliable and frequent releases! Check out the [IPFS blog for more details](https://blog.ipfs.io/2019-08-14-ipfs-release-process/). + +### The IPFS/LibP2P Help Desk is coming to ETHBerlin! + +To help developers quickly hop over hurdles and get back to building awesome hacks, [ETHBerlin will have a dedicated IPFS/libp2p help desk](https://medium.com/pinata/the-ipfs-libp2p-help-desk-is-coming-to-ethberlin-9754fadaf095) available for hackers to visit during the hackathon. + +### go-ipfs 0.4.22 released 📣 + +You’re going to want to check out the recently [released PATCH version of go-ipfs](https://blog.ipfs.io/054-go-ipfs-0.4.22) based on 0.4.21 containing some critical fixes. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Tupelo as it relates to IPLD and IPFS](https://medium.com/@tobowers/under-the-hood-tupelo-uses-ipld-libp2p-and-it-also-makes-use-of-bitswap-2d8007ba664c), Topper Bowers, 19 August 2019 +- [Berty team at IPFS Camp](https://berty.tech/blog/ipfs-camp/), Berty, 15 August 2019 +- [Benchmarking IPFS Gateways](https://aadhi.rocks/benchmarking-ipfs-gateways/), Aadhi Manivannan, 13 August 2019 +- [The Responsibility of a Developer with regards to Climate Change](https://blog.m7w3.de/responsibility-of-a-developer-climate-change.html), Matthias Wahl, 13 August 2019 +- [Decentralized Storage: Leading the Digital Storage Transformation](https://medium.com/@memolabs/decentralized-storage-leading-the-digital-storage-transformation-dc27514efa7f), MemoLabs, 13 August 2019 +- [Is storing encrypted files on IPFS good enough?](https://medium.com/@mikesmolenski/is-storing-encrypted-files-on-ipfs-good-enough-959cbc843a37) Michael Smolenski, 12 August 2019 +- [Will the next generation internet be built on blockchain technology?](https://medium.com/@bitghosted/will-the-next-generation-internet-be-built-on-blockchain-technology-e4af1dde8839) 12 August 2019 +- [I know IPFS, what’s the deal with Qri?](https://qri.io/docs/concepts/ipfs_to_qri/) 12 August 2019 +- [Ethereum Classic’s Amazing Kademlia System](https://medium.com/@cseberino/ethereum-classics-amazing-kademlia-system-e6c60c73014d), Christian Seberino, Ph.D., 12 August 2019 +- [Towards an Interoperable Name Service Standard](https://medium.com/the-ethereum-name-service/towards-interoperable-name-service-standard-9e6c0dd0ee35), Makoto Inoue, 15 July 2019 +- [How to Enable a .Eth Domain in Your Local Network](https://medium.com/the-ethereum-name-service/how-to-enable-eth-domain-in-your-local-network-9ef4c7e01003), Makoto Inoue, 8 July 2019 +- [How to Host Your Dapp With IPFS+ENS and Access It Via EthDNS](https://medium.com/the-ethereum-name-service/how-to-host-your-dapp-with-ipfs-ens-and-access-it-via-ethdns-c96046059d87), Makoto Inoue, 21 June 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [This is what’s coming for IPFS Cluster 0.11.0](https://github.com/ipfs/ipfs-cluster/blob/0.11.0/changelog/CHANGELOG.md). +- [Peergos v0.1.2](https://alpha.peergos.net/public/peergos/releases/v0.1.2) - Including upgrade to ipfs v0.4.22 and Amazon S3 datastore plugin + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- Introducing [Pyramids!](https://gateway.pinata.cloud/ipfs/QmdeNiNrLeWZ6o6qFVLK9HQKgH75x8sk4hkTRQ1L2rQCiB/#landing) Load the page dynamically creating crypto key pairs! Their public parts can be uploaded to IPFS. The IPFS hashes can then be registered in a stellar transaction. +- [go-ipfs-log](https://github.com/berty/go-ipfs-log) – Go version of append-only log CRDT on IPFS +- [Ambients Encoding Examples](https://github.com/ambientsprotocol/encoding-examples) – Examples of computation abstractions using the Robust Ambients calculus +- [TMFS: a IPFS concept design](https://steempeak.com/ipfs/@vaultec/tmfs-a-ipfs-concept-design-znstyhyt) +- [IPFS content distribution checker](https://ownpaste.com/#!/ipfscheck): a simple IPFS content distribution checker tool + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **21-23 August 2019:** [DappCon Berlin](https://www.dappcon.io/): A global developer conference for Ethereum Dapps, Infrastructure, and token engineering, Berlin Germany. +- **22 August 2019:** ProtoSchool Seattle is hosting an + [August Decentralized Web Meetup](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/262328555/), details TBA! Seattle, WA (US). +- **23 August 2019:** [Decentralised Storage Summit](https://www.eventbrite.com/e/decentralised-storage-summit-tickets-62719912948) is an in depth conference that will feature presentations and panels on topics such as file storage, databases, adoption and more. Berlin, Germany. +- **23-25 August 2019:** [ETHBerlinZwei](https://ethberlinzwei.com/) is the second iteration of ETHBerlin, a hackathon, a culture festival, an educational event, a platform for hacktivism, and a community initiative to push the decentralized ecosystem forward. Berlin, Germany. +- **31 August 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 5](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/263835810/): Protoshool Shanghai Chapter is a group of people passionate about the Decentralized Web and excited to learn, teach, and share ideas. Everyone is welcome! Shanghai, China. +- **4 September 2019:** [Paris P2P](https://www.meetup.com/Paris-P2P/events/263171540/) is a monthly meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **16 September 2019:** [Victoria Tech Meetup September 2019](https://ti.to/fission/victoria-sept-2019): sign up to attend once they’ve confirmed date and venue! Victoria, British Columbia, Canada +- **RESCHEDULED – 27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-056/README.md b/src/_blog/weekly-056/README.md new file mode 100644 index 00000000..0604afdb --- /dev/null +++ b/src/_blog/weekly-056/README.md @@ -0,0 +1,75 @@ +--- +date: 2019-08-27 +url: /weekly-56/ +translationKey: ipfs-weekly-56 +tags: weekly +title: IPFS Weekly 56 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us on [IRC](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Overview of the package chain project](https://gist.github.com/dvc94ch/2ce60a00550e83d95ed051fc81e3683e), David Craven, 24 August 2019 +- SLIDES: [go-libp2p-noise](https://github.com/ChainSafe/go-libp2p-noise/blob/master/go-libp2p-noise-ethberlin-1a.pdf), Ed Mazurek, ETHBerlinZwei, 24 August 2019 +- [How I used 3Box to build a full-stack Dapp](https://medium.com/@pedrouid/how-i-used-3box-to-build-a-full-stack-dapp-49d3ef9365cb), Pedro Gomes, 23 August 2019 +- [Adding Authentication To Your App The Easy Way](https://medium.com/simpleid-dev-tools/adding-authentication-to-your-app-the-easy-way-44d182055f91), 23 August 2019 +- [Decentralized Cloud Storage is changing the face of the internet](https://hackernoon.com/decentralized-cloud-storage-how-it-will-change-the-face-of-the-internet-22-np1f2349h), Hackernoon, 21 August 2019 +- [Comparison of IPFS and EdgeFS for Secure Edge/IoT Computing use cases](https://hackernoon.com/comparison-of-ipfs-and-edgefs-for-secure-edgeiot-computing-use-cases-0dgu30zk), Hackernoon, 21 August 2019 +- [Creating a Caelum Masternode — How Easy is it?](https://medium.com/@procryptologist/creating-a-caelum-masternode-how-easy-is-it-da0042c237d9) Pro Cryptologist, 21 August 2019 +- VIDEO: [Unleashing the power of decentralization: How to build unstoppable apps using IPFS](https://www.youtube.com/watch?time_continue=2&v=L7PgUNiByVk), Andrew Hill at Commit Porto '19, 20 August 2019 +- [Scaling the Next Generation of the Internet](https://medium.com/temporal-cloud/scaling-the-next-generation-of-the-internet-fca01011fde3), Temporal, 20 August 2019 +- [How can one make the Internet great again with the help of GeeSome and IPFS protocols for decentralized social networks?](https://medium.com/geesome/how-to-make-the-internet-great-again-with-the-help-of-geesome-and-ipfs-ae516aa06f89) Social Network, 20 August 2019 +- [ttcX: Applying the Top Trading Cycle algorithm to NFT exchange](https://www.theblockcrypto.com/2019/08/16/ttcx-applying-the-top-trading-cycle-algorithm-to-nft-exchange/), The Block Genesis, 16 August 2019 +- [Types of distributed storage systems for blockchain networks](https://blog.incubicon.com/tipos-de-sistemas-de-almacenamiento-distribuido-para-redes-blockchain), Incubicon blog, 8 August 2019 +- [Decentralizing my website with IPFS](https://dev.to/hacdias/decentralizing-my-website-with-ipfs-2073), Henrique Dias, 7 August 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [MIX Acuity 1.0.3 Released!](https://medium.com/mix-blockchain/mix-acuity-1-0-3-released-7f7111ecb5af) Fixes Fix IPFS propagation regression, display errors on transaction history, and more. + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [SimpleID](https://www.simpleid.xyz/) – Privacy, security, and convenience all rolled into one simple developer experience. Add decentralized authentication and storage to your application in under 10 minutes. +- [InterPlanetary Wayback](https://github.com/oduwsdl/ipwb): A distributed and persistent archive replay system using IPFS +- [BitTube](https://bittubeapp.com/) reshapes how web monetization should work. Browse privately, ad free and support every publisher you visit. Your time powers the new attention economy without compromise. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **29 August 2019:** Graphs with Friends is hosting [Privacy on the dweb](https://www.meetup.com/Graphs-With-Friends/events/263942243/). A round table discussion on privacy preservation, metadata resistance, tracking and anonymity in distributed systems. London, UK +- **31 August 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 5](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/263835810/): Protoshool Shanghai Chapter is a group of people passionate about the Decentralized Web and excited to learn, teach, and share ideas. Everyone is welcome! Shanghai, China. +- **3 September 2019:** Ethereum Hack Tokyo is hosting [17 Touch and learn Practice IPFS (Distributed Storage)](https://icovo-ag.connpass.com/event/144474/), a hands-on seminar for those who know Ethereum but do not know IPFS (Distributed Storage). Chiyoda-ku, Tokyo, Japan. +- **4 September 2019:** [Paris P2P](https://www.meetup.com/Paris-P2P/events/263171540/) is a monthly meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **16 September 2019:** [Victoria Tech Meetup September 2019](https://ti.to/fission/victoria-sept-2019): sign up to attend once they’ve confirmed date and venue! Victoria, British Columbia, Canada +- **20-22 September 2019:** [Our Networks 2019 RE: Infrastructures](https://ournetworks.ca/) explores the collective care and maintenance of alternative networking practices—new protocols, peer-to-peer connections, offline-first computing, and community-based governance. Toronto, Ontario, Canada. +- **RESCHEDULED – 27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-057/README.md b/src/_blog/weekly-057/README.md new file mode 100644 index 00000000..da6398ab --- /dev/null +++ b/src/_blog/weekly-057/README.md @@ -0,0 +1,76 @@ +--- +date: 2019-09-03 +url: /weekly-57/ +translationKey: ipfs-weekly-57 +tags: weekly +title: IPFS Weekly 57 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### You can now PubSub with the JS IPFS HTTP API client in the browser! + +Now that the fetch API supports cancelation, and has done so for a while, PubSub Support has arrived! Hooray \o/ Read all about it on [the IPFS blog](https://blog.ipfs.io/2019-08-29-pubsub-in-the-browser/). + +### Catch up on the latest IPFS Weekly Call + +Long holiday weekend keep you from joining this week’s IPFS Call? Catch up on the meeting [in the recording here](https://www.youtube.com/watch?v=h-AVN4Z6w40)! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Tutorial: Build a Zero Dependency Notes App on IPFS — Part I](https://medium.com/simpleid-dev-tools/tutorial-build-an-encrypted-notes-app-on-ipfs-part-i-39fb06fa95ce), SimpleID, 3 Sept 2019 +- [Fake News: A Universal Solution](https://towardsdatascience.com/fake-news-a-universal-solution-22895048f5e7), Towards Data Science, 2 Sept 2019 +- [Memolabs: Ensure the Validity of Data at Low Cost](https://medium.com/@memolabs/memolabs-ensure-the-validity-of-data-at-low-cost-6fd80d1c6024), 1 Sept 2019 +- [The Gathering in a Nutshell](https://medium.com/the-gathering/the-gathering-in-a-nutshell-eb5c81572b9c), 29 August 2019 +- [Expanding Beyond Financial Services](https://medium.com/rtrade-technologies/how-blockchain-adoption-is-expanding-beyond-financial-services-f0886d03da33), RTrade Technologies, 29 August 2019 +- [How Blockchain Adoption is Expanding Beyond Financial Services](https://medium.com/rtrade-technologies/how-blockchain-adoption-is-expanding-beyond-financial-services-f0886d03da33), RTrade Technologies, 29 August 2019 +- [Getting Started with IPFS in Ethereum Grid](https://medium.com/ethereum-grid/getting-started-with-ipfs-in-ethereum-grid-80875cd70e6), 28 August 2019 +- [Creating a private IPFS Network](https://medium.com/@danishshaikh42/creating-a-private-ipfs-network-246a92483d9c), 28 August 2019 +- [Tech and Research Updates](https://medium.com/web3foundation/tech-and-research-updates-464048c4c280), Web3 Foundation, 26 August 2019 +- [10+ Resources Every IPFS Developer Should Know About](https://hackernoon.com/10-resources-every-ipfs-developer-should-know-about-hc20w21gp), Hackernoon, 21 August 2019 +- [Securing and Deduplicating the Edge with EdgeFS](https://medium.com/swlh/securing-and-deduplicating-the-edge-with-edgefs-86d48e6f1be7), The Startup, 11 August 2019 + +## Open Positions working on IPFS + +- [UX and Web Designer (HTML/CSS)](https://www.blender.org/jobs/ux-and-web-designer-html-css/), Blender, Amsterdam, the Netherlands +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Koos](https://dev.to/lcoenen/koos-a-decentralised-social-network-4mfd), a decentralised social network +- [Diffuse](https://www.producthunt.com/posts/diffuse-2) – A music player that connects to cloud/distrib +- [TulipTools](https://snapshots.tulip.tools/#/) is hosting snapshots for all Tezos networks via IPFS to make it even faster to run a Tezos node + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **4 September 2019:** [Paris P2P](https://www.meetup.com/Paris-P2P/events/263171540/) is a monthly meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **6 September 2019:** Would you like to help create a next-generation navigation for [docs.ipfs.io](https://docs.ipfs.io/)? Join in a discussion on the existing navigation structure of the IPFS documentation site, plus a collaborative "card sort" exercise to explore alternative possibilities for getting around the IPFS docs. [Join the video chat from 1700-1830 UTC](http://protocol.zoom.us/my/docsforce). +- **16 September 2019:** [Victoria Tech Meetup September 2019](https://ti.to/fission/victoria-sept-2019): sign up to attend once they’ve confirmed date and venue! Victoria, British Columbia, Canada +- **20-22 September 2019:** [Our Networks 2019 RE: Infrastructures](https://ournetworks.ca/) explores the collective care and maintenance of alternative networking practices—new protocols, peer-to-peer connections, offline-first computing, and community-based governance. Toronto, Ontario, Canada. +- **27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-058/README.md b/src/_blog/weekly-058/README.md new file mode 100644 index 00000000..c70ca3d9 --- /dev/null +++ b/src/_blog/weekly-058/README.md @@ -0,0 +1,84 @@ +--- +date: 2019-09-10 +url: /weekly-58/ +translationKey: ipfs-weekly-58 +tags: weekly +title: IPFS Weekly 58 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Check out the latest version of the IPFS Desktop with new sweet features! + +[The 0.9.0 version](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.9.0) now allows you to navigate, not only your own files and pins, but the whole /ipfs and /ipns universe. + +### Sync service has been migrated from Consul to Redis + +[See the tradeoffs and prototyped solution](https://github.com/ipfs/testground/issues/27#issuecomment-527857071) on our testground. Then, try it for yourself! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Setting up an IPFS Node using docker-compose and certbot](https://willschenk.com/articles/2019/setting_up_an_ipfs_node/), Will Schenk, 7 Sep 2019 +- [Enterprise IPFS for True Supply Chain Provenance — Part 1](https://medium.com/rtrade-technologies/enterprise-ipfs-for-true-supply-chain-provenance-part-1-89524337f27), RTrade Technologies, 6 Sep 2019 +- VIDEO: [Topper Talks Tupelo with the IPFS Community](https://www.quorumcontrol.com/blog/2019/9/5/protocollabs-ipfs), 5 Sep 2019 +- [Tutorial: How to Build an IPFS & Text Notification App](https://medium.com/simpleid-dev-tools/tutorial-how-to-build-an-ipfs-text-notification-app-d7e1a89c784b), SimpleID, 5 Sep 2019 +- [A Step by Step Guide to Building a Zero Dependency Notes App on IPFS](https://hackernoon.com/tutorial-build-a-zero-dependency-notes-app-on-ipfs-182y72e28), Hackernoon, 4 Sep 2019 +- VIDEO: [Open Source Coin & Radicle - Barcelona Free Software](https://www.youtube.com/watch?v=ucfn1R4WQNE), KDE España, 4 Sep 2019 +- [An Introduction To Blockchain Application Development — Part 2/2](https://dev.to/kristjank/an-introduction-to-blockchain-application-development-part-2-2-2k6), Kristjan Kosic, 4 Sep 2019 +- VIDEO: [18 Decentralised Database Panel: GunDB, Textile, Fluence, VulcanizeDB](https://www.youtube.com/watch?time_continue=1&v=AbvxEOG2EWU), Decentralized Storage Summit 2019, 3 Sep 2019 +- [RTrade Technologies Partners with Textile to Provide Digital Infrastructure for Textile Cafes](https://medium.com/temporal-cloud/rtrade-technologies-partners-with-textile-to-provide-digital-infrastructure-for-textile-cafes-3404296d2652), Temporal, 3 Sep 2019 +- [Tutorial: Build a Zero Dependency Notes App on IPFS — Part II](https://medium.com/simpleid-dev-tools/tutorial-build-an-encrypted-notes-app-on-ipfs-part-ii-3bdba2d867ad), SimpleID, 3 Sep 2019 +- VIDEO: [EO Data Challenge proposals](https://media.ccc.de/v/bucharest-513-eo-data-challenge-proposals#t=509), Teodora Selea, Ivian Adrian Albu, Bang Pham Huu, Vasil Yordanov, Iván Sánchez Ortega, Candan Eylül Kilsedar and Volker Mische for FOSS4G 2019, 30 August 2019 +- VIDEO: [Geodata on IPFS](https://media.ccc.de/v/bucharest-401-geodata-on-ipfs), Volker Mische for FOSS4G 2019, 29 August 2019 +- ESSAY: [Protocols, Not Platforms: A Technological Approach to Free Speech](https://knightcolumbia.org/content/protocols-not-platforms-a-technological-approach-to-free-speech), Knight First Amendment Institute at Columbia University, 21 August 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- The latest Go release, [version 1.13](https://golang.org/doc/go1.13), arrives six months after Go 1.12. +- [Lighthouse Update #15](https://lighthouse.sigmaprime.io/update-15.html): Coming soon to a multi-client testnet near you! + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Dicoogle IPFS Storage Plugin](https://github.com/BMDSoftware/dicoogle-ipfs-storage) – A Dicoogle plugin to support the storage of files over IPFS. +- [Elastos Hive](https://elastos.academy/hive/) is a basic service infrastructure that provides decentralized storage capabilities to Apps +- [GitHuman](https://medium.com/@ivirajanchan/githuman-decentralized-alternative-to-github-and-gitlab-d1941385c54b) — Decentralized alternative to GitHub and GitLab + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **16 September 2019:** [Victoria Tech Meetup September 2019](https://ti.to/fission/victoria-sept-2019): sign up to attend once they’ve confirmed date and venue! Victoria, British Columbia, Canada +- **19 September 2019:** San Francisco IPFS is hosting [How IPFS Works](https://www.meetup.com/San-Francisco-IPFS/events/264171146/) at Starfish Mission, so sign up to attend and learn more about IPFS and how it actually works! San Francisco, CA, USA +- **20-22 September 2019:** [Our Networks 2019 RE: Infrastructures](https://ournetworks.ca/) explores the collective care and maintenance of alternative networking practices—new protocols, peer-to-peer connections, offline-first computing, and community-based governance. Toronto, Ontario, Canada. +- **27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. +- **28 September 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 6](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/264683729/) will take place at Caohejing International Incubation Center. Shanghai, China + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-059/README.md b/src/_blog/weekly-059/README.md new file mode 100644 index 00000000..ffd0226a --- /dev/null +++ b/src/_blog/weekly-059/README.md @@ -0,0 +1,81 @@ +--- +date: 2019-09-17 +url: /weekly-59/ +translationKey: ipfs-weekly-59 +tags: weekly +title: IPFS Weekly 59 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### v0.1 of the IPFS Explainer is now public! + +After much hard work by [the IPFS Documentation Team](https://twitter.com/meiqimichelle/status/1172352640480530432), the A v0.1 explainer on how the IPFS content-addressed, peer-to-peer network works is finally here. [Check it out for yourself](https://docs.ipfs.io/introduction/how-ipfs-works/)! + +### Join the js-ipfs Early Testers Programme + +The early testers programme allows groups using js-ipfs in production to self-volunteer to help test js-ipfs release candidates to ensure that no regressions that might affect production systems make it into the final release. [Read on for more information](https://github.com/ipfs/js-ipfs/blob/master/doc/EARLY_TESTERS.md). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Enable IPFS Applications Through Private Networks](https://medium.com/temporal-cloud/enable-ipfs-applications-through-private-networks-28f98ea7358f), Temporal, 16 Sep 2019 +- [Build a Versioning System With IPFS and Blockstack](https://hackernoon.com/tutorial-build-a-versioning-system-on-ipfs-77lvx2geh), Hackernoon, 16 Sep 2019 +- [Temporal Proudly Sponsoring Our Networks RE: Infrastructures](https://medium.com/temporal-cloud/temporal-proudly-sponsoring-our-networks-re-infrastructures-a9ba8418224e), Temporal, 16 Sep 2019 +- [Using IPFS Distributed File Storage for Game Asset Metadata](https://medium.com/blockadegames/using-ipfs-distributed-file-storage-for-game-asset-metadata-aac4478e3063), Blockade Games, 15 Sep 2019 +- [Comparing Authentication Tools For Developers](https://dev.to/polluterofminds/comparing-authentication-tools-for-developers-47a2), Justin Hunter, 15 Sep 2019 +- [Build a Versioning System With IPFS and Blockstack](https://medium.com/simpleid-dev-tools/build-a-versioning-system-with-ipfs-and-blockstack-5992e34b1bd2), SimpleID, 13 Sep 2019 +- [Dedicated IPFS Networks](https://medium.com/pinata/dedicated-ipfs-networks-c692d53f938d), Pinata, 12 Sep 2019 +- [An Efficient Procedure to Develop, Deploy and Monitor Iterative Performance Tests for IoT-FOTA Platform](https://www.asvin.io/news/an-efficient-procedure-to-develop-deploy-and-monitor-iterative-performance-tests-for-iot-fota-platform/), Rohit Bohara, 11 Sep 2019 +- [Deploying Kyber on the Matic testnet](https://medium.com/@batatsar/deploying-kyber-on-the-matic-testnet-8d1bc49ffc41), 11 Sep 2019 +- [First release of IPFS Portable User Settings App](https://blog.fission.codes/ipfs-user-settings-app/), FISSION, 10 Sep 2019 +- [Nimbus team awarded grant for a native implementation of libp2p](https://our.status.im/nimbus-team-awarded-grant-for-a-native-implementation-of-libp2p/), Status, 10 Sep 2019 +- [Enterprise IPFS for True Supply Chain Provenance — Part 2](https://medium.com/temporal-cloud/enterprise-ipfs-for-true-supply-chain-provenance-part-2-e18b07f20b80), Temporal, 10 Sep 2019 +- [Password Manager with 3Box](https://medium.com/@ryanpedersen42/password-manager-with-3box-b6d6decf9fd1), Ryan Pedersen, 8 Sep 2019 +- VIDEO: [SourceCred at Berlin Open Source Salon](https://www.youtube.com/watch?v=fK0vjRq-4oI), Dandelion Mané, 1 Sep 2019 + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [ETH Pictures](https://eth.pictures/): The images are uploaded to IPFS, and an NFT (non-fungible token) is minted in the Ethereum blockchain to represent each picture. +- [Open Index Protocol’s DDX,](https://www.youtube.com/watch?v=AR8O0vnYQxs&feature=youtu.be) or Distributed Database of X, is a piece of software built on Open Index Protocol. +- [WAX Photo](https://photo.wax.gg/): A decentralized photo service that allows uploading avatars to IPFS and linking them to your WAX account. +- [Password Manager with 3Box](https://medium.com/@ryanpedersen42/password-manager-with-3box-b6d6decf9fd1) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **New IPFS Meetup:** [Zürich IPFS Meetup Gruppe](https://www.meetup.com/Zurich-IPFS-Meetup-Gruppe/) will be gathering soon to discuss the potential and current situation of IPFS and (maybe also) similar P2P networks making economy borderless. Zürich, Switzerland. +- **19 September 2019:** San Francisco IPFS is hosting [How IPFS Works](https://www.meetup.com/San-Francisco-IPFS/events/264171146/) at Starfish Mission, so sign up to attend and learn more about IPFS and how it actually works! San Francisco, CA, USA. +- **20-22 September 2019:** [Our Networks 2019 RE: Infrastructures](https://ournetworks.ca/) explores the collective care and maintenance of alternative networking practices—new protocols, peer-to-peer connections, offline-first computing, and community-based governance. Toronto, Ontario, Canada. +- **27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. +- **28 September 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 6](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/264683729/) will take place at Caohejing International Incubation Center. Shanghai, China. +- **2 October 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-2/) is a meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **28-30 October 2019:** [Open Source Summit + ELC Europe 2019](https://osseu19.sched.com/event/TLD8) will feature Trevor Conn of Dell Technologies presenting “Securely Store IOT Edge Data with IPFS and Distributed Ledger.” Lyon, France. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-060/README.md b/src/_blog/weekly-060/README.md new file mode 100644 index 00000000..ee0fdda3 --- /dev/null +++ b/src/_blog/weekly-060/README.md @@ -0,0 +1,72 @@ +--- +date: 2019-09-24 +url: /weekly-60/ +translationKey: ipfs-weekly-60 +tags: weekly +title: IPFS Weekly 60 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### IPFS Camp course videos released 🍿 + +If you’ve been following the updates from IPFS Camp you’ve likely already explored the videos from the lightning talks, deep dives, and poster projects, but now the videos from [IPFS Camp’s core and elective courses have been released](https://blog.ipfs.io/2019-09-18-ipfs-camp-course-videos/)! + +### IPFS Cluster v0.11.0 is out! + +[IPFS Cluster v0.11.0 is the biggest release in the project’s history](https://github.com/ipfs/ipfs-cluster/blob/master/CHANGELOG.md). Its main feature is the introduction of the new CRDT “consensus” component. Leveraging Pubsub, Bitswap and the DHT and using CRDTs, cluster peers can track the global pinset without needing to be online or worrying about the rest of the peers as it happens with the original Raft approach. Be sure to check out [the updated documentation too](https://cluster.ipfs.io/documentation/). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Host a website using IPFS, IPNS, and DNSLink](https://simpleaswater.com/ipfs/tutorials/hosting_website_on_ipfs_ipns_dnslink), SimpleAsWater, 22 Sep 2019 +- [IPFS DeFi & FinTech Banking Reality Check](https://medium.com/temporal-cloud/ipfs-defi-fintech-banking-reality-check-b87811d27cec), Temporal, 20 Sep 2019 +- [Pool Full of cDAI](https://medium.com/graphprotocol/pool-full-of-cdai-6b0d9ba0cf35), The Graph, 20 Sep 2019 +- VIDEO: [Introduction to OpenBazaar P2P Marketplace Video](https://www.youtube.com/watch?v=kcHDu0EjGF0), CryptoShoppe, 19 Sep 2019 +- [RTrade Partners with Permaweb Utilizing Web 3.0 Infrastructure to Create New Publishing Platform.](https://medium.com/temporal-cloud/rtrade-partners-with-permaweb-utilizing-web-3-0-infrastructure-to-create-new-publishing-platform-e1e09d333ab7) Temporal, 18 Sep 2019 +- [Publish your metadata and the source code to SWARM and IPFS](https://medium.com/remix-ide/publish-your-metadata-and-sourcecode-to-swarm-and-ipfs-bf3fcd179cd6), Remix Ethereum-IDE, 18 Sep 2019 +- [Blockchain: Thinking BIG for Users.](https://medium.com/realitems/blockchain-thinking-big-for-users-ef91b4399793) Ken Woodruff, 16 Sep 2019 +- [Sign up to Beta Test Qri!](https://qri.io/beta/) 15 Sep 2019 + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [IpJot](https://ipjot.herokuapp.com/) creates short notes, stories, books, poems etc on the web and adds them to IPFS. +- [IPFS with TiddlyWiki](https://github.com/xmaysonnave/tiddlywiki-ipfs), a plugin who aims to help developers, editors or users to save their wikis and attachments over IPFS. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **New IPFS Meetup:** [Zürich IPFS Meetup Gruppe](https://www.meetup.com/Zurich-IPFS-Meetup-Gruppe/) will be gathering soon to discuss the potential and current situation of IPFS and (maybe also) similar P2P networks making economy borderless. Zürich, Switzerland. +- **27-30 September 2019:** [Offline Camp Oregon](http://offlinefirst.org/camp) had to be postponed, but it’s still happening! [Hear how past campers describe this unique unconference retreat](https://youtu.be/FNtpPW_7H1k) focused on the [Offline First](http://offlinefirst.org/) approach to web development and design. +- **28 September 2019:** [ProtoSchool - Shanghai Chapter: Technical Salon Session 6](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/264683729/) will take place at Caohejing International Incubation Center. Shanghai, China. +- **2 October 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-2/) is a meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **7 October 2019:** [Get Ready for Mars](https://www.eventbrite.com/e/ipfs-workshop-in-osaka-tickets-73598149045), an IPFS Workshop in Osaka invites you to dive deeper into how IPFS works under the hood, and how to practically use IPFS in new projects. Osaka, Japan. +- **28-30 October 2019:** [Open Source Summit + ELC Europe 2019](https://osseu19.sched.com/event/TLD8) will feature Trevor Conn of Dell Technologies presenting “Securely Store IOT Edge Data with IPFS and Distributed Ledger.” Lyon, France. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-061/README.md b/src/_blog/weekly-061/README.md new file mode 100644 index 00000000..fab607f9 --- /dev/null +++ b/src/_blog/weekly-061/README.md @@ -0,0 +1,89 @@ +--- +date: 2019-10-01 +url: /weekly-61/ +translationKey: ipfs-weekly-61 +tags: weekly +title: IPFS Weekly 61 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### js-ipfs 0.38.0 is out now! + +[The latest version of the JavaScript implementation](https://blog.ipfs.io/070-js-ipfs-0-38/) includes support for garbage collection, gossipsub & IPNS support for ipfs resolve! Also a new release process! Check it out! + +### Watch this short documentary: The Decentralized Web Is Coming + +Amazon, Google, Facebook, and Twitter are in the federal government’s crosshairs, but the technology necessary to undermine their dominance may already exist. [See how IPFS plays a role](https://www.youtube.com/watch?v=R1ccwyP6fjc&feature=youtu.be) in the internet of the future. + +### At Grace Hopper in Orlando this week? Swing by the PL booth + +Stop by the Protocol Labs booth at Grace Hopper this week to chat with the team, learn more about our open positions, and [sign up for a complimentary professional-grade headshot](https://twitter.com/IPFSevents/status/1178711529656422406?s=20)! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Understanding IPFS in Depth(1/6): A Beginner to Advanced Guide](https://hackernoon.com/understanding-ipfs-in-depth-1-5-a-beginner-to-advanced-guide-e937675a8c8a), Hackernoon, 30 Sep 2019 +- [DFile: A fancy IPFS-based file sharing mode](https://medium.com/@bruce.meerkat/dfile-a-fancy-ipfs-based-file-sharing-mode-e640e081f2c5), Bruce Meerkat, 30 Sep 2019 +- [Understanding IPFS in Depth(3/6): What is InterPlanetary Naming System(IPNS)?](https://hackernoon.com/understanding-ipfs-in-depth-3-6-what-is-interplanetary-naming-system-ipns-9aca71e4c13b) Hackernoon, 30 Sep 2019 +- [Enterprise IPFS Platform to be added to Hydro dApp Store](https://medium.com/temporal-cloud/enterprise-ipfs-platform-to-be-added-to-hydro-dapp-store-97958062631a), Temporal, 30 Sep 2019 +- [ethoFS Windows and macOS Support Now in Beta!](https://medium.com/@Ether1Official/the-latest-updates-to-ethofs-and-what-they-mean-50c8d780e59d) The Ether-1 Project, 28 Sep 2019 +- [Short documentary on the quest to re-decentralize the internet](https://boingboing.net/2019/09/27/decentralize-or-die-2.html), Boing Boing, 27 Sep 2019 +- [General Terms and Conditions Deposit with Bitcoin Blockchain and IPFS](https://berk.es/2019/09/27/algemene-voorwaarden-deponeren-met-bitcoin-blockchain-en-ipfs/), Bèr Kessels, 27 Sep 2019 +- [Leveraging the Graph Protocol to improve user experience and rapidly iterate on ideas](https://unlock-protocol.com/blog/the-graph-blog-post/), The Graph, 25 Sep 2019 +- [Diffusion Developer Conference with IPFS Help Desk](https://blog.fission.codes/diffusion-developer-conference-with-ipfs-helpdesk/), FISSION, 25 Sep 2019 +- [Why IPFS is Needed in Video Streaming?](https://dev.to/sashasydney99/why-ipfs-is-needed-in-video-streaming-3aj) Sasha Sydney, 25 Sep 2019 +- [Internet decentralized and distributed with IPFS](https://soka.gitlab.io/blog/post/2019-09-23-ipfs/), Iker Landajuela, 23 Sep 2019 +- [Running IPFS on Chromebooks](https://talk.fission.codes/t/running-ipfs-on-chromebooks/271), fission forum, 23 Sep 2019 +- PHOTO: [Hector Sanjuan giving a technical introduction to IPFS!](https://twitter.com/_ournetworks/status/1175813420047831045?s=20) Our Networks, 22 Sep 2019 +- [The definite guide to your high-performance IPFS Gateway](https://blog.stacktical.com/ipfs/gateway/dapp/2019/09/21/ipfs-server-google-cloud-platform.html), The Stacktical Blog, 21 Sep 2019 + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Introducing Qri Desktop](https://qri.io/desktop/): As an open-source project, Qri is both the resource and product of a community of contributors and data enthusiasts - many of whom share feature ideas, help find and squash bugs, or contribute code and datasets. + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [The PageSaver](https://pagesaver.dweb.tools/) saves pages of the web onto ipfs, and gives you links to the public gateways. +- [DFile](https://medium.com/@bruce.meerkat/dfile-how-to-use-ipfs-as-a-file-storage-by-python-flask-7906334e832a): How to use IPFS as a file storage by python+flask + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **TONIGHT! 1 October 2019:** [DWeb SF Meet Up-- October](https://www.eventbrite.com/e/dweb-sf-meet-up-october-tickets-73850257107), we loved the community and sharing at DWeb Camp 2019 so much, so let's keep the momentum going! Come meet others interested in building a decentralized web, the web we need and deserve. San Francisco, CA, US. +- **2 October 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-2/) is a meeting organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **7 October 2019:** [Get Ready for Mars](https://www.eventbrite.com/e/ipfs-workshop-in-osaka-tickets-73598149045), an IPFS Workshop in Osaka invites you to dive deeper into how IPFS works under the hood, and how to practically use IPFS in new projects. Osaka, Japan. +- **16 October 2019:** [IPFS Colorado User Testing Day](https://www.meetup.com/IPFS-Colorado/events/264964856): Help make an impact on the UX of the peer-to-peer internet and get a day of free coworking and coffee in return! Boulder/Denver, Colorado USA. +- **16 October 2019:** [IPFS Colorado Basics Night](https://www.meetup.com/IPFS-Colorado/events/265003484): Collab between IPFS Colorado and Ethereum Boulder! Join us for an awesome IPFS overview plus an interactive tutorial on IPFS basics. Boulder/Denver, Colorado USA. +- **19-20 October 2019:** [Diffusion 2019](https://diffusion.events/) Join and connect to some of the world’s most exciting Web 3 protocols in blockchain, AI, IoT and Big Data from across The Convergence Stack, for a 2-day dev con made up of hacks, exclusive product launches, and live demos. Berlin, Germany. +- **28-30 October 2019:** [Open Source Summit + ELC Europe 2019](https://osseu19.sched.com/event/TLD8) will feature Trevor Conn of Dell Technologies presenting “Securely Store IOT Edge Data with IPFS and Distributed Ledger.” Lyon, France. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-062/README.md b/src/_blog/weekly-062/README.md new file mode 100644 index 00000000..6f948294 --- /dev/null +++ b/src/_blog/weekly-062/README.md @@ -0,0 +1,74 @@ +--- +date: 2019-10-10 +url: /weekly-62/ +translationKey: ipfs-weekly-62 +tags: weekly +title: IPFS Weekly 62 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### An update on IPFS Browser progress + +We’re making headway! We’d like to share some collaborations the IPFS project has had in the works for a while, which brings us a few steps closer to making unmediated access to information just work… by solving that “last mile” problem and [integrating IPFS directly into web browsers](https://blog.ipfs.io/2019-10-08-ipfs-browsers-update/). + +### IPFS now available on Storj Network + +Recently, the Storj team announced the availability reference architecture that [backs an IPFS node to its Tardigrade decentralized cloud storage service](https://www.cryptoninjas.net/2019/10/07/ipfs-now-available-on-storj-network/). + +### IPFS Camp Sci-Fi videos 🧬 + +Hot on the heels of IPFS Camp videos covering lightning talks, deep dives, poster projects and core + elective courses come [the interviews from our sci-fi fair](https://ipfs.io/blog/2019-10-03-ipfs-camp-sci-fi-fair-videos/). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Previewing RTrade’s Decentralized, Privacy-Focused (dVPN)](https://medium.com/rtrade-technologies/previewing-rtrades-decentralized-privacy-focused-dvpn-35073b683f0c), RTrade Technologies, 9 Oct 2019 +- [IPFS + ENS Everywhere: Introducing EthDNS](https://medium.com/the-ethereum-name-service/ethdns-9d56298fa38a), The Ethereum Name Service, 8 Oct 2019 +- VIDEO: [RPi Cluster Interview with Héctor Sanjuán](https://www.youtube.com/watch?time_continue=3&v=u0n_pBjTYG8), 7 Oct 2019 +- [TemporalX vs Go-IPFS Official Node Benchmarks](https://medium.com/temporal-cloud/temporalx-vs-go-ipfs-official-node-benchmarks-8457037a77cf), Temporal, 7 Oct 2019 +- TUTORIAL: [Build Youtube using IPFS](https://simpleaswater.com/ipfs/tutorials/youtube_on_ipfs?ref=twitter_youtube_on_ipfs), SimpleAsWater, 5 Oct 2019 +- [Fission API in ipfs-deploy](https://dev.to/fission/fission-api-in-ipfs-deploy-1e1e), Fission, 2 Oct 2019 +- [Using IPFS Distributed File Storage for Game Asset Metadata](https://medium.com/blockadegames/using-ipfs-distributed-file-storage-for-game-asset-metadata-aac4478e3063), Blockade Games, 15 Sep 2019 + +## Open Positions working on IPFS + +- [React Native Developer](https://berty.tech/jobs/react-native-developer/), Berty, Paris, France +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Senior Golang Engineer](https://www.golangprojects.com/golang-go-job-def-Senior-Golang-Engineer-Remote-Textile.html), Textile, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote +- [IPFS Documentation & Technical Content Strategist](https://jobs.lever.co/protocol/e7db2c84-afd7-44a4-9a27-449c751d8289), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [GoFS](https://gofs.io/) is a modern file storage solution. Unlike traditional file storage solutions (Dropbox, Google Files, etc), GoFS serves files from multiple locations at once allowing for faster downloads and more redundancies to keep your files available. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **16 October 2019:** [IPFS Colorado User Testing Day](https://www.meetup.com/IPFS-Colorado/events/264964856): Help make an impact on the UX of the peer-to-peer internet and get a day of free coworking and coffee in return! Boulder/Denver, Colorado USA. +- **16 October 2019:** [IPFS Colorado Basics Night](https://www.meetup.com/IPFS-Colorado/events/265003484): Collab between IPFS Colorado and Ethereum Boulder! Join us for an awesome IPFS overview plus an interactive tutorial on IPFS basics. Boulder/Denver, Colorado USA. +- **19-20 October 2019:** [Diffusion 2019](https://diffusion.events/) Join and connect to some of the world’s most exciting Web 3 protocols in blockchain, AI, IoT and Big Data from across The Convergence Stack, for a 2-day dev con made up of hacks, exclusive product launches, and live demos. Berlin, Germany. +- **28-30 October 2019:** [Open Source Summit + ELC Europe 2019](https://osseu19.sched.com/event/TLD8) will feature Trevor Conn of Dell Technologies presenting “Securely Store IOT Edge Data with IPFS and Distributed Ledger.” Lyon, France. +- **30 October 2019:** [OPO.js Meetup #10](https://www.meetup.com/opo-js/events/265502030/) is hosting the next free Porto JavaScript Community meetup, supported by the ScaleUp Porto initiative. Porto, Portugal. +- **6 November 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-3/) is a monthly meetup organized by and for the community of P2P and cryptography enthusiasts. Paris, France. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-063/README.md b/src/_blog/weekly-063/README.md new file mode 100644 index 00000000..2c2585e5 --- /dev/null +++ b/src/_blog/weekly-063/README.md @@ -0,0 +1,266 @@ +--- +date: 2019-10-15 +url: /weekly-63/ +translationKey: ipfs-weekly-63 +tags: weekly +title: Recapping IPFS in Q3 2019 🎉 +description: +author: Jenn Turner +--- + +Every day brings us closer to the end of 2019! To celebrate, we put together a very special issue looking back on all that the [InterPlanetary File System (IPFS)](https://ipfs.io/) community has accomplished so far in 2019. From milestones like remixing our working group and shipping new releases, to the many awesome (and new!) contributors who have joined us, and what’s to come for the rest of this year, we hope you enjoy this quarterly recap. + +Thanks for being part of our community, we truly couldn’t make IPFS what it is without you. ❤️ + +# Milestones + +## Shipped IPFS Project Q3 Priorities & Working Groups + +Back in July, [we remixed the project working groups](https://blog.ipfs.io/2019-07-31-operation-task-force/) to include Team Bifrost, Package Managers, and more! + +## Project releases galore! + +### js-ipfs 0.37.0 and 0.38.0 released 💛 + +[Version 0.37.0 featured](https://blog.ipfs.io/2019-08-06-js-ipfs-0-37/) a new constructor, better DNSLink support and delegated routing, with [version 0.38.0 adding support](https://blog.ipfs.io/070-js-ipfs-0-38/) for garbage collection, Gossipsub, and IPNS support for `ipfs resolve`! + +### js-libp2p 0.26.0 released 🧩 + +In early August, [js-libp2p also got Gossipsub support](https://blog.ipfs.io/2019-08-07-js-libp2p-0-26/), and Promisify-ied the libp2p API. + +### go-ipfs 0.4.22 released 💠 + +go-ipfs versions 0.4.19, 0.4.20, and go-ipfs 0.4.21 shipped an unusual number of critical regressions which were fixed with [this most recent patch release](https://blog.ipfs.io/054-go-ipfs-0.4.22). + +## go-ipfs improves the IPFS Release Process + +The aforementioned regressions necessitated a new approach to the release process, [as detailed this past August](https://blog.ipfs.io/2019-08-14-ipfs-release-process/). The new approach added three specific changes to the 5-stage process. + +## You can now pubsub with the JS IPFS HTTP API client in the browser! + +Due to boring technical reasons, pubsub over the HTTP API in the browser was not supported. But once the fetch API supported cancelation, [pubsub support with js-ipfs had arrived](https://blog.ipfs.io/2019-08-29-pubsub-in-the-browser/)! + +## IPFS Desktop 0.9 released 🖥 + +In early September, [the newest version of IPFS Desktop, 0.9.2 shipped](https://blog.ipfs.io/2019-09-19-ipfs-desktop-0-9/)! You can now browse, use npm on IPFS, add IPFS command line tools to your system, and more! + +## IPFS Browser Update + +We aim to have multiple browsers implement fully native (and interoperable!) IPFS support. As part of this progression, we’ve had ongoing collaborations with Firefox, Brave, Opera, and other browsers. [Read on to hear the latest status](https://blog.ipfs.io/2019-10-08-ipfs-browsers-update/) and learn about our progress so far. + +## IPFS + ENS Everywhere: Introducing EthDNS (technically in Q4 but we had to share) + +Earlier this month, [EthDNS was announced](https://medium.com/the-ethereum-name-service/ethdns-9d56298fa38a), bridging the traditional web world to the new universe of ENS-named, IPFS-backed decentralized sites and dapps through the ancient, yet indispensable, 🧙‍♂️ Domain Name System 🧙‍♂️. + +# IPFS Camp + +True, IPFS Camp took place in Q2, but so much of the amazing content that came out of the event wasn’t ready for consumption until Q3. Check out these batches of awesome IPFS Camp video and blog content! + +- [⚡️ Lightning Talks and 📃Poster Projects](https://blog.ipfs.io/2019-07-22-ipfs-camp-content-first-batch/) +- [The story of the Deep Dive sessions at IPFS Camp 2019 as told from the perspective of a DWeb historical researcher in the far future](https://blog.ipfs.io/2019-08-12-great-calamity-circumvention-assembly-at-ipfs-camp/) +- [IPFS Camp Core Course Videos 🍿](https://blog.ipfs.io/2019-09-18-ipfs-camp-course-videos/) +- [IPFS Camp Sci-Fi Fair Videos 🧬](https://blog.ipfs.io/2019-10-03-ipfs-camp-sci-fi-fair-videos/) + +# Have you seen these IPFS Tutorials? + +- [Hosting Slate Documentation On IPFS](https://medium.com/temporal-cloud/tutorial-hosting-slate-documentation-on-ipfs-9bc54272ca18), Temporal +- [How To Get Started With IPFS and Node](https://medium.com/better-programming/how-to-get-started-with-ipfs-and-node-fa04baec6b3a), BetterProgramming +- [Decentralizing my website with IPFS](https://dev.to/hacdias/decentralizing-my-website-with-ipfs-2073), Henrique Dias +- [Build a Zero Dependency Notes App on IPFS](https://medium.com/simpleid-dev-tools/tutorial-build-an-encrypted-notes-app-on-ipfs-part-i-39fb06fa95ce), SimpleID +- [Getting Started with IPFS in Ethereum Grid](https://medium.com/ethereum-grid/getting-started-with-ipfs-in-ethereum-grid-80875cd70e6), Ethereum Grid +- [Build a Versioning System With IPFS and Blockstack](https://hackernoon.com/tutorial-build-a-versioning-system-on-ipfs-77lvx2geh), Hackernoon +- [Host a website using IPFS, IPNS, and DNSLink](https://simpleaswater.com/ipfs/tutorials/hosting_website_on_ipfs_ipns_dnslink), SimpleAsWater + +# Q3 by the names and numbers + +All told **121 contributors** produced approximately **2,202 commits** across **109 repositories** in the IPFS project this past quarter. Thank you to the following folks for making it happen: + +@0zAND1z +@aanupam23 +@achingbrain +@adria0 +@aeddi +@aknuds1 +@alanshaw +@alexander255 +@AliabbasMerchant +@amitizkpa +@andrew +@andrewxhill +@aphelionz +@arku +@aschmahmann +@AuHau +@autonome +@bigs +@blackforestboi +@bob-42 +@campoy +@carsonfarmer +@cesarosum +@codynhat +@cwaring +@daviddias +@dbachko +@dbw9580 +@dignifiedquire +@dirkmc +@djdv +@doctorrobinson +@drbh +@DTV96Calibre +@eingenito +@ericronne +@ernest-bruce +@fbielejec +@frrist +@fsdiogo +@gjeanmart +@gmas +@godkong +@gpestana +@hacdias +@hannahhoward +@hapsody +@herronjo +@hikerpig +@hsanjuan +@hugomrdias +@ianopolous +@icidasset +@jacobheun +@jamiew +@jbenet +@jehunter5811 +@Jeroen52 +@jessicaschilling +@jimpick +@jkarni +@jonnycrunch +@Jonybang +@kanej +@Kcchouette +@khinsen +@khursheb +@kishansagathiya +@koalalorenzo +@konoromiHimaries +@Kubuxu +@lanzafame +@lidel +@magik6k +@Mairkur +@maparent +@mburns +@mcdee +@meiqimichelle +@mib-kd743naq +@michealavila +@MichaelMure +@mikeal +@momack2 +@moyid +@nick +@npfoss +@NukeManDan +@obo20 +@olizilla +@parkan +@PedroMiguelSS +@phillmac +@pkafei +@postables +@Prabhakar-Poudel +@Prtfw +@raulk +@realabbas +@renrutnnej +@romanic-juniet +@satazor +@scout +@smwa +@soapdog +@solangegueiros +@stebalien +@steven004 +@swedneck +@tapaswenipathak +@terichadbourne +@timowli +@tobowers +@vasa-develop +@vasco-santos +@vijaysv +@vmx +@whyrusleeping +@xavivives +@xhipster +@ZenGround0 +@Zimmi48 + +## Please help us in welcoming these 49 new contributors 👏 + +@0zAND1z +@aanupam23 +@adria0 +@AliabbasMerchant +@amitizkpa +@andrewxhill +@bob-42 +@cesarosum +@codynhat +@dbachko +@dbw9580 +@dignifiedquire +@doctorrobinson +@drbh +@DTV96Calibre +@ernest-bruce +@fbielejec +@gmas +@godkong +@gpestana +@hapsody +@herronjo +@hikerpig +@icidasset +@jehunter5811 +@Jeroen52 +@jonnycrunch +@kanej +@khinsen +@khursheb +@Mairkur +@mcdee +@mib-kd743naq +@moyid +@nick +@npfoss +@phillmac +@Prtfw +@realabbas +@soapdog +@solangegueiros +@steven004 +@swedneck +@tapaswenipathak +@timowli +@tobowers +@vijaysv +@xavivives +@xhipster +@Zimmi48 + +Once again, thanks for all of your hard work and contributions in Q3. Keep up the great job! + +# Coming up next in 2019 + +As the year winds down, the different project working groups across all of IPFS are busy trying to meet their Q4 and 2019 goals. You can see these goals in the [viewable 2019 Q4 IPFS OKRs spreadsheet](https://docs.google.com/spreadsheets/d/1VeyiLvBdX_PrP394kU_lwkQZxfNwqMVX1f7K4ursSPM/edit#gid=1439867466). Lend your expertise by [joining us on GitHub](https://github.com/ipfs)! + +# Thanks for reading ☺️ + +That’s it for this special edition of the IPFS Weekly. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! Next week we’ll return with all the news that’s happened across the ecosystem since the last weekly. + +If this is your first time reading the IPFS Weekly, you can learn more or get involved by checking out [the project on GitHub](https://github.com/ipfs), or joining us [on chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +See you next week! 👋 diff --git a/src/_blog/weekly-064/README.md b/src/_blog/weekly-064/README.md new file mode 100644 index 00000000..43cb07c1 --- /dev/null +++ b/src/_blog/weekly-064/README.md @@ -0,0 +1,86 @@ +--- +date: 2019-10-22 +url: /weekly-64/ +translationKey: ipfs-weekly-64 +tags: weekly +title: IPFS Weekly 64 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### See IPFS Camp Keynotes and Interviews + +We’re excited to share [the Keynotes that brought us together on our first and last days of IPFS Camp](https://blog.ipfs.io/2019-10-14-ipfs-camp-keynotes-interviews/), and the Community Interviews that highlight some of the amazing work being done by IPFS Camp attendees in the wider ecosystem. + +### WATCH: IPFS Basics Night with ProtoSchool Denver + +[IPFS Basics presentation followed by interactive demo](https://www.youtube.com/watch?v=D3MjB45YZsM&feature=youtu.be) of real-time collaboration tools from the Cryptorado Community! + +### Presenting Building Web3 at Web3 Summit 2019 + +Catch up on [Juan Benet’s talk](https://www.youtube.com/watch?v=pJOG5Ql7ZD0) from Web3 Summit 2019 on Building Web3. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Peergos update: 2X faster and transaction aware GC](https://peergos.gitlab.io/blog#peergos_release_v013_), Peergos, 21 Oct 2019 +- [Exploding IPFS data — enabling single use links, expiring links and more through a simple link shortening service.](https://blog.textile.io/ipfs-experiments-creating-ipfs-links-that-you-can-delete/) Textile, 18 Oct 2019 +- [KILLER DAPPS: The Best Decentralized Alternatives To Conventional Networks](https://creary.net/blockchain/@cryptoblog/killer-dapps), Creary, 15 Oct 2019 +- TUTORIAL: [Online Publication using IPFS](https://simpleaswater.com/ipfs/tutorials/online_publishing_using_ipld?ref=reddit_ipfs_publication_using_ipld), SimpleAsWater, 13 Oct 2019 +- TUTORIAL: [How To Setup A Private IPFS Cluster](https://raptoreum.com/blog/how-to-setup-a-private-ipfs-cluster/), Raptoreum, 11 Oct 2019 +- SLIDES: [Demystifying gossipsub](), Raúl Kripalani for Devcon5, Osaka, 9 Oct 2019 + +## Open Positions working on IPFS + +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Peergos v0.1.3](https://alpha.peergos.net/public/peergos/releases/v0.1.3): Huge speed up, native builds and transaction aware GC +- [Qri Desktop 0.1.0 is OUT!](https://qri.io/desktop/) Version your datasets locally and publish them (with full commit history) to the cloud. +- [ARK Core v2.6](https://blog.ark.io/ark-core-v2-6-is-now-live-on-devnet-bfd8798fadf3) is Now Live On Devnet + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Announcing lotus](https://filecoin.io/blog/announcing-lotus/), the first alternate Filecoin implementation! +- [3Box Ghost Threads API](https://docs.3box.io/build/web-apps/messaging/ghost-threads): Ghost threads are a different type of thread that doesn't persist any messages to database storage. Instead, messages are sent from one peer to the rest of the network using IPFS pubsub, and upon receipt by other online peers are kept in-memory. +- [Large](https://gitlab.com/ptoner/large) is a P2P blogging platform. Build an online community that's run and hosted by the community. +- [Permaweb](https://github.com/Permaweb/permaweb) runs on a series of self-hosted nodes. These are powered by Textile.io, which is acts as a digital wallet for fully encrypted, decentralized content. Content is stored using the IPFS protocol, which makes Permaweb links unique and permanent. +- [SourceCred Color Exploration](https://discourse.sourcecred.io/t/sourcecred-color-exploration/292): an opportunity to launch a lighthearted game using cred! + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **23 October 2019:** [Decentralized Web Prague hosts IPFS Meetup #2: Files in IPFS and hands-on workshop](https://www.meetup.com/dweb-prague/events/263909416/): In the first half of the meetup, we will dive deeper into how IPFS handles files. In the second half, we will explore together the explained concepts hands-on. Prague, Czechia. +- **25 October 2019:** [Re­decentra­lize Conference 2019](https://redecentralize.org/events/2019-conference/) – Interested in a fairer, freer web and net? Working on decentralisation? Care about privacy, autonomy and our future digital infrastructure? Then join us to learn, compare experiences, bounce ideas, share challenges and lessons learnt, hatch collaborations, plan campaigns and start projects. London, UK. +- **27 October 2019:** [Force Commercial Platform Based on IPFS](https://www.meetup.com/Shanghai-Decentralized-Systems-Meetup-Group/events/265612157/) – This meetup hosted by the IPFS Force Community will introduce the IPFS Force commercial platform, which connects decentralized storage providers and users on top of the IPFS network. Shanghai, China. +- **28-30 October 2019:** [Open Source Summit + ELC Europe 2019](https://osseu19.sched.com/event/TLD8) will feature Trevor Conn of Dell Technologies presenting “Securely Store IOT Edge Data with IPFS and Distributed Ledger.” Lyon, France. +- **30 October 2019:** [OPO.js Meetup #10](https://www.meetup.com/opo-js/events/265502030/) is hosting the next free Porto JavaScript Community meetup, supported by the ScaleUp Porto initiative. Porto, Portugal. +- **6 November 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-3/) is a monthly meetup organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **14 November 2019:** [DWeb Talks: Carson Farmer of Textile.io](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/263590720/) hosted by ProtoSchool Seattle. Come and hear from decentralized web developer Carson Farmer on Textile.io! Seattle, WA (US) +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-065/README.md b/src/_blog/weekly-065/README.md new file mode 100644 index 00000000..27213899 --- /dev/null +++ b/src/_blog/weekly-065/README.md @@ -0,0 +1,85 @@ +--- +date: 2019-10-29 +url: /weekly-65/ +translationKey: ipfs-weekly-65 +tags: weekly +title: IPFS Weekly 65 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Learn how to use go-ipfs as a Library 📚 + +[The title says it all.](https://blog.ipfs.io/073-go-ipfs-as-a-library/) Learn how to use go-ipfs as a library with this new tutorial and take full advantage of the go-ipfs Core API. + +### js-ipfs 0.39.0 released 🎉 + +Woo hoo! Configure your node with preset profiles! Limit outgoing browser requests! Start your node from fresh with one command! [All with js-ipfs 0.39.0!](https://blog.ipfs.io/071-js-ipfs-0-39/) + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- PHOTO: [Tim Berners-Lee seems to be a fan of IPFS and libp2p](https://twitter.com/sgrasmann/status/1189194596544200708/photo/1), Twitter, 29 Oct 2019 +- [RTrade Technologies Partners with Dappkit Utilizing Enterprise IPFS Infrastructure & APIs](https://medium.com/temporal-cloud/rtrade-technologies-partners-with-dappkit-utilizing-enterprise-ipfs-infrastructure-apis-7c9b67fdb589), Temporal, 28 Oct 2019 +- PHOTOS: [After #devcon5 and #CrosslinkTaiwan, we were at #IPFS meetup last Monday!](https://twitter.com/pswu11/status/1188403475471831042) Twitter, 27 Oct 2019 +- [Observer October update: IPFS and Built-ins](https://medium.com/@rumkin/observer-october-update-ipfs-and-built-ins-6a821fe2a42d), Paul Rumkin, 27 Oct 2019 +- [Why Tech Can Still Create a Bright Future, as explained to my skeptical father.](https://medium.com/datadriveninvestor/why-tech-can-still-create-a-bright-future-as-explained-to-my-skeptical-father-f3a6e6dc960) Alex White, 25 Oct 2019 +- TUTORIAL: [How To Setup A Public IPFS Gateway](https://raptoreum.com/blog/how-to-set-up-a-public-ipfs-gateway/), Raptoreum, 25 Oct 2019 +- [Towards Autonomous Organizations — Past, Present, Future](https://medium.com/a-mma/towards-autonomous-organizations-past-present-future-9b66612507e6), Jose Jubin, 25 Oct 2019 +- [Ocean Protocol and IPFS, Sitting In The Merkle Tree](https://blog.oceanprotocol.com/ocean-ipfs-integration-store-asset-files-43c623c356d7), Ocean Protocol, 24 Oct 2019 +- [Introducing Embeddable Textile](https://blog.textile.io/introducing-embeddable-textile/), Textile, 23 Oct 2019 +- TUTORIAL: [Embark is Awesome!](https://medium.com/@andrej.rakic.97/embark-is-awesome-9eee74fdfb4f) Andrej, 23 Oct 2019 +- [ARK Development Roadmap: Moving Towards 2020](https://blog.ark.io/ark-development-roadmap-moving-towards-2020-36d5e78a1dfe), ARK, 23 Oct 2019 +- [Function X, a Modern Smartphone with Blockchain technology](https://medium.com/@ailaafton2/function-x-a-modern-smartphone-with-blockchain-technology-c7194615f931), Afton Aila, 21 Oct 2019 +- PODCAST: [Distributed Web: The democratization of the web?](https://www.innoq.com/de/podcast/068-distributed-web/) 14 Oct 2019 +- [Designing a Distributed Ledger Technology System for Interoperable and General Data Protection Regulation–Compliant Health Data Exchange: A Use Case in Blood Glucose Data](https://www.jmir.org/2019/6/e13665/), Hawig D, Zhou C, Fuhrhop S, Fialho AS, Ramachandran N, Journal of Medical Internet Research, June 2019 + +## Open Positions working on IPFS + +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [async-std v0.99.11 has been released!](https://github.com/async-rs/async-std/releases/tag/v0.99.11) Includes added sync::channel, added Future::delay, added Stream::timeout, fixes for task::block_on, and faster fs::File operations. +- [Ocean Protocol v1.1 Released](https://blog.oceanprotocol.com/ocean-protocol-v1-1-released-2a8bedc0466d): A minor maintenance update with some new features: IPFS file hosting integration, new Events-Handler component, and Commons as default UI in Barge. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [os](https://github.com/tomaka/os/) – Experiment to build some kind of operating-system-like environment where executables are all in WASM and are loaded from some IPFS-like decentralized network. +- [The Graph Network In Depth](https://thegraph.com/blog/the-graph-network-in-depth-part-1) +- [Witness](https://witnessdb.com/home) – Immortalize files on the Ethereum blockchain with IPFS + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **28-30 October 2019:** [Open Source Summit + ELC Europe 2019](https://osseu19.sched.com/event/TLD8) will feature Trevor Conn of Dell Technologies presenting “Securely Store IOT Edge Data with IPFS and Distributed Ledger.” Lyon, France. +- **30 October 2019:** [OPO.js Meetup #10](https://www.meetup.com/opo-js/events/265502030/) is hosting the next free Porto JavaScript Community meetup, supported by the ScaleUp Porto initiative. Porto, Portugal. +- **30 October 2019:** [Data Science Wrangle Palo Alto](https://events.attend.com/f/1383790393) – Come network, socialize, and trade notes with practitioners at the leading edge of data science innovation and learn how professionals are driving business outcomes with ML in their day-to-day workflows. Palo Alto, CA (US) +- **6 November 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-3/) is a monthly meetup organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **14 November 2019:** [DWeb Talks: Carson Farmer of Textile.io](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/263590720/) hosted by ProtoSchool Seattle. Come and hear from decentralized web developer Carson Farmer on Textile.io! Seattle, WA (US) +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-066/README.md b/src/_blog/weekly-066/README.md new file mode 100644 index 00000000..b628221d --- /dev/null +++ b/src/_blog/weekly-066/README.md @@ -0,0 +1,55 @@ +--- +date: 2019-11-05 +url: /weekly-66/ +translationKey: ipfs-weekly-66 +tags: weekly +title: IPFS Weekly 66 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### New Tutorial: Use go-ipfs as a Library (no separate process needed!) + +In case you missed it, learn how to spawn a go-ipfs node using the go-ipfs core API in [this new tutorial](https://github.com/ipfs/go-ipfs/tree/master/docs/examples/go-ipfs-as-a-library). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [TemporalX Development Environment Is Live](https://www.reddit.com/r/ipfs/comments/dqu45y/temporalx_development_environment_is_live/), 3 Nov 2019 +- [Video Of The Week: Filecoin and Web3](https://avc.com/2019/11/video-of-the-week-filecoin-and-web3/), AVC, 2 Nov 2019 +- PHOTO: [Textile CEO Andrew Hill explaining Interplanetary File System coolness at our Data Science Wrangle](https://twitter.com/bethann_nyc/status/1189725609414385664?s=20), Bethann Noble, 30 Oct 2019 +- [The Decentralization Dance.](https://medium.com/the-decentralization-dance-enable-not-control/the-decentralization-dance-a8a670bf852b) Aicumen, 29 Oct 2019 +- PODCAST: [Qri: Talking Data Sets with Brendan O’Brien & Rico Gardaphe](https://bettermousetrap.nyc/podcast/qri-talking-data-sets-with-brendan-obrien-rico-gardaphe/), A Better Mouse Trap, 29 Oct 2019 +- [The definite guide to your high-performance IPFS Gateway](https://blog.stacktical.com/ipfs/gateway/dapp/2019/09/21/ipfs-server-google-cloud-platform.html), Stacktical, 21 Sep 2019 + +## Open Positions working on IPFS + +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **6 November 2019:** [Paris P2P Monthly Peer to Beer](https://p2p.paris/en/event/monthly-3/) is a monthly meetup organized by and for the community of P2P and cryptography enthusiasts. Paris, France. +- **14 November 2019:** [DWeb Talks: Carson Farmer of Textile.io](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/263590720/) hosted by ProtoSchool Seattle. Come and hear from decentralized web developer Carson Farmer on Textile.io! Seattle, WA (US) +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-067/README.md b/src/_blog/weekly-067/README.md new file mode 100644 index 00000000..334eaf88 --- /dev/null +++ b/src/_blog/weekly-067/README.md @@ -0,0 +1,89 @@ +--- +date: 2019-11-12 +url: /weekly-67/ +translationKey: ipfs-weekly-67 +tags: weekly +title: IPFS Weekly 67 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Explore the Files API in a new tutorial on ProtoSchool + +Last week, a brand new ProtoSchool tutorial exploring the Regular Files API was launched, built by the awesome Gil Domingues. 🎉 Read [the full blog announcement](https://blog.ipfs.io/2019-11-06-explore-the-files-api-on-protoschool/) for more details. + +### See the new themes being proposed during our 2020 project planning + +See all of [the 2020 Theme Proposals](https://github.com/ipfs/roadmap/issues?q=is%3Aissue+is%3Aopen+label%3A%222020+Theme+Proposal%22) submitted during our open call for themes for the IPFS Project to invest in more deeply in 2020. From IPFS on mobile to a Wikipedia Mirror, and more! + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Dappkit adopts MóiBit as the decentralized storage partner](https://medium.com/@moibit/dappkit-adopts-moibit-as-the-decentralized-storage-partner-8bb69d0658bb), MóiBit, 11 Nov 2019 +- [Comparing IPFS Pinning Services Pricing/Functionality. Temporal, Eternum & Pinata.](https://medium.com/temporal-cloud/comparing-ipfs-pinning-services-pricing-functionality-temporal-eternum-pinata-d38b87a279d8) Temporal, 11 Nov 2019 +- [Atomic access control and human readable public links](https://peergos.org/blog#atomic_access_control_), Peergos, 11 Nov 2019 +- [Exporting your Facebook photos to Fission](https://blog.fission.codes/exporting-your-facebook-photos-to-fission/), Fission, 10 Nov 2019 +- [A Beginner’s Guide to the Decentralized Web](https://medium.com/ppio/dweb-guide-a915cc7a9902), ppio, 8 Nov 2019 +- [MóiBit is now live on Matic Network as the Decentralized storage partner](https://medium.com/moibit/m%C3%B3ibit-is-now-live-on-matic-network-as-the-decentralized-storage-partner-25c179dfd873), MóiBit, 7 Nov 2019 +- [Deploy a Censorship Resistant Website for FREE](https://dev.to/0xbanana/deploy-a-censorship-resistant-website-for-free-clc), Jason Schorr, 6 Nov 2019 +- [After the Meltdown: rethinking event management platforms.](https://medium.com/t14g/decentralized-event-management-platforms-d1fce0748a26) Stefan Adolf, 5 Nov 2019 +- [Creating the Censorship-Resistant Standard for Global Free Speech — With Brad Kam of Unstoppable Domains](https://blog.sendwyre.com/creating-the-censorship-resistant-standard-for-global-free-speech-with-brad-kam-of-unstoppable-44e4c4c48b03), Wyre blog, 5 Nov 2019 +- [Web 3.0 IPFS and Blockchain](https://bhdnetwork.com/2019/11/04/web-3-0-ipfs-and-blockchain/), BHD Network, 4 Nov 2019 +- [TemporalX S3 API vs STORJ IPFS. Development Environment is LIVE!](https://medium.com/temporal-cloud/temporalx-s3-api-vs-storj-ipfs-development-environment-is-live-4b8ef5356b4b) Temporal, 4 Nov 2019 +- VIDEO: [How To Launch An Unstoppable Website On IPFS In Under 3 Minutes!](https://www.youtube.com/watch?time_continue=2&v=I9vTeAtELOk&feature=emb_logo) Unstoppable Domains, 4 Nov 2019 +- The 1st Prize at the Diffusion2019 Hackathon used IPFS! [Learn more about how @toxzique and @mediaquery built a decentralized static website CI/CD pipeline using iExec, IPFS and FISSION](https://twitter.com/iEx_ec/status/1186043294331162624). 20 Oct 2019 +- [What’s going to happen to the WEB when we colonise the Universe?](https://medium.com/@riccardogiorato/whats-going-to-happen-to-the-web-when-we-colonise-the-universe-76f8ccfc31fa) Riccardo Giorato, 10 Oct 2019 + +## Open Positions working on IPFS + +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- [Peergos v0.1.4](https://alpha.peergos.net/public/peergos/releases/v0.1.4): Atomic access control and public links +- [Qri Desktop 0.2.0 is out!](https://github.com/qri-io/desktop/releases/tag/v0.2.0) + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [An awesome example of replicating public datasets](https://twitter.com/daviddias/status/1187666725245992960) by Henrique Dias +- [ethoFS](https://ethofs.com/), a fully decentralized hosting platform that combines blockchain indexing technology and the IPFS protocol to deliver decentralized content on-demand. +- [Neocities reached 4 billion hits!](https://twitter.com/neocities/status/1192990722317635584?s=20) +- [Infury](https://github.com/carsenk/infury) – Basic application to upload files to IPFS from IPFS utilzing Infura.io IPFS API + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **14 November 2019:** [DWeb Talks: Carson Farmer of Textile.io](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/263590720/) hosted by ProtoSchool Seattle. Come and hear from decentralized web developer Carson Farmer on Textile.io! Seattle, WA (US) +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. + +_Fission is running a [series of Decentralized Web Meetups](https://blog.fission.codes/november2019-europe-meetups/). At each, [Brooke @expede](https://github.com/expede) will be doing an IPFS 101 overview, and then explain how we’re using it to build the Fission platform. We’ve got other speakers on other decentralized web topics._ + +- 15 November 2019 [Berlin, Germany Decentralized Web Meetup](https://ti.to/fission/decentralized-web-meetup-berlin) hosted at the Monadic offices, who will share more on [Radicle](https://radicle.xyx) +- 20 November 2019 [Antwerp, Belgium Decentralized Web Meetup](https://ti.to/fission/decentralized-web-meetup-belgium), where @icidasset will talk about [Diffuse](https://diffuse.sh), his decentralized music player +- 21 November 2019 [Victoria, Canada Tech Meetup](https://ti.to/fission/victoria-tech-meetup-2019), organized with Carson from [Textile](https://textile.io) +- 29 November 2019 [Amsterdam, Netherlands Decentralized Web Meetup](https://ti.to/fission/decentralized-web-meetup-amsterdam), including @berkes presenting peer-to-peer cartography with [Peermaps](https://peermaps.org/) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-068/README.md b/src/_blog/weekly-068/README.md new file mode 100644 index 00000000..72b276f1 --- /dev/null +++ b/src/_blog/weekly-068/README.md @@ -0,0 +1,78 @@ +--- +date: 2019-11-19 +url: /weekly-68/ +translationKey: ipfs-weekly-68 +tags: weekly +title: IPFS Weekly 68 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### Help us work on IPFS Docs ✍️ + +The IPFS Docs team needs your help! Wanna contribute? [Check out the latest issues](https://github.com/ipfs/docs/labels/help%20wanted), categorized by size and difficulty. + +### IPFS got a sweet shoutout in the Berty Weekly! + +From [last week’s Berty Weekly](https://berty.tech/newsletter/weekly-21/), a quick bit on gomobile-ipfs: “Guilhem and Antoine found the best approach to allow gomobile-ipfs to handle incoming and outgoing connections with a given peer using streams...” + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [Temporal IPFS Updates: Kubernetes, ENS Domains, Amazon S3, Playground, Organization management](https://medium.com/temporal-cloud/temporal-ipfs-updates-kubernetes-ens-domains-amazon-s3-playground-organization-management-16353e89b255), Temporal, 18 Nov 2019 +- [Atomic access control](https://peergos.org/blog#atomic_access_control_), Peergos, 15 Nov 2019 +- [Brave Browser in 2020: New Ad-Blocks, Filters, SDK, and IPFS](https://u.today/brave-browser-in-2020-new-ad-blocks-filters-sdk-and-ipfs), Vladislov Sopov, 15 Nov 2019 +- [Cross-platform IPFS Lite: JS, Android, iOS, and gRPC](https://blog.textile.io/javascript-ios-android-grpc-ipfs-lite/), Textile, 13 Nov 2019 +- [A Universal Hostless Substrate for a Post-Serverless Future at Øredev 2019](https://dev.to/fission/a-universal-hostless-substrate-for-a-post-serverless-future-at-oredev-2019-41nm), Brooklyn Zelenka, 13 Nov 2019 +- [Mathematicians Solve '42' Problem With Planetary Supercomputer](https://www.sciencealert.com/the-sum-of-three-cubes-problem-has-been-solved-for-42), Science Alert, 9 Sep 2019 + +## Open Positions working on IPFS + +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Updates and new releases + +_See the latest releases of IPFS tools and projects across the ecosystem._ + +- VIDEO: [A sneak peak of the RavencoinOS release 5 for the RPI4 now available for download](https://www.youtube.com/watch?v=z9nGg3yWVUM) +- [IPFS Webpack Plugin](https://github.com/zippiehq/ipfs-webpack-plugin): This plugin simplifies the operation of creating js bundles to be served through IPFS by automatically adding the bundles as part of the webpack build process. + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Eternum](https://www.eternum.io/) is a simple and easy-to-use IPFS pinning service. It will host your IPFS files so you can be sure they'll always be available, and it comes with an API that you can use in your applications. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **20 November 2019:** [Decentralized Web Prague](https://www.meetup.com/dweb-prague/events/263923023) is hosting a night of Developing apps with IPFS at 6pm at Paralelní Polis. Prague, Czech Republic. +- **21 November 2019:** [Decentralized Web Meetup Victoria](https://ti.to/fission/victoria-tech-meetup-2019/) is a new event exploring general discussion about open source and the decentralized web, hosted by Watershed Coworking. Victoria, B.C. +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. + +_Fission is running a [series of Decentralized Web Meetups](https://blog.fission.codes/november2019-europe-meetups/). At each, [Brooke @expede](https://github.com/expede) will be doing an IPFS 101 overview, and then explain how we’re using it to build the Fission platform. We’ve got other speakers on other decentralized web topics._ + +- 20 November 2019 [Antwerp, Belgium Decentralized Web Meetup](https://ti.to/fission/decentralized-web-meetup-belgium), where @icidasset will talk about [Diffuse](https://diffuse.sh), his decentralized music player +- 21 November 2019 [Victoria, Canada Tech Meetup](https://ti.to/fission/victoria-tech-meetup-2019), organized with Carson from [Textile](https://textile.io) +- 29 November 2019 [Amsterdam, Netherlands Decentralized Web Meetup](https://ti.to/fission/decentralized-web-meetup-amsterdam), including @berkes presenting peer-to-peer cartography with [Peermaps](https://peermaps.org/) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-069/README.md b/src/_blog/weekly-069/README.md new file mode 100644 index 00000000..99baaf63 --- /dev/null +++ b/src/_blog/weekly-069/README.md @@ -0,0 +1,78 @@ +--- +date: 2019-11-26 +url: /weekly-69/ +translationKey: ipfs-weekly-69 +tags: weekly +title: IPFS Weekly 69 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### js-ipfs-http-client v40 release, woo! 🎉 + +In the latest release of client library for the IPFS HTTP API, a bug preventing the JWT from being pushed through to every API call was fixed! Check out [the full release notes](https://github.com/ipfs/js-ipfs-http-client/releases/tag/v40.0.0) for more details. + +### IPFS featured in this Fall 2019 Advanced CS course at Old Dominion University + +[IPFS was featured](https://cs531-f19.github.io/) as part of an upper-division course on web server design taught by [Sawood Alam](https://twitter.com/ibnesayeed/status/1197613980992229376?s=20), as well as the Interplanetary WayBack. See all of the course [lecture slides here](https://cs531-f19.github.io/lectures/). + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- [IPFS & Blockchain: Two Peas in a Pod](https://medium.com/zubi-io/ipfs-blockchain-two-peas-in-a-pod-7377d396a223), Viraz Malhotra, 26 Nov 2019 +- [50 Wallets Signed-Up, Growing dWeb, TruffleSuite, & More: ENS Ecosystem Update](https://medium.com/the-ethereum-name-service/50-wallets-signed-up-growing-dweb-trufflesuite-more-ens-ecosystem-update-23be948e23ca), Brantly Millegan, 22 Nov 2019 +- [Can You Really Break the Internet?](https://www.makeuseof.com/tag/can-you-break-internet/) James Frew, 22 Nov 2019 +- [Built on Origin: A Decentralized Shopify Alternative](https://medium.com/originprotocol/built-on-origin-a-decentralized-shopify-alternative-888adc4198b0), Nick Poulden, 20, Nov 2019 +- [A Review on Blockchain Technology and Blockchain Projects Fostering Open Science](https://www.frontiersin.org/articles/10.3389/fbloc.2019.00016/full), Frontiers, 19 Nov 2019 +- [Introducing the Mattereum Asset Passport](https://medium.com/humanizing-the-singularity/introducing-the-mattereum-asset-passport-72f28c9ba6f1), James Hester, 19 Nov 2019 +- [‘Pepo’ is the first Apple Pay approved DApp](https://medium.com/technicity/pepo-is-the-first-apple-pay-approved-dapp-326686b1751), Faisal Khan, 19 Nov 2019 +- [Textile's primer on libp2p (or why we ❤️ libp2p)](https://blog.textile.io/a-primer-on-libp2p/), Textile, 19 Nov 2019 +- [Blockchain-based storage service takes on Amazon AWS, unveils pricing](https://www.itworld.com/article/3454365/blockchain-based-storage-service-takes-on-amazon-aws-unveils-pricing.html), Lucas Mearian, 19 Nov 2019 +- [New Tools for Running IPFS Nodes](https://blog.infura.io/new-tools-for-running-ipfs-nodes-196de636f079), Infura, 18 Nov 2019 +- [Why Vitalik and Everyone Else Has “.ETH” in their Twitter Profiles (and You Should, Too!)](https://medium.com/the-ethereum-name-service/why-vitalik-and-everyone-else-has-eth-in-their-twitter-profiles-and-you-should-too-f5e62731c4d1), Brantly Millegan, 18 Nov 2019 +- [Your Next App May Not Have a Back End](https://medium.com/better-programming/your-next-app-may-not-have-a-backend-aacc728bd032), Alessandro Segala, 15 Nov 2019 +- [The Ultimate Guide to ENS Names](https://medium.com/@eric.conner/the-ultimate-guide-to-ens-names-aa541586067a), Eric Conner, 12 Nov 2019 + +## Open Positions working on IPFS + +- **NEW!** [Senior Backend Engineer (IPFS) - Golang/Python or Golang/JavaScript](https://consensys.net/open-roles/1965747/), Infura, Brooklyn, San Francisco, Remote +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Zil.Link](https://www.zil.link/): A service bridging IPFS and traditional DNS. +- [RecipeRadar](https://www.reciperadar.com): Peer-to-peer sharing of a session via CRDTs over IPFS. +- [3Box Architecture: An introduction to the 3Box technology stack](https://medium.com/3box/3box-architecture-a3e35c82e919) + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **3-4 December, 2019:** [Actyx Hackathon](https://www.smartfactory-owl.de/index.php/de/veranstaltungen/smartfactoryowl/kompetenzzentrum/demonstrieren/livinglab/95-kollaboration-in-einer-produktionsanlage-mittels-dezentraler-edge-plattform), hosted by SmartFactoryOWL, is coming next month. As part of the hackathon, the application of the Actyx platform, (which uses IPFS and libp2p) will be tested and applied to the “living object.” Lemgo, Germany. +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. + +_Fission is running a [series of Decentralized Web Meetups](https://blog.fission.codes/november2019-europe-meetups/). At each, [Brooke @expede](https://github.com/expede) will be doing an IPFS 101 overview, and then explain how we’re using it to build the Fission platform. We’ve got other speakers on other decentralized web topics._ + +- 29 November 2019 [Amsterdam, Netherlands Decentralized Web Meetup](https://ti.to/fission/decentralized-web-meetup-amsterdam), including @berkes presenting peer-to-peer cartography with [Peermaps](https://peermaps.org/) + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-070/README.md b/src/_blog/weekly-070/README.md new file mode 100644 index 00000000..011fed8b --- /dev/null +++ b/src/_blog/weekly-070/README.md @@ -0,0 +1,73 @@ +--- +date: 2019-12-03 +url: /weekly-70/ +translationKey: ipfs-weekly-70 +tags: weekly +title: IPFS Weekly 70 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### js-ipfs 0.40.0 released 🎉 + +Good news friends! The new version of js-ipfs now ships with a repo migration tool that’ll automatically migrate repo’s in the browser. [Read the full release post](https://blog.ipfs.io/2019-12-02-js-ipfs-0-40/) to learn more! + +### GeoHot hacks on IPFS during “Simple Skills Sunday” + +Recently George Hotz, or GeoHot, got the chance to [hack on some IPFS](https://www.youtube.com/watch?v=EecfVsdQMcM) while creating [Tic Tac Toe in React](https://github.com/geohot/twitchtactoe) for Simple Skills Sunday. Check out the full video, or skip to 2:45:00 to get straight to the IPFS bit. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- SLIDES: [cyber: Computing the knowledge of the Great Web](https://ipfs.io/ipfs/QmceNpj6HfS81PcCaQXrFMQf7LR5FTLkdG9sbSRNy3UXoZ), @xhipster and @litvintech, 1 Dec 2019 +- PHOTO: [Henrique Dias guided the BarcampLX audience](https://twitter.com/BarcampLx/status/1200837433178427393?s=20) through a quick dive into the decentralized web with IPFS, 30 Nov 2019 +- [Code Talks: Application of Zero-Knowledge Proof Technology in the Blockchain Industry](https://medium.com/ppio/application-zero-knowledge-c0710a2a1dac), PPIO, 29 Nov 2019 +- TUTORIAL: [Building IPFS Applications with Node.Js](https://medium.com/swlh/ipfs-nodejs-app-8e35f504d440), The Startup, 29 Nov 2019 +- [How the Interplanetary File System (IPFS) Could Decentralize the Web](https://www.maketecheasier.com/how-interplanetary-file-system-decentralize-the-web/), Make Tech Easier, 28 Nov 2019 +- [Compliant Data-Driven Advertising in the Era of Regulations](https://medium.com/2key/compliant-data-driven-advertising-in-the-era-of-regulations-c669b1594412), 2key, 28 Nov 2019 +- [Performance Testing IPFS Protocol](https://dev.to/qainsights/performance-testing-ipfs-protocol-24fb), Naveen Kumar Namachivayam, 24 Nov 2019 +- [How To Fix Everything That's Wrong With the Internet](https://hackernoon.com/what-is-wrong-with-the-internet-and-how-to-fix-it-c67w32no), Martti Malmi, 2 Nov 2019 + +## Open Positions working on IPFS + +- [Senior Backend Engineer (IPFS) - Golang/Python or Golang/JavaScript](https://consensys.net/open-roles/1965747/), Infura, Brooklyn, San Francisco, Remote +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Senior Backend Engineer](https://www.golangprojects.com/golang-go-job-dcr-Senior-Backend-Engineer-Berlin-MXC-Foundation-gGmbH.html), MXC Foundation gGmbH, Berlin, Germany +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [Confidential InterPlanetary File System](https://github.com/mitchellpkt/CIPFS): an open-source encryption layer for IPFS, enabling anybody with an internet connection to access free confidential decentralized storage. +- [Open Street Map tile server on IPFS](https://forum.openstreetmap.org/viewtopic.php?id=68102): a raster tile system, in which image data storage and transmission is distributed via IPFS! +- [CyberCongress](https://cybercongress.ai/): It’s hard to explain simply what it is. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **3-4 December 2019:** [Actyx Hackathon](https://www.smartfactory-owl.de/index.php/de/veranstaltungen/smartfactoryowl/kompetenzzentrum/demonstrieren/livinglab/95-kollaboration-in-einer-produktionsanlage-mittels-dezentraler-edge-plattform), hosted by SmartFactoryOWL, is coming next month. As part of the hackathon, the application of the Actyx platform, (which uses IPFS and libp2p) will be tested and applied to the “living object.” Lemgo, Germany. +- **4 December 2019:** [Paris P2P #4](https://p2p.paris/en/event/monthly-4/) is a meetup organized by and for the community passionate about P2P and cryptography in Paris, France. +- **6 December 2019:** [React Day Berlin](https://reactday.berlin/): Build code, not walls. Take part in the exploration of the React universe! Focusing on in-depth talks, hands-on workshops, and finding new opportunities, React Day Berlin conference provides space for everyone to make friends and develop stellar apps together. Berlin, Germany. +- **7-8 December 2019:** [IndieWebCamp San Francisco](https://2019.indieweb.org/sf) is a two day workshop for creatives who want to discuss, brainstorm, or hack on any and all independent, distribute, local, offline, indieweb technologies for practical usable open web solutions to real world problems and social media. San Francisco (CA), United States. +- **11 December 2019:** [Lyon P2P](https://www.meetup.com/France-P2P/events/266104402/) is a meetup to discuss the topics of peer-to-peer (P2P), decentralization, offline-first applications, networks, confidentiality, anti-surveillance, anti-censorship, security, and more! Lyon, France. +- **8 January 2020:** [Paris P2P Festival](https://p2p.paris/en/event/festival-0/) is an opportunity to federate and allow the meeting of Peer-2-Peer actors in all its forms to meet around all themes related to Peer-to-Peer. For more information on the free four day festival, visit [p2p.paris](https://p2p.paris/en/event/festival-0/). + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-071/README.md b/src/_blog/weekly-071/README.md new file mode 100644 index 00000000..fc364137 --- /dev/null +++ b/src/_blog/weekly-071/README.md @@ -0,0 +1,85 @@ +--- +date: 2019-12-10 +url: /weekly-71/ +translationKey: ipfs-weekly-71 +tags: weekly +title: IPFS Weekly 71 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly. 👋 + +The [InterPlanetary File System (IPFS)](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identity. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. Since that’s a pretty large scope, we track development across the ecosystem in this weekly dispatch. + +Looking to get involved? Click on some of the links below, see what we’re up to on [GitHub](https://github.com/ipfs), or join us in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +Want this update in your inbox? [Subscribe to our weekly newsletter!](http://eepurl.com/gL2Pi5) + +Here are some of the highlights since the last IPFS Weekly. + +## The latest + +### IPFS on Zero Knowledge + +Last week, @jbenet was featured on Zero Knowledge, a podcast focused on the emerging Web3 and the community researching and building it. [Check it out to hear more about IPFS](https://www.zeroknowledge.fm/106), libp2p and what’s new with the Filecoin project lately. + +### DAppNode’s IPFS Pinner Package Demo + +In case you missed it, DAppNode created an IPFS-pinner! [Watch this demo](https://www.youtube.com/watch?time_continue=1&v=I2MuNFlVnHo&feature=emb_logo) on the creative combo of IPFS Cluster, ENS, and IPFS for collaborative community mirrors of your favorite package registry. + +### Catch up on the IPFS Weekly call, Mondays! + +Yesterday, @parkan was on hand to [walk us through a demo of EthDNS](https://www.youtube.com/watch?v=8S4BJKtu6rk), and @alanshaw covered some highlights of the recent js-ipfs v0.40.0 release. Catch up on the call recording, and [join us next Monday, December 16](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) when @ianopolous shares about Peergos. Peergos is a peer-to-peer encrypted filesystem with secure sharing of files designed to be resistant to surveillance of data content or friendship graphs. + +## IPFS in the wild + +_Do you follow [IPFS on Twitter](https://twitter.com/IPFSbot)? For the latest mentions of IPFS in the news, check our Twitter feed or see the [latest articles on Awesome IPFS](https://awesome.ipfs.io/articles/)._ + +- VIDEO: [How to Host Your Website Using ENS+IPFS](https://www.youtube.com/watch?v=oA4oOY5zgU0&feature=emb_logo), Yahsin Huang, 5 Dec 2019 +- [On Video Content Monetization and Blockchain](https://medium.com/altcoin-magazine/on-video-content-monetization-and-blockchain-eff693c72269), Dmitriy Kim, 5 Dec 2019 +- VIDEO: [How & Why You Should Get An .ETH Address With ENS](https://www.narrative.org/post/how-and-why-you-should-get-an-eth-address-with-ens), Scott Cunningham, 5 Dec 2019 +- [Hydro dApp Store — 3rd Party Partner Developer Tools](https://medium.com/project-hydro/hydro-dapp-store-3rd-party-partner-developer-tools-aa80e8fb467), Hydro, 5 Dec 2019 +- [Community Spotlight: Meeting Merwane](https://medium.com/@arweave/community-spotlight-meeting-merwane-11a3c972e126), The Arweave Project, 5 Dec 2019 +- TUTORIAL: [3Box Edit Profile Plugin](https://medium.com/3box/3box-edit-profile-plugin-8502509a4ff4), 3Box, 4 Dec 2019 +- [China’s Ban on EtherScan Is a Sign of Things to Come](https://btcmanager.com/china-ban-etherscan/?q=/china-ban-etherscan/&q=/china-ban-etherscan/), BTC Manager, 4 Dec 2019 +- [Distributed workflow on file-based blockchain](https://medium.com/coinmonks/distributed-workflow-on-file-based-blockchain-cbc485cae9f5), EVEN Foundation, 3 Dec 2019 +- [Temporal Kubernetes Stack — Scaling IPFS Clusters & Sharding the Pinset](https://medium.com/temporal-cloud/temporal-kubernetes-stack-scaling-ipfs-clusters-sharding-the-pinset-15e614ba3003), RTrade Technologies, Ltd., 2 Dec 2019 +- [Video streaming from IPFS for Property tokens media content by GeeSome](https://www.youtube.com/watch?v=qF4bk4EvxSw&feature=youtu.be), Galt Project, 2 Dec 2019 +- [Host a website using IPFS, IPNS, and DNSLink](https://simpleaswater.com/hosting-website-using-ipfs/), Simple as Water, 2 Dec 2019 +- TUTORIAL: [NixOS, ROS and p2p tech on Raspberry Pi 4](https://www.youtube.com/watch?v=M7XSp-ubCy0&feature=emb_logo), Airalab Robonomics, 1 Dec 2019 +- [OpenAPI: connect to any public API with Band Protocol](https://medium.com/bandprotocol/openapi-connect-to-any-public-api-with-band-protocol-5904ed0825c9), Band Protocol, 20 Nov 2019 +- PAPER: [Incorporating Blockchain into RDF Store at the Lightweight Edge Devices](https://link.springer.com/chapter/10.1007%2F978-3-030-33220-4_27), Anh Le-TuanEmail authorDarshan HinguManfred HauswirthDanh Le-Phuoc, 4 Nov 2019 + +## Take a look at these open issues 👀 + +- Via ipfs/docs, should we include [pointers for “non-official” ways of installing IPFS](https://github.com/ipfs/docs/issues/249)? +- Help create a [short concept doc about what a “swarm” is in IPFS](https://github.com/ipfs/docs/issues/112). +- Take on the herculean effort of making sure [every repo has a description and a README](https://github.com/ipfs/docs/issues/55)! + +## Open Positions working on IPFS + +- [Senior Backend Engineer (IPFS) - Golang/Python or Golang/JavaScript](https://consensys.net/open-roles/1965747/), Infura, Brooklyn, San Francisco, Remote +- [Tech Lead, Distributed Systems Test Infrastructure](https://jobs.lever.co/protocol/1ef5b878-573d-44fc-9fe6-c3745597c1fd), Protocol Labs, Remote +- [Distributed Systems Engineer, IPFS Cluster (Go)](https://jobs.lever.co/protocol/29207ca7-76a4-470f-b94a-e24244f9adc1), Protocol Labs, Remote +- [Distributed Systems Technical Lead, IPFS](https://jobs.lever.co/protocol/9283f9b0-de64-4e1f-a221-5d02b0202198), Protocol Labs, Remote + +## Tools and projects we <3 + +_[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated list of projects, tools, or pretty much any things related to IPFS that are totally awesome. To see more, or add yours to the list, visit [Awesome IPFS on GitHub](https://github.com/ipfs/awesome-ipfs)._ + +- [data,together.org](https://datatogether.org/). Exploring Community-Driven Data Stewardship! +- [radicle](https://radicle.community/) launched their community forum, where several interesting discussions about IPFS are going on. 👀 +- [Denarius Jupiter POD — IPFS Timestamping](https://medium.com/@carsenk/denarius-jupiter-pod-ipfs-timestamping-ae457e7fcd9d) +- [GruPur.com](https://grupur.com/feed.html), an uncensored permanent public record, is now running on IPFS and supports IPFS file uploads. + +## Coming up in the Community + +_Did you know IPFS has a community forum at [discuss.ipfs.io](https://discuss.ipfs.io/)? Sign up to participate in discussions about coding, tutorials, see announcements and learn about upcoming community events._ + +- **11 December 2019:** [Lyon P2P](https://www.meetup.com/France-P2P/events/266104402/) is a meetup to discuss the topics of peer-to-peer (P2P), decentralization, offline-first applications, networks, confidentiality, anti-surveillance, anti-censorship, security, and more! Lyon, France. +- **8 January 2020:** [Paris P2P Festival](https://p2p.paris/en/event/festival-0/) is an opportunity to federate and allow the meeting of Peer-2-Peer actors in all its forms to meet around all themes related to Peer-to-Peer. For more information on the free four day festival, visit [p2p.paris](https://p2p.paris/en/event/festival-0/). + +## Thanks for reading ☺️ + +That’s it for this week’s news on all things IPFS. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! That way we can feature you in next week’s edition. diff --git a/src/_blog/weekly-072/README.md b/src/_blog/weekly-072/README.md new file mode 100644 index 00000000..887629b8 --- /dev/null +++ b/src/_blog/weekly-072/README.md @@ -0,0 +1,233 @@ +--- +date: 2019-12-17 +url: /weekly-72/ +translationKey: ipfs-weekly-72 +tags: weekly +title: Recapping IPFS in Q4 2019 🎉 +description: +author: Jenn Turner +--- + +We’ve put together a very special issue looking back on all that you, the InterPlanetary File System (IPFS) community, accomplished over the past few months of 2019. From milestones like releases, projects like ProtoSchool, to the many new (and awesome) contributors who have joined us, and what’s to come for the rest of this year, we hope you enjoy this quarterly recap. + +Thanks for being part of our community, we truly couldn’t make IPFS what it is without you. ❤️ + +## Milestones + +_As far as shipping goes, yeah we did that._ + +### IPFS Browser Update + +Read about [the ongoing collaborations with Firefox, Brave, Opera, and other browsers](https://blog.ipfs.io/2019-10-08-ipfs-browsers-update/) we have going on, and learn about our progress so far. + +### Loads of IPFS Camp content to catch up on! + +From [the keynotes to the developer interviews](https://blog.ipfs.io/2019-10-14-ipfs-camp-keynotes-interviews/), to [the Sci-Fi Fair videos](https://blog.ipfs.io/2019-10-03-ipfs-camp-sci-fi-fair-videos/), there’s a ton of great IPFS Camp videos to watch! + +### js-ipfs 0.39.0 and 0.40.0 released + +The js-ipfs team has been hard at work figuring out the foundations to switch to a hash format in the future, and much, much more. Check out the updates from both [version 0.39.0](https://blog.ipfs.io/071-js-ipfs-0-39/) and [0.40.0](https://blog.ipfs.io/2019-12-02-js-ipfs-0-40/). + +### Learn how to use go-ipfs as a library + +The title says it all! Learn how to use [go-ipfs as a library](https://blog.ipfs.io/073-go-ipfs-as-a-library/) with the new tutorial and take full advantage of the go-ipfs core API. + +### Explore the Files API on ProtoSchool + +This new tutorial [explores the methods at the top-level of js-ipfs](https://blog.ipfs.io/2019-11-06-explore-the-files-api-on-protoschool/) (add, get, cat, etc.) that are custom-built for working with files. Check it out! + +### Presenting on IPFS? We got you + +Feel free to [use these materials](https://github.com/ipfs/community#ipfs-event-materials), like How IPFS Works and IPFS Deep Dive Workshops, to make your event(s) awesome! + +## Q4 by the names and numbers + +All told **83 contributors** produced approximately **1607 commits across 91 repositories** in the IPFS project this past quarter. Thanks to the following folks for helping make this such an amazing end to a fantastic year. 👏 + +@0x6431346e +@aarshkshah1992 +@achingbrain +@agowu338 +@alanshaw +@alexander255 +@Alexey-N-Chernyshov +@AliabbasMerchant +@alzuri +@andrewxhill +@aschmahmann +@AuHau +@autonome +@ay2306 +@carsonfarmer +@csuwildcat +@cwaring +@daviddias +@dirkmc +@djdv +@doctorrobinson +@dreamski21 +@ericronne +@erlend-sh +@Frijol +@frrist +@fulldecent +@gjeanmart +@hacdias +@hannahhoward +@hcg1314 +@hinshun +@hsanjuan +@hueg +@hugomrdias +@ianopolous +@iiska +@jacobheun +@jessicaschilling +@jimpick +@jkosem +@johnnymatthews +@Jorropo +@jsoares +@kaczmarj +@khinsen +@kishansagathiya +@kpp +@Kubuxu +@lanzafame +@lidel +@martin-seeman +@mboperator +@meiqimichelle +@MichaelMure +@mikeal +@mikedotexe +@mkg200001 +@momack2 +@moul +@moyid +@nijynot +@nonsense +@olizilla +@parkan +@PedroMiguelSS +@pranjalv9 +@raulk +@reasv +@renrutnnej +@sarthak0906 +@Seenivasanseeni +@serejandmyself +@starmanontesla +@Stebalien +@stongo +@tapaswenipathak +@terichadbourne +@TheBinitGhimire +@vasco-santos +@vincepmartin +@whyrusleeping +@xiegeo +@yiannisbot + +### Please help us in welcoming these new contributors 👋 + +IPFS wouldn’t be the same without your help! We’re so grateful to have you onboard. Thank you. + +@0x6431346e +@aarshkshah1992 +@Alexey-N-Chernyshov +@alzuri +@ay2306 +@csuwildcat +@dreamski21 +@erlend-sh +@Frijol +@fulldecent +@hcg1314 +@iiska +@jkosem +@johnnymatthews +@jsoares +@kaczmarj +@kpp +@mboperator +@mikedotexe +@mkg200001 +@moul +@nijynot +@nonsense +@pranjalv9 +@reasv +@sarthak0906 +@Seenivasanseeni +@serejandmyself +@starmanontesla +@stongo +@TheBinitGhimire +@vincepmartin +@xiegeo +@yiannisbot + +## Contributors by the numbers + +Here are the 10 contributors who touched the most repos in the project so this quarter: + +- @Stebalien +- @achingbrain +- @aschmahmann +- @lidel +- @alanshaw +- @MichaelMure +- @hugomrdias +- @jessicaschilling +- @hacdias + +Once again, thanks for all of your hard work and contributions in 2019. Keep up the great job! + +## Awesome content + +### The Decentralized Web is coming + +Amazon, Google, Facebook, and Twitter are in the federal government’s crosshairs, but the technology necessary to undermine their dominance may already exist. [See how IPFS plays a role](https://www.youtube.com/watch?v=R1ccwyP6fjc&feature=youtu.be) in the internet of the future. + +### IPFS + ENS Everywhere: Introducing EthDNS + +[EthDNS](https://medium.com/the-ethereum-name-service/ethdns-9d56298fa38a) bridges the traditional web world to the new universe of ENS-named, IPFS-backed decentralized sites and dapps through the ancient, yet indispensable, 🧙‍♂️ Domain Name System 🧙‍♂️. + +### Exploding IPFS data 💥 + +Enabling single use links, expiring links and more through [a simple link shortening service](https://blog.textile.io/ipfs-experiments-creating-ipfs-links-that-you-can-delete/). + +### Presenting Building Web3 at Web3 Summit 2019 + +Catch up on [Juan Benet’s talk from Web3 Summit 2019](https://www.youtube.com/watch?v=pJOG5Ql7ZD0) on Building Web3. + +### Tim Berners-Lee seems to be a fan of IPFS and libp2p + +OMG senpai noticed [us](https://twitter.com/sgrasmann/status/1189194596544200708/photo/1)! + +### Brave Browser in 2020: New Ad-Blocks, Filters, SDK, and IPFS + +Back in November, [Brave announced plans](https://u.today/brave-browser-in-2020-new-ad-blocks-filters-sdk-and-ipfs) to launch and implement IPFS, a cutting edge approach to decentralization. 💁‍♀️ + +### GeoHot hacks on IPFS during “Simple Skills Sunday” + +Recently George Hotz, or GeoHot, got the chance to [hack on some IPFS](https://www.youtube.com/watch?v=EecfVsdQMcM) while creating Tic Tac Toe in React for Simple Skills Sunday. Check out the full video, or skip to 2:45:00 to get straight to the IPFS bit. + +### DAppNode’s IPFS Pinner Package demo + +In case you missed it, DAppNode created an IPFS-pinner! [Watch this demo](https://www.youtube.com/watch?time_continue=1&v=I2MuNFlVnHo&feature=emb_logo) on the creative combo of IPFS Cluster, ENS, and IPFS for collaborative community mirrors of your favorite package registry. + +## Coming up in 2020 + +- We celebrate 2019 in style 🎉 +- The IPFS docs get a brand new look +- Check out [the goals we’ve outlined so far for 2020](https://github.com/ipfs/roadmap#2020-goals) + +## Thanks for reading ☺️ + +That’s it for this special edition of the IPFS Weekly. If we missed something, [send us an email](mailto:newsletter@ipfs.io) and let us know! We’ll return with all the ecosystem news you love to read about on January 7, 2020. + +If this is your first time reading the IPFS Weekly, you can learn more or get involved by checking out [the project on GitHub](https://github.com/ipfs), or joining us [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). + +See you next year! 👋 diff --git a/src/_blog/weekly-073/README.md b/src/_blog/weekly-073/README.md new file mode 100644 index 00000000..774eb709 --- /dev/null +++ b/src/_blog/weekly-073/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-01-14 +url: /weekly-73/ +translationKey: ipfs-weekly-73 +tags: weekly +title: IPFS Weekly 73 +description: +author: Jenn Turner +--- + +# Welcome back to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Top 10 recent highlights + +- [Announcing collaborative clusters](https://blog.ipfs.io/2020-01-09-collaborative-clusters/), the first set of public collaborative clusters, creating an easy way to join the IPFS Network. +- [An IPFS Use Case](https://medium.com/pinata/an-ipfs-use-case-6c46349cb1), or why IPFS is well-suited to handle the buying and selling of data. +- The [IPFS Docs Beta is live!](https://docs.ipfs.io/) [Learn more about helping beta test](https://blog.ipfs.io/2020-01-07-ipfs-docs-beta/) to make it even better. +- New release: [IPFS Cluster 0.12.0 is here!](https://cluster.ipfs.io/news/0.12.0_release/) +- [Hands-on IPLD Tutorial in Golang: Getting Started with IPLD](https://simpleaswater.com/hands-on-ipld-tutorial-in-golang/) +- [ProtoSchool](https://proto.school/) has enabled social sharing. When a user completes all lessons in a tutorial, they’re now presented with a congratulatory message and an opportunity to share their success on Twitter! +- [Comparing IPFS and Dat](https://medium.com/@jaygraber/comparing-ipfs-and-dat-8f3891d3a603): Everything you wanted to know about the two. +- [A Quick Dive Into the Dweb with IPFS](https://www.youtube.com/watch?v=EmxUyuCD37Q&feature=emb_logo), no joke like 15 minutes quick. +- [IPFS Storage Adapter](https://blog.fission.codes/ipfs-storage-adapter-for-ghost-blog-heroku-deploy/) for Ghost Blog with Heroku Deploy +- Get caught up on the [IPFS All hands with Peergos](https://www.youtube.com/watch?v=sHw3sY7OvXU&feature=youtu.be) + +## Current work in progress + +An update from the [IPFS Core Implementations](https://github.com/ipfs/team-mgmt/issues/992#issuecomment-573746115) team: + +- go-ipfs 0.5.0: Delays due to existing issues. Remaining testing requirements have been defined. +- js-ipfs: Steady progress progress on async/await refactor. +- js-ipfs: unixFS 1.5: merged mode and mtime support. +- [Bitswap protocol extensions](<(https://github.com/ipfs/go-bitswap/issues/186)>): Progress on implementing bitswap protocol extensions in both JS/Go +- go-ipfs: Effort to use multihashes rather than CIDs in DHT, Datastore etc., is in progress. + +[Any awesome #c++ devs out there?](https://github.com/openzim/zim-tools/issues/69) The distributed-wikipedia-mirror could use a helping hand to get updated snapshots of Wikipedia in Turkish, English, and more! + +Looking to dip your toes into some [fresh libp2p and Nim development?](https://github.com/status-im/nim-libp2p/issues) + +Don’t forget to [get involved with the new IPFS docs beta](https://blog.ipfs.io/2020-01-07-ipfs-docs-beta/) by testing, contributing content, or voting on new features! + +## Recommended viewing + +[BYOD: bring you own data | Carson Farmer | textile.io - YouTube](https://www.youtube.com/watch?v=glbV7azZ0vY&feature=youtu.be) + +## Check out our mentions + +- [The Coming Decentralized Decade](https://morningconsult.com/opinions/the-coming-decentralized-decade/), 06 Jan 2020 +- [The library is now OPEN, the real Secure, Private and Unblockable VPN](https://medium.com/rtrade-technologies/the-library-is-now-open-the-real-secure-private-and-unblockable-vpn-ec9d0e4c81d8), 04 Jan 2020 +- [Build a dynamic website… or not?](https://hacdias.com/2020/01/02/6/dynamic-static/) 02 Jan 2020 +- [How ICTE will use IPFS and Cloudflare to create a secure trading environment](https://themerkle.com/how-icte-will-use-ipfs-and-cloudflare-to-create-a-secure-trading-environment/), 28 Dec 2019 +- [Building a Distributed AppStore with 3Box](https://medium.com/3box/building-a-distributed-appstore-with-3box-ef7345aab34e), 27 Dec 2019 +- [A protocol & event-sourced database for decentralized user-siloed data](https://blog.textile.io/introducing-textiles-threads-protocol/), 18 Dec 2019 +- [Intro to Web3 and Protocol Labs](https://www.youtube.com/watch?v=d-iigN2WjvY&feature=emb_logo), 18 Dec 2019 +- [Off-Chain Data: Why traditional clouds don’t work for blockchain data](https://medium.com/pinata/off-chain-data-63bca5a9c266), 17 Dec 2019 +- [You Know It - Prove It!](https://medium.com/@johngrant/you-know-it-prove-it-3597040ca9ee) 16 Dec 2019 +- [Decentralized React states - using IPFS to sync, store, and recover state](https://www.youtube.com/watch?list=PLNBNS7NRGKMH-zMH-MG7wSszTThAKFi3S&v=wnnkaqpArmQ&feature=emb_logo), 13 Dec 2019 +- [Textile’s primer on libp2p, part 2 (or why we really ❤️ libp2p)](https://blog.textile.io/textiles-primer-on-libp2p-part-2-or-why-we-really-libp2p/), 12 Dec 2019 +- [IPFS Website Experiment Using Ethereum Name Service](https://www.increaseo.com/eth-domains-ipfs/) 01 Dec 2019 + +## Quote of the week + +[Reyes on Twitter: “Everyday there is something that will blow up your mind and create interest, today for me it’s #IPFS. 🤯”](https://twitter.com/Jorgert1205/status/1215492174806122496?s=20) + +## Open positions working on IPFS + +- [Research Engineers and Scientists](https://research.protocol.ai/posts/201912-resnetlab-launch/), ResNetLab +- [Golang Engineer, focused on p2p systems and immutable data types](https://twitter.com/qri_io/status/1207709551828635656?s=20), Qri +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Join the community at these upcoming events + +- **18 Jan 2020** | [Global Diversity CFP Day](https://www.globaldiversitycfpday.com/), Global +- **13-17 Feb 2020** | [#BUIDL Week Colorado - ETHDenver 2020](https://www.ethdenver.com/buidlweek/), Denver (CO), US +- **13 Feb 2020** | [Distributed Networks Summit – IPFS & Friends](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487?aff=textileio), Denver (CO), US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up in [chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) diff --git a/src/_blog/weekly-074/README.md b/src/_blog/weekly-074/README.md new file mode 100644 index 00000000..00fa1a04 --- /dev/null +++ b/src/_blog/weekly-074/README.md @@ -0,0 +1,97 @@ +--- +date: 2020-01-21 +url: /weekly-74/ +translationKey: ipfs-weekly-74 +tags: weekly +title: IPFS Weekly 74 +description: +author: Jenn Turner +--- + +## Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Top 10 recent highlights + +- [IPFS Companion v2.10.0](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.10.0) shipped, it now adds files to your MFS rather than just pinning them, so you can find them later! +- Missed the Local Offline Collaboration Monthly meeting? Catch up [on the video here](https://www.youtube.com/watch?v=JNdVzO4YXZY&feature=youtu.be) +- Why build this blog—or anything—[on IPFS](http://teetotality.blog/posts/why-ipfs/)? +- [ProtoSchool](https://twitter.com/ProtoSchool/status/1217288554650505217?s=20) celebrated their 1 year anniversary! +- New tutorial: [Decentralizing your Website](https://towardsdatascience.com/decentralizing-your-website-f5bca765f9ed) +- Read this survey of social applications that have incorporated a blockchain into their design in [Blockchain Social Networks](https://medium.com/@jaygraber/blockchain-social-networks-c941fb337970) +- [Hands-on IPLD Tutorial in Golang: PART 2](https://simpleaswater.com/hands-on-ipld-tutorial-in-golang-2/) available now on Simple as Water +- Vue.js + IPFS = [VIPFS](https://github.com/Ideea-inc/vipfs). Create unstoppable applications +- Anytype.io has launched, [join the beta here](https://www.anytype.io/)! +- “Is There Any Hope…Only If We Work Together...” [Sharing Everything Always](https://medium.com/@tjayrush/simple-undeniable-facts-2e74f0e71bd5) + +## Project updates + +- Qri shipped [a new docs page](https://qri.io/docs/) 🎉 +- Peergos asks what would [the perfect social network look like](https://peergos.org/posts/perfect-social-network)? +- [Cyber](https://cyber.page/) is a consensus computer on top of IPFS that uses IPFS hashes to create cyberlinks. In other words, it is a decentralized search engine built with the help of IPFS. They have recently released their testnet: [Euler-5](https://github.com/cybercongress/cyberd/releases). It is an incentivized testnet that allows launching validator nodes, searching for content on IPFS and most importantly create cyberlinks (semantically link IPFS hashes to create a semantic core). Watch [this video](https://www.youtube.com/watch?v=RS6w6wiAag4) to learn more! +- [Introducing Tipsets](https://filecoin.io/blog/tipsets-family-based-approach-to-consensus/): A closer look at Filecoin building blocks + +## Win the Decentralized Future Prize + +Nesta is launching an [open call for essays](https://www.nesta.org.uk/blog/decentralised-future-prize/) that explore how the next decade of decentralization could change the way we work together towards shared goals, how we structure organizations and the societal impacts of these changes. We want these essays to inform policymakers and the public about the potential of these new technologies and inspire a new wave of innovators to experiment with different organizational structures for social good. The writer of the best essay will secure a £3,000 prize; to enter, you’ll need to send us a short written pitch for your essay (500 words max) by Sunday 26th January. + +## Work in progress + +- Coming soon: the js-ipfs async-await refactor. It’s currently closer than it’s ever been to being done. +- Can you write great docs? There’s never been a better time to help the global IPFS community by [contributing to our new docs beta site](https://docs.ipfs.io/project/contribute/#documentation)! +- [gomobile-ipfs](https://github.com/ipfs/go-ipfs-api/pull/202) is almost ready! + +## Recommended viewing + + + +Watch this recent video of Alessandro Segala, from Microsoft, “JavaScript Apps Going InterPlanetary” from NodeJS Interactive. + +## Check out our mentions + +- ARTICLE: [Status introduces beta version of web3 crowdfunding tool Assemble](https://www.cryptoninjas.net/2020/01/18/status-introduces-beta-version-of-web3-crowdfunding-tool-assemble/), 18 Jan 2020 +- POST: [Car Lifecycle on the Blockchain](https://medium.com/@dmitriykim/car-lifecycle-on-the-blockchain-e57dc91424fd), 16 Jan 2020 +- TUTORIAL: [Configuring IPFS part 2](https://dev.to/azwyane/configuring-ipfs-part-2-227c), 16 Jan 2020 + +“...the website for Elon Musk’s SpaceX project is hosted on IPFS. So when you type in SpaceX.eth, Blockchain Router will decode it into a 32-byte link, look up the website on a blockchain, verify it, and download the site, piece by piece, from a bunch of nodes in the network.” – [A new, easier way to access Web3](https://decrypt.co/16524/a-new-easier-way-to-access-web3-the-blockchain-router): The “blockchain router. 13 Jan 2020 + +- ANNOUNCEMENT: [Temporal Partners with Rivet Utilizing IPFS APIs and Powerful Infrastructure](https://medium.com/temporal-cloud/temporal-partners-with-rivet-utilizing-ipfs-apis-and-powerful-infrastructure-b463721264b0). 13 Jan 2020 +- TUTORIAL: [How to Use Unstoppable Domains](https://medium.com/tuneintodetuned/c%C3%B3mo-usar-unstoppable-domains-96ef25f3a891), 12 Jan 2020 +- POST: [Distributed Internet — IPFS & Blockchain](https://medium.com/@info_15033/distributed-internet-ipfs-blockchain-f37f8eec020c). 06 Jan 2020 + +“Take a look at what happens when you add a file to IPFS. Your file, and all of the blocks within it, is given a unique fingerprint.” – [Live Chat Application With IPFS & Pubsub & React](https://medium.com/@rajesh.t_91497/live-chat-application-with-ipfs-pubsub-react-cd20d3c4bccd), 03 Jan 2020 + +- POST: [Polkadot 2019: Year in review](https://medium.com/polkadot-network/polkadot-2019-year-in-review-8c852ef42668), 29 Dec 2019 +- POST: [Docker, Kubernetes and the Butterfly Protocol](https://medium.com/butterfly-protocol/docker-kubernetes-and-the-butterfly-protocol-9ca67b2d5a01), 18 Dec 2019 +- POST: [Off-Chain Data](https://medium.com/pinata/off-chain-data-63bca5a9c266): Why traditional clouds don’t work for blockchain data, 17 Dec 2019 +- TUTORIAL: [Create a Decentralized Database using Tangle and IPFS for beginners](https://medium.com/coinmonks/create-a-database-using-tangle-and-ipfs-for-beginners-5cd5228ba830), 17 Dec 2019 + +## Quote of the week + + + +## Open positions working on IPFS + +- [Research Engineers and Scientists](https://research.protocol.ai/posts/201912-resnetlab-launch/), ResNetLab +- [Golang Engineer](https://twitter.com/qri_io/status/1207709551828635656?s=20), focused on p2p systems and immutable data types, Qri +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Join the community at these upcoming events + +- [DWeb SF Meet Up Explores Decentralized Social Media](https://www.meetup.com/dwebsf/events/267899235/?rv=ea1_v2&_xtd=gatlbWFpbF9jbGlja9oAJDA0MjNkYjZkLWEyYWEtNGY1YS1iY2QwLTM3YjhjNDU3NTdlZQ), 21 Jan 2020, San Francisco (CA), US +- [DWeb Talks: Kelsey Breseman–a DWeb Primer, Decentralized Web Seattle](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/267123900/), 30 Jan 2020, Seattle (WA), US +- WEBINAR: [Do you dare to know how IPFS and Blockchain work?](https://marketing.createsend1.com/t/ViewEmail/y/1D97557C38316695) 30 Jan 2020 +- [FOSDEM 2020](https://fosdem.org/2020/), 1-2 Feb 2020, Brussels, Belgium +- [Paris P2P #6](https://p2p.paris/en/event/monthly-6/), 5 Feb 2020, Paris, France +- [Distributed Networks Summit – IPFS & Friends](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487), 13 Feb 2020, Denver (CO), US +- [#BUIDL Week Colorado – ETHDenver 2020](https://www.ethdenver.com/buidlweek/), 13-17 Feb 2020, Denver (CO), US +- [Open Data Day 2020](https://opendataday.org/), 7 Mar 2020, 35 events registered so far! + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) each Tuesday. diff --git a/src/_blog/weekly-075/README.md b/src/_blog/weekly-075/README.md new file mode 100644 index 00000000..5c32b9ab --- /dev/null +++ b/src/_blog/weekly-075/README.md @@ -0,0 +1,84 @@ +--- +date: 2020-01-28 +url: /weekly-75/ +translationKey: ipfs-weekly-75 +tags: weekly +title: IPFS Weekly 75 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Top 5 highlights + +- The [go-ipfs v0.4.23 release](https://github.com/ipfs/go-ipfs/issues/6837) is right around the corner! +- The [first search engine](https://medium.com/the-ethereum-name-service/the-first-search-engine-for-the-dweb-ens-ipfs-has-launched-79b9fae7a9dc) for the decentralized web has launched! 🚀 +- Ever wanted to build a Twitter bot using IPFS Cluster? [Check this out!](https://simpleaswater.com/ipfs-cluster-twitter-pinbot/) +- Make an immortal website using Ethereum name service and [IPFS Desktop](https://medium.com/@kirpy/make-an-immortal-website-using-ethereum-name-service-and-ipfs-simple-939e66c893df) +- Here’s how to deploy [an IPFS node on Azure](https://medium.com/cladular/running-an-interplanetary-file-system-node-using-azure-container-instances-5627814a48f5) + +## People are building cool stuff with IPFS + +- [The world’s first (truly) private home security camera](https://medium.com/iotex/how-we-built-the-worlds-first-truly-private-home-security-camera-4c4f97eb4b27) built with IPFS! +- Also built with IPFS, check out [ItalyGourmet.co datahub](https://www.datagourmet.net/) +- Generate [DApps for smart contracts](https://github.com/solui/solui) +- [ipfs-tab:](https://github.com/sergejmueller/ipfs-tab) IPFS extension for Chromium + +## Open questions from the community + +- Help with experimental chat feature of [js-ipfs/ipfs-pubsub](https://www.reddit.com/r/ipfs/comments/eukjwz/help_in_approaching_this_project_idea/)... +- Thinking of doing [live streaming project with IPFS](https://www.reddit.com/r/ipfs/comments/ety5oi/live_streaming_ipfs/)... +- Has anyone attempted to use [js-ipfs/web3js/js-libp2p to create a private network](https://www.reddit.com/r/ipfs/comments/eshkje/seeking_advice_on_jsipfs_for_private_offline/) that's browse based? +- How to initiate IPFS node once and [keep using the same PeerID](https://discuss.ipfs.io/t/how-to-initiate-ipfs-node-once-and-keep-using-the-same-peerid-in-app/7086) in App? + +## Recommended viewing + + + +## Check out our mentions + +- [How open, trusted edge can help improve data sharing and monetization](https://venturebeat.com/2020/01/23/how-open-trusted-edge-can-help-improve-data-sharing-and-monetization/), 23 Jan 2020 +- [Building MongoDB-like DataStore on InterPlanetary Linked Data](https://medium.com/swlh/building-mongodb-like-datastore-on-interplanetary-linked-data-afc21a4edec2), 23 Jan 2020 +- [How Can Blockchain Improve Data Storage? | Cointelegraph](https://cointelegraph.com/news/how-can-blockchain-improve-data-storage) 22 Jan 2020 +- [How to Host a Website on IPFS (with DNS)](https://medium.com/@leondo/how-to-host-a-website-on-ipfs-with-dns-82f1f2fe6361) 22 Jan 2020 +- [Grokking Qri](https://medium.com/qri-io/grokking-qri-4cc10f3f38d5), 21 Jan 2020 +- [Join us at ETH Denver 2020!](https://medium.com/3box/join-us-at-eth-denver-2020-932eaf4b1695) 21 Jan 2020 +- [How to EASILY make your data persistent (data pinning) on IPFS with Alex of Pinata](https://www.youtube.com/watch?v=U7k_pOsVCpY&feature=emb_logo), 19 Jan 2020 +- [Configuring IPFS part 2](https://dev.to/azwyane/configuring-ipfs-part-2-227c), 16 Jan 2020 +- [How to make a eth.link website](https://medium.com/@collindyer/how-to-make-a-eth-link-website-bd3aba5bfd67), 10 Jan 2020 +- [Foraged Stories: Planting the Seeds of a Story Economy in Haig Park](https://medium.com/blocumenta/foraged-stories-planting-the-seeds-of-a-story-economy-in-haig-park-47d34dc5d74b), 04 Dec 2019 + +## Submit your next talk to these upcoming events + +- **07 Feb:** [csv,conf,v5](https://csvconf.com/), a community conference for data makers everywhere, 13-14 May 2020, Washington, D.C., US +- **11 Feb:** [40th Annual International Cryptology Conference (Crypto 2020)](https://crypto.iacr.org/2020/), 16-20 Aug 2020, Santa Barbara, CA, US +- **Closing soon!:** [Ethereum Community Conference 3](https://ethcc.io/speakers.html), the largest annual European Ethereum event focused on technology and community, 3-5 Mar 2020, Paris, France +- **Open now:** [C3 Crypto Conference](https://crypto-conference.com/) reveals to the world all the innovative solutions and new technologies in the blockchain, crypto, and more, 03-05 June 2020, TBD + +## Open positions working on IPFS + +- [Senior Backend Engineer, IPFS](https://boards.greenhouse.io/consensys/jobs/1965747), Infura +- [Data Research Assistant](https://www.linkedin.com/jobs/cap/view/1659228994/), Qri +- [Research Engineers and Scientists](https://research.protocol.ai/posts/201912-resnetlab-launch/), ResNetLab +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Join the community at these upcoming events + +- [DWeb Talks: Kelsey Breseman– a DWeb Primer, Decentralized Web Seattle](https://www.meetup.com/ProtoSchool-Seattle-Learn-to-Make-the-Decentralized-Web/events/267123900/), 30 Jan 2020, Seattle (WA), US +- WEBINAR: Do you dare to know how IPFS and Blockchain work? https://marketing.createsend1.com/t/ViewEmail/y/1D97557C38316695 30 Jan 2020 +- [FOSDEM 2020](https://fosdem.org/2020/), 1-2 Feb 2020, Brussels, Belgium +- [Paris P2P #6](https://p2p.paris/en/event/monthly-6/), 5 Feb 2020, Paris, France +- [Distributed Networks Summit – IPFS & Friends](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487), 13 Feb 2020, Denver (CO), US +- [#BUIDL Week Colorado - ETHDenver 2020](https://www.ethdenver.com/buidlweek/), 13-17 Feb 2020, Denver (CO), US +- [Open Data Day 2020](https://opendataday.org/), 7 Mar 2020, 35 events registered so far! + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) each Tuesday. diff --git a/src/_blog/weekly-076/README.md b/src/_blog/weekly-076/README.md new file mode 100644 index 00000000..7b078fb7 --- /dev/null +++ b/src/_blog/weekly-076/README.md @@ -0,0 +1,84 @@ +--- +date: 2020-02-04 +url: /weekly-76/ +translationKey: ipfs-weekly-76 +tags: weekly +title: IPFS Weekly 76 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Coming soon to a core API near you, the async/await refactor + +Read all about [the ongoing refactor](https://blog.ipfs.io/2020-02-01-async-await-refactor/) in the js-ipfs, js-libp2p and js-ipld codebases to use Promises and remove Node.js streams and pull streams from the code base entirely. Consider this your early warning that the releases of these next two modules will have BIG breaking changes. 🤯 + +## Top 5 recent highlights + +- [go-ipfs 0.4.23](https://ipfs.io/blog/2020-01-30-go-ipfs-0-4-23/) was released 🚀 +- There was also new release of [ipfs-update](https://dist.ipfs.io/#ipfs-update), version 1.5.3 which fixed a ton of bugs when running on Windows +- The path to [landing Bitswap in go-ipfs](https://github.com/ipfs/go-ipfs/issues/6782#issuecomment-579973116) has been discovered! +- You’re going to want to see this [absolutely amazing IPFS deck]9https://docs.google.com/presentation/d/1yJEKH2BQRp5SnuGYNf7R9n7pobfMHF78tsfHJK6LFxI/edit) by Kelsey Breseman +- New tutorial: [Using a Node.js Script to Upload a Folder to a Remote IPFS Node](https://medium.com/cladular/using-a-node-js-script-to-upload-a-folder-to-a-remote-ipfs-node-255fa9e3b766) + +## People are building cool stuff with IPFS + +- Want to try Filecoin? [Textile is building tools to make it even easier](https://blog.textile.io/developer-tools-for-filecoin-ipfs-web/) +- [Peergos shipped v0.1.5](https://alpha.peergos.net/public/peergos/releases/v0.1.5) – 5X faster!! New CLI and more! Keep your stuff private on IPFS +- Let Qri be your [Personal Data Portal](https://medium.com/qri-io/qri-as-your-personal-data-portal-6d5e2d80e7ba) +- Announcing Forest: ChainSafe’s [Implementation of Filecoin in Rust](https://medium.com/chainsafe-systems/announcing-forest-chainsafes-implementation-of-filecoin-in-rust-675d176be517) +- [Shop at the Origin Swag Store](https://medium.com/originprotocol/shop-at-the-origin-swag-store-and-earn-ogn-4fd51fd5b440) and Earn OGN +- Check out this [Recycling System using IOTA](https://medium.com/coinmonks/recycling-system-using-iota-2172ecc7444) +- [The Play to Earn website](https://medium.com/play-to-earn/play-to-earn-website-launched-46903d275526), built on IPFS, launched! + +## Recommended viewing + + +Check out “A Technical Introduction to IPFS,” by Hector Sanjuan. + +## Check out our mentions + +- [Interview with Hayden Young, founder of KnowledgeArc.](https://medium.com/the-capital/interview-with-hayden-young-founder-of-knowledgearc-a44c15e6a231) 03 Feb 2020 +- [Building & Deploying a Gatsby Website to IPFS Using Azure Pipelines](https://medium.com/cladular/building-deploying-a-gatsby-website-to-ipfs-using-azure-pipelines-7dd095a861fb), 02 Feb 2020 +- [Efficient online ad management on ethereum](https://medium.com/@jon.tomp/cost-economic-model-for-web-advertising-7fca03764896), 30 Jan 2020 +- [‘Digital Art’ Framed And Collected On Blockchain](https://www.forbes.com/sites/michaelhaley/2020/01/30/digital-art-framed-and-collected-on-blockchain/#38801b698d90), 30 Jan 2020 +- Translated: [What is IPFS? A decentralized World Wide Web?](https://medium.com/@itdo_solutions/qu%C3%A9-es-ipfs-una-world-wide-web-descentralizada-d92ca2dd3b9e) 30 Jan 2020 +- [A Look Into Origin Protocol](https://medium.com/coinlist/a-look-into-origin-protocol-68473f463c9e), 29 Jan 2020 +- [Add editable, IPFS-based user profiles to your dapp in less than 30 mins](https://medium.com/coinmonks/add-editable-ipfs-based-user-profiles-to-your-dapp-in-less-than-30-mins-abae8c9a05e6), 29 Jan 2020 +- [5 things you can do with the Blok on Blok smartphone](https://medium.com/functionx/5-things-you-can-do-with-the-blok-on-blok-smartphone-ff46999f9f01), 28 Jan 2020 +- [Throwback from the first edition of P2P Festival!](https://berty.tech/blog/berty-at-p2p-festival/) 27 Jan 2020 +- [Predicting the 2020s in frontier tech](https://medium.com/@alexruppert/predicting-the-2020s-in-frontier-tech-34c4507c2461), 27 Jan 2020 +- [Interview With Michael Sena And Danny Zuckerman - Founders of 3Box](https://blog.simpleid.xyz/interview-with-michael-sena-and-danny-zuckerman/), 27 Jan 2020 +- [OPUS — Your questions answered!](https://medium.com/@info_62555/opus-your-questions-answered-ccbe869a3afe) 26 Jan 2020 +- [How to Decentralize Twitter](https://hackernoon.com/how-to-decentralize-twitter-956a37da), 20 Jan 2020 + +## Open positions working on IPFS + +- [Senior Backend Engineer, IPFS](https://boards.greenhouse.io/consensys/jobs/1965747), Infura +- [Research Engineers and Scientists](https://jobs.lever.co/protocol/f39f7fe0-1805-40d2-9453-90fd25c72bc3), ResNetLab +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Quote of the week + + + +## Join the community at these upcoming events + +- [Paris P2P #6](https://p2p.paris/en/event/monthly-6/), 05 Feb 2020, Paris, France +- [Distributed Networks Summit – IPFS & Friends](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487), 13 Feb 2020, Denver (CO), US +- [#BUIDL Week Colorado - ETHDenver 2020](https://www.ethdenver.com/buidlweek/), 13-17 Feb 2020, Denver (CO), US +- [Stanford Blockchain Conference 2020](https://cbr.stanford.edu/sbc20/), 19-20 Feb 2020, Stanford (CA), US +- [Ethereum Community Conference 3](https://ethcc.io/), 03-05 Mar 2020, Paris, France +- [Open Data Day 2020](https://opendataday.org/), 07 Mar 2020, 35 events registered so far! +- [Cryptoeconomic Systems Conference '20](https://cryptoeconomicsystems.pubpub.org/ces20), 07-08 Mar 2020, Cambridge (MA), US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) each Tuesday. diff --git a/src/_blog/weekly-077/README.md b/src/_blog/weekly-077/README.md new file mode 100644 index 00000000..a9a48e54 --- /dev/null +++ b/src/_blog/weekly-077/README.md @@ -0,0 +1,69 @@ +--- +date: 2020-02-11 +url: /weekly-77/ +translationKey: ipfs-weekly-77 +tags: weekly +title: IPFS Weekly 77 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Our focus for 2020: 📞 Content Routing + +Yesterday we released our roadmap for 2020 and more, in a post [examining our project focus for the coming year](https://blog.ipfs.io/2020-02-10-our-focus-for-2020/). Beginning with an excellent recap of 2019—including some of the year’s top wins—as well as describing the unenviable process of roadmapping and decisions that led to our chosen focus, you can read all this and more [on the IPFS blog](https://blog.ipfs.io/2020-02-10-our-focus-for-2020/). + +## Introducing the Interplanetary Testground + +Last week, another project entered the Interplanetary realm: [Testground](https://github.com/ipfs/testground)! Though created by the helping hands of IPFS and friends, Testground is a general-purpose, agnostic platform for testing distributed software at scale. Take a look at the [latest release notes](https://github.com/ipfs/testground/releases/tag/v0.1.0) and give it a try! 💫 + +## Top 5 recent highlights + +- Have we mentioned the biggest of [Big Refactors](https://blog.ipfs.io/2020-02-06-big-refactors/) yet? +- With [js-libp2p 0.27 released](https://blog.ipfs.io/2020-02-07-js-libp2p-0-27/), not only did the Async Await refactor of js-libp2p land, but we’ve measured memory usage improvements between 30-40% compared to the previous version! +- Hey IPFS Community, [come hack with us at ETHDenver](https://blog.ipfs.io/2020-02-07-ethdenver-2020/) this week! +- “At age 30, this is not the Web we wanted...” [The 3 Revolutions of Web 3](https://medium.com/@tonyob/the-3-revolutions-of-web-3-7165ed6b3036) +- What are you working on with IPFS? [a thread](https://www.reddit.com/r/ipfs/comments/f10um9/what_are_you_working_on_with_ipfs/) 🧵 + +## Recommended viewing + +Check out [“The Path to Peer-to-Peer Matrix”](https://fosdem.org/2020/schedule/event/dip_p2p_matrix/) from Matthew Hodgson from FOSDEM, earlier this month. + +## People are building cool stuff with IPFS + +- [libp2p-lora-transport](https://github.com/RTradeLtd/libp2p-lora-transport): Enabling low-bandwidth LibP2P protocols to communicate over LoRa, a low-powered long-range wireless protocol (WIP) +- [3Box messaging plugins](https://medium.com/3box/3box-messaging-plugins-get-more-social-354e2afe88cb) get more social! +- [Qri Desktop 0.3.5](https://github.com/qri-io/desktop/releases/tag/v0.3.5) upgrades electron & electron-builder, re-enabling auto-update on the app. +- The [Butterfly Mobile App](https://medium.com/bproto/the-butterfly-mobile-app-4e904427c840): Your Butterfly identity is owned by you within your Ethereum wallet, to which only you have the secret to access. +- [Robonomics Network](https://robonomics.network/en/): Ethereum network infrastructure for cyber-physical systems’ integration into Smart Cities and Industry 4.0 + +## Quote of the week + + + +## Open positions working on IPFS + +- [Backend Software Engineeer](https://qri.io/jobs/job-backend-software-engineer), Qri +- [Frontend Software Engineer](https://qri.io/jobs/job-frontend-software-engineer), Qri +- [Research Engineers and Scientists](https://jobs.lever.co/protocol/f39f7fe0-1805-40d2-9453-90fd25c72bc3), ResNetLab +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Join the community at these upcoming events + +- [Distributed Networks Summit – IPFS & Friends](https://www.eventbrite.com/e/distributed-networks-summit-ipfs-friends-tickets-86959928487), 13 Feb 2020, Denver (CO), US +- [#BUIDL Week Colorado - ETHDenver 2020](https://www.ethdenver.com/buidlweek/), 13-17 Feb 2020, Denver (CO), US +- [Stanford Blockchain Conference 2020](https://cbr.stanford.edu/sbc20/), 19-20 Feb 2020, Stanford (CA), US +- [Ethereum Community Conference 3](https://ethcc.io/), 03-05 Mar 2020, Paris, France +- [Open Data Day 2020](https://opendataday.org/), 07 Mar 2020, 35 events registered so far! +- [Cryptoeconomic Systems Conference '20](https://cryptoeconomicsystems.pubpub.org/ces20), 07-08 Mar 2020, Cambridge (MA), US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) each Tuesday. diff --git a/src/_blog/weekly-078/README.md b/src/_blog/weekly-078/README.md new file mode 100644 index 00000000..b7f83ca6 --- /dev/null +++ b/src/_blog/weekly-078/README.md @@ -0,0 +1,92 @@ +--- +date: 2020-02-18 +url: /weekly-78/ +translationKey: ipfs-weekly-78 +tags: weekly +title: IPFS Weekly 78 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Improvements to IPFS Bitswap, or how Netflix is experimenting with IPFS + +After IPFS Camp 2019, [Netflix and IPFS began collaborating](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/) on ways to incorporate peer-to-peer services into Netflix’s developer tooling. Together, we figured out a way to leverage IPFS to speed up cloud builds, designing and testing solutions for faster Continuous Integration (CI) pipelines powered by efficient p2p container image distribution. Read more on the [IPFS blog](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/). + +## js-ipfs 0.41.0 released + +We’ve completed a HUGE refactor to [js-ipfs internals 🥳](https://blog.ipfs.io/2020-02-13-js-ipfs-0-41/), switching to using Promises and async/await over Callbacks and using async iterables instead of Node.js Streams and Pull Streams. BUT, this release brings big breaking changes to the core API so please consult **the full release notes**! + +## Top 5 recent highlights + +- Berty released [gomobile-ipfs!!](https://berty.tech/blog/go-mobile-ipfs) This repo aims to provide packages for Android, iOS and React-Native that allow one to run and use an IPFS node on mobile devices. +- [IPFS Web UI E2E tests](https://github.com/ipfs-shipyard/ipfs-webui#e2e-tests) are now run as a part of go-ipfs and js-ipfs regression test suites. +- [Introducing Terminal V2](https://blog.terminal.co/posts/introducing-terminal-v2): The easiest way to build, deploy, and host websites & apps on IPFS. +- Catch up on the [latest IPFS Weekly Call](https://www.youtube.com/watch?v=octr87XSCeY&feature=emb_logo), featuring a look at how IPFS and libp2p are used in Robonomics. 🤖 +- [Unstoppable Domains](https://medium.com/unstoppabledomains/unstoppable-website-templates-e5ed343a7c7a) will be giving **\$100** per template to the first 10 pull requests that they approve. And speaking of bounties... + +## Introducing IPFS Bounties & DevGrants + +Our new IPFS Grant platform connects funding organizations with builders and researchers in the IPFS community—that means you! We offer several types of grants, including bounties. To learn more about IPFS DevGrants, [check out the repo](https://github.com/ipfs/devgrants). +Here are some of our open bounties: + +- [Fix script responsible for preparing IPFS mirror](https://github.com/ipfs/distributed-wikipedia-mirror/issues/64) +- [Write a brief but interesting history of the IPFS Project](https://github.com/ipfs/website/issues/352) + +See the recently claimed bounties or check for new open ones when they get posted on [The Bounty Board 📌](https://github.com/ipfs/devgrants/projects/1). + +## The IPFS Community at ETHDenver + +Last week, the IPFS Community gathered at one of the largest Ethereum conferences and hackathons in the US: [ETHDenver](https://www.ethdenver.com/). Here are some other key takeaways: + +- Out of the 52 projects submitted to ETHDenver, **24 were built with IPFS!** +- IPFS Hackathon Standouts: [Medici](https://alchemy-xdai.daostack.io/dao/0xe248a76a4a84667c859eb51b9af6dea29e52f139/crx/proposal/0xc2584683cbf5f10af39fb2b79b62ff967608a9e179241e0fce9c8f6dbd6a579a/competition/submission/0x7cbe3ffec0b06ad42fd6d603ae01b5e3907c72101d6f66d37f1d081af192d5de), [TexIOT](https://github.com/RTradeLtd/ethdenver2020/tree/submission/hackathon/texiot), MuckRaker, [IPFS iOS Backup](https://github.com/codynhat/ipfs-ios-backup) +- [The Distributed Network Summit](http://dnsummit.cryptorado.org/), hosted by the [Cryptorado Community](https://cryptorado.org/#/), **an entire day** dedicated to IPFS, featured presentations and workshops on how people are continuing to build on IPFS, as well as some pretty amazing new use cases. +- This three-part series from Textile on [how to publish dynamic IPFS buckets](https://blog.textile.io/ethden-come-learn-how-to-publish-dynamic-ipfs-buckets-on-textile/) on Textile, how to [pin projects to IPFS](https://blog.textile.io/ethden-2-pin-projects-to-ipfs-right-from-github/) right from GitHub, and [how to use CI to publish your webpage](https://blog.textile.io/ethden-using-ci-to-publish-your-webpage-using-ipfs-and-textile-buckets/) using IPFS and Textile Buckets +- [Bounties using IPFS](https://medium.com/3box/3box-x-ethdenver-bounties-bfca17b98187) were all over the place (and XP missions too!) +- Presenters talking all things IPFS, like [Carson Farmer, from Textile](https://twitter.com/textileio/status/1228739364869505027?s=20)! + +Thank you, everyone who joined us there, IPFS will be back for ETHDenver 2021! 🎉 + +## Check out our mentions + +- [Decentralized storage and zkSNARKS - Golem joins the Filecoin trusted setup ceremony](https://blog.golemproject.net/decentralized-storage-and-zksnarks-golem-joins-the-filecoin-trusted-setup-ceremony/), 14 Feb 2020 +- [ARK desktop blockchain wallet upgrade adds multisig and multipayments](https://www.cryptoninjas.net/2020/02/12/ark-desktop-blockchain-wallet-upgrade-adds-multisig-and-multipayments/), 14 Feb 2020 +- [Fission Drive Preview](https://blog.fission.codes/fission-drive-preview/), 13 Feb 2020 +- [Temporal and ENS now make launching a decentralized website easier than ever](https://cryptoslate.com/temporal-and-ens-now-make-launching-a-decentralized-website-easier-than-ever/), 10 Feb 2020 +- Textile shipped a Filecoin tools progress update: [10 February](https://blog.textile.io/filecoin-tools-progress-update-10-february/), 10 Feb 2020 +- [Taking Back The Internet with Naomi Brockwell and Brad Kam](https://medium.com/unstoppabledomains/taking-back-the-internet-with-naomi-brockwell-and-brad-kam-65f475ef88b9), 07 Feb 2020 +- [Blockchain Key To A Better Internet](http://www.cryptomorrow.com/2020/02/06/blockchain-key-to-a-better-internet/), 06 Feb 2020 +- [What’s IPFS and how it can change Internet](https://medium.com/natix-io/whats-ipfs-and-how-it-can-change-internet-161239bc69ec), 04 Feb 2020 + +## Quote of the week + + + +## Open positions working on IPFS + +- [Backend Software Engineeer](https://qri.io/jobs/job-backend-software-engineer), Qri +- [Frontend Software Engineer](https://qri.io/jobs/job-frontend-software-engineer), Qri +- [Research Engineers and Scientists](https://jobs.lever.co/protocol/f39f7fe0-1805-40d2-9453-90fd25c72bc3), ResNetLab +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Join the community at these upcoming events + +- [Stanford Blockchain Conference 2020](https://cbr.stanford.edu/sbc20/), 19-20 Feb 2020, Stanford (CA), US +- [Ethereum Community Conference 3](https://ethcc.io/), 03-05 Mar 2020, Paris, France +- [Open Data Day 2020](https://opendataday.org/), 07 Mar 2020, 35 events registered so far! +- [Cryptoeconomic Systems Conference '20](https://cryptoeconomicsystems.pubpub.org/ces20), 07-08 Mar 2020, Cambridge (MA), US +- [The Web Conference 2020](https://www2020.thewebconf.org/), 20-24 Apr 2020, Taipei, Taiwan +- [Consensus 2020](https://www.coindesk.com/events/consensus-2020), 11-13 May 2020, New York (NY), US +- [csv,conf,v5](https://csvconf.com/), 13-14 May 2020, Washington, D.C., US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) each Tuesday. diff --git a/src/_blog/weekly-079/README.md b/src/_blog/weekly-079/README.md new file mode 100644 index 00000000..8c994fee --- /dev/null +++ b/src/_blog/weekly-079/README.md @@ -0,0 +1,79 @@ +--- +date: 2020-02-25 +url: /weekly-79/ +translationKey: ipfs-weekly-79 +tags: weekly +title: IPFS Weekly 79 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Top 5 recent highlights + +- Introducing [Textile Buckets](https://blog.textile.io/first-look-at-textile-buckets-dynamic-ipfs-folders/): Dynamic data storage and management for IPFS +- [Mapping the Interplanetary FileSystem](https://arxiv.org/abs/2002.07747), a study of the structure of the resulting overlay network +- Upload to IPFS, the GitHub Action that deploys [Straight to IPFS](https://medium.com/@sergiibomko/straight-to-ipfs-3bff32fdb480). +- Help test the new [Discourse IPFS Plugin](https://talk.fission.codes/t/testing-discourse-ipfs-plugin/482) +- Check out the [new docs bounties](https://twitter.com/dzesika/status/1232017738752614407?s=20) and earn some 💸 + +## People are building cool stuff with IPFS + +### 🎧 Audius + +Your new favorite music streaming app, Audius, is now [live on the iOS app store](https://twitter.com/AudiusProject/status/1220066334278447106?s=20). Go download the only decentralized and open-source streaming music platform controlled by independent artists, fans, & developers. + +### 🏞 Decentraland + +[Decentraland](https://decentraland.org/) is a virtual world where you can build and explore 3D creations, play games and socialize, and it’s open now! + +### ⛓ Unstoppable Blockchain Browser Is Live + +The [Unstoppable Blockchain Browser](https://www.youtube.com/watch?v=_aIf4Nac6DU&feature=youtu.be) fights censorship by featuring Blockchain Domains and Decentralized Websites which can’t be taken down without your permission. + +### 🧘 Ambient Stack + +The [Ambient Stack](https://ambientstack.org/) brings together CRDTs, IPFS, and the Tupelo DLT to remove the need for heavy backend infrastructure. + +## Check out our mentions + +- [Stellar Community Podcast: Bidcoins, Stellar, and Arbitrary Data Storage with Nick Papillon](https://podcast.stellar.org/episodes/bidcoins-stellar-and-arbitrary-data-storage-with-nick-papillon), 22 Feb 2020 +- [Berty team at IPFS Camp, June 2019](https://medium.com/berty-tech/berty-team-at-ipfs-camp-june-2019-2b3e3958fc46), 21 Feb 2020 +- An epic [ETHDenver 2020 Recap](https://medium.com/3box/ethdenver-2020-recap-aab409daef19), 20 Feb 2020 +- [ENS + .KRED](https://medium.com/the-ethereum-name-service/ens-kred-major-integration-of-dns-and-ens-launches-e7efb4dd872a): Major Integration of DNS and ENS Launches, 19 Feb 2020 +- [Algorand, paves the way to become DeFi go-to platform](https://www.linkedin.com/pulse/algorand-paves-way-become-defi-go-to-platform-andrzej-winiarski/). 19 Feb 2020 +- [Unstoppable Browser for decentralized IPFS web](https://medium.com/@nederob/unstoppable-browser-for-decentralized-ipfs-web-832eca583aa6), 18 Feb 2020 +- [Getting Started with Terminal](https://blog.terminal.co/posts/getting-started), 17 Feb 2020 +- NEW PAPER: [Decentralized and permission-less green energy certificates with GECKO](https://link.springer.com/article/10.1186/s42162-020-0104-0), Fabian Knirsch, Clemens Brunner, Andreas Unterweger, & Dominik Engel, 14 Feb 2020 +- [MoiBit](https://medium.com/@aikrish/moibit-the-practical-decentralized-cloud-storage-network-d7decb7db8aa) — The practical Decentralized Cloud Storage Network, 14 Feb 2020 + +## Quote of the week + + + +## Open positions working on IPFS + +- [Backend Software Engineeer](https://qri.io/jobs/job-backend-software-engineer), Qri +- [Frontend Software Engineer](https://qri.io/jobs/job-frontend-software-engineer), Qri +- [Research Engineers and Scientists](https://jobs.lever.co/protocol/f39f7fe0-1805-40d2-9453-90fd25c72bc3), ResNetLab +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf), Protocol Labs +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef), Protocol Labs +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268), Protocol Labs +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Protocol Labs +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f), Protocol Labs + +## Join the community at these upcoming events + +- [Ethereum Community Conference 3](https://ethcc.io/), 03-05 Mar 2020, Paris, France +- [Open Data Day 2020](https://opendataday.org/), 07 Mar 2020, 35 events registered so far! +- [Cryptoeconomic Systems Conference '20](https://cryptoeconomicsystems.pubpub.org/ces20), 07-08 Mar 2020, Cambridge (MA), US +- [The Web Conference 2020](https://www2020.thewebconf.org/), 20-24 Apr 2020, Taipei, Taiwan +- [Consensus 2020](https://www.coindesk.com/events/consensus-2020), 11-13 May 2020, New York (NY), US +- [csv,conf,v5](https://csvconf.com/), 13-14 May 2020, Washington, D.C., US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230) each Tuesday. diff --git a/src/_blog/weekly-080/README.md b/src/_blog/weekly-080/README.md new file mode 100644 index 00000000..d634520c --- /dev/null +++ b/src/_blog/weekly-080/README.md @@ -0,0 +1,76 @@ +--- +date: 2020-03-03 +url: /weekly-80/ +translationKey: ipfs-weekly-80 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 80 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Top 10 recent highlights + +- New interview highlighting Bitswap: [IPFS Emerges as Tool to Distribute Container Images](https://containerjournal.com/topics/container-management/ipfs-emerges-as-tool-to-distribute-container-images/) +- [From Web 1.0 to Web3: How the Internet Grew Over The Years](https://hackernoon.com/from-web-10-to-web3-how-the-internet-grew-over-the-years-zac032g1) +- Temporal introduces [a contender in the object storage solution space](https://medium.com/temporal-cloud/introducing-s3x-endless-ipfs-dynamic-possibilities-stream-videos-host-dynamic-websites-f0072127070f) with IPFS-based alternative to AWS, S3X +- [New release of get-ipfs](https://github.com/fission-suite/get-ipfs), a one-stop shop for loading an IPFS instance into a webpage. +- Take a look at all of the [Project Submissions from ETHDenver 2020](https://medium.com/ethdenver/all-of-the-ethdenver-2020-project-submissions-a29124035332), half of which were built on IPFS +- Breaking news: [Upcoming Support for Filecoin via Gemini Custory](https://gemini.com/blog/upcoming-support-for-filecoin) +- New Tutorial: [How to host a personal website on IPFS](https://lpfann.me/post/decentralized-site/) +- Drop in on the ongoing [Drupal IPFS module research](https://talk.fission.codes/t/drupal-ipfs-module-research/516) +- Another reason why we are doing this: [The Cancer Gene Trust](https://www.cancergenetrust.org/), a globally distributed repository of genomic, clinical, and imaging data built on IPFS, helping foster collaboration and data resiliency to accelerate cancer research. +- The Testground team is making progress in their experimental discoveries, check out [the latest release for more](https://github.com/ipfs/testground/releases/tag/v0.2.0)! + +## Recommended viewing + + +The IPFS Weekly Community Call from Monday, March 2, 2020. [Join us each Monday at 5pm UTC](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call). + +## Check out our recent mentions + +- [GET Documentation — State change batches](https://medium.com/get-protocol/get-documentation-state-change-batches-1ed91ef4d614), 27 Feb 2020 +- VIDEO: [3Box integration in eth.build](https://www.youtube.com/watch?v=i_X5uGkgfc8&feature=emb_logo), 26 Feb 2020 +- [Secure myState — Government Services for Citizens #ETHDenver2020](https://medium.com/twos-complement/secure-mystate-government-services-for-citizens-ethdenver2020-17f47407b656), 26 Feb 2020 +- [Privacy browser Brave now digs up the Internet’s past](https://decrypt.co/20656/privacy-browser-brave-now-digs-up-the-internets-past), 26 Feb 2020 +- [Winklevoss-led Gemini Custody to add Filecoin, trading may be next](https://decrypt.co/20544/winklevoss-led-gemini-custody-to-add-filecoin-trading-may-be-next), 25 Feb 2020 +- [Web 3.0 Stack Modules Reconstruction and Investment Outlook](https://medium.com/@IOSGVC/web-3-0-stack-modules-reconstruction-and-investment-outlook-bd1e624c4bdb), 23 Feb 2020 + +## Catch up on the last week of WG meetings + +- [Core Implementations Weekly Sync](https://www.youtube.com/watch?v=mSUqOGOmkJ4) +- [Docs & Developer UX Weekly Sync](https://www.youtube.com/watch?v=vLnLIhX3AR4) +- [IPFS GUI and Browsers Weekly](https://www.youtube.com/watch?v=c7Kb1mjhbcY) +- BONUS: [Last week’s community call](https://www.youtube.com/watch?v=uUL6Qm6Zb5I) + +## Quote of the week + + + +## Open CFPS for events you want to be at + +- [Consensus 2020](https://airtable.com/shrgZo95do5Oeo55N), 11-13 May 2020, New York (NY), US +- Closing soon! [C3 Crypto Conference](https://crypto-conference.com/apply-speaker/), 03-05 Jun 2020, Berlin, Germany +- Closing March 15! [Commit Porto '20](https://commitporto.com/), 06 Jun 2020, Porto, Portugal +- [DAPPCON](https://gnosis1.typeform.com/to/u8cTBg), 08-10 Sep 2020, Berlin, Germany +- [The Linux Foundation Open Source Summit Europe](https://events.linuxfoundation.org/open-source-summit-europe/program/cfp/#overview), 26-28 Oct 2020, Dublin, Ireland +- [Web Summit 2020](https://websummit.com/speaker-application), 02-05 Nov 2020, Lisbon, Portugal + +## Join the community at these upcoming events + +- [Open Data Day 2020](https://opendataday.org/), 07 Mar 2020, 226 events registered so far! +- [Cryptoeconomic Systems Conference '20](https://cryptoeconomicsystems.pubpub.org/ces20), 07-08 Mar 2020, Cambridge (MA), US +- [The Web Conference 2020](https://www2020.thewebconf.org/), 20-24 Apr 2020, Taipei, Taiwan +- [GopherCon Europe 2020](https://gophercon.berlin/), 23-26 Apr 2020, Berlin, Germany +- [Ethereal Summit New York 2020](https://www.etherealsummit.com/), 08-09 May 2020, New York (NY), US +- [Magical Crypto Conference](https://www.magicalcryptoconference.com/2020-nyc#countdown), 09-10 May 2020, New York (NY), US +- [Consensus 2020](https://www.coindesk.com/events/consensus-2020), 11-13 May 2020, New York (NY), US +- [csv,conf,v5](https://csvconf.com/), 13-14 May 2020, Washington, D.C., US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-081/README.md b/src/_blog/weekly-081/README.md new file mode 100644 index 00000000..2a1525bc --- /dev/null +++ b/src/_blog/weekly-081/README.md @@ -0,0 +1,85 @@ +--- +date: 2020-03-10 +url: /weekly-81/ +translationKey: ipfs-weekly-81 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 81 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Top highlights this week + +- **Late-breaking news:** js-ipfs to begin trialing a [Lerna-style monorepo](https://github.com/ipfs/js-ipfs/issues/2877) +- NEW! Explore the anatomy of a CID in [ProtoSchool’s newest tutorial](https://blog.ipfs.io/2020-03-04-protoschool-tutorial-anatomy-of-a-cid/) +- Discover how [Terminal.co + IPFS](https://blog.terminal.co/posts/Terminal+IPFS) = Web3 Deployment Simplified +- What’s the latest with **Textile Threads**? You know, the databases that run on IPFS with built-in support for decentralized applications, meaning multi-user, standardized encryption, and multi-protocol data exchange. [See what’s new right here!](https://blog.textile.io/textile-threads-progress-report-march-2020/) +- We love to see folks hacking on IPFS around the globe–truly decentralized! Check out [these members of the IPFS community](https://twitter.com/aeternity/status/1237030560444420098) from the [ækiti community](https://aekiti.com/) hacking on IPFS as a part of their workshop from Ekiti State, Nigeria. Kaabo! +- You’re going to want to read the first blog of the [Trusted WebAssembly Runtime on the IPFS series](https://medium.com/@pushbar/0-of-n-cover-letter-of-the-trusted-webassembly-runtime-on-ipfs-12a4fd8c4338). + +## People are building the coolest stuff with IPFS + +- [Bradbvry](https://bradbvry.now.sh/home): Web-based text editor that you truly own. Everything is encrypted with your private key and stored on IPFS. +- [ethoFS](https://ethofs.com/): Fully decentralized hosting platform that combines blockchain indexing technology and the IPFS to deliver decentralized content on-demand. +- [Play to Earn](http://www.playtoearn.online/): Decentralized editorial platform about blockchain games, hosted on IPFS. Read their latest on the [Tides of Magic open beta](https://medium.com/play-to-earn/tides-of-magic-launched-open-beta-6868a8d2fc05). +- [Qri](https://qri.io/): Global dataset version control system (GDVCS) built on the distributed web, a.k.a. “git for datasets” just shipped their largest release ever! [With v0.4.0](https://github.com/qri-io/desktop/releases/tag/v0.4.0), you can browse, search, & clone datasets all within the app! +- [Resume](https://github.com/denzuko/resume): Rename the result to a pdf, get a resume. rename to .jar and run get my website. Hosted on IPFS. +- [Temporal](https://temporal.cloud/): Creator of scalable IPFS infrastructure, recently shipped a preview of their forthcoming IPFS pinning service, [Playground](https://play2.temporal.cloud/). +- New community favorite [Terminal](https://terminal.co/) provides everything you need to launch and maintain fast, modern websites hosted on IPFS. Check out their [latest release update](https://blog.terminal.co/posts/Release-update-1). +- [Unstoppable Domains](https://unstoppabledomains.com/) just released [a Chrome browser extension](https://unstoppabledomains.com/extension) with built in support for IPFS! Enjoy surfing the decentralized web 🏄 +- [WebRun](https://github.com/RangerMauve/webrun): JavaScript environment that uses Web APIs with optional plugins for Dat and IPFS. + +## Recommended viewing + + +
+SourceCred: A Social Algorithm, by Dandelion Mane at SustainWeb3 + +## Check out our recent mentions + +- [Why the Internet is Falling Apart and the Need for IPFS](https://codeclimbing.com/why-the-internet-is-falling-apart-and-the-need-for-ipfs/), 09 Mar 2020 +- [Decentralized storage: the foundation of the Internet of Value](https://www.criptonoticias.com/redes-protocolos/almacenamiento-descentralizado-base-internet-valor/), 08 Mar 2020 +- [Additional Notes After IPFS Weekly Call](https://blog.aira.life/additional-notes-after-ipfs-weekly-call-87111f10e8bd), 06 Mar 2020 +- Slides: [ENS beyond Ethereum](https://speakerdeck.com/makoto_inoue/ens-beyond-ethereum), 06 Mar 2020 +- [Blockchain Based Peer-Review Interfaces for Digital Medicine](https://www.frontiersin.org/articles/10.3389/fbloc.2020.00008/full), 05 Mar 2020 +- [Pushing Real Estate Data to the Chain](https://medium.com/realtplatform/pushing-real-estate-data-to-the-chain-98d8f1429e99), 5 Mar 2020 +- [Terminal.co + HelloWorld.html](https://blog.terminal.co/posts/terminal+helloWorld), 05 Mar 2020 +- [The Distributed Download by 3Box](https://medium.com/3box/the-distributed-download-11cef378cbcc), 03 Mar 2020 +- [What is IPFS? Interplanetary File System: Complete Beginner’s Guide](https://blockonomi.com/interplanetary-file-system/), 03 Mar 2020 + +## Check out Fission on the last IPFS Weekly Call + + +
+Yesterday, the folks from [Fission](https://blog.fission.codes/) joined the IPFS Weekly community call to share Fission’s app creation platform that decouples storage from apps, provides hosted services, and more. See the [slides from the full presentation here](https://talk.fission.codes/t/ipfs-weekly-community-call-fission-presenting/520), and check out [their blog post about it](https://blog.fission.codes/fission-on-the-ipfs-community-call/) too! + +Join us for [next Monday’s community call](https://github.com/ipfs/team-mgmt#-ipfs-weekly-call--formerly-known-as-ipfs-all-hands-call) when the [Terminal team](https://terminal.co/) will show us how to host your site or app on IPFS! + +## Job hunting? Work on IPFS! + +- [Backend Software Engineer](https://qri.io/jobs/job-backend-software-engineer): Work closely with the **Qri engineering team** to implement backend features that support the operation of both qri command-line and Qri Desktop. NYC or Remote. +- [Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to **libp2p** and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and **empowering engineering teams** to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote +- [Frontend Software Engineer](https://qri.io/jobs/job-frontend-software-engineer): Work closely with the **Qri engineering team** to build and maintain features on Qri Desktop, an open source Electron app written with TypeScript, React, and Redux. NYC or Remote +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for **the IPFS community**, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef): Tackle some of **IPFS’s highest priority initiatives** using flexible problem solving abilities. Also responsible for identifying the project’s most important problems, structuring them, and collaborating with cross-functional teams to come to a solution. Protocol Labs, Remote +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268): Help write clear specifications for libp2p, and thus aid in new languages being able to **implement the libp2p specs** correctly. Protocol Labs, Remote +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6), Experienced in distributed systems design and implementation? Join our full-time open-source team where we value experience independently designing and **implementing significant components of complex systems**, and the execution focus and discipline to carry projects to completion. Protocol Labs, Remote + +## Join the community at these upcoming events + +- [The Web Conference 2020](https://www2020.thewebconf.org/), 20-24 Apr 2020, Taipei, Taiwan +- [GopherCon Europe 2020](https://gophercon.berlin/), 23-26 Apr 2020, Berlin, Germany +- [Ethereal Summit New York 2020](https://www.etherealsummit.com/), 08-09 May 2020, New York (NY), US +- [Magical Crypto Conference](https://www.magicalcryptoconference.com/2020-nyc#countdown), 09-10 May 2020, New York (NY), US +- [Consensus 2020](https://www.coindesk.com/events/consensus-2020), 11-13 May 2020, New York (NY), US +- [csv,conf,v5](https://csvconf.com/), 13-14 May 2020, Washington, D.C., US + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-082/README.md b/src/_blog/weekly-082/README.md new file mode 100644 index 00000000..1104afaa --- /dev/null +++ b/src/_blog/weekly-082/README.md @@ -0,0 +1,101 @@ +--- +date: 2020-03-24 +url: /weekly-82/ +translationKey: ipfs-weekly-82 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 82 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Using IPFS to fight COVID-19 + +Here are some ways people in the dweb space are responding to the COVID-19 pandemic with their skills. + +- BOUNTY: [Create Collaborative Cluster for all CORD-19 datasets](https://github.com/ipfs/ipfs-cluster/issues/1021) +- Tracking real-time COVID-19 & SARS-CoV-2 outbreak stats [over libp2p & IPFS](https://medium.com/temporal-cloud/real-time-covid-19-sars-cov-2-outbreak-stats-over-libp2p-ipfs-75972c9afa7) +- NEWS: [InterPlanetary File System Is Uncensorable During Coronavirus News Fog](https://www.coindesk.com/interplanetary-file-system-is-uncensorable-during-coronavirus-news-fog) +- NEWS: [A Chinese doctor posts a video about COVID-19 on IPFS after multiple takedowns on social media.](https://www.reddit.com/r/Coronavirus/comments/fjmfvv/a_chinese_doctor_posts_a_video_about_covid19_on/) +- **Want to jump in and help?** New projects are added daily to [Help with COVID-19](https://helpwithcovid.com/). +- **Want to help, but not sure where to start?** Help keep people healthy by keeping them fed, [stateside](https://www.feedingamerica.org/) and [abroad](https://www.care.org/). + +## Top highlights this week + +- **2 NEW LANGUAGES join the IPFS ecosystem!** Learn about [Rust IPFS](https://blog.ipfs.io/2020-03-18-announcing-rust-ipfs/), and check out their call for contributors. [Wolfram Lang also added IPFS support](https://writings.stephenwolfram.com/2020/03/in-less-than-a-year-so-much-new-launching-version-12-1-of-wolfram-language-mathematica/#external-connectivity), which is a huge win for making manipulation over distributed datasets much easier. +- **NEW RELEASE:** Testground, although still experimental, is making headway in [its latest release](https://github.com/ipfs/testground/releases/tag/v0.3.0) focused on observability and robustness. +- **NEW TUTORIAL:** [Nim-libp2p Tutorial: A Peer-to-Peer Chat Example 1](https://our.status.im/nim-libp2p-tutorial-chat/) +- Did you want a list of all the ietf RFCs available on IPFS? Well, [here you go](https://gateway.temporal.cloud/ipfs/QmbmXg966neztdEh7G7cDd44R7V7StnTFvjPkKMWe7QCZJ)! +- **NEW PAPER:** [Decentralized Security Bounty Management on Blockchain and IPFS](https://www.unlv.edu/news/accomplishments/alex-hoffman-eric-becerril-blas-and-yoohwan-kim), by Alex Hoffman, Eric Becerril-Blas, and Yoohwan Kim +- Missed the IPFS Weekly call? [Watch the video here](https://www.youtube.com/watch?v=08zD9L3hBLg&feature=emb_logo) and learn all about how connecting the Metaverse with IPFS! + +## Running an old version of go-ipfs prior to 0.4.20? + +The upcoming go-ipfs 0.5 release includes write coalescing patches, which will trigger an old (long fixed) bug in secio which may cause nodes to panic! Upgrade ASAP or [get in touch](mailto:newsletter@ipfs.io)! + +## People are building the coolest stuff with IPFS + +- Introducing, the latest from Pinata, [IPFS Regions and Replications](https://medium.com/pinata/ipfs-regions-and-replications-a1e52d60dfdb)! Now Pinata allows you to replicate your content on multiple nodes and in multiple regions. +- [Next Dapp](https://next-dapp.warashibe.market/) is a web framework aimed at progressively connecting web 2.0 with 3.0. +- [The Ceramic Protocol](https://medium.com/ceramic/introduction-to-the-ceramic-protocol-8d56951ae3f) from 3Box, is a new protocol that serves as a universal routing layer for storing decentralized identifiers (DIDs) and their associated metadata, data schemas, policies for usage of web services, access control permissions, and other documents that collectively enable boundless interoperability between an ecosystem of connected wallets, applications, databases, and services. +- Learn [how to deploy a GatsbyJS site onto IPFS with Terminal](https://blog.terminal.co/posts/Gatsby-Terminal). +- [Hactar](https://www.hactar.app/) provides analytics for your Filecoin miner nodes. +- [What exactly can you build with 3Box?](https://medium.com/3box/what-you-can-build-with-3box-216bcef0a71c) Check out this list of ideas, including some on how to help with the COVID-19 response. +- The folks at [cyber.page](https://cyber.page/) have successfully embedded an IPFS node into their app and can deliver content directly from a p2p network! Now you can cyberlink any local file and it will immediately become available for search worldwide! + +## Recommended viewing + + +
+Learn how IPFS addresses content (CIDs) and what goes into a content address in IPFS from project lead, Molly Mackinlay.  + +## Check out our recent mentions + +- [Working from home, with Hut34](https://hut34project.substack.com/p/working-from-home-with-hut34), 23 Mar 2020 +- [Decentralised web apps: How to Deploy your web app onto IPFS with Terminal](https://dev.to/atharva3010/decentralised-web-apps-how-to-deploy-your-web-app-onto-ipfs-with-terminal-284p), 22 Mar 2020 +- [IPFS:🦠Pandemic resilient infrastructure](https://dev.to/adaptive/ipfs-pandemic-resilient-infrastructure-5aap), 19 Mar 2020 +- [We need to serve the Internet offline](https://medium.com/offline-camp/we-need-to-serve-the-internet-offline-c67b35f9f388), 17 Mar 2020 +- [Build Your First Dapp on Tezos](https://medium.com/coinmonks/build-your-first-dapp-on-tezos-270c568d4fe9), 17 Mar 2020 +- [The IPFS Holy Grail Part 1: A More Secure and Efficient Internet](https://codeclimbing.com/the-ipfs-holy-grail-part-1-a-more-secure-and-efficient-internet/), 16 Mar 2020 +- [How to Deploy a Wordpress Website onto IPFS](https://blog.terminal.co/posts/wordpress+terminal), 16 Mar 2020 +- [IndexChain: The Decentralized Application Platform](https://medium.com/digital-notice-media-labs/indexchain-the-decentralized-application-platform-review-7556849e6369), 14 Mar 2020 +- [Data Privacy in the Time of Data Breaches: How Blockchain Strengthens Data Privacy](https://medium.com/@AxelUnlimited/data-privacy-in-the-time-of-data-breaches-how-blockchain-strengthens-data-privacy-axel-blog-e973b0d22f93), 11 Mar 2020 +- [How to deploy a Censorship Resistant Website for FREE](https://www.idiwork.com/how-to-deploy-a-censorship-resistant-website-forfree/), 10 Mar 2020 +- [Trust projects thanks to PMPeople](https://blog.pmpeople.org/confiar-en-los-proyectos-gracias-a-pmpeople/), 10 Mar 2020 +- [DApp’s pipeline (IPFS + ENS)](https://medium.com/coinmonks/dapps-pipeline-ipfs-ens-cbb4f2de15c2), 10 Mar 2020 +- VIDEO: [Building a P2P blog with Ethereum, IPFS, and TypeScript](https://www.youtube.com/watch?v=_tfmKqNW8nw), 09 Mar 2020 +- [Thick Clients, Thin Servers aka Web3](https://medium.com/@lawrencelundybryan/thick-clients-thin-servers-aka-web3-9851fb29518f), 09 Mar 2020 +- VIDEO: [Using dtube to upload decentralized video](https://www.youtube.com/watch?v=Js1Xkv65Kts), 27 Feb 2020 + +## IPFS en español + +Looking for tips or tutorials on IPFS in Spanish? Check out these community resources. + +- [IPFS, un nuevo protocolo P2P para una web permanente](https://www.redeszone.net/2015/10/13/ipfs-un-nuevo-protocolo-p2p-para-una-web-permanente/), escrito por Rubén Velasco +- [Cloudflare se vuelve InterPlanetario - Presentamos la puerta de enlace IPFS de Cloudflare](https://translate.google.com/translate?sl=auto&tl=es&u=https%3A%2F%2Fblog.cloudflare.com%2Fdistributed-web-gateway%2F), escrito por Andy Parker +- [Sistema de Archivos Interplanetario (IPFS): descentralizar Internet no parece una Misión Imposible](https://bitcoin.es/actualidad/sistema-de-archivos-interplanetario-ipfs-podra-descentralizar-internet-imposible/#IPFS_en_homenaje_a_Internet), escrito por Abelardo Madrid + +## Quote of the week + + + +## Job hunting? Work on IPFS! + +- [Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef): Tackle some of IPFS’s highest priority initiatives using flexible problem solving abilities. Also responsible for identifying the project’s most important problems, structuring them, and collaborating with cross-functional teams to come to a solution. Protocol Labs, Remote +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268): Help write clear specifications for libp2p, and thus aid in new languages being able to implement the libp2p specs correctly. Protocol Labs, Remote +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6): Experienced in distributed systems design and implementation? Join our full-time open-source team where we value experience independently designing and implementing significant components of complex systems, and the execution focus and discipline to carry projects to completion. Protocol Labs, Remote +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote +- [Technical Product Manager, 3Box](https://jobs.lever.co/3box/6c68f7ec-a4b4-48ab-9d77-6500e36351e7): Own the delivery of new technical products and features across the 3Box suite of developer APIs, SDKs, and plugins, and manage the onboarding, engagement and partnership activities to ensure a thriving community and network. 3Box, NYC, Berlin, or Remote + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-083/README.md b/src/_blog/weekly-083/README.md new file mode 100644 index 00000000..e9c75f86 --- /dev/null +++ b/src/_blog/weekly-083/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-03-31 +url: /weekly-83/ +translationKey: ipfs-weekly-83 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 83 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +![IPFS built-in to Opera for Android](/img/086-ipfs-in-opera-for-android/opera-android-banner.png) + +## IPFS in Opera for Android + +IPFS support in the Opera web browser has been in development for some time. Today, Opera for Android 57 is live in the Google Play Store with default support for IPFS! [Read all about it on the IPFS blog](https://blog.ipfs.io/2020-03-30-ipfs-in-opera-for-android/). + +## Using IPFS to fight COVID-19 + +Here are some ways people in the dweb space are responding to the COVID-19 pandemic with their skills. + +- Protocol Labs is committing \$200,000 to an accelerated grants program supporting open innovation efforts contributing to improved technical solutions around testing, treatment, mitigation, and prevention of COVID-19 and future epidemics. Apply for their [COVID-19 Open Innovation Grants here](https://protocollabs.smapply.io/prog/covid-19_open_innovation_grants/). +- [SafeTrace: Privacy-Preserving Contact Tracing for COVID-19](https://blog.enigma.co/safetrace-privacy-preserving-contact-tracing-for-covid-19-c5ae8e1afa93) +- Take a look at [16 Ways Coronavirus May Change the Way We Look at the World](https://singularityhub.com/2020/03/25/16-ways-coronavirus-may-change-the-way-we-look-at-the-world/) +- This COVID 19 Contact Tracing Network using Mobile Apps is powered by BLE, IPFS, Ethereum, ZKP Protocols. Learn more about [Cyanaura-Apps](https://github.com/EPICKnowledgeSociety/Cyanaura-Apps). +- [Why might Berty allow the new forms of micro-local cooperation facing COVID-19?](https://berty.tech/blog/covid-local-cooperation/) +- Good read: [3 Coping Strategies for Programmers in Quarantine](https://dev.to/mlimonczenko/3-coping-strategies-for-programmers-in-quarantine-1g59) + +## 🎉 Ethereum now hosts their site on IPFS 🎉 + +Late breaking news: The [Ethereum.org website](https://ethereum.org) is now hosted on IPFS and accessible via ENS at ethereum.eth. This was made possible by the hard work of one Chris Waring’s inventive use of [VuePress plugins](https://github.com/cwaring/vuepress-plugin-ipfs). Check it out! + +## Top highlights this week + +- Pinata explains [“What is an IPFS Pinning Service?”](https://medium.com/pinata/what-is-an-ipfs-pinning-service-f6ed4cd7e475) +- Unstoppable Domains launches [Opera support](https://unstoppabledomains.com/opera) +- NEW TUTORIAL: [Backup Your iOS Devices to a Private IPFS Node](https://codyhatfield.me/2020/03/backup-your-ios-devices-to-a-private-ipfs-node/) +- Learn about [All the Ways You Can Surf the Decentralized Web Today](https://medium.com/the-ethereum-name-service/all-the-ways-you-can-surf-the-decentralized-web-today-bf8e7a42fa27) +- Another NEW TUTORIAL: [IPFS and Docker](https://www.chevdor.com/post/2020-03-docker-ipfs/) +- Check out [A People’s Guide to IPFS](https://blog.terminal.co/posts/Guide-IPFS), a fantastic guide from Terminal + +## People are building the coolest stuff with IPFS + +- Meet [FLEEK](https://fleek.co/), the new & improved way to deploy web projects formerly known as Terminal! +- Textile shares their [Filecoin tools progress update](https://blog.textile.io/filecoin-tools-progress-update-26-march/) +- [Filplorer](https://filplorer.com/) - Powered by IPFS 💪 +- [Berty is opening its code!](https://berty.tech/blog/open-source/) +- [Galacteek (browser) v0.4.20](https://discuss.ipfs.io/t/galacteek-browser-v0-4-20-release/7582) was recently released +- Learn about the [Ravenland IPFS Network](https://medium.com/@ravenlandpush/getting-to-know-the-ravenland-ipfs-network-37c9b9f4349f) + +## Catch up on yesterday’s IPFS Weekly Call + + + +## Check out our recent mentions + +- [Opera Supports Blockchain Domain Names Natively](https://medium.com/play-to-earn/opera-supports-blockchain-domain-names-natively-8849ed9617d0), 30 Mar 2020 +- [InterPlanetary File System (IPFS): Re-architecting the Internet](https://blog.verbat.com/interplanetary-file-system-rearchitecting-internet/), 30 Mar 2020 +- [A comprehensive guide to accessing the new web (Web3, IPFS, ENS)](https://www.reddit.com/r/ipfs/comments/fojkpf/a_comprehensive_guide_to_accessing_the_new_web/), 25 Mar 2020 +- VIDEO: [Learning how to use Implement File System (IPFS) and how to store files (images, PDFs, etc) on the blockchain and retrieving files on our Library æpp](https://www.youtube.com/watch?v=Ms48q_gVMiM), 24 Mar 2020 +- [Working remotely: 8 essential software tools and their Web3 cousins](https://decrypt.co/23345/working-remotely-8-essential-software-tools-and-their-web3-cousins), 23 Mar 2020 +- [Mindsync: Our vision and mission](https://medium.com/mindsync-ai/our-vision-and-mission-da68980b42b5), 21 Mar 2020 + +## Job hunting? Work on IPFS! + +- [Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef): Tackle some of IPFS’s highest priority initiatives using flexible problem solving abilities. Also responsible for identifying the project’s most important problems, structuring them, and collaborating with cross-functional teams to come to a solution. Protocol Labs, Remote +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268): Help write clear specifications for libp2p, and thus aid in new languages being able to implement the libp2p specs correctly. Protocol Labs, Remote +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6): Experienced in distributed systems design and implementation? Join our full-time open-source team where we value experience independently designing and implementing significant components of complex systems, and the execution focus and discipline to carry projects to completion. Protocol Labs, Remote +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote +- [Technical Product Manager, 3Box](https://jobs.lever.co/3box/6c68f7ec-a4b4-48ab-9d77-6500e36351e7): Own the delivery of new technical products and features across the 3Box suite of developer APIs, SDKs, and plugins, and manage the onboarding, engagement and partnership activities to ensure a thriving community and network. 3Box, NYC, Berlin, or Remote + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-084/README.md b/src/_blog/weekly-084/README.md new file mode 100644 index 00000000..6dab7d87 --- /dev/null +++ b/src/_blog/weekly-084/README.md @@ -0,0 +1,156 @@ +--- +date: 2020-04-08 +url: /weekly-84/ +translationKey: ipfs-weekly-84 +tags: weekly +title: IPFS Weekly Q1 2020 Recap 🎉 +description: +author: Jenn Turner +--- + +## Celebrate Q1 in the IPFS Community + +A quick look back at what we accomplished together in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## January! A new year 🎉 + +**The new IPFS Docs beta went live** +IPFS now has documentation that is redesigned, with a simple, clean interface, has better navigation, and most importantly, reintroduced a key feature: the search functionality. [Read about it on the blog](https://blog.ipfs.io/2020-01-07-ipfs-docs-beta/). + +**Collaborative clusters are here** +The first set of [public collaborative clusters](https://blog.ipfs.io/2020-01-09-collaborative-clusters/) and the first iteration of the clusters site went live this month. For full documentation on how to set up and operate clusters, see cluster.ipfs.io/documentation. + +**go-ipfs 0.4.23 was released 🚢** +Just a small, [tidy patch release](https://blog.ipfs.io/2020-01-30-go-ipfs-0-4-23/) with some critical fixes before 0.5.0 ships. + +**ipfs-update got an update!** +Your favourite tool for updating go-ipfs got a [shiny new update](https://dist.ipfs.io/#ipfs-update) of its own. Windows users should like it a lot. + +## February! The plot thickens 🤔 + +**The Async Await Refactor and Other Big Refactors appear on the horizon** +Fortunately, we pulled together a migration guide, as well as several explainers as to [the changes coming](https://blog.ipfs.io/2020-02-01-async-await-refactor/) and the [method for pulling them off](https://blog.ipfs.io/2020-02-06-big-refactors/). + +**js-libp2p 0.27 released 🚢** +The Async Await refactor [lands first in js-libp2p](https://blog.ipfs.io/2020-02-07-js-libp2p-0-27/). + +**IPFS goes to Denver!** +First, the IPFS community gathered, courtesy of Cryptorado, for the first [Decentralized Networks Summit](http://dnsummit.cryptorado.org/) to share our learnings and use cases. If you missed it, you can check out the [captured live stream here](https://www.youtube.com/watch?v=WG0dBSoDB1A&feature=youtu.be). + +Second, several of our favorite collaborators and a few of the IPFS team made it to [ETHDenver](https://blog.ipfs.io/2020-02-07-ethdenver-2020/), where approximately [half of the hackathon participants used IPFS](https://twitter.com/momack28/status/1230717064425328640), including 3 of the winners. + +**The IPFS Roadmap for 2020** +[Content Routing becomes our North star](https://blog.ipfs.io/2020-02-10-our-focus-for-2020/), but that’s not all! Plus, check out the awesome diagram of our ecosystem. + +**js-ipfs 0.41.0 released 🚢** +The Async Await refactor finally [lands in js-ipfs internals](https://blog.ipfs.io/2020-02-13-js-ipfs-0-41/), the result of a huge refactor, and cause for much celebration! + +**Our collaboration with Netflix leads to new improvements to IPFS Bitswap** +Our mission—[a container distribution challenge Netflix wanted to address](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/)—how to efficiently pull container images in a large scale, multi-region environment. But how? + +**Fleek debuts as the easiest way to build, deploy, and host websites & apps on IPFS** +Formerly Terminal, [Fleek](https://fleek.co/) arrives on the scene to provide everything you need to build fast modern websites hosted on IPFS. [See their many tutorials](https://blog.fleek.co/) ranging from using Jekyll to Wordpress, Next.js and more! + +**Berty releases gomobile-ipfs 📱** +Finally, a library that aims to provide packages for Android, iOS, and React-Native that allow one to run and use an IPFS node on mobile devices. [Read the full announcement here](https://berty.tech/blog/go-mobile-ipfs). + +**Textile ships Buckets: simple, dynamic data storage and management for IPFS** +[Built with IPFS and Threads](https://blog.textile.io/first-look-at-textile-buckets-dynamic-ipfs-folders/), Buckets provides users with simple to use, interoperable, and dynamic data folders shared over IPFS. Plus a few magical features. ✨ + +**Fission begins testing a Discourse IPFS Plugin** +Add [a Discourse forum plugin](https://talk.fission.codes/t/testing-discourse-ipfs-plugin/482) to use IPFS to store files, using the Fission web API. + +**Temporal launches S3 ontop of IPFS** +This new functionality allows you to do things like stream video on IPFS, host a dynamic website, or even build an FTP server on top of IPFS. For a more complete list of endless possibilities, [check out the announcement](https://medium.com/temporal-cloud/introducing-s3x-endless-ipfs-dynamic-possibilities-stream-videos-host-dynamic-websites-f0072127070f). + +## March! Rising to the challenge 💪 + +**Explore the anatomy of a CID in ProtoSchool’s latest tutorial** +Also new, the snazzy icons and toggle which make it easy to find non-coding content on ProtoSchool, including the new multiple-choice [Anatomy of a CID tutorial](https://blog.ipfs.io/2020-03-04-protoschool-tutorial-anatomy-of-a-cid/). + +**Testground v.02 ships 🚢** +Learn all about Testground's goal of providing a set of tools for testing next generation P2P applications (i.e. Filecoin, IPFS, libp2p & others), as well as [their mission and roadmap](https://twitter.com/raulvk/status/1234934825448091664). + +**Qri shipped their biggest release ever!** +[qri-desktop 0.4.0 launches](https://github.com/qri-io/desktop/releases/tag/v0.4.0) a whole slew of new features & many bugs squashed. You can now browse, search, & clone datasets all within the app! + +**The Unstoppable Extension goes live in the Chrome Browser** +[With their latest feature](https://twitter.com/unstoppableweb/status/1235604851603566592), you can surf the dweb in two simple steps! + +**The effort to merge repos begins** +The js-ipfs team began trialing [a Lerna-style monorepo](https://github.com/ipfs/js-ipfs/issues/2877) to alleviate the confusion over the volume of repos necessary to pull in. It’s going to take some time, but it will be worth it. 😅 + +**IPFS Regions and Replications launched by Pinata** +For users looking for more speed and extra redundancy, Pinata now allows you to [replicate your content on multiple nodes and in multiple regions](https://medium.com/pinata/ipfs-regions-and-replications-a1e52d60dfdb). Making decentralization easier every day! + +**Rust IPFS arrives on the scene** +Active full-time work on a Rust-IPFS implementation has commenced, building on the great work from rust-libp2p. [Check out how you can contribute right here](https://blog.ipfs.io/2020-03-18-announcing-rust-ipfs/)! + +**And the very next day, Wolfram Lang support!** +Stephen Wolfram announces in [Version 12.1 of Wolfram Language & Mathematica](https://writings.stephenwolfram.com/2020/03/in-less-than-a-year-so-much-new-launching-version-12-1-of-wolfram-language-mathematica/) that support for external filesystems, specifically IPFS, was added. + +**Introducing the Ceramic Protocol** +Due to its [hybrid design relying on IPFS/IPLD](https://medium.com/ceramic/introduction-to-the-ceramic-protocol-8d56951ae3f) and various blockchains, Ceramic’s document graph is interoperable, scalable, permissionless, and low cost and we’re very excited about it. + +**IPFS lands in Opera for Android** +As we recently mentioned, [IPFS landing, enabled by default, right out of the box](https://blog.ipfs.io/2020-03-30-ipfs-in-opera-for-android/), in a production release of a major web browser was **a big deal** for us. + +**You can now host your Gatsby and Vue apps with IPFS** +Thanks to the hard work on some crucial plugins, you can now [host your Gatsby and Vue apps on IPFS](https://twitter.com/daviddias/status/1245199748849598470) easily with the path converter plugins. + +## Also new this quarter... + +- The [IPFS DevGrants beta](https://github.com/ipfs/devgrants) was successfully launched, resulting in 5 paid out bounties, 5 more in progress, and 6 grant approvals, most of which are still in progress. Discover how you can get paid to help build IPFS. ⚒ +- We spent some time in Q1 doing a deep dive on where people are talking about IPFS and how we can reach and serve them better. You can learn more here about the Information Ecosystem Audit and its findings, [on our community repo](https://github.com/ipfs/community/tree/master/ecosystem-audit). +- [playwright-test](https://github.com/hugomrdias/playwright-test) now allows you to run Mocha, zora, Tape and Benchmark.js scripts inside real browsers +- [stardust in js-libp2p](https://github.com/libp2p/js-libp2p-stardust) shipped! +- IPFS Desktop began [supporting Mac OS X Catalina](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.10.4). + +Keep up the great work team! We can’t wait to see what happens in the next few months. 🎉 + +## Check out the community 🌟 all stars 🌟 who joined us for the IPFS Weekly calls + + + +

+Each Monday the IPFS Community gathers at 5pm UTC to share a new story about what people are doing with our favorite filesystem. In the past few months, we’ve had guests from Dapp Node, Infura, Robonomics, Qri, Fission, Fleek (formerly Terminal), Textile, Pinata, and others join us.

+ +Next quarter we’ll have talks from Berty, EDGI, Unstoppable Domains, Anytype, Microsoft and more! Catch up on [this past quarter’s community calls here](https://www.youtube.com/playlist?list=PLuhRWgmPaHtSGRSHdU9dbsukHKlihZZAe), and we’ll see you on Monday! + +## Great reads about IPFS from Q1 👇 + +- [IPFS Emerges as Tool to Distribute Container Images](https://containerjournal.com/topics/container-management/ipfs-emerges-as-tool-to-distribute-container-images/): “contributors added a new way to fetch blocks to the Bitswap protocol that cut transfer time in half for benchmarked use cases around container distribution. In the previous version of Bitswap, it took on average 9.08 seconds to pull a 300 MiB image to 32 leeching peers. The optimized branch brought this down to 3.16 seconds—20% faster than DockerHub (3.93 seconds).” +- [Decentralized Website, How to host a personal website on IPFS](https://lpfann.me/post/decentralized-site/): “IPFS introduced an address scheme for content and also the exchange of information using peer to peer networking without a central server. People using the IPFS application automatically act as servers for other peers when they have information another node needs.” +- [What’s IPFS and how it can change the Internet](https://medium.com/natix-io/whats-ipfs-and-how-it-can-change-internet-161239bc69ec): “IPFS is designed to fix HTTP problems and moves the internet towards the permanent web. A web that contents are stored permanently and no single entity controls or owns all of the data.” +- [How to deploy a Censorship Resistant Website for FREE](https://www.idiwork.com/how-to-deploy-a-censorship-resistant-website-forfree/): “I believe in free and open internet and to help keep it that we’re going to learn how to deploy a censorship-resistant static website in just a few minutes with a few free tools. To achieve censorship resistance we’re going to use IPFS (Interplanetary File System) a distributed system for storing and accessing files, websites, and data.” +- [IPFS and Docker](https://www.chevdor.com/post/2020-03-docker-ipfs/): “With IPFS, you can share files without the need for a centralized product such as Dropbox, Google Drive and Co. That means that you need no account, you have no size or bandwidth limits…​It makes sharing files convenient and very secure.” + +## Videos to bookmark (for rewatching, of course) + +Face it, you’ve got the time. Enjoy! 🍿 + +- [How to use IPFS and how to store files](https://www.youtube.com/watch?v=Ms48q_gVMiM), via æternity Ekiti +- [Bring Your Own Data: A New Model for an Interoperable dWeb](https://www.youtube.com/watch?v=DpRaxjIiYew), via Carson Farmer +- [The Path to Peer-to-Peer Matrix](https://fosdem.org/2020/schedule/event/dip_p2p_matrix/), via Matthew Hodgson +- [Document Exchange Verification System on Ethereum Blockchain using IPFS](https://www.youtube.com/watch?v=UdhsNYHQfis), via Rumeel Hussain +- [Making IPFS Work For You](https://www.youtube.com/watch?v=9tbhRy7fJvQ), via Matt Ober + +## Coming up next in 2020 + +So what’s next for IPFS? Content Routing is still our major focus for 2020, if you recall [from the roadmap](https://blog.ipfs.io/2020-02-10-our-focus-for-2020/), and we’re very motivated by the progress our team, as well as our contributor community, has made over the past few months. + +Much bigger things are right around the corner, but more about that later. We’ve also invested quite heavily in the IPFS ecosystem, having created these working groups: + +- **Browsers & Connectivity**: Maximize availability & connectivity of IPFS on the web +- **Collabs & Community**: Support IPFS users and grow new opportunities through research, collaborations and community engagement +- **Developer Experience & Maintainership**: Support the IPFS technical community through documentation, contributor experience, API ergonomics and tooling + +The evidence of these groups’ progress is listed above, with much more in store this quarter. 😎 + +If you’d like to get involved, check out our [contribution guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) and come to [IPFS Office Hours](https://github.com/ipfs/community/issues?utf8=%E2%9C%93&q=label%3A%22%F0%9F%99%8C%F0%9F%8F%BD+IPFS+Weekly+Call%22+) to get pointers on where to start! + +**Please take care of yourselves and each other.** ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us](mailto:newsletter@ipfs.io). + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-085/README.md b/src/_blog/weekly-085/README.md new file mode 100644 index 00000000..458e6d62 --- /dev/null +++ b/src/_blog/weekly-085/README.md @@ -0,0 +1,89 @@ +--- +date: 2020-04-14 +url: /weekly-85/ +translationKey: ipfs-weekly-85 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 85 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## ProtoSchool explores the Async Iterables returned by js-ipfs 0.41 + +The recent release of js-ipfs 0.41 introduced a huge async/await refactor, and the breaking changes were no joke! The affected ProtoSchool tutorials have been updated to reflect the recent changes, highlighting which js-ipfs methods now return Async Iterables and how you can use /for await…of/ loops or alternative helper modules to work with them. + +Check out the updated content in our [Mutable File System (MFS)](https://school.us4.list-manage.com/track/click?u=41e9e493c56c3865870435d91&id=d160d74ae0&e=28ddac0f86) and [Regular Files API tutorials](https://school.us4.list-manage.com/track/click?u=41e9e493c56c3865870435d91&id=b1b4d385be&e=28ddac0f86), then check out the updated event submission process for local leaders to list virtual workshops on ProtoSchool’s [events page](https://proto.school/#/events)! + +## Latest launches 🚀 + +- [Multiple versions of aegir](https://github.com/ipfs/aegir/compare/v21.4.5...v21.8.1) shipped with some nice developer experience improvements like testing helpers (echo server, for example), get free port and more. Also hooks can now forward environment vars to the test runners. +- Shipped [ipfsd-ctl](https://github.com/ipfs/js-ipfsd-ctl/compare/v3.0.0...v3.1.0) with better docs, less node globals and other minors improvements +- The [pubsub discovery module](https://github.com/libp2p/js-libp2p-pubsub-peer-discovery) was released +- NodeFactory released [libp2p-noise](https://github.com/NodeFactoryIo/js-libp2p-noise) last week. Yay, handshakes all around! 🤝 +- Lastly, the [IPFS Distributions website](https://dist.ipfs.io/) got a fun IPFS rebrand! Enjoy! + +## Using IPFS to fight COVID-19 + +Here is a followup to our bounty for creating a CORD-19 dataset: + +We now have a **CORD-19 collaborative cluster dataset**, but it won’t be useful if the people that should use it don’t know that they can access this content from the IPFS network! + +Please share it freely: https://ipfs.io/ipfs/Qme2F949GSfupReGPMKJ4EQTGi9hzzUcsJvRS1Mr8YVNzQ + +## Meet Fleek + +Not only did our friends at Terminal do an entire platform rebrand to become **[Fleek](https://fleek.co/)**, but they’ve been busy churning out new features at the same time! [Check out their latest announcement](https://blog.fleek.co/posts/Fleek-Release-Update-UI-Rebrand) detailing their user interface rebrand, an introduction to the Teams feature, and new fan favorite: Framework Auto Detection. + +## Top highlights this week + +- [Brave Launches Origin-Powered Store](https://brave.com/brave-launches-new-swag-store-powered-by-origin/) +- [Pinata](https://pinata.cloud/) asks, [“Who Is Responsible for NFT Data?”](https://medium.com/pinata/who-is-responsible-for-nft-data-99fb4e8147e4) 🤔 +- Since there wasn’t one, @mborho wrote [a Terraform provider for IPFS](https://github.com/mborho/terraform-provider-ipfs)! +- Have you watched this video on [Decentralized React states - using IPFS to sync, store, and recover state](https://codetalks.tv/talk/decentralized-react-states-using-ipfs-to-sync-store-and-recover-state-andrew-hill-wnnkaqparmq) from Andrew Hill [of Textile](https://textile.io/)? Because you should. +- Check out the video from the [Open Tech Will Save Us](https://matrix.org/open-tech-meetup/) meetup, featuring talks on IPFS, Matrix, and Jitsi + +## People are building the coolest stuff with IPFS + +- [Crust](https://medium.com/@crustnetwork/crust-decentralized-cloud-d61afbcdbfb6) implements the incentive layer protocol for decentralized storage with adapting to multiple storage layer protocols including IPFS, and provides support for the application layer. +- [Energy Web Chain’s DID Library](https://medium.com/energy-web-insights/ewfs-did-library-is-open-source-1f355c95503e) is now open-source. +- [Fetch.ai Agent Framework v0.3](https://medium.com/fetch-ai/fetch-ai-agent-framework-v0-3-the-collaborative-communications-and-smart-contract-release-745d0129fe68): The collaborative, communications and smart contract release, built with IPFS +- The latest from [Fission](https://fission.codes/): [Fear and Loathing and IPFS file metadata tricks](https://talk.fission.codes/t/fear-and-loathing-and-ipfs-file-metadata-tricks/577) +- Use Infura as the bridge between the Ethereum network and your application to build your own API to [invoke Compound protocol smart contracts](https://medium.com/compound-finance/compound-ethereum-api-with-infura-1f5c555fd4a2) using conventional HTTP requests. +- [The KyberWidget is now hosted on IPFS](https://twitter.com/KyberNetwork/status/1243198158932340736), meaning it can be used by anyone, anywhere in the world! +- [Qri CLI v0.9.7](https://github.com/qri-io/qri/releases/tag/v0.9.7) is huge. This release adds SQL support, turning Qri into an ever-growing database of open datasets. If that wasn’t enough, we’ve added tab completion, nicer automatic commit messages, unified our command descriptions, and fixed a whole slew of bugs! +- [Raw.chat](https://github.com/rodkeys/Rawchat): A censorship-resistant chat app using IPFS and libp2p/gossipsub. +- [Textile](https://textile.io/) gave us a [Threads progress report for 2020 April 7](https://blog.textile.io/textile-threads-progress-report-for-7-april/) 🎉 +- [Temporal](https://www.temporal.cloud/) decided to [kick things up a notch with their nodes](https://medium.com/temporal-cloud/nodes-w-built-in-replication-high-performance-security-consensus-free-6657ac9e44ea) to ensure support and performance for big data IPFS work loads. +- [Totem](https://totem.network/): Manage your files, crypto assets, 3Box profile and more! It is build on Ethereum and IPFS. The public beta launches soon! + +## Calls for contributors + +Come hack on [the OpenTelemetry Tracing for OrbitDB](https://github.com/orbitdb/opentelemetry-plugin-orbitdb). This, combined with the HTTP tracing in #IPFS could lead to some awesome metrics + tracing +observability on the distributed web. + +Calling all rustaceans, rustafarians, ferrosities, and rustlers! Community participation in [making Rust-IPFS a reality](https://blog.ipfs.io/2020-03-18-announcing-rust-ipfs/) is encouraged and welcomed! If you want to pitch in, [here are a few ways](https://github.com/ipfs-rust/ipfs-rust-conformance/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)! + +## Attend one of these exciting events from the comfort of your own home + +- [3rd ZK Proof Workshop](https://zkproof.org/events/workshop3/invite/): April-May 2020, Bringing together top researchers, developers and business practitioners to showcase the latest academic achievements and practical applications for ZKP privacy schemes. +- [ETHGlobal](https://medium.com/ethglobal/hackmoney-ethglobals-first-online-defi-hackathon-aa6e97815db0): 30 day virtual hackathon beginning 2020 Apr 24! Designed for hackers around the world to build DeFi applications. Apply now to participate! +- [Ethereal Virtual Summit](https://www.etherealsummit.com/): 2020 May 7-8, Join the first-ever virtual conference and experience a stellar collaboration of technologists, artists, startups, entrepreneurs, and investors engaging directly with the latest developments in Ethereum, blockchain, and decentralization. +- [Consensus Distributed](https://www.coindesk.com/events/consensus-2020?gclid=Cj0KCQiAyKrxBRDHARIsAKCzn8xTLzNy3u0cGN4s-gH5dpLxpeCQn8ufhFBlyZ3F4sXtd9ZF_azLQeYaApliEALw_wcB): 2020 May 11-15, Tune in for dozens of sessions across multiple tracks and days to better understand what the future might look like, especially in a post-COVID-19 era. It’s the same great content you’ve come to expect from Consensus, but virtual. + +## Job hunting? Work on IPFS! + +- [Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote +- [Technical Product Manager, 3Box](https://jobs.lever.co/3box/6c68f7ec-a4b4-48ab-9d77-6500e36351e7): Own the delivery of new technical products and features across the 3Box suite of developer APIs, SDKs, and plugins, and manage the onboarding, engagement and partnership activities to ensure a thriving community and network. 3Box, NYC, Berlin, or Remote + +**Take care of yourselves and each other.** ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-086/README.md b/src/_blog/weekly-086/README.md new file mode 100644 index 00000000..558c3b17 --- /dev/null +++ b/src/_blog/weekly-086/README.md @@ -0,0 +1,81 @@ +--- +date: 2020-04-21 +url: /weekly-86/ +translationKey: ipfs-weekly-86 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 86 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## The IPFS Mobile Design Research project + +The IPFS Mobile Design Research project started earlier this year, and recently Jim Kosem presented the goals, methodology and findings of his in-progress research into IPFS and p2p on mobile. Check out [the blog post](https://blog.ipfs.io/2020-04-10-ipfs-mobile-design-research/) and [the Local Offline Collaboration recording](https://youtu.be/Cg92MJY8swc?t=435) for more information. + +## Announcing the IPFS Pinning Summit + +On May 7-8, 2020, we are hosting the first-ever [IPFS Pinning Summit](https://ipfspinningsummit.com/), and we would love for you to attend! This virtual event is geared toward groups that provide pinning or other web/dweb infrastructure services. We plan to discuss the current state of distributed web infrastructure—including some of the challenges and operational lessons—and several exciting future opportunities (grants, integrations, potential new markets, etc). [Register to attend here](https://www.eventbrite.com/e/ipfs-pinning-summit-registration-102720606098). + +## Introducing the IPFS Grants Platform + +Earlier this week, the [IPFS Grants Platform was officially launched](https://blog.ipfs.io/2020-04-20-ipfs-grants-platform/). After a very successful pilot run in Q1, we are very excited to offer a platform for grants that help support and accelerate the ecosystem of developers building on IPFS, and contribute to our mission to create a resilient, upgradeable, open network to preserve and grow humanity’s knowledge. + +## Create NFTs with IPFS and Digital Art + +What do Non Fungible Tokens (NFTs) have to do with IPFS? [Pinata explains how these unique tokens](https://medium.com/pinata/ipfs-nfts-and-persistent-artwork-50a129587a36) create digital scarcity for digital artwork. Learn how artists (and creators more broadly) can use IPFS when minting NFTs. + +## Top highlights this week + +- Getting help for IPFS has never been easier: [ipfs.io/help/](https://ipfs.io/help/) +- Upload to IPFS Directly from the [ENS Manager with New Tool from Temporal Cloud](https://medium.com/the-ethereum-name-service/upload-to-ipfs-directly-from-the-ens-manager-with-new-tool-ac055db5d2fe) +- Check out this creative use of [IPFS to publish a restored audio version of Michel Foucault’s lessons](https://twitter.com/ploplachatte/status/1251080870410231808)! The most cited philosopher in the world whose audio lessons were previously closed, now live on IPFS. +- 1,000+ .crypto and 500+ .zil websites are now live on IPFS courtesy of [Unstoppable Domains](https://twitter.com/unstoppableweb/status/1250054498908807174) +- What’s in a CID? Multi, Multi, Multi…](https://codeclimbing.com/whats-in-a-cid-multi-multi-multi/) + +## People are building the coolest stuff with IPFS + +- Qri got a [new homepage design](https://qri.io/)! +- An in-depth guide to [reading and writing requests to the Ethereum blockchain](https://dzone.com/articles/ethereum-rpcs-methods-and-calls), using Infura. +- PODCAST: Michael Sena, of 3Box, appears on [Fork the Product](https://forktheproduct.com/episodes/026-michael-sena-3box/) podcast +- The test version of the [Tezos IPFS blog platform](https://www.connectez.cc/) is now available for testing and feedback. +- Learn how Numbers is using IPFS to give readers confirmation that [news sources are trustworthy and traceable](https://filecoin.io/blog/community-tammy-yang-bofu-chen-numbers/). +- [Berty, libp2p and Bluetooth Low Energy](https://berty.tech/blog/bluetooth-low-energy) +- Brave recently hosted a Guest AMA with [Matthew Liu & Nick Poulden of Origin](https://brave.com/guest-ama-with-origin/) +- The first go-ds-crdt user apart from IPFS Cluster is [officially RTrade](https://github.com/RTradeLtd/s3x/tree/v0.0.7)! + +## Quote of the week + + + +## Calls for contributors + +Unstoppable Domains launched a 💰bounty💰[to build a Decentralized Search Engine on IPFS](https://gitcoin.co/issue/unstoppabledomains/decentralized-websites/37/4215)! Submit by May 7. + +Resilient Networks Lab has two open RFPs for building next gen DHTs and P2P PubSub. Interested? [Apply and work on solving some of the Open Problems to scaling DWeb to billions of users](https://protocollabs.smapply.io/)! + +The Ceramic Protocol is looking for collaborators to work on [a Ceramic Explorer UI](https://twitter.com/ceramicnetwork/status/1251885021759246340). + +## Coming up next for IPFS + +- Work is currently being done on a [Git Remote Helper to Push/Fetch from IPFS](https://github.com/dhappy/git-remote-ipfs) +- Good news for the [new 0.5.0 release candidate](https://twitter.com/Tyke_Riley/status/1251276411828084738) +- [New labeling standards are coming](https://github.com/ipfs/community/blob/master/ISSUE_LABELS.md) to the IPFS org in GitHub! + +## Job hunting? Work on IPFS! + +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote +- [Technical Product Manager, 3Box](https://jobs.lever.co/3box/6c68f7ec-a4b4-48ab-9d77-6500e36351e7): Own the delivery of new technical products and features across the 3Box suite of developer APIs, SDKs, and plugins, and manage the onboarding, engagement and partnership activities to ensure a thriving community and network. 3Box, NYC, Berlin, or Remote +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef): Tackle some of IPFS’s highest priority initiatives using flexible problem solving abilities. Also responsible for identifying the project’s most important problems, structuring them, and collaborating with cross-functional teams to come to a solution. Protocol Labs, Remote +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268): Help write clear specifications for libp2p, and thus aid in new languages being able to implement the libp2p specs correctly. Protocol Labs, Remote +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6): Experienced in distributed systems design and implementation? Join our full-time open-source team where we value experience independently designing and implementing significant components of complex systems, and the execution focus and discipline to carry projects to completion. Protocol Labs, Remote + +**Take care of yourselves and each other.** ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-087/README.md b/src/_blog/weekly-087/README.md new file mode 100644 index 00000000..4d9c0bc7 --- /dev/null +++ b/src/_blog/weekly-087/README.md @@ -0,0 +1,58 @@ +--- +date: 2020-04-28 +url: /weekly-87/ +translationKey: ipfs-weekly-87 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 87 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +![Announcing IPFS 0.5](/header_images/090-go-ipfs-0-5-0.png) + +## go-ipfs 0.5.0 is officially here 🚀 + +We are very excited to announce the latest release of go-ipfs 0.5.0. This release is a major step forward on our journey toward a more efficient, secure, and resilient web to preserve and grow humanity’s knowledge. [Read the full announcement on the blog for more details](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/). + +## Join us Friday for the 0.5 Launch Meetup! + +Join the IPFS community for a virtual meetup to dive deeper into what’s in the latest 0.5 release, how to take advantage of these improvements, and how IPFS is being used in the wild today. This event will take place **Friday, May 1, starting at 5pm UTC / 1pm ET / 10am PT**. Meet the IPFS core developers and many of the builders that are deploying IPFS into production, as well as a great line-up of speakers in-store, and also lots of time for Q&A and demos! [Please RSVP to attend](https://www.meetup.com/San-Francisco-IPFS/events/270212268/). + +## The latest on IPFS Mobile Design Research + +For IPFS to succeed, it needs to be where people will use it, and for the vast majority around the world that is on their smartphones. That’s why we’ve teamed up with Jim Kosem to understand how people are building, using and thinking about P2P and IPFS on mobile today in order to create tools and guidelines. [In his latest post for the IPFS blog](https://blog.ipfs.io/2020-04-24-ipfs-mobile-design-research-findings/), Jim shares a summary of his findings. + +## Highlights from this week + +- [js-ipfs 0.42.0](https://blog.ipfs.io/2020-04-14-js-ipfs-0-42/) was also recently released +- Introducing [3ID Connect](https://medium.com/3box/introducing-3id-connect-531af4f84d3f), from 3Box +- ENS unveils easier way to [build decentralized websites on Ethereum](https://decrypt.co/26246/ens-unveils-easier-way-to-build-decentralized-websites-on-ethereum) +- Fission tried [experimenting with HLS Video Streaming and IPFS](https://blog.fission.codes/experimenting-with-hls-video-streaming-and-ipfs/) +- TUTORIAL: [Deploy your website on IPFS: Why and How](https://ipfs.tarunbatra.com/blog/decentralization/Deploy-your-website-on-IPFS-Why-and-How/) + +## People are building the coolest stuff with IPFS + +- The Ethereum Name Service (ENS) is now available [for the Energy Web](https://medium.com/energy-web-insights/ethereum-name-service-ens-is-now-available-for-the-energy-web-a8d884138790) +- Introducing [Pravah.io](https://pravah.io/): Data exchange for smart cities that uses libp2p +- Putting the [Query back into Qri](https://medium.com/qri-io/putting-the-query-back-into-qri-24aa46bf3cbe) +- Unstoppable Domains in MEW: [Get a .Crypto Home for Your Assets and Content](https://medium.com/@myetherwallet/unstoppable-domains-in-mew-get-a-crypto-home-for-your-assets-and-content-5d4847b39f04) +- Design a Web3 protocol and provide a courtesy node for Factom, IPFS, and ETH with [api.bitwrap.io](https://api.bitwrap.io/ipfs/QmUraA27jv1KVWJEPHo8iJj1cd2744M3WBAyWTeNXJPj1d) + +## Join the IPFS team at Ready Layer One + +[Ready Layer One](https://readylayer.one/) is a three-day virtual conference in collaboration with Celo, Cosmos, NEAR, Polkadot, Protocol Labs, Solana, Tezos, and more. Featuring talks, workshops, and networking, this interactive event will bring together developers of the decentralized web to share knowledge, technology, and ideas across multiple communities. Visit the [Ready Layer One site](https://readylayer.one/) for the amazing line-up of speakers including Juan Benet, Molly Mackinlay, Raúl Kripalani, David Dias, and more! Tickets are first-come, first-served. [Claim your ticket here to attend](https://hopin.to/events/readylayerone?specinf=11809). + +## See you next week at the IPFS Pinning Summit + +On May 7-8, 2020, we are hosting the first-ever [IPFS Pinning Summit](https://ipfspinningsummit.com/), and we would love for you to attend! This virtual event is geared toward groups that provide pinning or other web/dweb infrastructure services. We plan to discuss the current state of distributed web infrastructure—including some of the challenges and operational lessons—and several exciting future opportunities (grants, integrations, potential new markets, etc). [Register to attend here](https://www.eventbrite.com/e/ipfs-pinning-summit-registration-102720606098). + +**Take care of yourselves and each other.** ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-088/README.md b/src/_blog/weekly-088/README.md new file mode 100644 index 00000000..9c951bdc --- /dev/null +++ b/src/_blog/weekly-088/README.md @@ -0,0 +1,93 @@ +--- +date: 2020-05-05 +url: /weekly-88/ +translationKey: ipfs-weekly-88 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 88 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + + + +## News about the 0.5 Release last week + +- [Decentralized Web Protocol IPFS Has Its Biggest Update So Far](https://cointelegraph.com/news/decentralized-web-protocol-ipfs-has-its-biggest-update-so-far) – CoinTelegraph +- [The InterPlanetary File System gets a network upgrade to make data fetching faster](https://www.theblockcrypto.com/post/63189/ipfs-network-upgrade-data-fetching) – The Block +- [Latest Version of Open Source IPFS Improves Performance](https://devops.com/latest-version-of-open-source-ipfs-improves-performance/) – DevOps +- [IPFS Releases 0.5.0 Network Upgrade, Finding and Fetching Data Is Now 5 Times Faster](https://bitcoinexchangeguide.com/ipfs-releases-0-5-0-network-upgrade-finding-and-fetching-data-is-now-5-times-faster/) – Bitcoin Exchange Guide +- [Ya fue liberada la nueva versión del sistema de archivos descentralizado IPFS 0.5](https://blog.desdelinux.net/ya-fue-liberada-la-nueva-version-del-sistema-de-archivos-descentralizado-ipfs-0-5/) – Desde Linux +- [Protocolo IPFS é atualizado para tornar coleta de dados mais rápida](https://www.moneytimes.com.br/protocolo-ipfs-e-atualizado-para-tornar-coleta-de-dados-mais-rapida/) – Money Times + +## Using IPFS to fight COVID-19 + +Here are some ways people in the dweb space are responding to the COVID-19 pandemic with their skills. + +- [Origin Protocol](https://www.coinspeaker.com/origin-protocol-launches-fundraiser-to-help-find-vaccine-for-covid-19/) Launches Fundraiser to Help Find Vaccine for COVID-19 +- Privacy-first COVID-19 app TRACY chooses [Matic Network](https://medium.com/moibit/privacy-first-covid-19-app-tracy-chooses-matic-network-633f1bba4c66) +- Announcing our [COVID-19 Open Innovation Grant awardees](https://research.protocol.ai/blog/2020/announcing-our-covid-19-open-innovation-grant-awardees/) + +## New bounties on the IPFS Bounty Board + +Several new bounties of varying amounts have been added to the [IPFS Bounty Board](https://github.com/ipfs/devgrants/projects/1), so check those out and see if you can get paid to fix something! + +## Latest releases + +- The [desktop client for IPFS](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.11.1) got a full upgrade. +- js-ipfs will be getting the same improvements to Bitswap (e.g., transfer speeds) very soon! [Take a look at the roadmap here](https://github.com/orgs/ipfs/projects/6). +- [Equilibrium’s work on Rust IPFS](https://medium.com/equilibriumco/rust-ipfs-append-only-log-001-42106983f3c) is steadily progressing, and we are pleased to announce that Phase 1 of the Protocol Labs devgrant is complete! + +## Top highlights this week + +- [IPFS and the Future of the Internet](https://medium.com/@dltlabs/ipfs-and-the-future-of-the-internet-dfb3cfed0531) +- 3 Part Tutorial: [Nim-libp2p Tutorial: A Peer-to-Peer Chat Example](https://our.status.im/nim-libp2p-tutorial-a-peer-to-peer-chat-example-1/) +- [Creating a Point-of-Sale Application with the Algorand Blockchain](https://developer.algorand.org/solutions/creating-point-sale-application-algorand-blockchain/) +- Fleek recently shared a release bringing [the IPFS community ENS Domains](https://blog.fleek.co/posts/Fleek-Release-ENS-Domains)! +- [How to Save Time on DevOps and Scale With Infura](https://consensys.net/blog/blockchain-development/how-to-save-time-on-devops-and-scale-with-infura-lessons-from-leading-ethereum-dapps/): Lessons from Leading Ethereum Dapps +- [nOS Core 2.8.0 introduces decentralized validator profiles](https://nos.chat/t/update-nos-core-2-8-0-decentralized-validator-profiles/185), powered by IPFS. + +## People are building the coolest stuff with IPFS + +- dTube got a shoutout in the list of the [Best YouTube Alternatives 2020: Decentralized Video Platforms](https://blockonomi.com/youtube-alternative/) +- Qri can store everything you need to identify, document, store, update and validate a dataset in one place. Learn how in [their latest tutorial](https://medium.com/qri-io/how-to-use-qri-features-to-build-a-better-dataset-2d236da626f0). +- [Switcheo partnered with Unstoppable Domains](https://blog.switcheo.network/switcheo-exchange-hosted-on-ipfs/) to bring more convenience and flexibility to their users and now the Switcheo Exchange is now hosted on IPFS. +- Check out the [Ocean Protocol’s public IPFS Node](https://ipfs.oceanprotocol.com/), setup to be a public gateway, and to provide some access to its HTTP API for everyone. +- [Introducing AvionDB](https://simpleaswater.com/intro-to-aviondb/): A MongoDB-like Distributed Database built on top of OrbitDB & IPFS. +- Check out [Philes](https://philes.co/QmQ98prVZ2PRrdLN3RK32z4NNidgnks6ejZzDxf5zd2u9X), a decentralized notepad you can create and share content in a peer-to-peer fashion, built on IPFS. +- Fleek explains how constant links are achieved in IPFS in their latest: [Immutable Links in IPFS - IPNS vs DNSLink vs ENS](https://blog.fleek.co/posts/immutable-ipfs) +- This library contains a Tor transport implementation for libp2p that uses an embedded Tor client, [check out go-onion-transport](https://github.com/cpacia/go-onion-transport). +- [IPFS for Nextcloud](https://github.com/justicenode/files_external_ipfs), allowing you to use IPFS as an external storage for Nextcloud. + +## Join us Wednesday and Thursday at the IPFS Pinning Summit + +On May 7-8, 2020, we are hosting the first-ever [IPFS Pinning Summit](https://ipfspinningsummit.com/), and we would love for you to attend! This virtual event is geared toward groups that provide pinning or other web/dweb infrastructure services. We plan to discuss the current state of distributed web infrastructure—including some of the challenges and operational lessons—and several exciting future opportunities (grants, integrations, potential new markets, etc). [Register to attend here](https://www.eventbrite.com/e/ipfs-pinning-summit-registration-102720606098). + +## Quote of the week + + + +## Attend one of these exciting events from the comfort of your own home + +- [Ethereal Virtual Summit](https://www.etherealsummit.com/): 2020 May 7-8, Join the first-ever virtual conference and experience a stellar collaboration of technologists, artists, startups, entrepreneurs, and investors engaging directly with the latest developments in Ethereum, blockchain, and decentralization. +- [Consensus Distributed](https://www.coindesk.com/events/consensus-2020?gclid=Cj0KCQiAyKrxBRDHARIsAKCzn8xTLzNy3u0cGN4s-gH5dpLxpeCQn8ufhFBlyZ3F4sXtd9ZF_azLQeYaApliEALw_wcB): 2020 May 11-15, Tune in for dozens of sessions across multiple tracks and days to better understand what the future might look like, especially in a post-COVID-19 era. It’s the same great content you’ve come to expect from Consensus, but virtual. +- [csv,conf,v5](https://csvconf.com/): 2020 May 13-14, A community conference for data makers everywhere. Featuring stories about data sharing and data analysis from science, journalism, government, and open source. + +## Job hunting? Work on IPFS! + +- [Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote. +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote +- [Technical Product Manager, 3Box](https://jobs.lever.co/3box/6c68f7ec-a4b4-48ab-9d77-6500e36351e7): Own the delivery of new technical products and features across the 3Box suite of developer APIs, SDKs, and plugins, and manage the onboarding, engagement and partnership activities to ensure a thriving community and network. 3Box, NYC, Berlin, or Remote +- [Project Operator, IPFS](https://jobs.lever.co/protocol/135cecff-ecc4-49ca-b516-61b63fd4d9ef): Tackle some of IPFS’s highest priority initiatives using flexible problem solving abilities. Also responsible for identifying the project’s most important problems, structuring them, and collaborating with cross-functional teams to come to a solution. Protocol Labs, Remote +- [Specifications Engineer, libp2p](https://jobs.lever.co/protocol/0ee37e17-5fb3-4b0f-8559-e5fca363e268): Help write clear specifications for libp2p, and thus aid in new languages being able to implement the libp2p specs correctly. Protocol Labs, Remote +- [Senior Software Engineer, IPFS or libp2p](https://jobs.lever.co/protocol/82793e56-124f-484c-bf13-357ef0b45bc6): Experienced in distributed systems design and implementation? Join our full-time open-source team where we value experience independently designing and implementing significant components of complex systems, and the execution focus and discipline to carry projects to completion. Protocol Labs, Remote + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-089/README.md b/src/_blog/weekly-089/README.md new file mode 100644 index 00000000..1b0e3375 --- /dev/null +++ b/src/_blog/weekly-089/README.md @@ -0,0 +1,73 @@ +--- +date: 2020-05-12 +url: /weekly-89/ +translationKey: ipfs-weekly-89 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 89 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Testground is here! + +[Introducing Testground v0.5](https://blog.ipfs.io/2020-05-06-launching-testground/), a tool dedicated to testing, simulating, benchmarking P2P and distributed systems at scale. This is a huge milestone for the distributed web, and for the wider p2p ecosystem. Discover what Testground is, how to get started, what’s coming next, and the backstory behind it on the IPFS blog. + +## How do you use IPFS GUI Tools? + +In order to help prioritize future improvements to IPFS tooling and interfaces, we’d appreciate learning more about how the IPFS Desktop app and the in-browser IPFS GUI (also known as Web UI) fit into your overall workflow. [This survey should take no more than 5 minutes](https://forms.gle/c6gHP1pVtwtRpzdP7), and will make a big difference—so thank you in advance for your time! + +## Introducing the Hub + +Last week, Textile Hub was released! The Hub is a collection of libraries and services connecting and extending IPFS, libp2p, and Filecoin so you can build apps, secure data, and delight users! [Learn all about the Hub on the Textile blog](https://blog.textile.io/announcing-the-textile-protocol-hub/). + +## The case for hosting Wikipedia on IPFS + +The exploration to [host Wikipedia on IPFS](https://github.com/santhoshtr/wikipedia-ipfs) has begun. This project contains code to extract content from Wikipedia and add to IPFS and documentation of the proposed architecture. This is just a proof of concept and not ready for any serious use yet. As a reminder, a [wikipedia-ipfs mirror](https://github.com/ipfs/distributed-wikipedia-mirror) also currently exists. + +## Top highlights this week + +- [The Present and Future of IPFS: Thoughts on the IPFS Pinning Summit](https://codeclimbing.com/the-present-and-future-of-ipfs-thoughts-on-the-ipfs-pinning-summit/) +- [The Decentralized Web Could Help Preserve The Internet’s Data For 1,000 Years. Here’s Why We Need IPFS To Build It](https://www.techdirt.com/articles/20200504/16050844431/decentralized-web-could-help-preserve-internets-data-1000-years-heres-why-we-need-ipfs-to-build-it.shtml#comments) +- [Problems to solve when building blockchain products](https://medium.com/nirman-tech-blog/problems-to-solve-when-building-blockchain-products-4af3e5cd7f6b) +- [The next stage of Web3](https://flynnjamm.substack.com/p/the-next-stage-of-web3): How The Graph, 3box, Unlock Protocol are laying the bricks for Web3 +- [See what Open Works Lab is doing with Glif](https://filecoin.io/blog/community-jonathan-schwartz-owl/), a set of interoperable tools on the Filecoin network. + +## Recommended viewing + + + +## People are building the coolest stuff with IPFS + +- [Infura is partnering with Horizon](https://infura.io/customers/skyweaver), a blockchain infrastructure company pioneering a new dimension of gaming that belongs to its players and creators. +- FYI, everything you can do with Temporal’s platform, [you can now do over I2P](https://medium.com/temporal-cloud/temporal-i2p-infrastructure-refresh-52fe40751f8b). +- [Cyber IPFS Telegram bot](http://t.me/cyberdBot) can add any content to IPFS from Telegram with 2 clicks. [Source](https://github.com/Snedashkovsky/cyberdBot) +- [BHP, the world's first computing power public chain](https://finance.yahoo.com/news/ecology-bhp-public-chain-begun-151000655.html) which will build a set of infrastructure around the computing power ecology based on hashrate credit and provide basic services for various emerging hashrate ecosystems represented by cryptocurrency hashrate, genetic hashrate, IPFS hashrate, and AI hashrate. +- Introducing [Basquiat, an IPFS-ready image resizing tool](https://talk.fission.codes/t/basquiat-an-ipfs-ready-image-resizing-tool/612) from Fission. +- PODCAST: [Hashing It Out with Brad Kam talks Unstoppable Domains](https://medium.com/unstoppabledomains/hashing-it-out-with-brad-kam-transcript-a347f04a1a4) +- Get your AngularJS app sailing on IPFS in [this short tutorial from Fleek](https://blog.fleek.co/posts/angularjs-on-ipfs-on-fleek). +- [Meshstream](https://github.com/tomeshnet/meshstream) demonstrates live video streaming over content addressable storage, IPFS, and more! +- VIDEO: [Watch Qri’s latest ratification of RFCs (Publish, Delete & Drop, & more)](https://www.youtube.com/watch?v=gQu2XZZUqv4&feature=emb_logo). +- Check out this IPFS tutorial hosted on [jupyter](https://github.com/fede2cr/jupyter_playground/blob/master/bash/IPFS.ipynb) + +## Quote of the week + + + +## Job hunting? Work on IPFS! + +- [Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote +- [Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote. +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-090/README.md b/src/_blog/weekly-090/README.md new file mode 100644 index 00000000..6204297d --- /dev/null +++ b/src/_blog/weekly-090/README.md @@ -0,0 +1,63 @@ +--- +date: 2020-05-20 +url: /weekly-90/ +translationKey: ipfs-weekly-90 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 90 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## The path to decentralization and go-ipfs 0.5 on the Zero Knowledge Podcast + +IPFS Project Lead Molly Mackinlay was recently a guest on the [Zero Knowledge Podcast](https://www.zeroknowledge.fm/129) talk about her experience guiding the IPFS project, as well as libp2p, Bitswap, Testground, the use cases and projects working with these tools, and the specific upgrades made with the recent 0.5 IPFS release. Enjoy! + +## Experience the IPFS Pinning Summit, again! + +True, the IPFS Pinning Summit has come and gone, but if you missed it, we have you covered. [Watch all of the videos](https://www.youtube.com/playlist?list=PLuhRWgmPaHtTvsxuZ9T-tMlu_v0lja6v5) from the event and be sure to [read our recap](https://blog.ipfs.io/2020-05-13-ipfs-pinning-summit-recap/) from the two-day summit. + +## Are you using (or plan to use) js-ipfs in browser? + +Then we want to hear from you! Your input would really help to shape the plan for changes that we hope will improve your and your users' experience. Check out the discussion on [reducing js-ipfs overhead by sharing node across browser tabs](https://discuss.ipfs.io/t/reducing-js-ipfs-overhead-by-sharing-node-across-browser-tabs/8024) now! + +## Top highlights this week + +- Hot on the heels of go-ipfs 0.5.0 is [version 0.5.1](https://github.com/ipfs/go-ipfs/releases/tag/v0.5.1) with some important but small bug fixes! +- Explore the [libp2p PubSub protocol implementations](https://hackernoon.com/exploring-libp2p-pubsub-protocol-implementations-891i32jq) in this post from Hackernoon +- Pinata shared how to create a [Vox file for Cryptovoxels](https://medium.com/pinata/how-to-create-a-vox-file-for-cryptovoxels-39768edd8622) +- Learn all about publishing IPFS and IPNS links from React Native [using Textile Buckets](https://blog.textile.io/publishing-ipfs-and-ipns-links-from-react-native-using-textile-buckets/) +- Fleek announced the [Fleek Storage SDK](https://blog.fleek.co/posts/fleek-storage-nft): store NFT assets on IPFS! + +## Quote of the week + + + +## People are building the coolest stuff with IPFS + +- Airalab introduced [pollution monitoring dapp service](sensors.robonomics.network) over IPFS pubsub protocol with IoT sensors network built on the Robonomics platform +- The latest version of the [Elrond Network testnet](https://github.com/ElrondNetwork/elrond-go/releases/tag/v1.0.115) recently updated their libp2p libraries, so take a look! +- [ipfstagram](https://github.com/tycooperaow/ipfstagram): A blockchain powered version of Instagram +- cyb~Virus: a Firefox extension for [cybers search engine](https://github.com/cybercongress/go-cyber) that allows users to download web pages to IPFS. New [v0.2.0 release](https://github.com/CipherDogs/cyb-virus/releases). Firefox [addons](https://addons.mozilla.org/en-US/firefox/addon/cyb-virus/). + +## Have you shared your thoughts on IPFS GUI Tools? + +In order to help prioritize future improvements to IPFS tooling and interfaces, we’d appreciate learning more about how the IPFS Desktop app and the in-browser IPFS GUI (also known as Web UI) fit into your overall workflow. [This survey should take no more than 5 minutes](https://forms.gle/c6gHP1pVtwtRpzdP7), and will make a big difference—so thank you in advance for your time! + +## Job hunting? Work on IPFS! + +- [Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote +- [Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote +- [IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote +- [Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote. +- [Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +[Get the IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-091/README.md b/src/_blog/weekly-091/README.md new file mode 100644 index 00000000..ffaf385a --- /dev/null +++ b/src/_blog/weekly-091/README.md @@ -0,0 +1,67 @@ +--- +date: 2020-05-27 +url: /weekly-91/ +translationKey: ipfs-weekly-91 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 91 +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly + +Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## The Road to the New DHT + +At the end of April, we released our largest update yet: go-ipfs 0.5.0. This upgrade brought major performance and reliability improvements to IPFS — especially on the content discovery and routing front. We’d like to take you through our journey to re-write the DHT. [Read the full story on the blog](https://blog.ipfs.io/2020-05-19-road-to-dht/). + +## js-ipfs 0.44.0 released 🎉 + +Last week, we shipped the latest release for js-ipfs, version 0.44.0! Meaning, you can now use AbortControllers to cancel requests in js-ipfs! No more waiting around to see if your request ever completes. Read the changelog post for [full details on the release](https://blog.ipfs.io/2020-05-21-js-ipfs-0-44/). + +## It’s true; Gossipsub v1.1 is here + +The Gossipsub Task Force has been hard at work exploring and analyzing various attack vectors on public and permissionless messaging networks. With that knowledge, we’ve crafted and iterated on mitigating strategies to make our beloved libp2p PubSub Router work in adversarial environments. [The result is Gossipsub v1.1](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1). + +## Top highlights this week + +- [Orbit-db 0.24](https://github.com/orbitdb/orbit-db/issues/772#issuecomment-632357888) is out with support for both go-ipfs 0.5 and js-ipfs 0.44 +- [go-libp2p v0.9.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.9.0) was released with some long-awaited features: connection gating to accept/deny connections at different stages, decaying peer scoring tags, signed peer records for enhanced security, and more. +- [The second rust-ipfs grant](https://medium.com/equilibriumco/the-road-to-unixfs-f3cf5222b2ef) has been approved, and work has begun on the UnixFS! +- [ipfs-desktop 0.11.4](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.11.4) is now here! +- Under the hood: [AvionDB P2P Syncing](https://simpleaswater.com/aviondb-p2p-sync/) +- Learn all about [Offline Knowledge Hotspots](https://www.youtube.com/watch?time_continue=1&v=K2MF4fvcl70&feature=emb_logo) in the Local Offline Collaboration Monthly meeting + +## Quote of the week + + + +## People are building the coolest stuff with IPFS + +- [Zippie](https://talk.fission.codes/t/how-zippie-uses-dynamic-ipfs-loading-for-a-seamless-mobile-web-experience-carsten-munk-cto-of-zippie/611) uses dynamic IPFS loading for a seamless mobile web experience. +- Over [125,000 IPFS CIDs](https://cyber.page/brain/knowledge) added to [Cybers network](https://cyber.page/search/ipfs) as part of its incentivized tournament, [Game of Links](https://cyber.page/gol), in which users add IPFS CIDs to build a decentralized knowledge graph, which is used by the search engine +- [Fury](https://github.com/propensive/fury) is an experimental dependency manager and build tool for Scala +- [Textile](https://github.com/textileio/github-action-buckets/runs/697220495?check_suite_focus=true) updated their GitHub Actions, so the Textile Hub is back on the Github Marketplace! +- [An Introduction to Dwebsites](http://blog.almonit.eth.link/2020-05-21/Introduction_to_Dwebsitse.html) built on IPFS +- [Sapien Wallet](https://medium.com/@sapien.wallet/bash-script-light-wallet-case-624aa04cb216), built on Textile and IPFS +- [Fleek](https://blog.fleek.co/posts/fleek-storage-sdk-guide) releases their new Storage SDK Cookbook + +## Join us at Distributed Camp 2020 + +This Friday through Sunday, members of the IPFS, Dat, I2P, WebTorrent communities and more, will gather to talk all things distributed for a special hands-on event: **Distributed Camp 2020**. Enjoy two days of immersive, hands-on workshops where you get to try out some of the latest web technologies for yourself and a Sunday Unconference where you get to learn of other projects in this space as well as show off what you made! [Registration is free](https://distributed.camp/). + +## Are you using (or plan to use) js-ipfs in browser? + +Then we want to hear from you! Your input would really help to shape the plan for changes that we hope will improve your and your users' experience. Check out the discussion on [reducing js-ipfs overhead by sharing node across browser tabs](https://discuss.ipfs.io/t/reducing-js-ipfs-overhead-by-sharing-node-across-browser-tabs/8024) now! + +## Missed the 0.5 Meetup? Watch the videos now + +[Check out the full playlist](https://www.youtube.com/watch?list=PLuhRWgmPaHtQ26F2MIuogvo0so9QUgH1r&v=RxJSUBeqOKU&feature=emb_logo) of presentations from the event, from insights on content routing changes and improvements to the intricacies of Bitswap and subdomain gateways! And don’t forget to watch the lightning talks. Enjoy! + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the [IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-092/README.md b/src/_blog/weekly-092/README.md new file mode 100644 index 00000000..00860c60 --- /dev/null +++ b/src/_blog/weekly-092/README.md @@ -0,0 +1,70 @@ +--- +date: 2020-06-10 +url: /weekly-92/ +translationKey: ipfs-weekly-92 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 92 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #92 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Join us next Wednesday for our June meetup + +Next week the IPFS community will be gathering for a virtual meetup on June 17th. Join us for a deeper dive into our latest releases, meet the IPFS core developers, and sign up to give a demo of your own! + +[**Register to attend**](https://www.meetup.com/San-Francisco-IPFS/events/271042788/) + +## js-ipfs 0.46.0 released + +The JavaScript implementation of IPFS recently shared their latest progress on the IPFS blog. Goodies include Bitswap 1.2.0, much faster file transfers, and go-ipfs 0.5.x compatibility. + +[**Read the release notes**](https://blog.ipfs.io/2020-06-08-js-ipfs-0-46/) + +## Powering through the API gateway enabling IPFS and Filecoin data management + +Earlier this month, Powergate, Textile’s API driven solution to deploying multi-tiered storage based on IPFS and Filecoin into systems and applications, shared some insight into the project’s development progress. Up next? The JavaScript Powergate Client. + +[**Learn more about Powergate**](https://blog.textile.io/filecoin-tools-progress-update-june-2/) + +## Quote of the week + + + +## Brand new on IPFS + +- [Recommended viewing](https://www.youtube.com/watch?time_continue=3&v=7JW5Mms6DR4&feature=emb_logo): Learn how to deploy a decentralized React app on IPFS using Fleek. +- [Textile’s threads implementation in Go](https://github.com/textileio/go-threads/releases) released version 0.1.19. now with custom collection indexing. +- [nOS releases OrbitDB and AvionDB](https://github.com/nos/orbitdb-nos-identity-provider/) Identity Provider for nOS Network and ARK Core-based blockchains, adding BIP39 passphrase-based access control to IPFS. +- [Obsidian Systems brings IPFS support to Nix](https://discourse.nixos.org/t/obsidian-systems-is-excited-to-bring-ipfs-support-to-nix/7375), a package manager for Linux and Unix systems making package management reliable and reproducible. + +## People build the coolest stuff with IPFS + +- [This repository](https://github.com/2020PB/police-brutality) exists to accumulate and contextualize evidence of police brutality during the 2020 George Floyd protests, and has an open PR to create a public IPFS Follow Cluster. +- [IPDR](https://github.com/miguelmota/ipdr) is a Docker Registry tool that proxies Docker registry requests to IPFS for pushing and pulling images. +- [Git Large File Storage](https://git-lfs.github.com/) offers custom transfer and extension implementation that makes using IPFS for storage easy. +- [Check out IPIDE](https://ipfs.io/ipfs/QmV3SzLWyTHdMStxeRyvLnLteujLNwNVM5821QsxZVerZL), an extensible IDE hosted on IPFS. + +## Job hunting? Work on IPFS! + +[Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote + +[Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote + +[IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +[Software Engineer, the Underlay Project](https://notes.knowledgefutures.org/pub/si1okbw9): Strong full-stack web developer with an interest in semantic web and decentralized web technologies. The Knowledge Futures Group, Remote + +[**View our job postings**](https://jobs.lever.co/protocol) + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the [IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-093/README.md b/src/_blog/weekly-093/README.md new file mode 100644 index 00000000..cb389a60 --- /dev/null +++ b/src/_blog/weekly-093/README.md @@ -0,0 +1,75 @@ +--- +date: 2020-06-17 +url: /weekly-93/ +translationKey: ipfs-weekly-93 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 93 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #93 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Microsoft announces decentralized identity protocol built on IPFS + +Microsoft’s ION, an implementation of the decentralized identity protocol, now stores transaction data on IPFS. Read about how js-ipfs is being used to publish the data in a decentralized, universally addressable and network-agnostic way. + +[Read the full announcement](https://blog.ipfs.io/2020-06-11-identity-ipfs-ion/) + +## libp2p in 2020 and beyond! + +The past year has seen amazing improvements to libp2p with the protocol quickly becoming the de facto Web3 networking layer for a huge swath of projects. Now, libp2p is looking for new Project Lead to help grow and steward the project and ecosystem in 2020! + +[Learn more about libp2p](https://blog.ipfs.io/2020-06-09-libp2p-in-2020/) + +## IPFS and the Decentralized Web Dev Report 2020 + +Fluence Labs released the results of the Decentralized Developer 2020 report, revealing that IPFS and Ethereum are by far leaders among underlying tech respondents use to create DWeb apps. + +[Dig into the results](https://medium.com/fluence-network/decentralized-web-developer-report-2020-5b41a8d86789) + +## Quote of the week + + + +## Brand new on IPFS + +- [Why is Mindsync using Blockchain?](https://medium.com/mindsync-ai/why-is-mindsync-using-blockchain-the-answer-is-simple-f45e274a95c4) The answer is simple (and involved IPFS). +- [Unstoppable Domains taps IPFS](https://www.coindesk.com/unstoppable-domains-launches-censorship-resistant-blogging-platform) for censorship-resistant blogging platform. +- [Spark Hackathon](https://medium.com/encode-club/spark-hackathon-challenges-c464d26ad3b9) is an 8-week hackathon aimed at universities, challenging them to build with Filecoin and IPFS. +- [Infura is testing a beta release](https://twitter.com/infura_io/status/1270796084810375168) of their #Eth2 Beacon Chain API, in preparation for Ethereum 2.0. Apply to register your interest! + +## People build the coolest stuff with IPFS + +It’s June. Time for [a Qri update.](https://mailchi.mp/7069eecb4b55/welcome-to-the-qri-newsletter-4428380) + +Learn how to build a distributed website [with Hugo.](https://levelup.gitconnected.com/build-a-distributed-website-with-hugo-1183bb098057) + +[The Fleek Storage SDK Crash Course](https://www.youtube.com/watch?v=sCxvol1xA04&feature=emb_logo) you always wanted is finally here. + +Check out the new improvements to [Lightstreams Smart Vault](https://medium.com/lightstreams/smart-vault-light-client-mode-3efe09d9b7a7), Light Client Mode. + +Another take on [B.Y.O.D.](https://medium.com/@jacobcohenrosenthal/b-y-o-d-the-promise-of-user-siloed-data-in-edtech-and-beyond-9d36daf63856) – The promise of user-siloed data in EdTech and beyond! + +## Job hunting? Work on IPFS! + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Community Engineer, libp2p](https://jobs.lever.co/protocol/0afd449f-b292-42b4-abfd-af26415b796b): Help introduce new open source projects to libp2p and clear hurdles for them to adopt the libp2p stack for the networking layer of their system. Protocol Labs, Remote + +[Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote + +[IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the [IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-094/README.md b/src/_blog/weekly-094/README.md new file mode 100644 index 00000000..4ef26f92 --- /dev/null +++ b/src/_blog/weekly-094/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-06-24 +url: /weekly-94/ +translationKey: ipfs-weekly-94 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 94 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #94 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Watch videos from our June meetup now + +The IPFS community gathered for a virtual meetup last week to celebrate progress made since the go-ipfs 0.5 launch and take a look at where the ecosystem is headed for the duration of 2020. + +[Watch the videos](https://blog.ipfs.io/2020-06-23-june-meetup-recap/) + +## IPFS included in the foundation of blockchain, decentralization and DeFi + +Project Lead Molly Mackinlay was recognized as a mover and shaker in the decentralization movement in a recent piece from Hacker Noon. In “A Brief Look At Those Who Laid The Foundation of Blockchain, Decentralization and DeFi” Mackinlay was noted to be “uber-talented and someone to watch for an idea of where this all is headed.” + +[Read more at Hacker Noon](https://hackernoon.com/a-brief-look-at-those-who-laid-the-foundation-of-blockchain-decentralization-and-defi-ns343ypj) + +## A user story: publishing my website on IPFS + +You might have seen this post making the rounds, but we recently caught the video and really enjoyed this look at IPFS through a newcomer’s eyes. Check out Justin Poliachik’s post describing his discovery of IPFS, and then watch the video! + +[Adventures in learning IPFS](https://www.youtube.com/watch?v=N4RKKHSyZlk) + +## Quote of the week + + + +## Brand new on IPFS + +- [Opera and Unstoppable Domains](https://blogs.opera.com/mobile/2020/06/free-crypto-domain-unstoppable-opera/) now help you to secure your free .crypto domain and a Haiku. +- [Textile released the Buckets JS library!](https://textileio.github.io/js-hub/docs/hub.buckets) Super simple way to manage and persist dynamic folders on IPFS in your apps! +- [Unstoppable Domains](https://community.unstoppabledomains.com/t/decentralized-blog-contest/745) launched a competition to reward the top 15 decentralized blogs from a pool of \$1,500 Ethereum! +- [Decentralized Off the Shelf](https://decentpatterns.xyz/report/) has released some research on the 7 Maxims where the decentralization movement can improve. + +## Hangout with the IPFS Community in Nairobi + +A week from today, the IPFS Africa community is hosting a virtual meetup featuring a fireside chat between dweb advocate Sonia John and Carsten Munk, CEO of Zippie. Join us in attending this awesome virtual hangout next Tuesday! + +[Register to attend](https://www.eventbrite.co.uk/e/ipfs-community-meetup-nairobi-tickets-108105257736) + +## People build the coolest stuff with IPFS + +- Everything you read here is already implemented and operational: [A Universal Guide to The DAPP Network](https://medium.com/the-liquidapps-blog/a-universal-guide-to-the-dapp-network-8cac3aa14acd). +- Now, [you can use MEW](https://medium.com/myetherwallet/host-your-own-site-with-mew-introducing-ipfs-support-for-eth-and-crypto-domains-903ea852f2d7) to put your domain name to a truly exciting use — put up a Web3 website, entirely and permanently controlled by you alone. +- Have you seen this [IPFS Plugin for Flask](https://github.com/zatoichi-labs/Flask-IPFS) yet? +- How Alfonso de la Rocha built an [IPFS crawler with libp2p](https://adlrocha.substack.com/p/adlrocha-how-i-built-an-ipfs-crawler). +- Police Accountability Now's PAN Protocol is an anonymous, censorship-resistant database of police misconduct complaints, [built on Ethereum and IPFS](https://decrypt.co/32614/blockchain-police-brutality-database-gives-bad-cops-nowhere-to-hide). + +## Help make our community events better + +Share your thoughts on how we can make the IPFS weekly community calls and/or monthly meetups even better in this quick survey. + +[Take the survey](https://docs.google.com/forms/d/e/1FAIpQLSestacLPbEMvZp1KNtmSHC2Fk09sk1TQ2DUFzEIeE7-HK3QJA/viewform) + +## Job hunting? Work on IPFS! + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote + +[IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the [IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-095/README.md b/src/_blog/weekly-095/README.md new file mode 100644 index 00000000..bfb72c39 --- /dev/null +++ b/src/_blog/weekly-095/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-07-01 +url: /weekly-95/ +translationKey: ipfs-weekly-95 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 95 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #95 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## go-ipfs 0.6.0 adds QUIC transport and more! + +Late last week, go-ipfs 0.6.0 arrived, bringing with it the QUIC transport, the Noise Security Transport, the ability to customize 404 pages, Gossipsub upgraded to v1.1, and many bugfixes. + +[Read the release notes](https://blog.ipfs.io/2020-06-26-go-ipfs-0-6-0/) + +## NEW: IPFS Mobile Design guidelines + +Researcher Jim Kosem shared his findings and recommendations after extensive work examining mobile user patterns in P2P activities and how browsers influence these. + +[Read the full post](https://blog.ipfs.io/2020-06-25-ipfs-mobile-design-guidelines/) + +## Tell us your journey exploring the IPFS ecosystem + +Protocol Labs is conducting video interviews with IPFS developers to get a sense of the different journeys folks take while navigating the decentralized ecosystem. Take this survey to express your interest in telling your story! + +[Take the survey now](https://ipfscommunity.typeform.com/to/KOsYTzxn) + +## Thursday is the last day to join HackFS + +HackFS is a hackathon focused on building the foundation for Web3: a digital world that is censorship-resistant, decentralized, and trustless. ETHGlobal partnered with Protocol Labs to run an event centered on dapps, web3, decentralized storage, and everything in between. + +[Apply to hack](https://hackfs.com/) + +## Quote of the week + + + +## Brand new on IPFS + +- [Demystifying Digital Identity Part 2](https://medium.com/3box/demystifying-digital-identity-2-75dd7dfee2f2), from 3Box, introduces a blueprint for a complete identity standard. +- [Pin to IPFS with Fleek Storage JS!](https://blog.fleek.co/posts/guide-to-fleek-storage-js) It’s now easier than ever to upload and pin files. +- [How Berty Works:](https://berty.tech/blog/how-berty-works-ipfs/) Learn everything you need to know about Berty and how it works in this series. +- [Claim this IPFS Design Bounty](https://github.com/ipfs/dir-index-html/issues/37), and earn not only the undying love of the IPFS community but cash too! + +## People build the coolest stuff with IPFS + +- [Announcing managed Powergate instances — get enterprise access to hosted Filecoin and IPFS resources.](https://blog.textile.io/announcing-managed-powergate-instances-enterprise-filecoin-and-ipfs/) +- [Pulsarcast:](https://github.com/JGAntunes/pulsarcast) Scalable and reliable pub-sub over P2P networks, implemented on top of libp2p +- IPFS-based browser [Galacteek](https://github.com/pinnaculum/galacteek) adds support to deliver search queries from [Cybers search-engine](https://cyber.page/) in its [latest release](https://github.com/pinnaculum/galacteek/releases/tag/v0.4.30) +- Kyber, Contentos, Solana, Ternio and Four Other Partners Launch on [Origin’s Dshop](https://medium.com/originprotocol/origin-launches-new-dshop-partnerships-5034439d6337), built using the Ethereum blockchain, IPFS, and PGP. +- UnixFS exporting has landed. What comes next for [Rust IPFS?](https://medium.com/equilibriumco/unixfs-exporting-has-landed-what-comes-next-4775cc568838) + +## Enroll in the Smart Contracts & IPFS Bootcamp + +Learn how to build decentralized applications with Ethereum and IPFS. ChainShot is hosting a two-day workshop teaching participants to build a project fully utilizing both systems. + +[Register to attend](https://cs-room.com/event/bp/5eebc09ee70cdf1b40b61ab4) + +## Job hunting? Work on IPFS! + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Engineering Manager, IPFS](https://jobs.lever.co/protocol/3f0787e8-58b3-4122-a1ea-424561d2658f): Engineering managers have the challenging and exciting task of supporting and empowering engineering teams to deliver complex internet-scale systems in an environment defined by curiosity, passion, and a love for open source. Protocol Labs, Remote + +[IPFS Community Lead](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the [IPFS Weekly in your inbox](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230), each Tuesday. diff --git a/src/_blog/weekly-096/README.md b/src/_blog/weekly-096/README.md new file mode 100644 index 00000000..8b980bd6 --- /dev/null +++ b/src/_blog/weekly-096/README.md @@ -0,0 +1,150 @@ +--- +date: 2020-07-07 +url: /weekly-96/ +translationKey: ipfs-weekly-96 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly’s Q2 2020 Recap Issue +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly! + +A quick look back at what we accomplished together in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## April, a time for new beginnings 🛳 + +The [IPFS Mobile Design Research](https://blog.ipfs.io/2020-04-10-ipfs-mobile-design-research/) project kicks off – an initiative to research existing P2P protocol use in mobile apps, and create an informed and research-backed set of design guidelines and best-practices for IPFS. + +ProtoSchool explores the [Async Iterables returned by js-ipfs 0.41](https://school.us4.list-manage.com/track/click?u=41e9e493c56c3865870435d91&id=d160d74ae0&e=28ddac0f86) + +[js-ipfs 0.42.0 is released](https://blog.ipfs.io/2020-04-14-js-ipfs-0-42/), bringing automated publish of RCs, updated Docker containers, and more. + +We introduced the [IPFS Grants Platform](https://blog.ipfs.io/2020-04-20-ipfs-grants-platform/) 💻 ➡️ 💰 + +The [IPFS Distributions website](https://dist.ipfs.io/) got a fun IPFS rebrand. + +![New updates to go-ipfs](https://blog.ipfs.io/header_images/090-go-ipfs-0-5-0.png) + +Our largest upgrade to IPFS yet happened with [go-ipfs 0.5](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/)! And, we hosted [a launch meetup](https://www.youtube.com/watch?list=PLuhRWgmPaHtQ26F2MIuogvo0so9QUgH1r&v=RxJSUBeqOKU&feature=emb_log) with community members to share our many updates! + +Textile announced [Powergate](https://blog.textile.io/filecoin-tools-progress-update-8-april/), developing tools to get folks building on IPFS and Filecoin! + +Ethereum hosted [its site on IPFS](https://twitter.com/samonchain/status/1247229402431119360). + +Unstoppable Domains launches [Opera support](https://unstoppabledomains.com/opera). + +Brave Launches [Origin-Powered Store](https://brave.com/brave-launches-new-swag-store-powered-by-origin/), built on IPFS. + +FISSION shares how they experimented with [HLS Video Streaming and IPFS](https://blog.fission.codes/experimenting-with-hls-video-streaming-and-ipfs/). + +## May, gathering together (kind of) 😁 + +Textile launches [The Hub](https://blog.textile.io/announcing-the-textile-protocol-hub/), a collection of libraries and services connecting and extending IPFS, libp2p, and Filecoin. + +We take some significant steps to improve the [IPFS Developer experience](https://blog.ipfs.io/2020-05-05-developer-experience/). + +[Almonit](http://blog.almonit.eth.link/2020-05-21/Introduction_to_Dwebsitse.html) releases an introduction to Dwebsites, entirely built on IPFS. + +[js-ipfs 0.44.0 is released](https://blog.ipfs.io/2020-05-21-js-ipfs-0-44/), adding cancellable requests and a new browser datastore! + +[OrbitDB releases v0.24](https://github.com/orbitdb/orbit-db/issues/772#issuecomment-632357888) with support for both go-ipfs 0.5 and js-ipfs 0.44. + +![Launching Testground](https://blog.ipfs.io/header_images/092-launching-testground.png) + +We launched [Testground v0.5](https://blog.ipfs.io/2020-05-06-launching-testground/), a platform for testing, benchmarking, and simulating distributed and p2p systems at scale. Designed to be multilingual and runtime-agnostic, scaling from 2 to 10k instances. + +We hosted the [IPFS Pinning Summit](https://blog.ipfs.io/2020-05-13-ipfs-pinning-summit-recap/), bringing together pinning services, infra providers, and the curious for two days of talks and workshops. + +We took a deep dive into the road to the [new DHT](https://blog.ipfs.io/2020-05-19-road-to-dht/). + +Oh, hello! [Gossipsub v1.1 launches](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/), bringing a scalable, extensible, and hardened P2P pubsub router protocol into the mix. + +Project Lead Molly Mackinlay was a guest on the [Zero Knowledge Podcast](https://www.zeroknowledge.fm/129) to talk about go-ipfs 0.5 and more. + +An engineer from Wikipedia begins to explore [hosting on IPFS](https://github.com/santhoshtr/wikipedia-ipfs). 🕵️ + +Fleek announced the [Fleek Storage SDK](https://blog.fleek.co/posts/fleek-storage-nft), which stores web assets on IPFS through a simple drag-and-drop interface. + +The first completely virtual [Distributed Camp 2020](https://distributed.camp/) took place! + +## June, improving on improvements 🛠 + +[js-ipfs 0.46.0](https://blog.ipfs.io/2020-06-08-js-ipfs-0-46/) is released with new faster bitswap and go-ipfs 0.5 compatibility. + +The [libp2p project gives a 2020 update](https://blog.ipfs.io/2020-06-09-libp2p-in-2020/) and begins the search for a new team lead! + +Activists create a repository to accumulate and contextualize evidence of police brutality during the 2020 George Floyd protests, [hosted on IPFS](https://github.com/2020PB/police-brutality). Additionally, Police Accountability Now’s [PAN Protocol](https://decrypt.co/32614/blockchain-police-brutality-database-gives-bad-cops-nowhere-to-hide) is an anonymous, censorship-resistant database of police misconduct complaints, also built on Ethereum and IPFS. + +Textile released the [Buckets JS library](https://textileio.github.io/js-hub/docs/hub.buckets). + +Jim Kosem shares the new [IPFS Mobile Design Guidelines](https://blog.ipfs.io/2020-06-25-ipfs-mobile-design-guidelines/), based on research conducted earlier in the quarter. Go download the pdf! + +![IPFS and ION](https://blog.ipfs.io/img/099-identity-ipfs-ion/ipfs-ion-header.png) + +[ION](https://blog.ipfs.io/2020-06-11-identity-ipfs-ion/), launched by Microsoft, has been under development for over a year, and is an instance implementation of Sidetree that runs on the Bitcoin blockchain. And it stores transaction data on IPFS. + +We held a virtual June meetup, but if you missed it, catch up on all the videos on our [YouTube channel](https://www.youtube.com/playlist?list=PLuhRWgmPaHtToVYaDkd6ZTwB2Lo30s1vB). Make sure to subscribe to catch new content. + +Decentralized Off the Shelf released research on the [7 Maxims](https://decentpatterns.xyz/report/) where the decentralization movement can improve. + + +
+ +So many IPFS GUI improvements were made this quarter, but don’t take my word for, watch this 2 minute video instead. + +[IPFS Africa](https://www.eventbrite.co.uk/e/ipfs-community-meetup-nairobi-tickets-108105257736) hosts a virtual community meetup for the Nairobi IPFS community. + +And, keeping with how this quarter began, [go-ipfs 0.6.0 is launched](https://blog.ipfs.io/2020-06-26-go-ipfs-0-6-0/). QUIC, Noise, Peering and more! + +## Also new this quarter... + +Fluence Labs released the results of the [Decentralized Developer 2020 report](https://medium.com/fluence-network/decentralized-web-developer-report-2020-5b41a8d86789), revealing that IPFS and Ethereum are by far leaders used to create DWeb apps. + +[Galacteek](https://discuss.ipfs.io/t/galacteek-browser-v0-4-20-release/7582) releases their browser + +3Box launches [3ID Connect](https://medium.com/3box/introducing-3id-connect-531af4f84d3f) + +[AvionDB](https://simpleaswater.com/intro-to-aviondb/) launches + +Pinata shares how to create a [Vox File for Cryptovoxels](https://medium.com/pinata/how-to-create-a-vox-file-for-cryptovoxels-39768edd8622) + +[Ready Layer One](https://www.youtube.com/channel/UC-JxjKyX63VGkRM-8jziK8Q) brought the community together + +Keep up the great work team! We can’t wait to see what happens in the next few months. 🎉 + +## Missed a meetup? We got you 😊 + +- [IPFS Q2 Highlights](https://www.youtube.com/watch?v=yhbht93ln0w) - A highlight of all of the awesome things that have happened around IPFS in Q2 of 2020. +- [MSFT ION](https://www.youtube.com/watch?v=8kxfOyEelPs) - ION is a project that Microsoft started contributing to around scalable Decentralized Identifiers. +- [Upgrading your developer tools with Textile](https://www.youtube.com/watch?v=ZuRQOWonL0M) - Carson Farmer talks about how Textile had anticipated the go-ipfs 0.5 release, and what’s next. +- [go-ipfs 0.6.0 and beyond...](https://www.youtube.com/watch?v=SJejHfPJxl4) - go-ipfs maintainer Adin Schmahmann talks about the progress made since the major 0.5 release this spring. + +## Great reads from Q2 👇 + +[Using IPFS + FileCoin for decentralised storage with Powergate](https://medium.com/@samikshan/using-ipfs-filecoin-for-decentralised-storage-with-powergate-71ffe42f8c09) by Samikshan Bairagya + +[Publishing my Website on IPFS](http://justinpoliachik.com/posts/2020-03_ipfs_website/) by Justin Poliachik + +[How I built an IPFS crawler with libp2p](https://adlrocha.substack.com/p/adlrocha-how-i-built-an-ipfs-crawler) by Alfonso de la Rocha + +[As Covid-19 Tracing Raises Spying Fears, Blockchain Comes To Rescue](https://inc42.com/features/startups-vs-covid19-as-patient-tracing-raises-spying-fears-blockchain-comes-to-the-rescue/) by Suprita Anupam + +[3 Quorum Bounty Winners from ETHDenver 2020](https://medium.com/@mateo_ventures/3-quorum-bounty-winners-from-ethdenver-2020-cb37a0d91386) (used IPFS to win!) by Matt Wright + +## Coming up next + +So what’s next for IPFS? 🤔 + +If the first half of 2020 has taught us anything, it’s to expect the unexpected! For now, we’re [looking forward](https://github.com/orgs/ipfs/projects/6) to implementing some pinning improvements, adding support for TypeScript, and providing even more opportunities to bring everyone all together. Stay tuned! + +If you’d like to get involved, check out our [contribution guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) and come to [IPFS Office Hours](https://github.com/ipfs/community/issues?utf8=%E2%9C%93&q=label%3A%22%F0%9F%99%8C%F0%9F%8F%BD+IPFS+Weekly+Call%22+) to get pointers on where to start! + +**Take care of yourselves and each other. ❤️** + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us](mailto:newsletter@ipfs.io). + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-097/README.md b/src/_blog/weekly-097/README.md new file mode 100644 index 00000000..ddf0a27f --- /dev/null +++ b/src/_blog/weekly-097/README.md @@ -0,0 +1,79 @@ +--- +date: 2020-07-22 +url: /weekly-97/ +translationKey: ipfs-weekly-97 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 97 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #97 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## New from ProtoSchool: free dweb courses + +ProtoSchool has created new dweb courses from the many tutorials they offer. Peruse courses on IPFS, Filecoin, Multiformats, and more. With updated content from the latest releases, like js-ipfs 0.48.0! + +[Discover the courses](https://proto.school/#/tutorials?course=ipfs) + +## What the DHT looks like in v0.5.0 + +Get ready for a monster post that truly dives deep into the ins and outs of the go-ipfs DHT implementation. If you want to learn a thing or two about how DHTs work, and how we made the implementation used by IPFS faster and more resilient, read on! + +[Take a deep dive](https://blog.ipfs.io/2020-07-20-dht-deep-dive/) + +## Quote of the week + + + +## js-ipfs v0.48.0 is here! + +The latest iteration of the JavaScript implementation of your favorite protocol has now reached v0.48.0! This release includes much better default connectivity, a smaller blockstore, a more intuitive API, and loads of new features and bugfixes. + +[Read the release notes now](https://blog.ipfs.io/2020-07-20-js-ipfs-0-48/) + +## Brand new on IPFS + +- [TikTok was taken down last week](https://decrypt.co/35343/how-ipfs-can-skirt-chinas-grip-on-hong-kong) in Hong Kong. But there could be a solution with IPFS. +- [Bitsearch](https://bitsear.ch/) is a new search engine for the decentralized web by the team from ViewBlock. +- [IPFS x Audius: A story of harmony.](https://blog.ipfs.io/2020-07-09-case-study-audius/) Read the first edition of the IPFS Case Study Series. +- The latest version of [IPFS Companion](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.14.0) just hit the extension stores, and it’s pretty spiffy! + +## People build the coolest stuff with IPFS + +Introducing a decentralized game using [Unity, IPFS](https://medium.com/coinmonks/unity-on-ipfs-e0baa792f014), GitHub, Fleek, Unstoppable Domains, and Pinata. + +Catch up on the [IPFS Local Offline Collaboration WG](https://www.youtube.com/watch?v=3RS2dlzxYUQ) monthly call with design researcher Jim Kosem. + +Why a DAO for [Berty?](https://berty.tech/blog/dao-berty-1/) + +[InfiNFT](https://blockonomi.com/promising-ethereum-projects/) is a new token minting platform using IPFS featured in this roundup of promising longterm Ethereum projects. + +Check out [ChainShot Shield](https://twitter.com/BeingDanNolan/status/1282384273748692992) built with Merkle Trees, DAGs, the IPFS DAG & File API, and a smart contract game that mapped to CIDs on IPFS during the IPFS & Ethereum Workshop last week! + +[Meet the HackFS teams](https://filecoin.io/blog/hackfs-teams-vol-1/) using IPFS to showcase the power of Web3! + +## Job hunting? Work on IPFS! + +[Signed and Encrypted IPLD, Go](https://www.notion.so/Signed-and-Encrypted-data-in-IPFS-e1593e90b56e44c38e165109999782ce): Implement a new Go-based IPLD codec that supports signed and encrypted Blocks, and get paid for it! Externally funded, 3Box and Textile, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-098/README.md b/src/_blog/weekly-098/README.md new file mode 100644 index 00000000..83a6570b --- /dev/null +++ b/src/_blog/weekly-098/README.md @@ -0,0 +1,81 @@ +--- +date: 2020-07-29 +url: /weekly-98/ +translationKey: ipfs-weekly-98 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 98 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #98 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Join us Monday for our next monthly meetup + +Our next IPFS Virtual Community Meetup is scheduled for Monday, August 3rd and we want you to be there! Join us for some presentations on the latest in IPFS, as well as get a chance to present your work during our [lightning sessions](https://docs.google.com/document/d/1img1dzYQXAvB2D2Z-7UIHwKAxvODxZNsFj9tSjZdqCA/edit)! + +[Register to attend](https://www.crowdcast.io/e/ipfs-community-meetup-august-2020/register) + +## New in the GitHub marketplace: IPFS + GitHub actions + +Created by Oli Evans (@olizilla), you can now pin your site to IPFS from a GitHub Action! The action pins a directory to IPFS by using the ipfs-cluster-ctl command to pin it to a remote IPFS Cluster. + +[Go start pinning](https://github.com/ipfs-shipyard/ipfs-github-action) + +## Quote of the week + + + +## Watch the Textile AMA with Andrew W. Hill and Carson Farmer + +Last week, our friends at Textile participated in an AMA as part of the ongoing HackFS activities. Check out their thoughts on the dWeb, learn their origin story, and hear what it means to build a web3 company in a pandemic! + +[Watch the video](https://www.youtube.com/watch?v=FqUqGVO63fI&feature=youtu.be) + +## Brand new on IPFS + +- [IPFS was featured as a whitepaper](https://www.youtube.com/watch?v=fA8p3Vqb89A&feature=youtu.be) in Blockchain at Berkeley’s summer whitepaper series. +- [What is Identity Index?](https://medium.com/@msena/what-is-identity-index-d3594b59633e) The folks at Ceramic recently introduced IDX, an evolution in decentralized identity. +- [Play around with Gossipsub](https://adlrocha.substack.com/p/adlrocha-playing-with-gossipsub) and Alfonso de la Rocha’s Pubsub Playground in their recent post. +- [Protofire](https://medium.com/protofire-blog/protofire-provides-implementation-services-in-the-graph-partnership-7e07591031d7), creator of 20+ open-source subgraphs for IPFS, recently teamed up with The Graph. + +## People build the coolest stuff with IPFS + +A decentralized, hardcore, uncensored [Twitter analogue](https://cyber.page/ipfs/QmdfKnMkQUDgBa5rK7UiJG4xULRAKttUsEcDJkq5trotjm) that stores your content in IPFS, built on top of the Cyber protocol. + +The real interchain technology consists of 2 steps: [Locking and Mapping](https://medium.com/@chainx_org/the-real-inter-chain-technology-consists-of-two-steps-locking-and-mapping-3ea96058886f) + +Brooklyn’s qri aims to build a [library of data for all the world to use](https://www.downtownbrooklyn.com/news/2020/brooklyns-qri-aims-to-build-a-library-of-data-for-all-the-world-to-use) + +[Unstoppable Domains](https://www.coindesk.com/winklevoss-owned-gemini-now-provides-custody-for-crypto-blockchain-domains) announces domain registrars will utilize Gemini’s custody services when purchasing .crypto addresses for their clients through its service. + +One of the many cool things coming out of HackFS: [NEAR Accounts and Access Keys as Identities for Textile Integration](https://vitalpoint.ai/near-textile-integration/) + +Learn how to build your own [Flappy Birds game on IPFS](https://www.youtube.com/watch?v=gxHcW84izz0&feature=youtu.be)! + +Check out the new format for [Textile’s Powergate updates](https://blog.textile.io/filecoin-powergate-progress-update-for-july-21/) that shows off some of the great work happening in the community around Powergate. + +## Job hunting? Work on IPFS! + +[Signed and Encrypted IPLD, Go](https://www.notion.so/Signed-and-Encrypted-data-in-IPFS-e1593e90b56e44c38e165109999782ce): Implement a new Go-based IPLD codec that supports signed and encrypted Blocks, and get paid for it! Externally funded, 3Box and Textile, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-099/README.md b/src/_blog/weekly-099/README.md new file mode 100644 index 00000000..c57b0418 --- /dev/null +++ b/src/_blog/weekly-099/README.md @@ -0,0 +1,79 @@ +--- +date: 2020-08-05 +url: /weekly-99/ +translationKey: ipfs-weekly-99 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 99 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #99 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Join APOLLO and the Filecoin Launchpad Accelerator 🚀 + +Recently, Filecoin Ignite announced two new initiatives to get folks excited and hacking on the decentralized web. APOLLO is a 6-week, invite-only program designed for makers interested in the Filecoin ecosystem to either continue their work or start new projects using Filecoin and Web3 ecosystem. The Filecoin Launchpad Accelerator is a full-time, fully-remote program, built-in collaboration with Tachyon, looking for startups building more open, interoperable, and programmable tools, infrastructure, and applications for the distributed web. + +[Check out these events](https://ignite.fil.events/) + +## Watch the debate on the future of social media on the dweb + +Check out this recent video from HackFS, featuring guests Balaji Srinivasan, Vitalik Buterin, and Juan Benet. + +[Watch now](https://www.youtube.com/watch?time_continue=2&v=DTxE9KV3YrE&feature=emb_logo) + +## Quote of the week + + + +## Launch your self-serve store today with Dshop + +Dshop is a free and open-source e-commerce solution built on IPFS and Ethereum. Existing partners like Brave Software, Kyber, and Solana are already using the technology to power their stores, and now Origin is making it available to new merchants everywhere, at no cost. + +[Create your Dshop](https://medium.com/originprotocol/dshop-is-open-for-business-launch-your-free-decentralized-store-in-minutes-d7a7092a7527) + +## Brand new on IPFS + +- [Connecting ETH to IPFS.](https://medium.com/@austin_48503/tl-dr-scaffold-eth-ipfs-20fa35b11c35) A Scaffold-ETH tutorial and example dapp for HackFS. +- [Build an encrypted to-do list with 3Box](https://medium.com/3box/building-an-encrypted-todo-list-with-3box-part-1-2-d1619cd02e5b), IPFS, OrbitDB and more in this recent tutorial. +- [Learn how to deploy smart contracts](https://blog.infura.io/deploying-smart-contracts-managing-transactions-ethereum/) and manage transactions on Ethereum with Infura. +- [Watch this video](https://www.youtube.com/watch?v=HbPEenonaIk&t=1s) explaining how to deploy a decentralized React app on IPFS with GitHub and Fleek. + +## People build the coolest stuff with IPFS + +Have you watched this ProtoSchool tutorial on [Decentralized Data Structures?](https://www.youtube.com/watch?v=_VJSX7ar29I&t=273s) + +For [qri’s latest release, v0.9.10](https://github.com/qri-io/qri/releases/tag/v0.9.10), they focused on clarity, reliability, major fixes, and communication (both between qri and the user, and the different working components of qri as well). + +Are you tracking [the standards work Ceramic Network](https://github.com/ceramicnetwork/CIP/issues/26) has been doing? + +How does [Berty](https://berty.tech/blog/future-of-berty/) imagine the future? + +The Numbers Protocol recently wrote up [a brief explanation of IPFS and Filecoin](https://medium.com/numbers-protocol/understanding-ipfs-filecoin-cc4b795db038). + +[Go beyond Bitswap](https://adlrocha.substack.com/p/adlrocha-beyond-bitswap-i), in the latest post from Alfonso de la Rocha. + +## Job hunting? Work on IPFS! + +[Signed and Encrypted IPLD, Go](https://www.notion.so/Signed-and-Encrypted-data-in-IPFS-e1593e90b56e44c38e165109999782ce): Implement a new Go-based IPLD codec that supports signed and encrypted Blocks, and get paid for it! Externally funded, 3Box and Textile, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-100/README.md b/src/_blog/weekly-100/README.md new file mode 100644 index 00000000..378c4d5a --- /dev/null +++ b/src/_blog/weekly-100/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-08-12 +url: /weekly-100/ +translationKey: ipfs-weekly-100 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 100 🎉 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #100 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## 🚨 We are deprecating SECIO very soon 🚨 + +Soon, support for the SECIO security transport in IPFS and libp2p will be removed. You can mitigate impact to your node(s) by updating to the latest versions. + +[Read the blog](https://blog.ipfs.io/2020-08-07-deprecating-secio/) + +## Join us at the Randomness Summit Thursday + +A one day conference about Randomness Beacons: the research done, the current use-cases and challenges and the systems available, all taking place this week! Speakers include Juan Benet, Vitalik Buterin, Justin Drake and others, and the event is free to attend. + +[Register now](https://randomness2020.com/) + +## Watch talks from the last meetup + + + +
+ +If you missed last Monday’s virtual community meetup, catch up on all of the talks (Unstoppable Domains! Ceramic! Koda the Robot Dog!) now. + +[Watch now](https://www.youtube.com/watch?v=mBFYKesErvI&list=PLuhRWgmPaHtToVYaDkd6ZTwB2Lo30s1vB&index=11&t=0s) + +## How content addressing solves streaming challenges + +Research plays a crucial role in IPFS development and iteration and that’s why we’re happy to share this recent post from Yiannis Psaras on the merits of content addressability in a world increasingly reliant on internet networks. + +[Read the post](https://research.protocol.ai/blog/2020/how-content-addressing-can-solve-streaming-challenges-as-networks-are-overloaded/) + +## Brand new on IPFS + +- The latest release of [Peergos v0.3.0](https://peergos.org/posts/release-v0.3.0), gives a huge range of new features, speed ups, and fixes. +- [Introducing Space](https://blog.space.storage/posts/Introducing-Space), an open-source file storage, sharing and collaboration platform for the dweb, from Fleek. +- [Testground v0.5.3](https://github.com/testground/testground/releases/tag/v0.5.3) adds support for traffic routing policies, basic authentication support, and more. +- [The React Roundup podcast](https://devchat.tv/react-round-up/rru-114-decentralized-react-threadsdb-ipfs-filecoin-with-carson-farmer/) had Carson Farmer from Textile on to talk ThreadsDB, IPFS, and more. + +## New IPFS case study: OpenBazaar + +The second in the IPFS Case Study Series focuses on OpenBazaar, a p2p e-commerce platform where buyers and sellers can participate anonymously and privately. By using IPFS to create this collaborative network, OpenBazaar enables users to trade without the risks of centralized data collection or the threat of having their personal information hacked! + +[Read the case study](https://docs.ipfs.io/concepts/case-study-openbazaar/#overview) + +## HackFS + IPFS = 🤯 + +From COVID-19 tracing to crowdfunding on the dweb to a social distancing lyrics app, a PiedPiper mockup and more—you have to check out the cool things folks built with IPFS during HackFS. + +[Browse the showcase](https://hack.ethglobal.co/hackfs/showcase) + +## Job hunting? Work on IPFS! + +[Signed and Encrypted IPLD, Go](https://www.notion.so/Signed-and-Encrypted-data-in-IPFS-e1593e90b56e44c38e165109999782ce): Implement a new Go-based IPLD codec that supports signed and encrypted Blocks, and get paid for it! Externally funded, 3Box and Textile, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-101/README.md b/src/_blog/weekly-101/README.md new file mode 100644 index 00000000..a778ee78 --- /dev/null +++ b/src/_blog/weekly-101/README.md @@ -0,0 +1,87 @@ +--- +date: 2020-08-19 +url: /weekly-101/ +translationKey: ipfs-weekly-101 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 101 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #101 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## IoTeX, the latest in the IPFS Case Study series + +Are you curious about how a privacy-protecting surveillance camera could benefit from decentralized storage? Or how a privacy-centric blockchain platform might address one of the major risks of today’s IoT devices? Learn how IPFS has provided robust solutions for both these situations with Iotex and Ucam. + +[Read the case study](https://docs.ipfs.io/concepts/case-study-iotex/#overview) + +## HackFS finale starts soon 🎉 + +Today is the day! Join the finale presentation at 4:30 UTC to see what finalists were able to create with IPFS and Filecoin, plus judging and more! + +[Watch now](https://youtu.be/GibA0t0z_9w) + +## New from Pinata: Mint Unity prefabs with IPFS + +The folks from Pinata have done it again! Check out their latest, a step-by-step tutorial on how to create and sell unity prefabs as crypto collectible NFTs using Unity, Pinata’s Pin Explorer, Rarible, and IPFS. + +[Check out the tutorial](https://medium.com/pinata/how-to-create-and-sell-unity-prefabs-on-ipfs-as-nfts-793352c62069) + +## Quote of the week + + + +## Brand new on IPFS + +- [Web 2.0 meets Web3!](https://medium.com/google-cloud/origin-launches-decentralized-commerce-on-google-cloud-marketplace-b74fb46be7d9) Origin launches decentralized e-commerce on Google Cloud Marketplace. +- [Infura’s IPFS service](https://blog.infura.io/ipfs-0-5-is-here-with-a-new-improved-gateway/) now supports IPFS 0.5, the largest upgrade to the IPFS protocol. +- Discover [Textile’s User Mailbox API](https://blog.textile.io/introducing-textiles-user-mailboxes-send-messages-between-users-or-any-public-key-owners/), and send messages between any users or public key owners. +- [How IoTeX uses IPFS](https://cryptonews.com/news/filecoin-iotex-ipfs-bringing-decentralized-updates-for-surve-7417.htm) for firmware updates, and Ucam uses the IPFS decentralized storage network. + +## People are building the coolest things with IPFS + +Build an encrypted todo list [with 3Box](https://medium.com/3box/building-an-encrypted-todo-list-with-3box-part-2-2-da15aa2e2640) (part 2/2) + +Discover a new open-source [way to “pin” content](https://medium.com/temporal-cloud/sharedforeststore-a-new-open-source-way-to-pin-content-on-ipfs-300817fe606f) on IPFS + +Take a deep dive into [direct S3 blockstore access](https://peergos.org/posts/direct-s3) in Peergos. + +Learn how to unlock DeFi with [decentralized query](https://medium.com/conflux-network/unlocking-defi-with-decentralized-query-fab4fb04d97f) + +See [Fission’s web native file system](https://talk.fission.codes/t/fission-s-web-native-file-system-technical-design-overview-with-daniel-and-brooklyn/818) technical design in action! + +[Use the Qri CLI](https://www.youtube.com/watch?v=GXNfxbKYLHM&feature=emb_logo) to create, push, and query community datasets + +Check out [IPFS Deploy for Java](https://hack.ethglobal.co/showcase/ipfs-deploy-for-java-recy6OKUfckknpvas), decentralized Java package repositories on IPFS/Filecoin. + +## Relive the Randomness Summit + +Missed the first-ever distributed randomness focused event, which folks were calling “awesome,” “excellent”, and “I haven’t been in this high quality a summit for so long, I forgot how good they could be!?” Catch up on all the talks from Juan Benet, Justin Drake, Irene Giacomelli, Vitalik Buterin, and more! + +[Watch now](https://randomness2020.com/) + +## Job hunting? Work on IPFS! + +[Signed and Encrypted IPLD, Go](https://www.notion.so/Signed-and-Encrypted-data-in-IPFS-e1593e90b56e44c38e165109999782ce): Implement a new Go-based IPLD codec that supports signed and encrypted Blocks, and get paid for it! Externally funded, 3Box and Textile, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-102/README.md b/src/_blog/weekly-102/README.md new file mode 100644 index 00000000..7153665d --- /dev/null +++ b/src/_blog/weekly-102/README.md @@ -0,0 +1,85 @@ +--- +date: 2020-08-26 +url: /weekly-102/ +translationKey: ipfs-weekly-102 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 102 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #102 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Support for ipfs:// landed in Chromium’s protocol registry + +Good news for integration of decentralized protocols in browsers! Now supported in Chromium: "cabal", "dat", "did", "dweb", "ethereum", "hyper", "ipfs", "ipns", and "ssb". Another step forward for browser support and webcompat! + +[Read more details](https://chromium.googlesource.com/chromium/src/+/4e8ed0cecce04c5c55dd84a09e4df0d0f11c660f) + +## HackFS pushes IPFS development forward + +See all 134 projects built during HackFS in the showcase hosted by ETHGlobal. From building a way for content to persist on IPFS despite damage to data and the network at large to lowering the barriers to leveraging open data networks, and more, check out how what folks built with IPFS. + +[HackFS Showcase](https://hack.ethglobal.co/hackfs/showcase) + +## Filecoin Launchpad applications due Friday, 8/28 + +The Filecoin Launchpad Accelerator is a fully-remote program dedicated to building more open, interoperable, and programmable tools, infrastructure, and apps for the distributed and decentralized web. The program runs Sep-Dec 2020, with 15-20 teams provided funding, mentorship, benefits, etc., culminating in a Demo Day and post-program fundraising support. + +[Apply today](https://labs.consensys.net/tachyon/) + +## Quote of the week + + + +## Brand new on IPFS + +- [Read Berty’s latest blog post](https://berty.tech/blog/metadata-mobile-messaging/) on about metadata in mobile messaging. +- [Tailscale takes a deep dive](https://tailscale.com/blog/how-nat-traversal-works/) into how (Network Address Translators) NAT traversal works. +- [Padlock helps artists monetize creative work](https://hack.ethglobal.co/showcase/padlock-recOwF5kjzFYLkYkO) via the decentralized web with IPFS. +- [The Audius API is here](https://audiusproject.github.io/api-docs/#audius-api-docs), stream music made by the Audius community in games, apps, and sites! + +## People are building the coolest things with IPFS + +Stay calm and use IPFS to become [the cool DeFi insurance agent](https://medium.com/hakkafinance/ipfs-and-3fmutual-referral-system-84d23ea95c8f) + +[Origin Dshop growth continues](https://medium.com/originprotocol/dshop-growth-continues-highlighting-coinlist-and-five-other-new-merchant-partners-6c2b3e1c3856) as CoinList, KardiaChain, Fleta, Oasis Network, and others add shops. + +[On DeFi frontends](https://medium.com/blockchannel/on-defi-frontends-3c87c3661354), merging the future of finance with the dweb + +[Create Eth App v1.4.0 is out](https://github.com/PaulRBerg/create-eth-app/releases/tag/v1.4.0) with support for deploy to IPFS + +What is an [Ethereum Name Service](https://medium.com/the-capital/what-is-an-ethereum-name-service-732e6618771f)? + +[Easy IPFS](https://github.com/matthewjosephtaylor/easy_ipfs), shell script wrappers around IPFS docker containers to make life a bit easier. + +## Using the Slate API with IPFS and Filecoin + +The Filecoin team started hosting a series of Master Classes to demonstrate how to build on the Filecoin network. The first session highlighted how to integrate the Slate API with IPFS and Filecoin. Slate is a storage application that allows you to store images, audio, video, and data through a graphical interface or API. + +[Watch now](https://www.youtube.com/watch?v=Rknj2GqvJtg&feature=emb_logo) + +## Job hunting? Work on IPFS! + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[Backend Engineer](https://cryptojobslist.com/jobs/backend-engineer-at-fleek-remote): Work with the Fleek Product and Engineering team to build the leading decentralized development platform. Fleek, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-103/README.md b/src/_blog/weekly-103/README.md new file mode 100644 index 00000000..c89c7f37 --- /dev/null +++ b/src/_blog/weekly-103/README.md @@ -0,0 +1,85 @@ +--- +date: 2020-09-02 +url: /weekly-103/ +translationKey: ipfs-weekly-103 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly 103 +description: +author: Jenn Turner +--- + +# Welcome to IPFS Weekly #103 + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Peergos wins EU Next Generation Internet grant + +Many congratulations to the folks at Peergos for their recent award of a €200,000 grant by the Next Generation Internet Program for Open Internet Renovation (NGI-POINTER). They intend to use the opportunity to develop new and exciting features for Peergos that will see it evolve into a privacy-focused, decentralized social network. Excellent work, friends! 👏 + +[Full announcement](https://peergos.org/posts/next-generation-internet) + +## Please upgrade go and go-libp2p immediately + +🚨 Ring the alarm! 🚨 Users of go-libp2p need to: + +upgrade their go installations to v1.14.7 and v1.13.15 —and— +upgrade their go-libp2p-\* dependencies to the latest released versions +in order to secure their applications against an upstream security vulnerability. + +[More details](https://discuss.libp2p.io/t/notice-upstream-security-vulnerability-please-upgrade-go-and-go-libp2p-immediately/629) + +## New IPFS & Ethereum workshop this weekend! + +The folks at ChainShot are hosting another workshop for those keen to learn more about IPFS and Ethereum. Led by Dan Nolan, the workshop is a weekend of fundamentals, concepts, and components, plus learning how to build core data structures. + +[Register now](https://www.chainshot.com/workshops) + +## Quote of the week + + + +## Brand new on IPFS + +- [Check out the Zilliqa Podcast](https://www.youtube.com/watch?v=pKXdNttBFVM&feature=emb_logo) on Blockchain Domain Names with Brad Kam from Unstoppable Domains. +- [Prepare to launch](https://blog.textile.io/prepare-to-launch-expanding-free-access-to-filecoin-through-hosted-powergates/): easy access to Filecoin with free Powergate instances from Textile. +- [New Demo](https://www.youtube.com/watch?v=P2qeY2nPK3Q&feature=emb_logo): Using the work-in-progress Qri Python client in Jupyter Notebooks. +- [OrbitDB released v0.25.0](https://github.com/orbitdb/orbit-db/releases/tag/v0.25.1) with updates to peer.exchanged and removing unused files. Enjoy! + +## People are building the coolest things with IPFS + +[Missed the Dat Conference?](https://blog.datproject.org/2020/08/22/dat-conference-the-summary/) Check out this summary of the event. + +Don’t miss this showcase of some of the [Fleek prize winners from HackFS](https://blog.fleek.co/posts/HackFS-winners). + +[New tutorial](https://blog-81003.web.app/how-to-load-tensorflow-js-model-using-ipfs): How to load Tensorflow.js model using IPFS + +[Instant Notary App](https://blog.bluzelle.com/bluzelle-community-project-showcase-instant-notary-app-57e4d2a1308e): Combining the power of Bluzelle + IPFS + +ChainSafe joins the [League of Entropy](https://medium.com/chainsafe-systems/chainsafe-joins-league-of-entropy-production-drand-network-dee62919d8d5)! + +## Build decentralized apps using Fleek’s Space Daemon + +Learn all about how to use the latest and most exciting decentralized development, the Space Daemon from Fleek, in the latest Filecoin Master Class. Hosted by Samuele Agostinelli, this class takes you from technical decision making to step by step setup and implementation. + +[Watch now](https://www.pscp.tv/w/1RDGlrnQgPlxL) + +## Job hunting? Work on IPFS! + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-104/README.md b/src/_blog/weekly-104/README.md new file mode 100644 index 00000000..be33b9a0 --- /dev/null +++ b/src/_blog/weekly-104/README.md @@ -0,0 +1,77 @@ +--- +date: 2020-09-09 +url: /weekly-104/ +translationKey: ipfs-weekly-104 +tags: weekly +header_image: weekly-newsletter.png +title: Welcome to IPFS Weekly 104 +description: +author: Jenn Turner +--- + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! + +## Join us Thursday for a community meetup + +It’s September so it’s time for the IPFS community to gather once again! This month we’ll have guests from IoTeX, the folks behind Ucam, plus the creators of IPFS Recovery, an update from the go-IPFS maintainers, and more. Sign up to give a lightning talk and share what you’ve been building with IPFS! + +[Register here](https://protocol.zoom.us/webinar/register/9815995835879/WN_BD2oTcusST6QrfOw3Dx8Qw) + +## Chrome Beta added support for ipfs:// and ipns:// + +Hot on the heels of the news of Chromium’s support for dweb protocols (including ipfs://) comes the announcement that Chrome Beta extended their safelist distributed web schemes for registerProtocolHandler(). IPFS was included alongside cabal, dat, did, dweb, ethereum, hyper, ipns, and ssb. + +[Read the announcement](https://blog.chromium.org/2020/09/chrome-86-improved-focus-highlighting.html) + +## Interested in putting your IPFS project on Filecoin? + +Calling all builders! We’re looking for as many IPFS projects as possible to integrate with Filecoin by September 18. Protocol Labs can potentially offer grants, as well as support from our engineering team and community, for large projects that can hit this timeline. Check out how to [deploy your app to the network](https://docs.filecoin.io/build/start-building/deploy-your-application-to-the-filecoin-testnet/) and tools like [Textile’s Powergate](https://docs.textile.io/powergate/) that makes integration much easier. Reach out to ipfs-to-filecoin-testnet@protocol.ai if you are interested or have any questions. + +## Brand new on IPFS + +- [Read this proposal](https://hackernoon.com/what-would-git-could-look-like-in-web-30-xdt3wdx) for a distributed version control system that can be navigated via a block explorer. +- Create “art” on IPFS with [Nifty.Ink](https://medium.com/@austin_48503/nifty-ink-%EF%B8%8F-alpha-release-c860a4904cb2), built on scaffold-eth, an NFT platform that scales. +- The [DAG JOSE Project](https://www.memoryandthought.me/golang,/ipfs/2020/09/04/dag-jose-project.html), enabling interoperable encrypted and/or signed application data in IPFS via IPLD and JOSE. +- [What are your thoughts](https://talk.fission.codes/t/spa-mode-for-go-ipfs-http-gateway/999) on the folks at Fission creating a SPA mode for go-ipfs HTTP gateway? + +## People are building the coolest things with IPFS + +Check out [Parcel](https://www.youtube.com/watch?time_continue=1&v=AVyNd994IFM&feature=emb_logo), a decentralized, crypto payroll service with built-in end-to-end data encryption using Sablier, Filecoin and IPFS. + +Alfonso de la Rocha strikes again, this time with [Hash Array Mapped Tries (HAMT)](https://adlrocha.substack.com/p/adlrocha-hash-array-mapped-tries) to the rescue! + +What’s the latest in [Berty news](https://berty.tech/newsletter/news-44/)? + +Matthew Gould and Bradley Kam, of [Unstoppable Domains](https://www.listennotes.com/podcasts/the-boost-vc-podcast/ep95-how-dweb-outdoes-the-se4uUkTLOZ1/), talk about the future of dweb in the latest episode from The Boost VC Podcast. + +Over 200 Graph Nodes were deployed in [The Graph’s Testnet](https://medium.com/graphprotocol/over-200-graph-nodes-deployed-in-the-graphs-testnet-1cec2175d15a) + +This, we love: [Blockchain, Creativity and Arts Intertwine](https://medium.com/paradigm-fund/blockchain-creativity-and-arts-intertwine-d3c42739312f): Use Cases and Notable Projects + +Projects using IPFS got some love as part of the Web3 Foundation Grants [Wave 6 Recipients](https://medium.com/web3foundation/web3-foundation-grants-wave-6-recipients-5ed8d5cc179). + +## ETHGlobal’s biggest event of the year + +Next month, ETHGlobal kicks off 30-days of hackathons, summits, workshops, and events in their biggest event of the year, focused on the idea that Ethereum can change things. With over 20,000 USD available in prizes, what will you build? + +[Apply now](https://ethonline.org/) + +## Job hunting? Work on IPFS! + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Developer Advocate, IPFS](https://jobs.lever.co/protocol/71c4a9b9-af90-4ce9-9dba-8b72507997bf): Provide tactical support for the IPFS community, creating a global community strategy, and executing this strategy on the ground! Protocol Labs, Remote + +[View our job postings](https://jobs.lever.co/protocol) + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us](mailto:newsletter@ipfs.io). + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-105/README.md b/src/_blog/weekly-105/README.md new file mode 100644 index 00000000..8acc2af0 --- /dev/null +++ b/src/_blog/weekly-105/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-09-16 +url: /weekly-105/ +translationKey: ipfs-weekly-105 +tags: weekly +header_image: weekly-newsletter.png +title: Welcome to IPFS Weekly 105 +description: +author: Jenn Turner +--- + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Our IPFS Case Study series is on Fleek 😎 + +See what we did there? Jokes aside, our latest edition of the case study series focuses on our friends at Fleek. Learn the history of Fleek, the benefits they see using IPFS, as well as a quick peek under the hood. Enjoy! + +[Read the case study](https://docs.ipfs.io/concepts/case-study-fleek/#overview) + +## js-IPFS 0.50.0 shipped! 🎉🎉🎉 + +Earlier this week, js-ipfs officially reached version 0.50.0, adding the ability to share a node between multiple browser tabs and greatly improved pinning performance. It also includes quite a few new features, some API changes, and one breaking change you’ll want to review. + +[Read the release notes](https://blog.ipfs.io/2020-09-14-js-ipfs-0-50/) + +## Quote of the week + + + +## Added support for Nix already in progress + +Obsidian Systems is adding support for IPFS to Nix, a package manager, but at its heart a general-purpose build tool, so that build products can be persisted to and fetched from IPFS. Learn how they have organized this work into two distinct phases (Milestone 1 was already achieved!) by reading the announcement. + +[Read the blog](https://blog.ipfs.io/2020-09-08-nix-ipfs-milestone-1/) + +## Brand new on IPFS + +- [Qri recently released version 0.4.5](https://qri.io/download) of the Qri Desktop app to add a small refactor to match new qri backend. +- The [IPFS WebUI shipped v2.11.0](https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v2.11.0) with too many new features and bug fixes to list here, check it out! +- Have you heard the [IPFS Podcast](https://soundcloud.com/user-4802515/ipfs-podcast-episode-3-protocol-labs-part-2)? Listen to a recent episode featuring Project Lead Molly Mackinlay. +- The [Ceramic Network](https://www.ceramic.network/) got a brand new look. Visit their new site to get an update on their testnet and more. + +## People are building the coolest things with IPFS + +Check out [this recap on HackFS](https://medium.com/ethglobal/hackfs-building-up-to-the-finale-fbcb74f2404f) from the folks at ETHGlobal. + +[Galacteek](https://github.com/pinnaculum/galacteek/releases/tag/v0.4.33), a multi-platform browser for the distributed web, is out with a new version, 0.4.33. + +Kevin Zhang asks, how does [the delegation chain](https://medium.com/@pushbar/how-does-the-delegation-chain-help-security-and-trust-5e17b5a922a7) help security and trust? + +Tutorial: Easily [add “ipfs://” URL support](https://medium.com/@boomycloud/easily-add-ipfs-url-support-to-any-web-page-for-any-browser-7a254287e010) to any site for any browser + +Learn how Infura is powering [Nori’s Marketplace](https://infura.io/customers/nori) and API for Verified Carbon Removal + +How to launch an [NFT Sale on WAX](https://medium.com/wax-io/how-to-launch-an-nft-sale-on-wax-a-complete-guide-19944b3db67f): A Complete Guide + +Check out this IPFS mirror of the [Crypto Punks image](https://twitter.com/pixls_dot_eth/status/1304517078729330688) + +## Join us Thursday for Decentralizing the Cloud + +Later this week, we’ll be attending Decentralizing the Cloud: The Promise and Potential of Distributed Storage, hosted by our friends at Polkadot. Michelle Lee from Protocol Labs will be in attendance to discuss design patterns from Filecoin and other projects, and explore how and why they help us build the future of the decentralized web. Don’t miss it! + +[Register to attend](https://www.crowdcast.io/e/ubjg7i8k/register) + +## Job hunting? Work on IPFS! + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-106/README.md b/src/_blog/weekly-106/README.md new file mode 100644 index 00000000..dc149adc --- /dev/null +++ b/src/_blog/weekly-106/README.md @@ -0,0 +1,65 @@ +--- +date: 2020-09-23 +url: /weekly-106/ +translationKey: ipfs-weekly-106 +tags: weekly +header_image: weekly-newsletter.png +title: Welcome to IPFS Weekly 106 +description: +author: Jenn Turner +--- + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## An IPFS September to Remember Meetup + +If you missed the latest IPFS Meetup, not to worry. You can catch up on all the presentations, from IPFS Recovery to IoTex to the details behind go-IPFS 0.7 and more, by tuning into the IPFS YouTube channel. Bonus feature: another delightful lightning talk you won’t want to miss! + +[Watch the videos](https://blog.ipfs.io/2020-09-18-ipfs-meetup-sep2020/) + +## Space Race 2: Slingshot - put your project on Filecoin for FIL token rewards! + +Following [Space Race 1](https://spacerace.filecoin.io/), a competition for storage miners that resulted in 230PiB onboarded to the Filecoin testnet, Protocol Labs announced Space Race 2: Slingshot, a competition for the community of developers excited to use all this storage! Developers who integrate an application with and store useful data on Filecoin’s testnet can be eligible for potentially large Filecoin token rewards. We’d love to have as many developers from the IPFS community as possible participating - eligible integrations can be as simple as using a tool like [Textile’s Powergate](https://docs.textile.io/powergate/) to back up data your project is already storing on IPFS to Filecoin. Competition details can be found [here](https://filecoin.io/blog/announcing-sr2-slingshot/)! + +## New IPFS Case Study: Arbol + +Continuing the IPFS Case Study Series, Arbol is the latest organization to be featured, discussing how IPFS has benefitted their agriculturally-focused platform. From creating contracts for parametric weather protection agreements to the role of content addressability, Arbol has a very interesting case. + +[Read the case study](https://docs.ipfs.io/concepts/case-study-arbol/) + +## Brand new on IPFS + +- [ProtoSchool’s interactive tutorials](https://proto.school/tutorials) now include courses on IPFS, Filecoin and dweb concepts. Check it out! +- [Pinata’s latest work on NFT Files](https://medium.com/pinata/the-file-requirements-for-nfts-a20ea3ac524b) is leading the field when it comes to storage and management. +- Recently, [Infura took a deep-dive into IPFS](https://blog.infura.io/an-introduction-to-ipfs/), how it works, and how it fits into the Web3 stack. +- The podcast [Proof of Usability](https://anchor.fm/z-herring/episodes/Protocols-are-the-ultimate-hyper-object---Talking-Design-Philosophy-w-Jessica-Schilling-and-Jim-Lee-ejnn3o/a-a37rllr) interviewed IPFS & Filecoin designers Jessica Schilling and Jimmy Lee. + +## IPFS in the news + +How Hongkongers can use new technologies to preserve their democratic rights | [Hong Kong Free Press](https://hongkongfp.com/2020/09/16/how-hongkongers-can-use-new-technologies-to-preserve-their-democratic-rights/) + +Web 3.0 would enable new possibilities and opportunities | [Cointelegraph](https://cointelegraph.com/news/web-3-0-would-enable-new-possibilities-and-opportunities) + +HackFS kickstarts project development in Web 3.0 | [Forkast](https://forkast.news/hackfs-kickstarts-project-development-protocol-labs/) + +## Job hunting? Work on IPFS! + +[Front-end Developer](https://twitter.com/ceramicnetwork/status/1305886402886995968): Are you an experienced front end dev that understands IPFS and linked data and wants to make an impact on the future of Web3? Ceramic is looking for a contractor to work on Ceramic Explorer. + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +[Senior Software Engineer Rust/Go](https://www.notion.so/Hiring-Senior-Software-Engineer-Rust-Go-e6c94ccc261f426c80a483c7fc642412): You would be working with our distributed team of engineers on new products, core protocols or client projects. Most of the work we do is or will eventually be open source. Equilibrium, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-107/README.md b/src/_blog/weekly-107/README.md new file mode 100644 index 00000000..6cbcb751 --- /dev/null +++ b/src/_blog/weekly-107/README.md @@ -0,0 +1,83 @@ +--- +date: 2020-09-30 +url: /weekly-107/ +translationKey: ipfs-weekly-107 +tags: weekly +header_image: weekly-newsletter.png +title: Welcome to IPFS Weekly 107 +description: +author: Jenn Turner +--- + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## go-ipfs 0.7 is here 🚀🚀🚀 + +The latest iteration of the Go implementation of IPFS brings a truckload of features and fixes: SECIO disabled by default 👋, rotating keys 🔑, IPNS paths now encode the key name as a base36 CIDv1 by default 🎹, key export/import 📦, and more. Great work everyone! + +[Read the release notes](https://blog.ipfs.io/2020-09-24-go-ipfs-0-7-0/) + +## Case Study: Shipping IPFS with Morpheus.Network + +And we mean that quite literally. For Morpheus.Network, shipping of goods across the globe, it’s critical—both functionally and legally—to have verifiable, consistently accessible documentation for every shipment. That’s where IPFS comes into the picture, in the latest entry in the IPFS Case Study series. + +[Read the case study](https://docs.ipfs.io/concepts/case-study-morpheus/) + +## Quote of the week + + + +## Listen to podcasts on IPFS 🎧 + +Curious about which podcasts are stored on IPFS? Now you can search all of the podcasts available to stream on our favorite filesystem, courtesy of Pod.casts.io and Andrew Nesbitt. + +[Check out podcasts](https://pod.casts.io/ipfs) + +## Brand new on IPFS + +- [Rust IPFS + Substrate](https://medium.com/equilibriumco/tech-preview-2-rust-ipfs-substrate-848b8a1afb26): Introducing Ipfs::add, Ipfs::cat, pinning, and a much faster build time! +- [PowergateIO](https://github.com/orbitdb/orbit-db-powergate-io), a bridge between OrbitDB and Powergate, which is a bridge between Filecoin and IPFS. +- [qDesk](https://github.com/QuestNetwork/qDesk), lightning fast open-source peer-to-peer cross-platform social network that doesn’t sell you out. +- Don’t miss the [v1.0.0 release](https://github.com/textileio/go-threads/releases/tag/v1.0.00) of Textile’s go-threads server-less p2p database built on libp2p. + +## People are building the coolest stuff with IPFS + +[TCS and Yale University](https://finance.yahoo.com/news/tcs-yale-university-develop-secure-163400764.html) develop secure, private off-grid networking platform using IPFS + +The Brave Swag Store, [built on Origin](https://medium.com/originprotocol/the-brave-swag-store-now-accepts-bat-and-eth-4f5789c7112a), now accepts BAT and ETH + +Tutorial: Getting started with [Infura’s IPFS service](https://blog.infura.io/part-2-getting-started-with-ipfs-on-infura/) + +Video: Watch an [Unstoppable AMA](https://twitter.com/unstoppableweb/status/1308843950531379203?s=20) with Brad Kam + +[Decentralized Data Governance](https://medium.com/natix-io/natix-edge-drive-decenterzied-data-governance-8d497eac8ac2), courtesy of IPFS and NATIX EdgeDrive + +Eco-Track supply chain and recycling services using [IOTA and IPFS](https://medium.com/coinmonks/eco-track-supply-chain-and-recycling-services-using-iota-c2b1de681aac) + +[Swarm, IPFS and BigchainDB](https://hackernoon.com/swarm-ipfs-and-bigchaindb-comparing-data-storage-and-decentralization-4a2o3wf8): Comparing data storage and decentralization + +## Space Race 2: Slingshot - put your project on Filecoin for FIL token rewards! + +[Slingshot](https://slingshot.filecoin.io/) has kicked off and there’s still time to join the fun! Developers who integrate an application with and store useful data on Filecoin’s testnet can be eligible for potentially large Filecoin token rewards. Integrations can be as simple as using a tool like [Textile’s Powergate](https://docs.textile.io/powergate/) to back up data your project is already storing on IPFS to Filecoin. Sign up and find out more [here](https://slingshot.filecoin.io/)! + +## Job hunting? Work on IPFS! + +[Distributed Systems Engineer](https://jobs.lever.co/3box): 3Box is looking for a distributed systems engineer to push the limits of decentralized distributed systems by implementing and upgrading the Ceramic protocol in a high performance scaled network. + +[Front-end Developer](https://twitter.com/ceramicnetwork/status/1305886402886995968): Are you an experienced front end dev that understands IPFS and linked data and wants to make an impact on the future of Web3? Ceramic is looking for a contractor to work on Ceramic Explorer. + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +[Project Lead, libp2p](https://jobs.lever.co/protocol/27ff3891-6e13-4aa8-b43a-734715e85a26): This is a unique opportunity to take ownership of a massively successful open source project and carry it through its next phase of growth. Protocol Labs, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-108/README.md b/src/_blog/weekly-108/README.md new file mode 100644 index 00000000..1c396229 --- /dev/null +++ b/src/_blog/weekly-108/README.md @@ -0,0 +1,135 @@ +--- +date: 2020-10-07 +url: /weekly-108/ +translationKey: ipfs-weekly-108 +tags: weekly +header_image: weekly-newsletter.png +title: IPFS Weekly’s Q3 2020 Recap Issue +description: +author: Jenn Turner +--- + +# Welcome to the IPFS Weekly! + +A quick look back at what we accomplished together in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 + +## Thank you. We couldn’t do this without you. ❤️ + +What a long, strange trip the past few months have been. We are so grateful for every single contributor who took the time to submit issues, apply for grants, invent in a hackathon, participate in surveys, share a pull request, attend an event, or offer encouragement. Thank you for all you do to make our community a fantastic place to be. + +## Jumping right into July + +New quarter, new project! We kicked this one off with an introduction to the [IPFS Case Study Series](https://blog.ipfs.io/2020-07-09-case-study-audius/)! Includes features on Fleek, Arbol, Audius, and more. + +Libp2p and ResNetLab teamed up to ship a comprehensive, 61-page [evaluation report on Gossipsub](https://blog.ipfs.io/gossipsubv1.1-eval-report-and-security-audit/), in which you can learn how they approached the testing of Gossipsub v1.1, the setting in which tests were run, and detailed descriptions of the conclusions taken from the evaluation. + +The [js-ipfs 0.48.0 release](https://blog.ipfs.io/2020-07-20-js-ipfs-0-48/) included much better default connectivity, a smaller blockstore, a more intuitive API, and loads of new features and bugfixes. + +This [content routing deep dive](https://blog.ipfs.io/2020-07-20-dht-deep-dive/) from the 0.5 release covered everything you wanted to know about how DHTs work, and how we made the implementation used by IPFS faster and more resilient. + +[ProtoSchool created new dweb courses](https://proto.school/#/tutorials?course=ipfs) from the many tutorials they offer. Peruse courses on IPFS, Filecoin, Multiformats, and more with updated content from the latest releases. + +Oli Evans created a way to [pin your site to IPFS from a GitHub Action](https://github.com/ipfs-shipyard/ipfs-github-action)! The action pins a directory to IPFS by using the ipfs-cluster-ctl command to pin it to a remote IPFS Cluster. + +## And, another month, August + +We announced [deprecation of the SECIO security transport](https://blog.ipfs.io/2020-08-07-deprecating-secio/) in favor of the Noise security transport. + +[Our August virtual meetup](https://blog.ipfs.io/2020-08-14-ipfs-meetup-aug2020/) hosted talks from Unstoppable Domains, the builders of Koda the Robot Dog, Ceramic, and more. + +The virtual hackathon, [HackFS wrapped up](https://hack.ethglobal.co/hackfs/showcase), showcasing 135+ projects built with IPFS and Filecoin. + +The first-ever [Randomness Summit](https://randomness2020.com/) took place, addressing the state of randomness beacon research and deployment, and was a great success. + +Yiannis Psaras shared the merits of content addressability in a world increasingly reliant on internet networks in [How content addressing can solve streaming challenges as networks are overloaded](https://research.protocol.ai/blog/2020/how-content-addressing-can-solve-streaming-challenges-as-networks-are-overloaded/). + +[Chromium announced support](https://chromium.googlesource.com/chromium/src/+/4e8ed0cecce04c5c55dd84a09e4df0d0f11c660f) for: “cabal”, “dat”, “did”, “dweb”, “ethereum”, “hyper”, “ipfs”, “ipns”, and “ssb”. Another step forward for browser support and webcompat! + +The Filecoin team started hosting [a series of Master Classes](https://www.youtube.com/watch?v=Rknj2GqvJtg&feature=emb_logo) to demonstrate how to build on the Filecoin network. In the first session, Jimmy Lee highlighted how to integrate the Slate API with IPFS and Filecoin. + +## Staying the course in September + +Obsidian Systems began their efforts to [add support for IPFS to Nix](https://blog.ipfs.io/2020-09-08-nix-ipfs-milestone-1/), a package manager (but at its heart a general-purpose build tool), so that build products can be persisted to and fetched from IPFS. + +[js-ipfs officially reached version 0.50.0](https://blog.ipfs.io/2020-09-14-js-ipfs-0-50/), adding the ability to share a node between multiple browser tabs and greatly improved pinning performance. + +In September we had the creators of IPFS Recovery, a HackFS project, and an update from the go-ipfs maintainers speak at our [monthly virtual community meetup](https://blog.ipfs.io/2020-09-18-ipfs-meetup-sep2020/). + +Our pals at Peergos were awarded a €200,000 grant by the [Next Generation Internet Program for Open Internet Renovation](https://peergos.org/posts/next-generation-internet) (NGI-POINTER). + +[Chrome Beta extended their safelist](https://blog.chromium.org/2020/09/chrome-86-improved-focus-highlighting.html) distributed web schemes for registerProtocolHandler(). IPFS was included alongside cabal, dat, did, dweb, ethereum, hyper, ipns, and ssb. + +The IPFS Web UI team shipped a whole host of [new features in v2.11.0](https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v2.11.0) to make your IPFS experience smooth, sleek, and chic. + +The podcast [Proof of Usability](https://anchor.fm/z-herring/episodes/Protocols-are-the-ultimate-hyper-object---Talking-Design-Philosophy-w-Jessica-Schilling-and-Jim-Lee-ejnn3o/a-a37rllr) interviewed IPFS & Filecoin designers Jessica Schilling and Jimmy Lee. + +You can now search all of the [podcasts available to stream on IPFS](https://pod.casts.io/ipfs), courtesy of Pod.casts.io and Andrew Nesbitt. + +The latest iteration of [go-IPFS, v0.7.0](https://blog.ipfs.io/2020-09-24-go-ipfs-0-7-0/), landed and with it, the deprecation of SECIO, updates to IPNS paths, and some important plugin build changes. 🎉 + +## Also new this quarter... + +Michael Sena, from Ceramic, asked, what is [Identity Index](https://medium.com/@msena/what-is-identity-index-d3594b59633e)? + +[Origin opened Dshop](https://medium.com/originprotocol/dshop-is-open-for-business-launch-your-free-decentralized-store-in-minutes-d7a7092a7527) for business so you can launch a free, decentralized store in minutes. + +[Peergos released v0.3.0](https://peergos.org/posts/release-v0.3.0) landing improvements to the S3 datastore, and now you can test their alpha! + +Fleek [introduced Space](https://blog.space.storage/posts/Introducing-Space), an open-source file storage, sharing, and collaboration platform built on the distributed web. + +The OrbitDB community created [PowergateIO](https://github.com/orbitdb/orbit-db-powergate-io), a bridge between OrbitDB and Powergate, which is a bridge between Filecoin and IPFS. + +[Galacteek released v0.4.33](https://github.com/pinnaculum/galacteek/releases/tag/v0.4.33), which shipped a critical fix to their multi-platform browser for the distributed web + +The Audius Project shipped some [sleek Audius API Docs](https://audiusproject.github.io/api-docs/#audius-api-docs). + +Textile [released v1.0.0 of go-threads](https://github.com/textileio/go-threads/releases/tag/v1.0.00), a server-less p2p database built on libp2p. + +[QuestNetwork introduced qDesk](https://github.com/QuestNetwork/qDesk), an open-source, trustless, peer-to-peer cross-platform social network. + +Equilibrium shipped an update on improving the integration of the [Rust IPFS client with Substrate](https://medium.com/equilibriumco/tech-preview-2-rust-ipfs-substrate-848b8a1afb26). + +The [DAG JOSE](https://www.memoryandthought.me/golang,/ipfs/2020/09/04/dag-jose-project.html) project by Adam Good kicked off. + +Keep up the great work team! We can’t wait to see what you do in the next few months. 🎉 + +## Missed a meetup? We got you 😊 + + +
+
+Catch up on all of the presentations, updates, and lightning talks from Q3 by subscribing to the [IPFS Virtual Meetups playlist](https://www.youtube.com/playlist?list=PLuhRWgmPaHtToVYaDkd6ZTwB2Lo30s1vB). + +## Great reads from Q3 👇 + +[Beyond Bitswap](https://adlrocha.substack.com/p/adlrocha-beyond-bitswap-i) by Alfonso de la Rocha + +[An Introduction to IPFS](https://blog.infura.io/an-introduction-to-ipfs/) (Interplanetary File System) by Dr. Christian Lundkvist, John Lilic, and Cheryl Douglass + +[How Hongkongers can use new technologies to preserve their democratic rights](https://hongkongfp.com/2020/09/16/how-hongkongers-can-use-new-technologies-to-preserve-their-democratic-rights/) by Roger Huang, Hong Kong Free Press + +[Create and sell Unity Prefabs as Crypto Collectible NFTs using IPFS](https://medium.com/pinata/how-to-create-and-sell-unity-prefabs-on-ipfs-as-nfts-793352c62069) by Leon Do, Pinata + +[Web 3.0 would enable new possibilities and opportunities](https://cointelegraph.com/news/web-3-0-would-enable-new-possibilities-and-opportunities) by Zhong Gengfa, Cointelegraph + +[HackFS kickstarts project development in Web 3.0](https://forkast.news/hackfs-kickstarts-project-development-protocol-labs/) by Yohan Yun, Forkast + +## Coming up next + +So what’s next for IPFS? 🤔 + +Our community is excited for Filecoin launch, which officially begins October 19th with a week of [Filecoin Mainnet Liftoff](https://filecoin.io/blog/mainnet-ignition/) events and celebrations! + +TypeScript support is coming to IPFS in the near future. For more information, check out the [js-ipfs Project Roadmap](https://github.com/orgs/ipfs/projects/6). + +Some exciting projects are in the works, sponsored by the [IPFS Dev Grants program](https://github.com/ipfs/devgrants), including collaborations with Libre Space Foundation, OpenStreetMap, Nix, and more! + +If you’d like to get involved, check out [our contribution guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md), take a peek at [the docs](https://docs.ipfs.io/), and come to [IPFS Office Hours](https://github.com/ipfs/community/issues?utf8=%E2%9C%93&q=label%3A%22%F0%9F%99%8C%F0%9F%8F%BD+IPFS+Weekly+Call%22+) to get pointers on where to start! + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-109/README.md b/src/_blog/weekly-109/README.md new file mode 100644 index 00000000..69b5abaf --- /dev/null +++ b/src/_blog/weekly-109/README.md @@ -0,0 +1,87 @@ +--- +date: 2020-10-14 +url: /weekly-109/ +translationKey: ipfs-weekly-109 +tags: weekly +header_image: weekly-newsletter.png +title: Welcome to IPFS Weekly 109 +description: +author: Jenn Turner +--- + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## LikeCoin closes out the IPFS Case Study series + +The first series of IPFS Case Studies is now complete, ending with a look into how LikeCoin decentralizes the standard of truth for online media content with IPFS. Based on the Cosmos SDK, LikeCoin uses IPFS and custom IPLD to achieve its vision. + +[Read the case study](https://docs.ipfs.io/concepts/case-study-likecoin/) + +## Preparing for Filecoin Mainnet launch + +Next week Filecoin takes off, and to celebrate the team has a week full of action-packed talks, workshops, and panels from the Web3 community to celebrate mainnet launch and chart the future of the Filecoin network. + +[Join us 🚀](https://liftoff.filecoin.io/) + +## 🚨 Attention IPFS Desktop Windows users 🚨 + +**If you are on Windows and stuck with IPFS Desktop older than v0.13.1, please install [IPFS-Desktop-Setup-0.13.2.exe 1](https://github.com/ipfs-shipyard/ipfs-desktop/releases/download/v0.13.2/IPFS-Desktop-Setup-0.13.2.exe) manually.** + +We fixed autoupdate issues on Windows platform in v0.13.1, however older versions may still struggle to update. Manual update is a one-time fix: from now on, Windows updates will work as expected. + +## Paving the way for a new digital economy + +Recently IPFS contributor Jessica Schilling was featured in Modern Consensus, a publication focused on blockchain and cryptocurrency. In her op-ed, she describes how IPFS aims to break the stranglehold of tech giants by decentralizing the internet. + +[Read more](https://modernconsensus.com/commentary/opinion/ipfs-is-paving-the-way-for-a-new-digital-economy/) + +## Brand new on IPFS + +- [Kickoff your application with js-libp2p](https://medium.com/moxystudio/kickoff-your-application-with-js-libp2p-68221baaf38c_) with this guide to setting up a fully functional libp2p node +- VIDEO: [Building Web3:](https://www.youtube.com/watch?v=d1kpID1LSRE&feature=emb_logo) Textile builds developer tools that return data ownership to users +- [Introducing Litentry](https://medium.com/@litentry/introducing-litentry-d47b23d54281), identity and related data management layer for the Polkadot ecosystem +- [Coding with Ceramic Network](https://medium.com/ceramic/10-ideas-for-sculpting-with-ceramic-network-35328d9ad686)—see what you can do with the document-based data storage network + +## People are building the coolest things with IPFS + +Check out [ipfs-pharo](https://github.com/khinsen/ipfs-pharo): an IPFS interface for Pharo + +[“We plan to establish the first IPFS node on Mars”](https://hackernoon.com/we-plan-to-establish-the-first-ipfs-node-on-mars-says-filecoin-miner-neo-ge-ke2c3whe) says Filecoin Miner Neo Ge + +[A Guide to NFTs in Upland](https://medium.com/upland/a-guide-to-nfts-in-upland-a62515f75aa4). Bringing digital ownership to the next level + +Hacker Noon interviewed frequent [IPFS contributor Vaibhav Saini](https://hackernoon.com/ideas-manage-build-write-vaibhav-saini-on-optimal-learning-process-bq6t3ttk) on Optimal Learning Process + +Why the [P2P Resurgence](https://hackernoon.com/why-the-p2p-resurgence-is-the-step-backwards-the-internet-desperately-needs-fz2u3e7j) is the step backward the Internet desperately needs + +[VentureBeat](https://venturebeat.com/2020/10/06/google-chrome-86/) featured Chrome’s extended list of URL schemes—including ipfs and ipns + +Watch this demo of the [Qri Desktop 0.5.0 release candidate](https://twitter.com/qri_io/status/1314635575123734529?s=20) + +[Install IPFS for Linux](https://snapcraft.io/ipfs) using the Snap Store + +## Slingshot - put your project on Filecoin for FIL token rewards + +[Slingshot](https://slingshot.filecoin.io/) has kicked off and there’s still time to join the fun! Developers who integrate an application with and store useful data on Filecoin’s testnet can be eligible for potentially large Filecoin token rewards. Integrations can be as simple as using a tool like [Textile’s Powergate](https://docs.textile.io/powergate/) to back up data your project is already storing on IPFS to Filecoin. Sign up and find out more [here](https://slingshot.filecoin.io/)! + +## Job hunting? Work on IPFS! + +[Devops or SRE](https://authenticjobs.com/job/3006/textile-devops-or-sre/): The role is for someone with strong hands-on DevOps experience (cloud architecture, automated deployment, Kubernetes orchestration) that also likes to get their hands into the code (primarily written in Go). Textile, Remote. + +[Distributed Systems Engineer](https://jobs.lever.co/3box): 3Box is looking for a distributed systems engineer to push the limits of decentralized distributed systems by implementing and upgrading the Ceramic protocol in a high performance scaled network. + +[Front-end Developer](https://twitter.com/ceramicnetwork/status/1305886402886995968): Are you an experienced front end dev that understands IPFS and linked data and wants to make an impact on the future of Web3? Ceramic is looking for a contractor to work on Ceramic Explorer. + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +[UI Engineer](https://textile.breezy.hr/p/2efb847aca79-ui-engineer): Come build scalable front-end applications, experiment with new technologies, and build beautiful products. Textile, Remote + +**[View our job postings](https://jobs.lever.co/protocol)** + +Take care of yourselves and each other. ❤️ + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/_blog/weekly-110/README.md b/src/_blog/weekly-110/README.md new file mode 100644 index 00000000..780f9986 --- /dev/null +++ b/src/_blog/weekly-110/README.md @@ -0,0 +1,75 @@ +--- +date: 2020-10-21 +url: /weekly-110/ +translationKey: ipfs-weekly-110 +tags: weekly +header_image: weekly-newsletter.png +title: Welcome to IPFS Weekly 110 +description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut pulvinar. Nunc blandit nisi. Nam pulvinar augue nibh, sit amet varius magna egestas ac. +author: Jenn Turner +--- + +Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! 🚀 + +## Filecoin Mainnet takes off 🚀🚀🚀 + +Around 3pm UTC, on October 15, the Filecoin Mainnet went live! This was the culmination of years of effort, innovation, and teamwork. Join us in celebrating this momentous event by participating in [Filecoin Liftoff week](https://filecoin.io/blog/mainnet-liftoff-week/), running today through Friday, October 23. + +[Read the announcement](https://filecoin.io/blog/mainnet-liftoff/) + +## The latest on IPFS Desktop and IPFS Companion + +New release time! Check out updates on IPFS Desktop, including new features, bug fixes, and a crucial update for Windows users. But that’s not all, IPFS Companion also received some updates, including many visual additions you are absolutely going to love. + +Read notes on [ipfs-desktop v0.13.2](https://github.com/ipfs-shipyard/ipfs-desktop/releases/tag/v0.13.2) and [ipfs-companion v2.15.0](https://github.com/ipfs-shipyard/ipfs-companion/releases/tag/v2.15.0) + +## See presentations from LikeCoin, Arbol, and more + +Last week, the IPFS community virtually gathered together to talk about the latest goings on in the ecosystem. Speakers included Alfonso de la Rocha, talking about Bitswap, Alex Good talking about dag-jose, Ben Andre from Arbol, and Chung Wu from the LikeCoin Foundation. + +[Watch the videos](https://www.youtube.com/playlist?list=PLuhRWgmPaHtToVYaDkd6ZTwB2Lo30s1vB) + +## Brand new on IPFS + +- [Explore smarter data publishing](https://medium.com/qri-io/smarter-data-publishing-with-qri-4addb6917df8) with Qri, making publishing and sharing as easy as finding data. +- [Berty](https://berty.tech/newsletter/news-47/) recently published their latest community update, including some news on gomobile-IPFS. +- [MetaMask released Swaps](https://medium.com/metamask/introducing-metamask-swaps-84318c643785), allowing users to swap tokens directly from their wallets. +- The latest [IPFS Podcast episode](https://twitter.com/FleekHQ/status/1316047508804640768?s=20) features Harrison Hines, talking about Fleek. + +## People are building the coolest things with IPFS + +Tutorial: [Distributed Web Using Interplanetary File System (IPFS)](https://medium.com/swlh/distributed-web-using-interplanetary-file-system-ipfs-12e2a57bbb0e) + +Updating [Smart Contract Data](https://medium.com/coinmonks/updating-smart-contract-data-in-unity-419473bafb03) in Unity + +Where the Heck is MY Digital Art? a.k.a. Reading the Blockchain for [Proof of Ownership](https://medium.com/coinmonks/where-the-heck-is-my-digital-art-a-k-a-reading-the-blockchain-for-proof-of-ownership-74c2061580a3) + +Check out this Key-Value Store [built on IPFS](https://github.com/mikeal/dkv). + +[Infura](https://blog.infura.io/filters-support-over-https/) shipped filters support over HTTPS + +[Qri Desktop v0.5.0 shipped](https://github.com/qri-io/desktop/releases/tag/v0.5.0), featuring the new Collection view, a dynamic progress viewer! + +Brad Kam from Unstoppable Domains talks about [How the Decentralized Web Transfers Wealth From Corporations to People](https://www.coindesk.com/decentralized-web-transfers-wealth) + +VIDEO: Setting Up An Uncensorable, [Unstoppable Domains IPFS Website](https://lbry.tv/@ScottCBusiness:4/Setting-Up-An-Uncensorable-Unstoppable-Domains-Ipfs-Website-1:3) + +## Job hunting? Work on IPFS! + +[IPFS Engineer](https://authenticjobs.com/job/3315/arbol-inc-ipfs-engineer/): This role is for someone with a deep understanding of IPFS and its ecosystem, and a passion for open source and scientific projects. Ideally they would have contributed to the IPFS project itself. Experience with Docker is also a plus. Arbol, Remote or NYC. + +[Technical Writer](https://www.notion.so/Hiring-Technical-Writer-bc6a543f6bea40f28c06abfbfd810ea4): who can primarily create high-quality technical content, but has some other adjacent skills as well in the form of graphic design and/or video editing. Contract, Remote. + +[Devops or SRE](https://authenticjobs.com/job/3006/textile-devops-or-sre/): The role is for someone with strong hands-on DevOps experience (cloud architecture, automated deployment, Kubernetes orchestration) that also likes to get their hands into the code (primarily written in Go). Textile, Remote. + +[Front-end Developer](https://twitter.com/ceramicnetwork/status/1305886402886995968): Are you an experienced front end dev that understands IPFS and linked data and wants to make an impact on the future of Web3? Ceramic is looking for a contractor to work on Ceramic Explorer. + +[Remote Senior Software Engineer](https://jobs.lever.co/audius): We are looking for talented engineers to help us design, build, and architect the most difficult parts of the Audius protocol—high availability services for decentralized replication of data, latency-sensitive distributed file transfers, Ethereum smart contracts, infrastructure, tooling, and more. Audius, Remote + +**Take care of yourselves and each other. ❤️** + +Get involved with IPFS by checking us out on [GitHub](https://github.com/ipfs), joining discussions on [our community forum](https://discuss.ipfs.io/), or hitting us up [in chat](https://riot.im/app/#/room/#ipfs:matrix.org). Have a suggestion? [Email us.](mailto:newsletter@ipfs.io) + +Get the IPFS Weekly in your inbox, each Tuesday. + +

Sign up now

diff --git a/src/test/README.md b/src/test/README.md new file mode 100644 index 00000000..0d0c7640 --- /dev/null +++ b/src/test/README.md @@ -0,0 +1,12 @@ +--- +sidebar: auto +# sidebarDepth: 2 +--- + +# Hello from test + +## Level 2 + +## Level 3 + +## Level 4