diff --git a/.forestry/front_matter/templates/blog-post.yml b/.forestry/front_matter/templates/blog-post.yml
index 65882a0f..6babd9e5 100644
--- a/.forestry/front_matter/templates/blog-post.yml
+++ b/.forestry/front_matter/templates/blog-post.yml
@@ -27,12 +27,16 @@ fields:
- type: datetime
name: date
label: Date
- description: '"Published on" date. Remember this is only a list date for
- display; posts are not automatically published!'
+ description: '"Published on" date.
To schedule this post for future publishing, simply
+ set the date to the future.
WARNING: Data
+ is saved in the ipfs/ipfs-blog
+ public GitHub repo as soon as you hit the save button. So any sensitive information
+ will also be publicly available on GitHub, but hidden from the website blog.ipfs.io.'
config:
required: true
date_format: YYYY/MM/DD
export_format: YYYY-MM-DD
+ display_utc: false
- type: text
name: permalink
label: Permalink
@@ -58,23 +62,91 @@ fields:
target="_blank">Use this crop/scale tool to save a revised image to your local
machine, then upload here.
- name: tags
- type: tag_list
- default: []
+ type: list
+ config:
+ use_select: true
+ min:
+ max:
+ source:
+ type: simple
+ section: ''
+ file:
+ path: ''
+ options:
+ - AEgir
+ - API
+ - async/await
+ - Bitswap
+ - blockstore
+ - bootstrap nodes
+ - breaking change
+ - browsers
+ - case study
+ - CDN
+ - censorship
+ - CID
+ - CLI tools
+ - collaborative cluster
+ - community
+ - conferences
+ - containerization
+ - content routing
+ - CRDTs
+ - DAG
+ - datastore
+ - demo
+ - DHT
+ - Docker
+ - docs
+ - encryption
+ - Ethereum
+ - Filecoin
+ - gaming
+ - gateways
+ - go-ipfs
+ - Gossipsub
+ - hackathon
+ - identity
+ - infrastructure
+ - interoperability
+ - interview
+ - IPFS Camp
+ - IPFS Cluster
+ - IPFS Companion
+ - IPFS Desktop
+ - IPFS Web UI
+ - IPLD
+ - js-ipfs
+ - Kademlia
+ - libp2p
+ - MFS
+ - mobile
+ - NFTs
+ - official meetup
+ - opera
+ - package managers
+ - pinning
+ - project planning
+ - ProtoSchool
+ - pubsub
+ - QUIC
+ - recap
+ - release notes
+ - research
+ - Rust
+ - SECIO
+ - security
+ - static publishing
+ - streaming
+ - Testground
+ - tutorial
+ - weekly
+ - whitepaper
+ - Windows
label: Tags
- description: "Please copy/paste applicable values from this canonical tags
- list (capitalization counts!): AEgir ... API ... async/await ... Bitswap
- ... blockstore ... bootstrap nodes ... breaking change ... browsers ... case study
- ... CDN ... censorship ... CID ...CLI tools ... collaborative cluster ... community
- ... conferences ... containerization ... content routing ... CRDTs ... DAG ...
- datastore ... demo ... DHT ... DNSLink ... Docker ... docs ... Drand ... encryption
- ... Ethereum ... Filecoin ... gateways ... go-ipfs ... Gossipsub ... identity
- ... infrastructure ... interoperability ... interview ... IoT ... IPFS Camp ...
- IPFS Cluster ... IPFS Companion ... IPFS Desktop ... IPFS Web UI ... IPLD ...
- IPNS ... js-ipfs ... Kademlia ... Kubernetes ... libp2p ... Linux ... MacOS ...
- MFS ... mobile ... NFTs ... official meetup ... package managers ... pinning ...
- project planning ... pubsub ... QUIC ... recap ... research ... Rust ... SECIO
- ... security ... static publishing ... streaming ... Testground ... tutorial ...
- TypeScript ... Windows ... weekly ... whitepaper"
+ description: Select all tags that apply. If you really
+ need to add a new tag, please file an issue with the details.
pages:
- src/_blog/announcing-js-ipfs-0.53.0.md
- src/_blog/go-ipfs-0.8.0-and-remote-pinning-is-here.md
@@ -89,6 +161,7 @@ pages:
- src/_blog/meet-the-new-ipfs-blog-news.md
- src/_blog/own-your-identity-with-ion.md
- src/_blog/storing-nfts-on-ipfs.md
+- src/_blog/using-ipfs-to-help-with-scaling-ethereum.md
- src/_blog/welcome-to-ipfs-weekly-119.md
- src/_blog/welcome-to-ipfs-weekly-120.md
- src/_blog/welcome-to-ipfs-weekly-121.md
@@ -101,3 +174,4 @@ pages:
- src/_blog/welcome-to-ipfs-weekly-128.md
- src/_blog/welcome-to-ipfs-weekly-129.md
- src/_blog/welcome-to-ipfs-weekly-130.md
+- src/_blog/welcome-to-ipfs-weekly-131.md
diff --git a/.forestry/front_matter/templates/newslinks.yml b/.forestry/front_matter/templates/newslinks.yml
index fd22eefa..98413de4 100644
--- a/.forestry/front_matter/templates/newslinks.yml
+++ b/.forestry/front_matter/templates/newslinks.yml
@@ -35,6 +35,23 @@ fields:
export_format: YYYY-MM-DD
description: For events, use the date of the event itself. For
all other link types, use the date the original item was published.
+ - name: publish_date
+ type: datetime
+ label: Publish Date
+ description: 'When
+ the link should be published. Use this to schedule publishing the link in
+ the future. If you don''t want to schedule, leave this blank.
WARNING:
+ Data is saved in the ipfs/ipfs-blog public GitHub repo as soon as
+ you hit the Save button. This means anything you save will also be publicly
+ visible on GitHub, but not on the blog.ipfs.io site. Be careful if you are drafting something sensitive!'
+ config:
+ required: false
+ date_format:
+ time_format:
+ display_utc: true
+ export_format: YYYY-MM-DDThh:mm:ssZ
+ default: ''
- type: text
name: path
label: URL
@@ -54,21 +71,86 @@ fields:
revised image to your local machine, then upload here. Video links don''t
need images: they use the video thumbnail!'
- name: tags
- type: tag_list
- default: []
+ type: list
+ config:
+ use_select: true
+ min:
+ max:
+ source:
+ type: simple
+ options:
+ - AEgir
+ - API
+ - async/await
+ - Bitswap
+ - blockstore
+ - bootstrap nodes
+ - breaking change
+ - browsers
+ - case study
+ - CDN
+ - censorship
+ - CID
+ - CLI tools
+ - collaborative cluster
+ - community
+ - conferences
+ - containerization
+ - content routing
+ - CRDTs
+ - DAG
+ - datastore
+ - demo
+ - DHT
+ - Docker
+ - docs
+ - encryption
+ - Ethereum
+ - Filecoin
+ - gaming
+ - gateways
+ - go-ipfs
+ - Gossipsub
+ - hackathon
+ - identity
+ - infrastructure
+ - interoperability
+ - interview
+ - IPFS Camp
+ - IPFS Cluster
+ - IPFS Companion
+ - IPFS Desktop
+ - IPFS Web UI
+ - IPLD
+ - js-ipfs
+ - Kademlia
+ - libp2p
+ - MFS
+ - mobile
+ - NFTs
+ - official meetup
+ - opera
+ - package managers
+ - pinning
+ - project planning
+ - ProtoSchool
+ - pubsub
+ - QUIC
+ - recap
+ - release notes
+ - research
+ - Rust
+ - SECIO
+ - security
+ - static publishing
+ - streaming
+ - Testground
+ - tutorial
+ - weekly
+ - whitepaper
+ - Windows
label: Tags
- description: "Please copy/paste applicable values from this canonical
- tags list (capitalization counts!): AEgir ... API ... async/await
- ... Bitswap ... blockstore ... bootstrap nodes ... breaking change ... browsers
- ... case study ... CDN ... censorship ... CID ...CLI tools ... collaborative
- cluster ... community ... conferences ... containerization ... content routing
- ... CRDTs ... DAG ... datastore ... demo ... DHT ... DNSLink ... Docker ...
- docs ... Drand ... encryption ... Ethereum ... Filecoin ... gateways ... go-ipfs
- ... Gossipsub ... identity ... infrastructure ... interoperability ... interview
- ... IoT ... IPFS Camp ... IPFS Cluster ... IPFS Companion ... IPFS Desktop ...
- IPFS Web UI ... IPLD ... IPNS ... js-ipfs ... Kademlia ... Kubernetes ... libp2p
- ... Linux ... MacOS ... MFS ... mobile ... NFTs ... official meetup ... package
- managers ... pinning ... project planning ... pubsub ... QUIC ... recap ...
- research ... Rust ... SECIO ... security ... static publishing ... streaming
- ... Testground ... tutorial ... TypeScript ... Windows ... weekly ... whitepaper"
+ description: Select all tags that apply. If you really
+ need to add a new tag, please file an issue with the details.
description: To add a new link, click the "Add Link" button.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..3e24b1d0
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: 'npm' # See documentation for possible values
+ directory: '/' # Location of package manifests
+ schedule:
+ interval: 'daily'
+ commit-message:
+ prefix: 'chore'
+ include: 'scope'
diff --git a/.github/workflows/calibreapp-image-actions.yml b/.github/workflows/calibreapp-image-actions.yml
new file mode 100644
index 00000000..c1c338cd
--- /dev/null
+++ b/.github/workflows/calibreapp-image-actions.yml
@@ -0,0 +1,26 @@
+name: Compress Images
+on:
+ pull_request:
+ paths:
+ - 'src/assets/*.jpg'
+ - 'src/assets/*.jpeg'
+ - 'src/assets/*.png'
+ - 'src/assets/*.webp'
+jobs:
+ build:
+ # Only run on Pull Requests within the same repository, and not from forks.
+ if: github.event.pull_request.head.repo.full_name == github.repository
+ name: calibreapp/image-actions
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repo
+ uses: actions/checkout@v2
+
+ - name: Compress Images
+ uses: calibreapp/image-actions@main
+ with:
+ githubToken: ${{ secrets.GITHUB_TOKEN }}
+ jpegQuality: '100'
+ jpegProgressive: true
+ pngQuality: '100'
+ webpQuality: '100'
\ No newline at end of file
diff --git a/.github/workflows/scheduled-publishing.yml b/.github/workflows/scheduled-publishing.yml
new file mode 100644
index 00000000..25b24736
--- /dev/null
+++ b/.github/workflows/scheduled-publishing.yml
@@ -0,0 +1,26 @@
+name: Check for scheduled posts to publish
+on:
+ schedule:
+ - cron: '* 4,16 * * *'
+jobs:
+ check-n-publish:
+ name: Check for scheduled posts and publish if any found
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v2
+ - name: Install dependencies
+ run: npm ci
+ - name: Check for scheduled posts
+ run: echo "::set-output name=should_publish::$(${{ github.workspace }}/scripts/scheduled-publishing.js)"
+ id: should_publish_step
+ - name: Trigger Fleek Build
+ if: ${{ steps.should_publish_step.outputs.should_publish == 'true' }}
+ id: deploy
+ uses: fleekhq/action-deploy@v1
+ with:
+ apiKey: ${{ secrets.FLEEK_API_KEY }}
+ - name: Scheduled posts published
+ if: ${{ steps.should_publish_step.outputs.should_publish == 'true' }}
+ run: echo "Check https://blog.ipfs.io"
+
diff --git a/README.md b/README.md
index 22839f32..1a4bd5d4 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,8 @@ Forestry uses the `staging` branch as a work-in-progress scratchpad for blog con
- Use the "Content Types" section of Forestry's left-hand menu to drill down to the type of item (blog post, video, news coverage, event) you want to create/edit.
- For card and blog post header images, **be sure to use the [image crop/scale tool](https://blog.ipfs.io/image-crop/)** to resize and save images so they're the correct dimensions. (Don't have an image? Don't worry, there are generic fallback images.)
-- To switch between WYSIWYG and raw markdown while writing a blog post, choose "Raw Editor" or "WYSIWYG Editor" from the dots menu at the top right of the page (this is useful if you want to add any HTML, such as a video or Twitter embed): 
+- Want to embed a YouTube video in a blog post? Switch to raw markdown view and use `@[youtube](videoID)`, substituting the video's unique ID from the URL (e.g. `https://www.youtube.com/watch?v=eFbKKsEoQNg`) for `videoID`.
+- To switch between WYSIWYG and raw markdown while writing a blog post, choose "Raw Editor" or "WYSIWYG Editor" from the dots menu at the top right of the page: 
### Forestry build preview tips
diff --git a/package-lock.json b/package-lock.json
index 826e1e94..f0a78098 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,11 +13,10 @@
"tailwindcss-typography": "^3.1.0",
"v-lazy-image": "^1.4.0",
"v-scroll-lock": "^1.3.1",
- "vue-advanced-cropper": "^1.3.1",
+ "vue-advanced-cropper": "^1.5.0",
"vue-mq": "^1.0.1",
"vue-multiselect": "^2.1.6",
- "vue-observe-visibility": "^0.4.6",
- "vue-social-sharing": "^3.0.5",
+ "vue-social-sharing": "^3.0.7",
"vuepress-plugin-img-lazy": "^1.0.4",
"vuex": "^3.6.2"
},
@@ -26,14 +25,15 @@
"@vuepress/plugin-html-redirect": "^0.1.2",
"@vuepress/plugin-last-updated": "^1.8.2",
"autoprefixer": "^9.8.6",
- "eslint": "^7.23.0",
- "eslint-config-prettier": "^8.1.0",
+ "eslint": "^7.24.0",
+ "eslint-config-prettier": "^8.2.0",
"eslint-config-standard": "^16.0.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
- "eslint-plugin-prettier": "^3.3.1",
- "eslint-plugin-promise": "^4.3.1",
- "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "eslint-plugin-promise": "^5.1.0",
+ "eslint-plugin-vue": "^7.9.0",
+ "gray-matter": "^4.0.2",
"husky": "^6.0.0",
"lint-staged": "^10.5.4",
"lodash": "^4.17.21",
@@ -42,22 +42,24 @@
"markdown-it-task-lists": "^2.1.1",
"markdown-it-video": "^0.6.3",
"npm-run-all": "^4.1.5",
+ "p-map": "^4.0.0",
"postcss": "^7.0.35",
"prettier": "^2.2.1",
- "slug": "^4.0.3",
+ "slug": "^4.0.4",
"standard-version": "^9.2.0",
"stylelint": "^13.12.0",
"stylelint-config-prettier": "^8.0.2",
"stylelint-prettier": "^1.2.0",
- "svg-sprite-loader": "^5.2.1",
- "svgo": "^1.3.2",
- "svgo-loader": "^2.2.2",
+ "svg-sprite-loader": "^6.0.5",
+ "svgo": "^2.3.0",
+ "svgo-loader": "^3.0.0",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0",
"tailwindcss-line-clamp": "^1.0.5",
"tailwindcss-touch": "^1.0.1",
"vue": "^2.6.12",
"vuepress": "^1.8.2",
"vuepress-plugin-canonical": "^1.0.0",
+ "vuepress-plugin-chunkload-redirect": "^1.0.3",
"vuepress-plugin-clean-urls": "^1.1.2",
"vuepress-plugin-ipfs": "^1.0.2",
"vuepress-plugin-robots": "^1.0.1",
@@ -3355,6 +3357,15 @@
"node": ">=6"
}
},
+ "node_modules/@trysound/sax": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz",
+ "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
@@ -8252,15 +8263,19 @@
}
},
"node_modules/css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz",
+ "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==",
"dev": true,
"dependencies": {
"boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
+ "css-what": "^4.0.0",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.4.3",
+ "nth-check": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-select-base-adapter": {
@@ -8269,13 +8284,89 @@
"integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
"dev": true
},
- "node_modules/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==",
+ "node_modules/css-select/node_modules/dom-serializer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz",
+ "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==",
"dev": true,
"dependencies": {
- "mdn-data": "2.0.4",
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/css-select/node_modules/domhandler": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz",
+ "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domutils": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz",
+ "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/nth-check": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+ "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
"source-map": "^0.6.1"
},
"engines": {
@@ -8298,12 +8389,15 @@
"dev": true
},
"node_modules/css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz",
+ "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==",
"dev": true,
"engines": {
"node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css/node_modules/source-map": {
@@ -8473,45 +8567,17 @@
}
},
"node_modules/csso": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
- "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"dev": true,
"dependencies": {
- "css-tree": "1.0.0-alpha.39"
+ "css-tree": "^1.1.2"
},
"engines": {
"node": ">=8.0.0"
}
},
- "node_modules/csso/node_modules/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,
- "dependencies": {
- "mdn-data": "2.0.6",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/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
- },
- "node_modules/csso/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/cuint": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
@@ -9640,9 +9706,9 @@
}
},
"node_modules/eslint": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz",
- "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "7.12.11",
@@ -9694,9 +9760,9 @@
}
},
"node_modules/eslint-config-prettier": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz",
- "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz",
+ "integrity": "sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw==",
"dev": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
@@ -9865,30 +9931,42 @@
}
},
"node_modules/eslint-plugin-prettier": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz",
- "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz",
+ "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==",
"dev": true,
"dependencies": {
"prettier-linter-helpers": "^1.0.0"
},
"engines": {
"node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=5.0.0",
+ "prettier": ">=1.13.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
}
},
"node_modules/eslint-plugin-promise": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz",
- "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz",
+ "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==",
"dev": true,
"engines": {
- "node": ">=6"
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0"
}
},
"node_modules/eslint-plugin-vue": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.8.0.tgz",
- "integrity": "sha512-OGrnPz+PuYL2HmVyBHxm4mRjxW2kfFCQE6Hw9G6qOHs/Pcu0srOlCCW0FMa8SLzIEqxl8WuKoBSPcMnrjUG2vw==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
"dev": true,
"dependencies": {
"eslint-utils": "^2.1.0",
@@ -13049,10 +13127,7 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
+ "dev": true
},
"node_modules/internal-ip": {
"version": "4.3.0",
@@ -14500,9 +14575,9 @@
"dev": true
},
"node_modules/mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
"node_modules/mdurl": {
@@ -17216,12 +17291,105 @@
"node": ">=6.9.0"
}
},
+ "node_modules/postcss-svgo/node_modules/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,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/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,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/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,
+ "dependencies": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/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,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/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
+ },
"node_modules/postcss-svgo/node_modules/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
},
+ "node_modules/postcss-svgo/node_modules/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,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "dev": true,
+ "dependencies": {
+ "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"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/postcss-syntax": {
"version": "0.36.2",
"resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
@@ -19093,9 +19261,9 @@
}
},
"node_modules/slug": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.3.tgz",
- "integrity": "sha512-CnR9sYvJn6JW8hDzxRVg8imqzaJrCuUMc8poiFmd3tqWQXxeEQdwsBbBidSdl+Q3obwxQ4hrx7kxcUH9oCE9yw==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.4.tgz",
+ "integrity": "sha512-GwSsWjX2rcIAtbKWGaxnzASWljWraPQry0RmCnRkji2pEggVjgb5HjXdqN0Gb6JOPg19rsC3hHUYXbOnHXKv2Q==",
"dev": true
},
"node_modules/smoothscroll-polyfill": {
@@ -20980,9 +21148,9 @@
}
},
"node_modules/svg-sprite-loader": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-5.2.1.tgz",
- "integrity": "sha512-n2IZc87rpOeXh+PQFksFMGCfMV/BT01YG+Dlbyjoh2Cz8BSTL5Vi/7KDr86Pt/u1NRDCVb3vY74BF5rKCmqbNA==",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.5.tgz",
+ "integrity": "sha512-d1F4Bkx//jvITCYo4r5wf8skiJLdTHEREIg9hMH+N9KGARm8o57oCR49O3iBevDY4T+TRcxuTPU479FNQVnt8w==",
"dev": true,
"dependencies": {
"bluebird": "^3.5.0",
@@ -21014,54 +21182,43 @@
"dev": true
},
"node_modules/svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz",
+ "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==",
"dev": true,
"dependencies": {
- "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"
+ "@trysound/sax": "0.1.1",
+ "chalk": "^4.1.0",
+ "commander": "^7.1.0",
+ "css-select": "^3.1.2",
+ "css-tree": "^1.1.2",
+ "csso": "^4.2.0",
+ "stable": "^0.1.8"
},
"bin": {
"svgo": "bin/svgo"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">=10.13.0"
}
},
"node_modules/svgo-loader": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.2.tgz",
- "integrity": "sha512-UeE/4yZEK96LoYqvxwh8YqCOJCjXwRY9K6YT99vXE+nYhs/W8hAY2hNf5zg/lRsyKshJkR79V+4beV3cbGL40Q==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-3.0.0.tgz",
+ "integrity": "sha512-gwyFuzTxZ8hEWYKQ9GodudSKRHzW8CUqgdfsdNpu1U5Keow5dPIgxT4DoHUEVXQRolefgSCeBtW3y12CyhIGxw==",
"dev": true,
"dependencies": {
- "js-yaml": "^3.13.1",
- "loader-utils": "^1.0.3"
+ "loader-utils": "^1.0.3",
+ "svgo": "^2.2.0"
}
},
- "node_modules/svgo/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
"engines": {
- "node": ">=4"
+ "node": ">= 10"
}
},
"node_modules/table": {
@@ -22399,6 +22556,9 @@
"es-abstract": "^1.17.2",
"has-symbols": "^1.0.1",
"object.getownpropertydescriptors": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/util/node_modules/inherits": {
@@ -22543,13 +22703,12 @@
"node_modules/vue": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
- "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==",
- "dev": true
+ "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
},
"node_modules/vue-advanced-cropper": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.3.1.tgz",
- "integrity": "sha512-VsCx+PRize+BYpET5Nk1nxP7CSI8zd+cDx4imdqCg+ImlOUegLwMBiEePFIoIgIdMpiwPQzkPY51Ad2IZcZ+IA==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.0.tgz",
+ "integrity": "sha512-WQs15c8wFRCje2GLdD6aGCRapttjjKE/dmz0qVFlRB7q38scB6G51G7eh5Jcnm4jMUgOX3OVD1sD2UWmHpaNpQ==",
"dependencies": {
"classnames": "^2.2.6",
"debounce": "^1.2.0",
@@ -22558,6 +22717,9 @@
"engines": {
"node": ">=8",
"npm": ">=5"
+ },
+ "peerDependencies": {
+ "vue": "^2.6.6"
}
},
"node_modules/vue-class-component": {
@@ -22645,11 +22807,6 @@
"npm": ">= 3.0.0"
}
},
- "node_modules/vue-observe-visibility": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz",
- "integrity": "sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q=="
- },
"node_modules/vue-property-decorator": {
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz",
@@ -22755,9 +22912,12 @@
}
},
"node_modules/vue-social-sharing": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.5.tgz",
- "integrity": "sha512-wQWdL5SUR0amy1y5ZrHpfgrYYYFMjAKyn+81lVMeZsoKMTYESAGZC+fQSHA3ThLaFY2wtLcJ9uTkWygHVWu7XQ=="
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.7.tgz",
+ "integrity": "sha512-6FS+9t9qJQXY/Km0oyfpJv7rtjhqvrQodpVc/cbBc6TvQdhXc64pHi4yoqa3Jv797veNAlFuLztYyir9jONhBg==",
+ "peerDependencies": {
+ "vue": "^2.6.10"
+ }
},
"node_modules/vue-style-loader": {
"version": "4.1.3",
@@ -22885,6 +23045,12 @@
"integrity": "sha512-R2mcc+bp9VbKBQ3YIbCqUbWcWfmWSp1NIEyNGiLKkrcZmyUF/+0D48BqMCTx61AgJzWPW5DJzB6VkmpjbMIDbA==",
"dev": true
},
+ "node_modules/vuepress-plugin-chunkload-redirect": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-chunkload-redirect/-/vuepress-plugin-chunkload-redirect-1.0.3.tgz",
+ "integrity": "sha512-5VgvGw9t9v6DZU4NNksph9+en7v8NIo/gDKDnUdFkM+kuTnp4BAmWA+2JbpFIaw4Ke8R1txb2LZmAmuOum3DEA==",
+ "dev": true
+ },
"node_modules/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",
@@ -27198,6 +27364,12 @@
"defer-to-connect": "^1.0.1"
}
},
+ "@trysound/sax": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz",
+ "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==",
+ "dev": true
+ },
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
@@ -31450,15 +31622,70 @@
}
},
"css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz",
+ "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==",
"dev": true,
"requires": {
"boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
+ "css-what": "^4.0.0",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.4.3",
+ "nth-check": "^2.0.0"
+ },
+ "dependencies": {
+ "dom-serializer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz",
+ "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz",
+ "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.2.0"
+ }
+ },
+ "domutils": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz",
+ "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.1.0"
+ }
+ },
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
+ },
+ "nth-check": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+ "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ }
}
},
"css-select-base-adapter": {
@@ -31468,12 +31695,12 @@
"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==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"dev": true,
"requires": {
- "mdn-data": "2.0.4",
+ "mdn-data": "2.0.14",
"source-map": "^0.6.1"
},
"dependencies": {
@@ -31492,9 +31719,9 @@
"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==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz",
+ "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==",
"dev": true
},
"cssesc": {
@@ -31621,36 +31848,12 @@
"dev": true
},
"csso": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
- "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"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
- }
+ "css-tree": "^1.1.2"
}
},
"cuint": {
@@ -32611,9 +32814,9 @@
"dev": true
},
"eslint": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz",
- "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
@@ -32753,9 +32956,9 @@
}
},
"eslint-config-prettier": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz",
- "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz",
+ "integrity": "sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw==",
"dev": true,
"requires": {}
},
@@ -32906,24 +33109,25 @@
}
},
"eslint-plugin-prettier": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz",
- "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz",
+ "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==",
"dev": true,
"requires": {
"prettier-linter-helpers": "^1.0.0"
}
},
"eslint-plugin-promise": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz",
- "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==",
- "dev": true
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz",
+ "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==",
+ "dev": true,
+ "requires": {}
},
"eslint-plugin-vue": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.8.0.tgz",
- "integrity": "sha512-OGrnPz+PuYL2HmVyBHxm4mRjxW2kfFCQE6Hw9G6qOHs/Pcu0srOlCCW0FMa8SLzIEqxl8WuKoBSPcMnrjUG2vw==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
"dev": true,
"requires": {
"eslint-utils": "^2.1.0",
@@ -36631,9 +36835,9 @@
"dev": true
},
"mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
"mdurl": {
@@ -38954,11 +39158,83 @@
"svgo": "^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"
+ }
+ },
+ "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-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"
+ }
+ },
+ "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
+ },
+ "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
+ },
"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
+ },
+ "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"
+ }
}
}
},
@@ -40518,9 +40794,9 @@
}
},
"slug": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.3.tgz",
- "integrity": "sha512-CnR9sYvJn6JW8hDzxRVg8imqzaJrCuUMc8poiFmd3tqWQXxeEQdwsBbBidSdl+Q3obwxQ4hrx7kxcUH9oCE9yw==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.4.tgz",
+ "integrity": "sha512-GwSsWjX2rcIAtbKWGaxnzASWljWraPQry0RmCnRkji2pEggVjgb5HjXdqN0Gb6JOPg19rsC3hHUYXbOnHXKv2Q==",
"dev": true
},
"smoothscroll-polyfill": {
@@ -42101,9 +42377,9 @@
}
},
"svg-sprite-loader": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-5.2.1.tgz",
- "integrity": "sha512-n2IZc87rpOeXh+PQFksFMGCfMV/BT01YG+Dlbyjoh2Cz8BSTL5Vi/7KDr86Pt/u1NRDCVb3vY74BF5rKCmqbNA==",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.5.tgz",
+ "integrity": "sha512-d1F4Bkx//jvITCYo4r5wf8skiJLdTHEREIg9hMH+N9KGARm8o57oCR49O3iBevDY4T+TRcxuTPU479FNQVnt8w==",
"dev": true,
"requires": {
"bluebird": "^3.5.0",
@@ -42131,47 +42407,36 @@
"dev": true
},
"svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz",
+ "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==",
"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"
+ "@trysound/sax": "0.1.1",
+ "chalk": "^4.1.0",
+ "commander": "^7.1.0",
+ "css-select": "^3.1.2",
+ "css-tree": "^1.1.2",
+ "csso": "^4.2.0",
+ "stable": "^0.1.8"
},
"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"
- }
+ "commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true
}
}
},
"svgo-loader": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.2.tgz",
- "integrity": "sha512-UeE/4yZEK96LoYqvxwh8YqCOJCjXwRY9K6YT99vXE+nYhs/W8hAY2hNf5zg/lRsyKshJkR79V+4beV3cbGL40Q==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-3.0.0.tgz",
+ "integrity": "sha512-gwyFuzTxZ8hEWYKQ9GodudSKRHzW8CUqgdfsdNpu1U5Keow5dPIgxT4DoHUEVXQRolefgSCeBtW3y12CyhIGxw==",
"dev": true,
"requires": {
- "js-yaml": "^3.13.1",
- "loader-utils": "^1.0.3"
+ "loader-utils": "^1.0.3",
+ "svgo": "^2.2.0"
}
},
"table": {
@@ -43418,13 +43683,12 @@
"vue": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
- "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==",
- "dev": true
+ "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
},
"vue-advanced-cropper": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.3.1.tgz",
- "integrity": "sha512-VsCx+PRize+BYpET5Nk1nxP7CSI8zd+cDx4imdqCg+ImlOUegLwMBiEePFIoIgIdMpiwPQzkPY51Ad2IZcZ+IA==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.0.tgz",
+ "integrity": "sha512-WQs15c8wFRCje2GLdD6aGCRapttjjKE/dmz0qVFlRB7q38scB6G51G7eh5Jcnm4jMUgOX3OVD1sD2UWmHpaNpQ==",
"requires": {
"classnames": "^2.2.6",
"debounce": "^1.2.0",
@@ -43508,11 +43772,6 @@
"resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-2.1.6.tgz",
"integrity": "sha512-s7jmZPlm9FeueJg1RwJtnE9KNPtME/7C8uRWSfp9/yEN4M8XcS/d+bddoyVwVnvFyRh9msFo0HWeW0vTL8Qv+w=="
},
- "vue-observe-visibility": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz",
- "integrity": "sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q=="
- },
"vue-property-decorator": {
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz",
@@ -43602,9 +43861,10 @@
}
},
"vue-social-sharing": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.5.tgz",
- "integrity": "sha512-wQWdL5SUR0amy1y5ZrHpfgrYYYFMjAKyn+81lVMeZsoKMTYESAGZC+fQSHA3ThLaFY2wtLcJ9uTkWygHVWu7XQ=="
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.7.tgz",
+ "integrity": "sha512-6FS+9t9qJQXY/Km0oyfpJv7rtjhqvrQodpVc/cbBc6TvQdhXc64pHi4yoqa3Jv797veNAlFuLztYyir9jONhBg==",
+ "requires": {}
},
"vue-style-loader": {
"version": "4.1.3",
@@ -43715,6 +43975,12 @@
"integrity": "sha512-R2mcc+bp9VbKBQ3YIbCqUbWcWfmWSp1NIEyNGiLKkrcZmyUF/+0D48BqMCTx61AgJzWPW5DJzB6VkmpjbMIDbA==",
"dev": true
},
+ "vuepress-plugin-chunkload-redirect": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-chunkload-redirect/-/vuepress-plugin-chunkload-redirect-1.0.3.tgz",
+ "integrity": "sha512-5VgvGw9t9v6DZU4NNksph9+en7v8NIo/gDKDnUdFkM+kuTnp4BAmWA+2JbpFIaw4Ke8R1txb2LZmAmuOum3DEA==",
+ "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",
diff --git a/package.json b/package.json
index cd838f72..b7947fc9 100644
--- a/package.json
+++ b/package.json
@@ -22,14 +22,15 @@
"@vuepress/plugin-html-redirect": "^0.1.2",
"@vuepress/plugin-last-updated": "^1.8.2",
"autoprefixer": "^9.8.6",
- "eslint": "^7.23.0",
- "eslint-config-prettier": "^8.1.0",
+ "eslint": "^7.24.0",
+ "eslint-config-prettier": "^8.2.0",
"eslint-config-standard": "^16.0.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
- "eslint-plugin-prettier": "^3.3.1",
- "eslint-plugin-promise": "^4.3.1",
- "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "eslint-plugin-promise": "^5.1.0",
+ "eslint-plugin-vue": "^7.9.0",
+ "gray-matter": "^4.0.2",
"husky": "^6.0.0",
"lint-staged": "^10.5.4",
"lodash": "^4.17.21",
@@ -38,22 +39,24 @@
"markdown-it-task-lists": "^2.1.1",
"markdown-it-video": "^0.6.3",
"npm-run-all": "^4.1.5",
+ "p-map": "^4.0.0",
"postcss": "^7.0.35",
"prettier": "^2.2.1",
- "slug": "^4.0.3",
+ "slug": "^4.0.4",
"standard-version": "^9.2.0",
"stylelint": "^13.12.0",
"stylelint-config-prettier": "^8.0.2",
"stylelint-prettier": "^1.2.0",
- "svg-sprite-loader": "^5.2.1",
- "svgo": "^1.3.2",
- "svgo-loader": "^2.2.2",
+ "svg-sprite-loader": "^6.0.5",
+ "svgo": "^2.3.0",
+ "svgo-loader": "^3.0.0",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0",
"tailwindcss-line-clamp": "^1.0.5",
"tailwindcss-touch": "^1.0.1",
"vue": "^2.6.12",
"vuepress": "^1.8.2",
"vuepress-plugin-canonical": "^1.0.0",
+ "vuepress-plugin-chunkload-redirect": "^1.0.3",
"vuepress-plugin-clean-urls": "^1.1.2",
"vuepress-plugin-ipfs": "^1.0.2",
"vuepress-plugin-robots": "^1.0.1",
@@ -77,11 +80,10 @@
"tailwindcss-typography": "^3.1.0",
"v-lazy-image": "^1.4.0",
"v-scroll-lock": "^1.3.1",
- "vue-advanced-cropper": "^1.3.1",
+ "vue-advanced-cropper": "^1.5.0",
"vue-mq": "^1.0.1",
"vue-multiselect": "^2.1.6",
- "vue-observe-visibility": "^0.4.6",
- "vue-social-sharing": "^3.0.5",
+ "vue-social-sharing": "^3.0.7",
"vuepress-plugin-img-lazy": "^1.0.4",
"vuex": "^3.6.2"
}
diff --git a/scripts/scheduled-publishing.js b/scripts/scheduled-publishing.js
new file mode 100755
index 00000000..3cf9f6b8
--- /dev/null
+++ b/scripts/scheduled-publishing.js
@@ -0,0 +1,98 @@
+#!/usr/bin/env node
+
+'use strict'
+
+/**
+ * Scheduled Publishing of posts and links.
+ * This script checks for any blog posts and links that are scheduled to
+ * be published, but are to be published today. If there is at least
+ * one found, a build is trigged in fleek, updating the website
+ * with the latest data.
+ */
+
+const fs = require('fs')
+const path = require('path')
+
+const pMap = require('p-map')
+const matter = require('gray-matter')
+const dayjs = require('dayjs')
+
+const isBetween = require('dayjs/plugin/isBetween')
+dayjs.extend(isBetween)
+
+async function main() {
+ // read files contents concurrently, 10 at a time
+ const contentDir = path.resolve(__dirname, '../src/_blog')
+ const files = await pMap(
+ await fs.promises.readdir(contentDir),
+ (filename) => {
+ if (!filename.endsWith('.md')) {
+ return null
+ }
+
+ return fs.promises.readFile(path.resolve(contentDir, filename), 'utf8')
+ },
+ { concurrency: 10 }
+ )
+
+ const output = files
+ // exclude possible nulls
+ .filter((result) => !!result)
+ // process files into publishable items (posts or links)
+ .reduce((items, fileContent) => {
+ const metadata = matter(fileContent).data
+
+ if (metadata.type && metadata.data) {
+ // links
+ items.push(...metadata.data)
+ } else {
+ items.push(metadata)
+ }
+
+ return items
+ }, [])
+ // check if there is at least one publish date in the future
+ .some((item) => {
+ let publishDate
+
+ // blog post
+ if (item.permalink) {
+ publishDate = item.date
+ }
+
+ // links
+ if (item.url && item.publish_date) {
+ publishDate = item.publish_date
+ }
+
+ if (!publishDate) {
+ return false
+ }
+
+ // we trim to the hour to avoid counting the initial delays on triggering
+ // the job, which could cause the time calculations to exclude specific
+ // scheduled dates and times.
+ const now = dayjs(new Date()).startOf('hour')
+ const timeMatch = dayjs(new Date(publishDate)).isBetween(
+ now.subtract(12, 'hour'),
+ now
+ )
+
+ // using stderr since stdout is used for GH workflow output
+ if (timeMatch) {
+ console.error(`Found post/link to publish: "${item.title}"`)
+ }
+
+ return timeMatch
+ })
+
+ if (!output) {
+ console.error('Nothing found to publish.')
+ }
+
+ // output true or false: should trigger publish or not
+ // GH Workflow step reads from stdout
+ console.log(output)
+}
+
+main()
diff --git a/src/.vuepress/config.js b/src/.vuepress/config.js
index 6c107e13..51977749 100644
--- a/src/.vuepress/config.js
+++ b/src/.vuepress/config.js
@@ -3,6 +3,7 @@ const { reverse, sortBy } = require('lodash')
// 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
+const SPEEDCURVE_ID = process.env.SPEEDCURVE_ID || ''
const themeConfigDefaults = {
dateFormat: 'DD MMMM YYYY',
@@ -134,6 +135,7 @@ module.exports = {
},
},
plugins: [
+ [require('./plugins/vuepress-plugin-speedcurve'), { id: SPEEDCURVE_ID }],
['@vuepress/last-updated'],
[
'vuepress-plugin-clean-urls',
@@ -247,6 +249,7 @@ module.exports = {
countdown: 0,
},
],
+ 'vuepress-plugin-chunkload-redirect',
['vuepress-plugin-ipfs', IPFS_DEPLOY],
],
extraWatchFiles: ['.vuepress/config/head.js'],
diff --git a/src/.vuepress/plugins/pageData.js b/src/.vuepress/plugins/pageData.js
index e503fa2a..79d5e59f 100644
--- a/src/.vuepress/plugins/pageData.js
+++ b/src/.vuepress/plugins/pageData.js
@@ -1,4 +1,32 @@
const slug = require('slug')
+const dayjs = require('dayjs')
+
+function shouldBeHidden(frontmatter) {
+ const isDateInFuture = (date) => dayjs(new Date(date)).isAfter(dayjs())
+ let shouldHide = frontmatter.hidden || false
+
+ // sitemap config
+ if (frontmatter.sitemap) {
+ shouldHide = shouldHide || frontmatter.sitemap.exclude
+ }
+
+ // scheduled posts
+ // see auto-publishing of scheduled posts here: https://github.com/ipfs/ipfs-blog/issues/147
+ if (
+ !shouldHide &&
+ frontmatter.permalink && // permalink is unique to posts
+ frontmatter.date
+ ) {
+ shouldHide = shouldHide || isDateInFuture(frontmatter.date)
+ }
+
+ // scheduled links (path is unique to links)
+ if (!shouldHide && frontmatter.path && frontmatter.publish_date) {
+ shouldHide = shouldHide || isDateInFuture(frontmatter.publish_date)
+ }
+
+ return shouldHide
+}
module.exports = (options, context) => ({
extendPageData($page) {
@@ -18,8 +46,8 @@ module.exports = (options, context) => ({
frontmatter.authorKey = authorKey
}
- // exclude a page from the feed & robots if excluded from sitemap
- if (frontmatter.sitemap && frontmatter.sitemap.exclude) {
+ // exclude hidden pages (sitemap config, future publishes, etc)
+ if (shouldBeHidden(frontmatter)) {
frontmatter.feed = {
enable: false,
}
@@ -30,6 +58,18 @@ module.exports = (options, context) => ({
} else {
frontmatter.meta = [noIndex]
}
+
+ frontmatter.hidden = true
+ $page.hidden = true
+ }
+
+ // set links has hidden (future publishes, etc)
+ if (frontmatter.data) {
+ frontmatter.data.forEach((item) => {
+ if (shouldBeHidden(item)) {
+ item.hidden = true
+ }
+ })
}
},
})
diff --git a/src/.vuepress/plugins/vuepress-plugin-speedcurve/enhanceAppFiles.js b/src/.vuepress/plugins/vuepress-plugin-speedcurve/enhanceAppFiles.js
new file mode 100644
index 00000000..ed374582
--- /dev/null
+++ b/src/.vuepress/plugins/vuepress-plugin-speedcurve/enhanceAppFiles.js
@@ -0,0 +1,29 @@
+'use strict'
+
+/* global SPEEDCURVE_ID */
+
+module.exports = () => {
+ if (
+ process.env.NODE_ENV === 'production' &&
+ SPEEDCURVE_ID &&
+ typeof window !== 'undefined'
+ ) {
+ ;(function () {
+ const customScriptCode = `LUX=(function(){var a=("undefined"!==typeof(LUX)&&"undefined"!==typeof(LUX.gaMarks)?LUX.gaMarks:[]);var d=("undefined"!==typeof(LUX)&&"undefined"!==typeof(LUX.gaMeasures)?LUX.gaMeasures:[]);var j="LUX_start";var k=window.performance;var l=("undefined"!==typeof(LUX)&&LUX.ns?LUX.ns:(Date.now?Date.now():+(new Date())));if(k&&k.timing&&k.timing.navigationStart){l=k.timing.navigationStart}function f(){if(k&&k.now){return k.now()}var o=Date.now?Date.now():+(new Date());return o-l}function b(n){if(k){if(k.mark){return k.mark(n)}else{if(k.webkitMark){return k.webkitMark(n)}}}a.push({name:n,entryType:"mark",startTime:f(),duration:0});return}function m(p,t,n){if("undefined"===typeof(t)&&h(j)){t=j}if(k){if(k.measure){if(t){if(n){return k.measure(p,t,n)}else{return k.measure(p,t)}}else{return k.measure(p)}}else{if(k.webkitMeasure){return k.webkitMeasure(p,t,n)}}}var r=0,o=f();if(t){var s=h(t);if(s){r=s.startTime}else{if(k&&k.timing&&k.timing[t]){r=k.timing[t]-k.timing.navigationStart}else{return}}}if(n){var q=h(n);if(q){o=q.startTime}else{if(k&&k.timing&&k.timing[n]){o=k.timing[n]-k.timing.navigationStart}else{return}}}d.push({name:p,entryType:"measure",startTime:r,duration:(o-r)});return}function h(n){return c(n,g())}function c(p,o){for(i=o.length-1;i>=0;i--){var n=o[i];if(p===n.name){return n}}return undefined}function g(){if(k){if(k.getEntriesByType){return k.getEntriesByType("mark")}else{if(k.webkitGetEntriesByType){return k.webkitGetEntriesByType("mark")}}}return a}return{mark:b,measure:m,gaMarks:a,gaMeasures:d}})();LUX.ns=(Date.now?Date.now():+(new Date()));LUX.ac=[];LUX.cmd=function(a){LUX.ac.push(a)};LUX.init=function(){LUX.cmd(["init"])};LUX.send=function(){LUX.cmd(["send"])};LUX.addData=function(a,b){LUX.cmd(["addData",a,b])};LUX_ae=[];window.addEventListener("error",function(a){LUX_ae.push(a)});LUX_al=[];if("function"===typeof(PerformanceObserver)&&"function"===typeof(PerformanceLongTaskTiming)){var LongTaskObserver=new PerformanceObserver(function(c){var b=c.getEntries();for(var a=0;a ({
+ name: 'vuepress-plugin-speedcurve',
+ define() {
+ const id = params.id
+
+ return { SPEEDCURVE_ID: id || false }
+ },
+ enhanceAppFiles: path.resolve(__dirname, 'enhanceAppFiles.js'),
+})
diff --git a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png b/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png
index 8914f284..d8a1c7d5 100644
Binary files a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png and b/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png differ
diff --git a/src/.vuepress/public/android-chrome-192x192.png b/src/.vuepress/public/android-chrome-192x192.png
index 401df594..3586c244 100644
Binary files a/src/.vuepress/public/android-chrome-192x192.png and b/src/.vuepress/public/android-chrome-192x192.png differ
diff --git a/src/.vuepress/public/android-chrome-512x512.png b/src/.vuepress/public/android-chrome-512x512.png
index 59a57810..af16edc2 100644
Binary files a/src/.vuepress/public/android-chrome-512x512.png and b/src/.vuepress/public/android-chrome-512x512.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-114x114.png b/src/.vuepress/public/apple-touch-icon-114x114.png
index f035eeb1..ae6e6014 100644
Binary files a/src/.vuepress/public/apple-touch-icon-114x114.png and b/src/.vuepress/public/apple-touch-icon-114x114.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-120x120.png b/src/.vuepress/public/apple-touch-icon-120x120.png
index a28bb1a8..b87f8a15 100644
Binary files a/src/.vuepress/public/apple-touch-icon-120x120.png and b/src/.vuepress/public/apple-touch-icon-120x120.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-144x144.png b/src/.vuepress/public/apple-touch-icon-144x144.png
index 55b235d4..1b66b836 100644
Binary files a/src/.vuepress/public/apple-touch-icon-144x144.png and b/src/.vuepress/public/apple-touch-icon-144x144.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-152x152.png b/src/.vuepress/public/apple-touch-icon-152x152.png
index eeabba49..b672a2a3 100644
Binary files a/src/.vuepress/public/apple-touch-icon-152x152.png and b/src/.vuepress/public/apple-touch-icon-152x152.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-180x180.png b/src/.vuepress/public/apple-touch-icon-180x180.png
index 345de33a..a00cef70 100644
Binary files a/src/.vuepress/public/apple-touch-icon-180x180.png and b/src/.vuepress/public/apple-touch-icon-180x180.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-57x57.png b/src/.vuepress/public/apple-touch-icon-57x57.png
index 061f69ee..3d6a6573 100644
Binary files a/src/.vuepress/public/apple-touch-icon-57x57.png and b/src/.vuepress/public/apple-touch-icon-57x57.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-60x60.png b/src/.vuepress/public/apple-touch-icon-60x60.png
index 5205f532..773a71c4 100644
Binary files a/src/.vuepress/public/apple-touch-icon-60x60.png and b/src/.vuepress/public/apple-touch-icon-60x60.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-72x72.png b/src/.vuepress/public/apple-touch-icon-72x72.png
index 216e0464..0d160eda 100644
Binary files a/src/.vuepress/public/apple-touch-icon-72x72.png and b/src/.vuepress/public/apple-touch-icon-72x72.png differ
diff --git a/src/.vuepress/public/apple-touch-icon-76x76.png b/src/.vuepress/public/apple-touch-icon-76x76.png
index 3212b84d..375dfb1f 100644
Binary files a/src/.vuepress/public/apple-touch-icon-76x76.png and b/src/.vuepress/public/apple-touch-icon-76x76.png differ
diff --git a/src/.vuepress/public/apple-touch-icon.png b/src/.vuepress/public/apple-touch-icon.png
index e6b70538..a00cef70 100644
Binary files a/src/.vuepress/public/apple-touch-icon.png and b/src/.vuepress/public/apple-touch-icon.png differ
diff --git a/src/.vuepress/public/favicon-16x16.png b/src/.vuepress/public/favicon-16x16.png
index 4b08f2f7..e42d7f42 100644
Binary files a/src/.vuepress/public/favicon-16x16.png and b/src/.vuepress/public/favicon-16x16.png differ
diff --git a/src/.vuepress/public/favicon-32x32.png b/src/.vuepress/public/favicon-32x32.png
index d85e4fde..50442dd1 100644
Binary files a/src/.vuepress/public/favicon-32x32.png and b/src/.vuepress/public/favicon-32x32.png differ
diff --git a/src/.vuepress/public/favicon-48x48.png b/src/.vuepress/public/favicon-48x48.png
index a36df8ad..249c2506 100644
Binary files a/src/.vuepress/public/favicon-48x48.png and b/src/.vuepress/public/favicon-48x48.png differ
diff --git a/src/.vuepress/public/mstile-150x150.png b/src/.vuepress/public/mstile-150x150.png
index 1f6abfc6..609272b8 100644
Binary files a/src/.vuepress/public/mstile-150x150.png and b/src/.vuepress/public/mstile-150x150.png differ
diff --git a/src/.vuepress/theme/enhanceApp.js b/src/.vuepress/theme/enhanceApp.js
index 0f9937e7..cbf0dcd6 100644
--- a/src/.vuepress/theme/enhanceApp.js
+++ b/src/.vuepress/theme/enhanceApp.js
@@ -4,7 +4,6 @@ import { createStore } from '@theme/store/store'
import VScrollLock from 'v-scroll-lock'
import VueMq from 'vue-mq'
import { VLazyImagePlugin } from 'v-lazy-image'
-import VueObserveVisibility from 'vue-observe-visibility'
import VueSocialSharing from 'vue-social-sharing'
import Transition from '@theme/components/directives/Transition.js'
@@ -39,7 +38,6 @@ export default ({ Vue, router, siteData, isServer }) => {
Vue.use(VScrollLock)
Vue.use(VueMq, { breakpoints })
Vue.use(VLazyImagePlugin)
- Vue.use(VueObserveVisibility)
Vue.use(VueSocialSharing)
Vue.directive(Transition.name, Transition.directive)
diff --git a/src/.vuepress/theme/layouts/Blog.vue b/src/.vuepress/theme/layouts/Blog.vue
index 64eec2f0..ad47102d 100644
--- a/src/.vuepress/theme/layouts/Blog.vue
+++ b/src/.vuepress/theme/layouts/Blog.vue
@@ -80,6 +80,7 @@ export default {
numberOfPagesToShow: 24,
infiniteScroll: false,
delayValues: [0, 0.15, 0.3],
+ observer: null,
}
},
computed: {
@@ -128,14 +129,8 @@ export default {
return false
}
- if (
- page.frontmatter &&
- (page.frontmatter.sitemap ? !page.frontmatter.sitemap.exclude : true)
- ) {
- result.push({
- ...page,
- category: defaultCategory,
- })
+ if (page.frontmatter && !page.frontmatter.hidden) {
+ result.push({ ...page, category: defaultCategory })
}
})
@@ -211,14 +206,14 @@ export default {
this.$store.commit('appState/setAuthorsList', authorsArray)
},
mounted() {
- const observer = new IntersectionObserver(
+ this.observer = new IntersectionObserver(
this.handleBottomVisibilityChange,
{
threshold: 1.0,
}
)
- observer.observe(document.querySelector('footer.footer ul'))
+ this.observer.observe(document.querySelector('footer.footer ul'))
const { query } = this.$route
const newQuery = pick(Object.assign({}, query), [
@@ -319,6 +314,9 @@ export default {
this.$store.commit('appState/setLatestWeeklyPost', latestWeeklyPost)
},
+ beforeDestroy() {
+ this.observer.disconnect()
+ },
methods: {
updateQuery() {
const newQuery = {
diff --git a/src/.vuepress/theme/layouts/BlogPost.vue b/src/.vuepress/theme/layouts/BlogPost.vue
index 8c954a05..50d4d681 100644
--- a/src/.vuepress/theme/layouts/BlogPost.vue
+++ b/src/.vuepress/theme/layouts/BlogPost.vue
@@ -1,5 +1,5 @@
-
+ ({
showComments: null,
}),
+ computed: {
+ // hidden field set in plugins/pageData.js
+ isVisible() {
+ return !this.$root.$page.hidden
+ },
+ },
mounted() {
+ if (!this.isVisible) {
+ // path to 404 is relative to support ipfs sub path deployments
+ return this.$router.replace({ path: '../404' })
+ }
+
const ipfsPathRegExp = /^(\/(?:ipfs|ipns)\/[^/]+)/
const ipfsPathPrefix =
(window.location.pathname.match(ipfsPathRegExp) || [])[1] || ''
@@ -76,4 +87,23 @@ export default {
padding-bottom: 0.5rem;
border-bottom: 2px solid #d1d1d663;
}
+
+.blog > iframe {
+ @apply mx-auto;
+}
+
+.blog > iframe[src*='youtube'],
+.blog > iframe[src*='vimeo'] {
+ @apply max-w-full;
+ height: auto;
+ aspect-ratio: 16 / 9;
+}
+
+@supports not (aspect-ratio: 1 / 1) {
+ .blog > iframe[src*='youtube'],
+ .blog > iframe[src*='vimeo'] {
+ @apply h-52;
+ @apply sm:h-80;
+ }
+}
diff --git a/src/.vuepress/theme/styles/index.css b/src/.vuepress/theme/styles/index.css
index 157f6989..4110d612 100644
--- a/src/.vuepress/theme/styles/index.css
+++ b/src/.vuepress/theme/styles/index.css
@@ -9,16 +9,7 @@ pre {
padding: 1.25rem 1.5rem;
background-color: #0e2333;
border-radius: 6px;
-}
-
-pre > code {
- padding: 0;
- background-color: transparent;
- border-radius: 0;
- color: #fff;
- font-size: 0.85em;
- white-space: pre-wrap;
- word-break: break-all;
+ overflow-x: auto;
}
code {
@@ -28,4 +19,16 @@ code {
border-radius: 3px;
color: rgba(51, 51, 51, 0.8);
font-size: 0.85em;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+
+pre > code {
+ padding: 0;
+ background-color: transparent;
+ border-radius: 0;
+ color: #fff;
+ font-size: 0.85em;
+ white-space: unset;
+ word-break: unset;
}
diff --git a/src/.vuepress/theme/util/blogUtils.js b/src/.vuepress/theme/util/blogUtils.js
index fb913ac5..6acdce26 100644
--- a/src/.vuepress/theme/util/blogUtils.js
+++ b/src/.vuepress/theme/util/blogUtils.js
@@ -1,4 +1,4 @@
-export const checkItem = ({
+export function checkItem({
postType,
tags,
title,
@@ -7,7 +7,7 @@ export const checkItem = ({
searchedText = [],
activeCategory = '',
activeAuthor = '',
-}) => {
+}) {
if (activeCategory && decodeURI(activeCategory) !== postType) {
return false
}
@@ -40,13 +40,13 @@ export const checkItem = ({
return true
}
-export const parseProtectedPost = (
+export function parseProtectedPost(
post,
activeTags = [],
searchedText = [],
activeCategory = '',
activeAuthor = ''
-) => {
+) {
if (!post.frontmatter.data) {
return []
}
@@ -55,6 +55,7 @@ export const parseProtectedPost = (
post.frontmatter.data.forEach((item) => {
if (
+ item.hidden ||
!checkItem({
postType: post.frontmatter.type,
tags: item.tags,
diff --git a/src/_blog/086-ipfs-in-opera-for-android.md b/src/_blog/086-ipfs-in-opera-for-android.md
index 8e95ae6d..5f087fec 100644
--- a/src/_blog/086-ipfs-in-opera-for-android.md
+++ b/src/_blog/086-ipfs-in-opera-for-android.md
@@ -7,6 +7,7 @@ author: Dietrich Ayala
header_image: "/086-ipfs-in-opera-for-android-header-image.png"
tags:
- browsers
+- opera
- mobile
---
@@ -20,9 +21,9 @@ Today, **Opera for Android 57** is live in the Google Play Store with default su
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 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:
@@ -62,10 +63,10 @@ IPFS support in Opera for Android is enabled by a native protocol handler that u
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
+* 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.
@@ -76,7 +77,9 @@ Opera has implemented the protocol handler using the IPFS Web Browser Addressing
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://...">
+```html
+
+```
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).
diff --git a/src/_blog/events.md b/src/_blog/events.md
index 38e89f14..97f85895 100644
--- a/src/_blog/events.md
+++ b/src/_blog/events.md
@@ -9,7 +9,19 @@ data:
path: https://www.civhacks.com/
card_image: "/2021-04-13-cardheader-civhacks.png"
tags:
- - event
+ - hackathon
+- title: IPFS Community Meetup, April 2021
+ date: 2021-04-27
+ path: https://www.meetup.com/San-Francisco-IPFS/events/276123324/
+ card_image: "/2021-04-15-cardheader-ipfs-meetup-nft-april2021.png"
+ tags:
+ - NFTs
+ - official meetup
+- title: Cal Hacks hello:world
+ date: 2021-04-16
+ path: https://helloworld.calhacks.io/
+ card_image: "/2021-04-15-cardheader-hello-world.png"
+ tags:
- hackathon
- title: Gamedev.js Jam 2021
date: 2021-04-13
@@ -17,7 +29,7 @@ data:
card_image: "/2021-04-12-cardheader-gamedevjs-2021.png"
tags:
- gaming
- - " hackathon"
+ - hackathon
- title: IPFS Community Meetup, March 2021
date: 2021-03-23
path: https://www.meetup.com/San-Francisco-IPFS/events/276123396/
diff --git a/src/_blog/ipfs-and-igalia-collaborate-on-dweb-in-browsers.md b/src/_blog/ipfs-and-igalia-collaborate-on-dweb-in-browsers.md
index d1493b84..6a279f5b 100644
--- a/src/_blog/ipfs-and-igalia-collaborate-on-dweb-in-browsers.md
+++ b/src/_blog/ipfs-and-igalia-collaborate-on-dweb-in-browsers.md
@@ -1,6 +1,6 @@
---
date: 2021-01-15
-url: '/2021-01-15-ipfs-and-igalia-collaborate-on-dweb-in-browsers/'
+permalink: '/2021-01-15-ipfs-and-igalia-collaborate-on-dweb-in-browsers/'
translationKey: ''
header_image: '/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png'
title: IPFS and Igalia collaborate on dweb in browsers
diff --git a/src/_blog/newscoverage.md b/src/_blog/newscoverage.md
index 12e56a37..8baed0ca 100644
--- a/src/_blog/newscoverage.md
+++ b/src/_blog/newscoverage.md
@@ -4,299 +4,301 @@ type: News coverage
sitemap:
exclude: true
data:
- - title: IPFS at Fission Demo Day, March 2021
- date: 2021-03-18
- path: https://blog.fission.codes/fission-demo-day-march-2021/
- card_image: '/2021-03-23-cardheader-fission-demo-day.jpg'
- tags:
- - demo
- - title: Announcing IPFS for Creators
- date: 2021-03-06
- path: https://medium.com/mintgate/announcing-ipfs-for-creators-259a8f16e13
- card_image: '/2021-03-15-cardheader-ipfs-for-creators.png'
- tags:
- - tutorial
- - name: Cointelegraph Top 100 - Juan Benet [Cointelegraph]
- title: Cointelegraph Top 100 - Juan Benet (Cointelegraph)
- path: https://cointelegraph.com/top-people-in-crypto-and-blockchain/juan-benet
- card_image: '/2021-02-11-news-cointelegraph-juanbenet.png'
- date: 2021-02-11
- tags: []
- - name: Brave Becomes First Browser to Offer Native IPFS Integration (Coindesk)
- title: Brave Becomes First Browser to Offer Native IPFS Integration (Coindesk)
- path: https://www.coindesk.com/brave-browser-native-ipfs-integration-decentralized-web
- date: 2021-01-19
- tags:
- - browsers
- card_image: '/2021-01-19-news-brave-coindesk.png'
- - name: Brave browser now supports peer-to-peer IPFS protocol (Engadget)
- title: Brave browser now supports peer-to-peer IPFS protocol (Engadget)
- path: https://www.engadget.com/brave-ipfs-update-190545662.html
- date: 2021-01-19
- tags:
- - browsers
- card_image: '/2021-01-19-news-brave-engadget.png'
- - name: How to Use the Uncensorable Web on Privacy Browser Brave (Decrypt)
- title: How to Use the Uncensorable Web on Privacy Browser Brave (Decrypt)
- path: https://decrypt.co/54686/how-to-use-the-uncensorable-web-on-privacy-browser-brave
- date: 2021-01-19
- tags:
- - browsers
- card_image: '/2021-01-19-news-brave-decrypt.png'
- - name: Brave Becomes First Browser to Add Native IPFS Support (ZDNet)
- title: Brave Becomes First Browser to Add Native IPFS Support (ZDNet)
- path: https://www.zdnet.com/article/brave-becomes-first-browser-to-add-native-support-for-the-ipfs-protocol/
- date: 2021-01-19
- tags:
- - browsers
- card_image: '/2021-01-19-news-brave-zdnet.png'
- - name: Brave Integrates IPFS (Brave Blog)
- title: Brave Integrates IPFS (Brave Blog)
- path: https://brave.com/brave-integrates-ipfs/
- date: 2021-01-19
- card_image: '/2021-01-19-news-brave-braveblog.png'
- tags:
- - browsers
- - name: Brave Bets on the Decentralized Web (The Register)
- title: Brave Bets on the Decentralized Web (The Register)
- path: https://www.theregister.com/2021/01/19/brave_decentralized_browser/
- date: 2021-01-19
- tags:
- - browsers
- - name: Brave Takes Step Towards Enabling a Decentralized Web (The Verge)
- title: Brave Takes Step Towards Enabling a Decentralized Web (The Verge)
- path: https://www.theverge.com/2021/1/19/22238334/brave-browser-ipfs-peer-to-peer-decentralized-transfer-protocol-http-nodes
- date: 2021-01-19
- tags:
- - browsers
- card_image: '/2021-01-19-news-brave-verge.png'
- - name:
- We Need Alternatives to Big Tech; These Decentralized Tools Might Be The Answer
- (New America)
- title:
- We Need Alternatives to Big Tech; These Decentralized Tools Might Be The
- Answer (New America)
- path: https://www.newamerica.org/oti/blog/decentralization-competition/
- date: 2021-01-12
- tags:
- - browsers
- card_image: '/2021-01-12-news-bigtech-newamerica.png'
- - name: Cloudflare Unveils Gateway to Distributed Web With ENS, IPFS Integration
- title: Cloudflare Unveils Gateway to Distributed Web With ENS, IPFS Integration
- path: https://www.coindesk.com/cloudflare-unveils-gateway-to-distributed-web-with-ens-ipfs-integration
- date: 2021-01-13
- tags:
- - community
- - static publishing
- card_image: '/2021-01-13-news-cloudflare-coindesk.png'
- - name: 'Juan Benet: From Idea to Action (CoinDesk)'
- title: 'Juan Benet: From Idea to Action (CoinDesk)'
- path: https://www.coindesk.com/juan-benet-most-influential-2020
- date: 2020-12-09T00:00:00.000+00:00
- tags:
- - interview
- card_image: '/2020-12-08-news-juanbenet-coindesk.png'
- - name: IPFS is paving the way for a new digital economy (Modern Consensus)
- title: IPFS is paving the way for a new digital economy (Modern Consensus)
- path: https://modernconsensus.com/commentary/opinion/ipfs-is-paving-the-way-for-a-new-digital-economy/
- date: 2020-10-08T06:00:00.000+00:00
- card_image: '/2020-10-08-digitaleconomy-modernconsensus.png'
- - name:
- The Decentralized Web Could Help Preserve The Internet’s Data For 1,000 Years.
- Here’s Why We Need IPFS To Build It (TechDirt)
- title:
- The Decentralized Web Could Help Preserve The Internet’s Data For 1,000 Years.
- Here’s Why We Need IPFS To Build It (TechDirt)
- path: 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#
- date: 2020-05-05T06:00:00.000+00:00
- - name: Latest Version of Open Source IPFS Improves Performance (DevOps.com)
- title: Latest Version of Open Source IPFS Improves Performance (DevOps.com)
- path: https://devops.com/latest-version-of-open-source-ipfs-improves-performance/
- date: 2020-04-30T06:00:00.000+00:00
- tags:
- - go-ipfs
- card_image: '/2020-04-30-news-latestipfs-devops.png'
- - name: Decentralized Web Protocol IPFS Has Its Biggest Update So Far (Cointelegraph)
- title: Decentralized Web Protocol IPFS Has Its Biggest Update So Far (Cointelegraph)
- path: https://cointelegraph.com/news/decentralized-web-protocol-ipfs-has-its-biggest-update-so-far
- date: 2020-04-28T06:00:00.000+00:00
- tags:
- - go-ipfs
- card_image: '/2020-04-28-latestipfs-cointelegraph.png'
- - name: InterPlanetary File System Is Uncensorable During Coronavirus News Fog (Coindesk)
- title: InterPlanetary File System Is Uncensorable During Coronavirus News Fog (Coindesk)
- path: https://www.coindesk.com/interplanetary-file-system-is-uncensorable-during-coronavirus-news-fog
- date: 2020-03-18T06:00:00.000+00:00
- tags:
- - censorship
- card_image: '/2020-03-18-covid-coindesk.png'
- - name: IPFS Emerges as Tool to Distribute Container Images (Container Journal)
- title: IPFS Emerges as Tool to Distribute Container Images (Container Journal)
- path: https://containerjournal.com/topics/container-management/ipfs-emerges-as-tool-to-distribute-container-images/
- date: 2020-03-02
- tags:
- - Docker
- - containerization
- card_image: '/2020-03-02-news-images-containerjournal.png'
- - name: IPFS, libp2p and Filecoin with Juan Benet (Zero Knowledge)
- title: IPFS, libp2p and Filecoin with Juan Benet (Zero Knowledge)
- path: https://www.zeroknowledge.fm/106?t=0
- date: 2019-12-04
- tags:
- - interview
- card_image: '/2020-03-02-news-juanbenet-zeroknowledge.png'
- - name: Enterprise IPFS for True Supply Chain Provenance (RTrade)
- title: Enterprise IPFS for True Supply Chain Provenance (RTrade)
- path: https://medium.com/rtrade-technologies/enterprise-ipfs-for-true-supply-chain-provenance-part-1-89524337f27
- date: 2019-09-06
- tags:
- - community
- card_image: '/2019-09-06-news-supplychain-rtrade.png'
- - name: IFPS — Technology That's Out of This World (Sprint)
- title: IFPS — Technology That's Out of This World (Sprint)
- path: https://web.archive.org/web/20200221031918/https://business.sprint.com/blog/ipfs-technology/
- date: 2019-05-22T06:00:00.000+00:00
- - name: Cloudflare Goes InterPlanetary (Cloudflare Blog)
- title: Cloudflare Goes InterPlanetary (Cloudflare Blog)
- path: https://blog.cloudflare.com/distributed-web-gateway/
- date: 2018-09-17
- tags:
- - CDN
- - community
- card_image: '/2018-09-17-news-gateway-cloudflare.png'
- - name: Building Cooperation and Trust into the Web (Mozilla Hacks)
- title: Building Cooperation and Trust into the Web (Mozilla Hacks)
- path: https://hacks.mozilla.org/2018/08/dweb-building-cooperation-and-trust-into-the-web-with-ipfs/
- date: 2018-08-29
- tags:
- - community
- card_image: '/2018-08-29-news-supplychain-rtrade.png'
- - name: Deconstructing the Power Structures of Large-Scale Social Computing Networks
- title: Deconstructing the Power Structures of Large-Scale Social Computing Networks
- path: https://infocivics.com/
- date: 2018-08-06
- tags:
- - identity
- - name:
- Why is Decentralized and Distributed File Storage Critical for a Better Web?
- (Coin Center)
- title:
- Why is Decentralized and Distributed File Storage Critical for a Better Web?
- (Coin Center)
- path: https://coincenter.org/entry/why-is-decentralized-and-distributed-file-storage-critical-for-a-better-web
- date: 2017-06-20
- card_image: '/2017-06-20-news-distributedstorage-coincenter.png'
- - name: Protocol Labs (BlueYard Capital)
- title: Protocol Labs (BlueYard Capital)
- path: https://medium.com/@BlueYard/protocol-labs-35ceff61b031
- date: 2017-05-18
- card_image: '/2017-05-18-pl-blueyard.png'
- - name: Protocol Labs (Union Square Ventures)
- title: Protocol Labs (Union Square Ventures)
- path: https://www.usv.com/blog/protocol-labs
- date: 2017-05-18
- - name: Turkey Can’t Block This Copy of Wikipedia (Observer)
- title: Turkey Can’t Block This Copy of Wikipedia (Observer)
- path: http://observer.com/2017/05/turkey-wikipedia-ipfs/
- date: 2017-05-10
- tags:
- - censorship
- card_image: '/2017-05-10-news-wikipedia-observer.png'
- - name: Ethereum Meets Zcash? Why IPFS Plans a Multi-Blockchain Browser (CoinDesk)
- title: Ethereum Meets Zcash? Why IPFS Plans a Multi-Blockchain Browser (CoinDesk)
- path: https://www.coindesk.com/ethereum-meets-zcash-why-ipfs-plans-a-multi-blockchain-browser/
- date: 2017-04-29
- card_image: '/2017-04-29-news-multiblockchain-coindesk.png'
- - name: OpenBazaar Integrating IPFS to Help Keep Stores Open Longer (Nasdaq)
- title: OpenBazaar Integrating IPFS to Help Keep Stores Open Longer (Nasdaq)
- path: http://www.nasdaq.com/article/openbazaar-integrating-interplanetary-file-system-to-help-keep-stores-open-longer-cm606534
- date: 2016-04-14
- tags:
- - community
- card_image: '/2016-04-14-openbazaar-nasdaq.png'
- - name: A Protocol That Changes Everything (John Lilic)
- title: A Protocol That Changes Everything (John Lilic)
- path: https://www.linkedin.com/pulse/introduction-ipfs-interplanetary-file-system-brief-post-john-lilic
- date: 2015-10-19
- card_image: '/2015-10-18-news-changeseverything.png'
- - name: Epicenter Bitcoin Interviews Juan Benet
- title: Epicenter Bitcoin Interviews Juan Benet
- path: https://epicenter.tv/episode/100/
- date: 2015-10-12
- tags:
- - interview
- card_image: '/2015-10-12-news-juanbenet-epicenterbitcoin.png'
- - name: Decentralizing the Web with IPFS (Reseller Club)
- title: Decentralizing the Web with IPFS (Reseller Club)
- path: https://blog.resellerclub.com/decentralizing-the-web-with-ipfs/
- date: 2015-10-12
- card_image: '/2015-10-12-news-decentralizingweb-resellerclub.png'
- - name: FreeNAS Alpha Ships with IPFS as a Transport
- title: FreeNAS Alpha Ships with IPFS as a Transport
- path: https://web.archive.org/web/20151011192538/http://www.freenas.org/whats-new/2015/10/announcing-freenas-10-alpha.html
- date: 2015-10-09
- tags:
- - community
- - name: IPFS at AndYetConf 2015
- title: IPFS at AndYetConf 2015
- path: http://talks.benet.ai/2015-10-06-ipfs-013-andyetconf
- date: 2015-10-06
- tags:
- - conferences
- - name: Why the Internet Needs IPFS Before It's Too Late (TechCrunch)
- title: Why the Internet Needs IPFS Before It's Too Late (TechCrunch)
- path: https://techcrunch.com/2015/10/04/why-the-internet-needs-ipfs-before-its-too-late/
- date: 2015-10-04
- card_image: '/2015-10-04-news-toolate-techcrunch.png'
- - name: A For-Life, Decentralized, Privacy-Respecting Web (Maxim Veksler)
- title: A For-Life, Decentralized, Privacy-Respecting Web (Maxim Veksler)
- path: https://medium.com/@mvxlr/ipfs-inter-planetary-file-system-65466e4129c6
- date: 2015-09-23
- - name: IPFS Wants to Create a Permanent Web (Motherboard)
- title: IPFS Wants to Create a Permanent Web (Motherboard)
- path: https://motherboard.vice.com/en_us/article/78xgaq/the-interplanetary-file-system-wants-to-create-a-permanent-web
- date: 2015-09-19
- card_image: '/2020-09-18-news-permanent-vice.png'
- - name: First Steps Toward Implementing Distributed Permanent Web (Hacked.com)
- title: First Steps Toward Implementing Distributed Permanent Web (Hacked.com)
- path: https://web.archive.org/web/20150919135028/https://hacked.com/first-steps-toward-implementing-distributed-permanent-web-ipfs/
- date: 2015-09-10
- - name: HTTP is Obsolete. It’s Time for the Distributed, Permanent Web (Neocities)
- title: HTTP is Obsolete. It’s Time for the Distributed, Permanent Web (Neocities)
- path: https://blog.neocities.org/its-time-for-the-permanent-web.html
- date: 2015-09-08
- card_image: '/2015-09-08-news-dweb-neocities.png'
- - name: Juan Benet Interview (Software Engineering Daily)
- title: Juan Benet Interview (Software Engineering Daily)
- path: https://softwareengineeringdaily.com/2015/08/25/interplanetary-file-system-ipfs-with-juan-benet/
- date: 2015-08-25
- tags:
- - interview
- card_image: '/2015-08-25-juanbenet-softwareengineeringdaily.png'
- - name: IPFS at Battlemesh 2015
- title: IPFS at Battlemesh 2015
- path: https://battlemesh.org/BattleMeshV8/Agenda
- date: 2015-08-03
- tags:
- - conferences
- - name: Holger Krekels EuroPython 2015 Keynote
- title: Holger Krekels EuroPython 2015 Keynote
- path: http://dietzel.me/2015/08/02/EuroPython-2015-Holger-Krekels-Keynote-about-the-interplanetary-filesystem-Wed-22nd-July-2015/
- date: 2015-05-22
- tags:
- - conferences
- card_image: '/2015-08-02-news-holgerkrekel-europython.png'
- - name: IPFS at Data Terra Nemo 2015
- title: IPFS at Data Terra Nemo 2015
- path: https://dtn.is/2015.html
- date: 2015-05-23
- tags:
- - conferences
- card_image: '/2015-05-23-news-dataterranemo.png'
- - name: Juan Benet at O'Reilly Fluent Conf
- title: Juan Benet at O'Reilly Fluent Conf
- path: https://www.oreilly.com/library/view/fluent-conference-2015/9781491927786/
- date: 2015-04-23
- tags:
- - conferences
+- title: Palm, A New NFT Ecosystem and Studio for Creators, Announces Launch of First
+ Project with Damien Hirst
+ date: 2021-03-30
+ path: https://consensys.net/blog/press-release/palm-a-new-nft-ecosystem-and-studio-for-creators-announces-launch-of-first-project-with-damien-hirst/
+ card_image: "/2021-04-15-cardheader-palm-nft.png"
+ tags:
+ - NFTs
+- title: IPFS at Fission Demo Day, March 2021
+ date: 2021-03-18
+ path: https://blog.fission.codes/fission-demo-day-march-2021/
+ card_image: "/2021-03-23-cardheader-fission-demo-day.jpg"
+ tags:
+ - demo
+- title: Announcing IPFS for Creators
+ date: 2021-03-06
+ path: https://medium.com/mintgate/announcing-ipfs-for-creators-259a8f16e13
+ card_image: "/2021-03-15-cardheader-ipfs-for-creators.png"
+ tags:
+ - tutorial
+- name: Cointelegraph Top 100 - Juan Benet [Cointelegraph]
+ title: Cointelegraph Top 100 - Juan Benet (Cointelegraph)
+ path: https://cointelegraph.com/top-people-in-crypto-and-blockchain/juan-benet
+ card_image: "/2021-02-11-news-cointelegraph-juanbenet.png"
+ date: 2021-02-11
+ tags: []
+- name: Brave Becomes First Browser to Offer Native IPFS Integration (Coindesk)
+ title: Brave Becomes First Browser to Offer Native IPFS Integration (Coindesk)
+ path: https://www.coindesk.com/brave-browser-native-ipfs-integration-decentralized-web
+ date: 2021-01-19
+ tags:
+ - browsers
+ card_image: "/2021-01-19-news-brave-coindesk.png"
+- name: Brave browser now supports peer-to-peer IPFS protocol (Engadget)
+ title: Brave browser now supports peer-to-peer IPFS protocol (Engadget)
+ path: https://www.engadget.com/brave-ipfs-update-190545662.html
+ date: 2021-01-19
+ tags:
+ - browsers
+ card_image: "/2021-01-19-news-brave-engadget.png"
+- name: How to Use the Uncensorable Web on Privacy Browser Brave (Decrypt)
+ title: How to Use the Uncensorable Web on Privacy Browser Brave (Decrypt)
+ path: https://decrypt.co/54686/how-to-use-the-uncensorable-web-on-privacy-browser-brave
+ date: 2021-01-19
+ tags:
+ - browsers
+ card_image: "/2021-01-19-news-brave-decrypt.png"
+- name: Brave Becomes First Browser to Add Native IPFS Support (ZDNet)
+ title: Brave Becomes First Browser to Add Native IPFS Support (ZDNet)
+ path: https://www.zdnet.com/article/brave-becomes-first-browser-to-add-native-support-for-the-ipfs-protocol/
+ date: 2021-01-19
+ tags:
+ - browsers
+ card_image: "/2021-01-19-news-brave-zdnet.png"
+- name: Brave Integrates IPFS (Brave Blog)
+ title: Brave Integrates IPFS (Brave Blog)
+ path: https://brave.com/brave-integrates-ipfs/
+ date: 2021-01-19
+ card_image: "/2021-01-19-news-brave-braveblog.png"
+ tags:
+ - browsers
+- name: Brave Bets on the Decentralized Web (The Register)
+ title: Brave Bets on the Decentralized Web (The Register)
+ path: https://www.theregister.com/2021/01/19/brave_decentralized_browser/
+ date: 2021-01-19
+ tags:
+ - browsers
+- name: Brave Takes Step Towards Enabling a Decentralized Web (The Verge)
+ title: Brave Takes Step Towards Enabling a Decentralized Web (The Verge)
+ path: https://www.theverge.com/2021/1/19/22238334/brave-browser-ipfs-peer-to-peer-decentralized-transfer-protocol-http-nodes
+ date: 2021-01-19
+ tags:
+ - browsers
+ card_image: "/2021-01-19-news-brave-verge.png"
+- name: We Need Alternatives to Big Tech; These Decentralized Tools Might Be The Answer
+ (New America)
+ title: We Need Alternatives to Big Tech; These Decentralized Tools Might Be The
+ Answer (New America)
+ path: https://www.newamerica.org/oti/blog/decentralization-competition/
+ date: 2021-01-12
+ tags:
+ - browsers
+ card_image: "/2021-01-12-news-bigtech-newamerica.png"
+- name: Cloudflare Unveils Gateway to Distributed Web With ENS, IPFS Integration
+ title: Cloudflare Unveils Gateway to Distributed Web With ENS, IPFS Integration
+ path: https://www.coindesk.com/cloudflare-unveils-gateway-to-distributed-web-with-ens-ipfs-integration
+ date: 2021-01-13
+ tags:
+ - community
+ - static publishing
+ card_image: "/2021-01-13-news-cloudflare-coindesk.png"
+- name: 'Juan Benet: From Idea to Action (CoinDesk)'
+ title: 'Juan Benet: From Idea to Action (CoinDesk)'
+ path: https://www.coindesk.com/juan-benet-most-influential-2020
+ date: 2020-12-09T00:00:00.000+00:00
+ tags:
+ - interview
+ card_image: "/2020-12-08-news-juanbenet-coindesk.png"
+- name: IPFS is paving the way for a new digital economy (Modern Consensus)
+ title: IPFS is paving the way for a new digital economy (Modern Consensus)
+ path: https://modernconsensus.com/commentary/opinion/ipfs-is-paving-the-way-for-a-new-digital-economy/
+ date: 2020-10-08T06:00:00.000+00:00
+ card_image: "/2020-10-08-digitaleconomy-modernconsensus.png"
+- name: The Decentralized Web Could Help Preserve The Internet’s Data For 1,000 Years.
+ Here’s Why We Need IPFS To Build It (TechDirt)
+ title: The Decentralized Web Could Help Preserve The Internet’s Data For 1,000 Years.
+ Here’s Why We Need IPFS To Build It (TechDirt)
+ path: 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#
+ date: 2020-05-05T06:00:00.000+00:00
+- name: Latest Version of Open Source IPFS Improves Performance (DevOps.com)
+ title: Latest Version of Open Source IPFS Improves Performance (DevOps.com)
+ path: https://devops.com/latest-version-of-open-source-ipfs-improves-performance/
+ date: 2020-04-30T06:00:00.000+00:00
+ tags:
+ - go-ipfs
+ card_image: "/2020-04-30-news-latestipfs-devops.png"
+- name: Decentralized Web Protocol IPFS Has Its Biggest Update So Far (Cointelegraph)
+ title: Decentralized Web Protocol IPFS Has Its Biggest Update So Far (Cointelegraph)
+ path: https://cointelegraph.com/news/decentralized-web-protocol-ipfs-has-its-biggest-update-so-far
+ date: 2020-04-28T06:00:00.000+00:00
+ tags:
+ - go-ipfs
+ card_image: "/2020-04-28-latestipfs-cointelegraph.png"
+- name: InterPlanetary File System Is Uncensorable During Coronavirus News Fog (Coindesk)
+ title: InterPlanetary File System Is Uncensorable During Coronavirus News Fog (Coindesk)
+ path: https://www.coindesk.com/interplanetary-file-system-is-uncensorable-during-coronavirus-news-fog
+ date: 2020-03-18T06:00:00.000+00:00
+ tags:
+ - censorship
+ card_image: "/2020-03-18-covid-coindesk.png"
+- name: IPFS Emerges as Tool to Distribute Container Images (Container Journal)
+ title: IPFS Emerges as Tool to Distribute Container Images (Container Journal)
+ path: https://containerjournal.com/topics/container-management/ipfs-emerges-as-tool-to-distribute-container-images/
+ date: 2020-03-02
+ tags:
+ - Docker
+ - containerization
+ card_image: "/2020-03-02-news-images-containerjournal.png"
+- name: IPFS, libp2p and Filecoin with Juan Benet (Zero Knowledge)
+ title: IPFS, libp2p and Filecoin with Juan Benet (Zero Knowledge)
+ path: https://www.zeroknowledge.fm/106?t=0
+ date: 2019-12-04
+ tags:
+ - interview
+ card_image: "/2020-03-02-news-juanbenet-zeroknowledge.png"
+- name: Enterprise IPFS for True Supply Chain Provenance (RTrade)
+ title: Enterprise IPFS for True Supply Chain Provenance (RTrade)
+ path: https://medium.com/rtrade-technologies/enterprise-ipfs-for-true-supply-chain-provenance-part-1-89524337f27
+ date: 2019-09-06
+ tags:
+ - community
+ card_image: "/2019-09-06-news-supplychain-rtrade.png"
+- name: IFPS — Technology That's Out of This World (Sprint)
+ title: IFPS — Technology That's Out of This World (Sprint)
+ path: https://web.archive.org/web/20200221031918/https://business.sprint.com/blog/ipfs-technology/
+ date: 2019-05-22T06:00:00.000+00:00
+- name: Cloudflare Goes InterPlanetary (Cloudflare Blog)
+ title: Cloudflare Goes InterPlanetary (Cloudflare Blog)
+ path: https://blog.cloudflare.com/distributed-web-gateway/
+ date: 2018-09-17
+ tags:
+ - CDN
+ - community
+ card_image: "/2018-09-17-news-gateway-cloudflare.png"
+- name: Building Cooperation and Trust into the Web (Mozilla Hacks)
+ title: Building Cooperation and Trust into the Web (Mozilla Hacks)
+ path: https://hacks.mozilla.org/2018/08/dweb-building-cooperation-and-trust-into-the-web-with-ipfs/
+ date: 2018-08-29
+ tags:
+ - community
+ card_image: "/2018-08-29-news-supplychain-rtrade.png"
+- name: Deconstructing the Power Structures of Large-Scale Social Computing Networks
+ title: Deconstructing the Power Structures of Large-Scale Social Computing Networks
+ path: https://infocivics.com/
+ date: 2018-08-06
+ tags:
+ - identity
+- name: Why is Decentralized and Distributed File Storage Critical for a Better Web?
+ (Coin Center)
+ title: Why is Decentralized and Distributed File Storage Critical for a Better Web?
+ (Coin Center)
+ path: https://coincenter.org/entry/why-is-decentralized-and-distributed-file-storage-critical-for-a-better-web
+ date: 2017-06-20
+ card_image: "/2017-06-20-news-distributedstorage-coincenter.png"
+- name: Protocol Labs (BlueYard Capital)
+ title: Protocol Labs (BlueYard Capital)
+ path: https://medium.com/@BlueYard/protocol-labs-35ceff61b031
+ date: 2017-05-18
+ card_image: "/2017-05-18-pl-blueyard.png"
+- name: Protocol Labs (Union Square Ventures)
+ title: Protocol Labs (Union Square Ventures)
+ path: https://www.usv.com/blog/protocol-labs
+ date: 2017-05-18
+- name: Turkey Can’t Block This Copy of Wikipedia (Observer)
+ title: Turkey Can’t Block This Copy of Wikipedia (Observer)
+ path: http://observer.com/2017/05/turkey-wikipedia-ipfs/
+ date: 2017-05-10
+ tags:
+ - censorship
+ card_image: "/2017-05-10-news-wikipedia-observer.png"
+- name: Ethereum Meets Zcash? Why IPFS Plans a Multi-Blockchain Browser (CoinDesk)
+ title: Ethereum Meets Zcash? Why IPFS Plans a Multi-Blockchain Browser (CoinDesk)
+ path: https://www.coindesk.com/ethereum-meets-zcash-why-ipfs-plans-a-multi-blockchain-browser/
+ date: 2017-04-29
+ card_image: "/2017-04-29-news-multiblockchain-coindesk.png"
+- name: OpenBazaar Integrating IPFS to Help Keep Stores Open Longer (Nasdaq)
+ title: OpenBazaar Integrating IPFS to Help Keep Stores Open Longer (Nasdaq)
+ path: http://www.nasdaq.com/article/openbazaar-integrating-interplanetary-file-system-to-help-keep-stores-open-longer-cm606534
+ date: 2016-04-14
+ tags:
+ - community
+ card_image: "/2016-04-14-openbazaar-nasdaq.png"
+- name: A Protocol That Changes Everything (John Lilic)
+ title: A Protocol That Changes Everything (John Lilic)
+ path: https://www.linkedin.com/pulse/introduction-ipfs-interplanetary-file-system-brief-post-john-lilic
+ date: 2015-10-19
+ card_image: "/2015-10-18-news-changeseverything.png"
+- name: Epicenter Bitcoin Interviews Juan Benet
+ title: Epicenter Bitcoin Interviews Juan Benet
+ path: https://epicenter.tv/episode/100/
+ date: 2015-10-12
+ tags:
+ - interview
+ card_image: "/2015-10-12-news-juanbenet-epicenterbitcoin.png"
+- name: Decentralizing the Web with IPFS (Reseller Club)
+ title: Decentralizing the Web with IPFS (Reseller Club)
+ path: https://blog.resellerclub.com/decentralizing-the-web-with-ipfs/
+ date: 2015-10-12
+ card_image: "/2015-10-12-news-decentralizingweb-resellerclub.png"
+- name: FreeNAS Alpha Ships with IPFS as a Transport
+ title: FreeNAS Alpha Ships with IPFS as a Transport
+ path: https://web.archive.org/web/20151011192538/http://www.freenas.org/whats-new/2015/10/announcing-freenas-10-alpha.html
+ date: 2015-10-09
+ tags:
+ - community
+- name: IPFS at AndYetConf 2015
+ title: IPFS at AndYetConf 2015
+ path: http://talks.benet.ai/2015-10-06-ipfs-013-andyetconf
+ date: 2015-10-06
+ tags:
+ - conferences
+- name: Why the Internet Needs IPFS Before It's Too Late (TechCrunch)
+ title: Why the Internet Needs IPFS Before It's Too Late (TechCrunch)
+ path: https://techcrunch.com/2015/10/04/why-the-internet-needs-ipfs-before-its-too-late/
+ date: 2015-10-04
+ card_image: "/2015-10-04-news-toolate-techcrunch.png"
+- name: A For-Life, Decentralized, Privacy-Respecting Web (Maxim Veksler)
+ title: A For-Life, Decentralized, Privacy-Respecting Web (Maxim Veksler)
+ path: https://medium.com/@mvxlr/ipfs-inter-planetary-file-system-65466e4129c6
+ date: 2015-09-23
+- name: IPFS Wants to Create a Permanent Web (Motherboard)
+ title: IPFS Wants to Create a Permanent Web (Motherboard)
+ path: https://motherboard.vice.com/en_us/article/78xgaq/the-interplanetary-file-system-wants-to-create-a-permanent-web
+ date: 2015-09-19
+ card_image: "/2020-09-18-news-permanent-vice.png"
+- name: First Steps Toward Implementing Distributed Permanent Web (Hacked.com)
+ title: First Steps Toward Implementing Distributed Permanent Web (Hacked.com)
+ path: https://web.archive.org/web/20150919135028/https://hacked.com/first-steps-toward-implementing-distributed-permanent-web-ipfs/
+ date: 2015-09-10
+- name: HTTP is Obsolete. It’s Time for the Distributed, Permanent Web (Neocities)
+ title: HTTP is Obsolete. It’s Time for the Distributed, Permanent Web (Neocities)
+ path: https://blog.neocities.org/its-time-for-the-permanent-web.html
+ date: 2015-09-08
+ card_image: "/2015-09-08-news-dweb-neocities.png"
+- name: Juan Benet Interview (Software Engineering Daily)
+ title: Juan Benet Interview (Software Engineering Daily)
+ path: https://softwareengineeringdaily.com/2015/08/25/interplanetary-file-system-ipfs-with-juan-benet/
+ date: 2015-08-25
+ tags:
+ - interview
+ card_image: "/2015-08-25-juanbenet-softwareengineeringdaily.png"
+- name: IPFS at Battlemesh 2015
+ title: IPFS at Battlemesh 2015
+ path: https://battlemesh.org/BattleMeshV8/Agenda
+ date: 2015-08-03
+ tags:
+ - conferences
+- name: Holger Krekels EuroPython 2015 Keynote
+ title: Holger Krekels EuroPython 2015 Keynote
+ path: http://dietzel.me/2015/08/02/EuroPython-2015-Holger-Krekels-Keynote-about-the-interplanetary-filesystem-Wed-22nd-July-2015/
+ date: 2015-05-22
+ tags:
+ - conferences
+ card_image: "/2015-08-02-news-holgerkrekel-europython.png"
+- name: IPFS at Data Terra Nemo 2015
+ title: IPFS at Data Terra Nemo 2015
+ path: https://dtn.is/2015.html
+ date: 2015-05-23
+ tags:
+ - conferences
+ card_image: "/2015-05-23-news-dataterranemo.png"
+- name: Juan Benet at O'Reilly Fluent Conf
+ title: Juan Benet at O'Reilly Fluent Conf
+ path: https://www.oreilly.com/library/view/fluent-conference-2015/9781491927786/
+ date: 2015-04-23
+ tags:
+ - conferences
+
---
diff --git a/src/_blog/tutorials.md b/src/_blog/tutorials.md
index bc397473..713d14dd 100644
--- a/src/_blog/tutorials.md
+++ b/src/_blog/tutorials.md
@@ -4,93 +4,106 @@ type: Tutorial
sitemap:
exclude: true
data:
- - name: 'ProtoSchool: Introduction to libp2p'
- title: 'ProtoSchool: Introduction to libp2p'
- path: https://proto.school/introduction-to-libp2p
- card_image: '/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg'
- date: 2021-02-17
- tags:
- - ProtoSchool
- - libp2p
- - name: How to Leverage Cloudflare and IPFS to Host a Free High-Availability Site
- title: How to Leverage Cloudflare and IPFS to Host a Free High-Availability Site
- path: https://coywolf.pro/webmaster/ipfs-distributed-web-cloudflare-host-site/
- date: 2021-02-10
- tags:
- - static publishing
- - IPFS Desktop
- card_image: '/tutorial-20210210-cloudflare-ipfs.png'
- - name: 'ProtoSchool: Merkle DAGs — Structuring Data for the Distributed Web'
- title: 'ProtoSchool: Merkle DAGs — Structuring Data for the Distributed Web'
- path: https://proto.school/merkle-dags
- date: 2021-01-14
- tags:
- - ProtoSchool
- - DAG
- - IPLD
- - CID
- card_image: '/2021-01-14-tutorial-protoschool-merkledags.png'
- - name: 'ProtoSchool: Anatomy of a CID'
- title: 'ProtoSchool: Anatomy of a CID'
- path: https://proto.school/anatomy-of-a-cid
- date: 2020-03-16
- tags:
- - ProtoSchool
- - CID
- card_image: '/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png'
- - name: 'ProtoSchool: Regular Files API'
- title: 'ProtoSchool: Regular Files API'
- path: https://proto.school/regular-files-api
- date: 2020-09-12
- tags:
- - ProtoSchool
- - API
- - js-ipfs
- card_image: '/2020-09-11-tutorial-protoschool-regularfilesapi.png'
- - name: 'ProtoSchool: Mutable File System'
- title: 'ProtoSchool: Mutable File System'
- path: https://proto.school/mutable-file-system
- date: 2019-06-11
- tags:
- - ProtoSchool
- - MFS
- - js-ipfs
- card_image: '/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png'
- - name: 'ProtoSchool: Content Addressing on the Decentralized Web'
- title: 'ProtoSchool: Content Addressing on the Decentralized Web'
- path: https://proto.school/content-addressing
- date: 2019-01-03
- tags:
- - ProtoSchool
- - DAG
- - CID
- - js-ipfs
- - IPLD
- card_image: '/2021-01-12-tutorial-protoschool-contentaddressing.png'
- - name: 'ProtoSchool: Blogging on the Decentralized Web'
- title: 'ProtoSchool: Blogging on the Decentralized Web'
- path: https://proto.school/blog
- date: 2018-08-01
- tags:
- - ProtoSchool
- - static publishing
- - js-ipfs
- - IPLD
- - DAG
- card_image: '/2020-09-11-tutorial-protoschool-blogging.png'
- - name: 'ProtoSchool: P2P Data Links with Content Addressing'
- title: 'ProtoSchool: P2P Data Links with Content Addressing'
- path: https://proto.school/basics
- date: 2018-07-31
- tags:
- - ProtoSchool
- - CID
- card_image: '/2020-09-11-tutorial-protoschool-datalinks.png'
- - name: Install IPFS on a Raspberry Pi 2
- title: Install IPFS on a Raspberry Pi 2
- path: https://www.siliconian.com/blog/16-bitcoin-blockchain/23-beginner-s-guide-to-installing-ipfs-on-a-raspberry-pi-2
- date: 2015-05-02
- tags:
- - ProtoSchool
- card_image: '/2015-05-02-tutorial-raspberrypi-siliconian.png'
+- title: Build a No Code NFT File Tool With Zapier and IPFS
+ date: 2021-04-09
+ path: https://medium.com/pinata/build-a-no-code-nft-file-tool-with-zapier-and-ipfs-9bd44a3b23b7
+ card_image: "/2021-04-15-cardheader-zapier-nft-tool.png"
+ tags:
+ - NFTs
+- title: Decentralized Uniswap Interface Hosting on IPFS
+ date: 2021-03-31
+ path: https://medium.com/crustnetwork/decentralized-uniswap-interface-hosting-on-ipfs-18a78d1209ac
+ card_image: "/2021-04-15-cardheader-crust-ipfs-uniswap-integration.jpg"
+ tags:
+ - static publishing
+- name: 'ProtoSchool: Introduction to libp2p'
+ title: 'ProtoSchool: Introduction to libp2p'
+ path: https://proto.school/introduction-to-libp2p
+ card_image: "/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg"
+ date: 2021-02-17
+ tags:
+ - ProtoSchool
+ - libp2p
+- name: How to Leverage Cloudflare and IPFS to Host a Free High-Availability Site
+ title: How to Leverage Cloudflare and IPFS to Host a Free High-Availability Site
+ path: https://coywolf.pro/webmaster/ipfs-distributed-web-cloudflare-host-site/
+ date: 2021-02-10
+ tags:
+ - static publishing
+ - IPFS Desktop
+ card_image: "/tutorial-20210210-cloudflare-ipfs.png"
+- name: 'ProtoSchool: Merkle DAGs — Structuring Data for the Distributed Web'
+ title: 'ProtoSchool: Merkle DAGs — Structuring Data for the Distributed Web'
+ path: https://proto.school/merkle-dags
+ date: 2021-01-14
+ tags:
+ - ProtoSchool
+ - DAG
+ - IPLD
+ - CID
+ card_image: "/2021-01-14-tutorial-protoschool-merkledags.png"
+- name: 'ProtoSchool: Anatomy of a CID'
+ title: 'ProtoSchool: Anatomy of a CID'
+ path: https://proto.school/anatomy-of-a-cid
+ date: 2020-03-16
+ tags:
+ - ProtoSchool
+ - CID
+ card_image: "/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png"
+- name: 'ProtoSchool: Regular Files API'
+ title: 'ProtoSchool: Regular Files API'
+ path: https://proto.school/regular-files-api
+ date: 2020-09-12
+ tags:
+ - ProtoSchool
+ - API
+ - js-ipfs
+ card_image: "/2020-09-11-tutorial-protoschool-regularfilesapi.png"
+- name: 'ProtoSchool: Mutable File System'
+ title: 'ProtoSchool: Mutable File System'
+ path: https://proto.school/mutable-file-system
+ date: 2019-06-11
+ tags:
+ - ProtoSchool
+ - MFS
+ - js-ipfs
+ card_image: "/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png"
+- name: 'ProtoSchool: Content Addressing on the Decentralized Web'
+ title: 'ProtoSchool: Content Addressing on the Decentralized Web'
+ path: https://proto.school/content-addressing
+ date: 2019-01-03
+ tags:
+ - ProtoSchool
+ - DAG
+ - CID
+ - js-ipfs
+ - IPLD
+ card_image: "/2021-01-12-tutorial-protoschool-contentaddressing.png"
+- name: 'ProtoSchool: Blogging on the Decentralized Web'
+ title: 'ProtoSchool: Blogging on the Decentralized Web'
+ path: https://proto.school/blog
+ date: 2018-08-01
+ tags:
+ - ProtoSchool
+ - static publishing
+ - js-ipfs
+ - IPLD
+ - DAG
+ card_image: "/2020-09-11-tutorial-protoschool-blogging.png"
+- name: 'ProtoSchool: P2P Data Links with Content Addressing'
+ title: 'ProtoSchool: P2P Data Links with Content Addressing'
+ path: https://proto.school/basics
+ date: 2018-07-31
+ tags:
+ - ProtoSchool
+ - CID
+ card_image: "/2020-09-11-tutorial-protoschool-datalinks.png"
+- name: Install IPFS on a Raspberry Pi 2
+ title: Install IPFS on a Raspberry Pi 2
+ path: https://www.siliconian.com/blog/16-bitcoin-blockchain/23-beginner-s-guide-to-installing-ipfs-on-a-raspberry-pi-2
+ date: 2015-05-02
+ tags:
+ - ProtoSchool
+ card_image: "/2015-05-02-tutorial-raspberrypi-siliconian.png"
+
---
diff --git a/src/_blog/using-ipfs-to-help-with-scaling-ethereum.md b/src/_blog/using-ipfs-to-help-with-scaling-ethereum.md
new file mode 100644
index 00000000..21fd0f23
--- /dev/null
+++ b/src/_blog/using-ipfs-to-help-with-scaling-ethereum.md
@@ -0,0 +1,46 @@
+---
+title: Using IPFS to help with Scaling Ethereum
+description: We’re staking $7500 in FIL to encourage builders to help scale Ethereum
+ and Eth2!
+author: PL Hackathon Team
+date: 2021-04-14
+permalink: "/2021-04-14-scaling-ethereum/"
+translationKey: 2021-04-14-scaling-ethereum
+header_image: "/2021-04-14-cardheader-scaling-ethereum.png"
+tags:
+- Ethereum
+- hackathon
+
+---
+As the Ethereum community looks to enter the sixth year of collaborating on the world’s most actively used blockchain, many builders eagerly anticipate the next phase of Eth2. Scaling is an inevitable part of any successful open source project, and it presents many complex challenges. Enter [Scaling Ethereum](https://scaling.ethglobal.co/), another event Protocol Labs is happy to partner on with the [ETHGlobal](https://ethglobal.co/) team.
+
+Scaling Ethereum is a 4-week hackathon and virtual summit focused on upgrading the foundation of Ethereum and Eth2 by inviting the global community to collaborate around a vision for a better Ethereum. Anticipate hands-on workshops, technical talks, interesting prizes, and complex problem solving when you join.
+
+## How to find us
+
+Both the IPFS and Filecoin projects will be showing their support for the Ethereum community during this event. Ask questions and get support in the the _#sponsor-protocol-labs channel_ in the [Scaling Ethereum Discord](https://discord.com/invite/eKHHzxf).
+
+Also join us on April 14 at 15:30 CDT for 🛠 **Scaling infrastructure for the Interplanetary Web** 🛠 with Dietrich Ayala, developer onboarding and ecosystem support lead for Protocol Labs.
+
+## We’re staking $7500 in Prizes
+
+Protocol Labs has four prize options for scaling all the things, which it may choose to split up amongst multiple winners if too many of you build amazing projects:
+
+* 💮 NFT Metadata Updater, $1875 in FIL: Mo minting, mo problems. Best method for managing signed permissioned and timestamped updates to NFT metadata stored on IPFS via any L2 chain
+* 🏁 Filecoin Turbo Retrieval, $1875 in FIL: Best method of bundling, managing, warming up, pre-flighting or otherwise speeding up payment channel process for easy mass retrieval from Filecoin.
+* ⛵️ Sailing the Sea of CIDs, $1875 in FIL: You’re publishing everything to IPFS by default now, but… dude, where’s my stuff? Best tool, service, website or library for working with large collections of IPFS CIDs.
+* 🤝 Filecoin Super Disputer, $1875 in FIL: Disputing optimistic Window PoST proofs is a fun and profitable hobby, that also will impress your friends… but how to show off? Best prize for a disputer history visualizer, leaderboard or other panoramic view of this hot new community.
+
+More details for all prizes [here](https://hackmd.io/dHL5Hkb-SdOtlxTw7d7P_w?view), and ask us in the _#sponsor-protocol-labs channel_ on the ETHGlobal Discord for more info!
+
+## But, where to get started… 🤔
+
+
+
+Learn how to use IPFS to deploy infrastructure in this video from IPFS Camp 2019.
+
+
+
+Discover how Filecoin integrations create powerful opportunities for Web3 infrastructure.
+
+Find code examples, tutorials, and other resources on the [IPFS documentation site](https://docs.ipfs.io/) and the [Filecoin documentation site](https://docs.filecoin.io/). For more information, visit the [Scaling Ethereum site](https://scaling.ethglobal.co/) to register, or ping us on Twitter with your questions at @IPFS or @Filecoin. See you there!
\ No newline at end of file
diff --git a/src/_blog/welcome-to-ipfs-weekly-131.md b/src/_blog/welcome-to-ipfs-weekly-131.md
new file mode 100644
index 00000000..2ba5cba4
--- /dev/null
+++ b/src/_blog/welcome-to-ipfs-weekly-131.md
@@ -0,0 +1,69 @@
+---
+title: Welcome to IPFS Weekly 131
+description: Uniswap Interface hosting on IPFS, a call for Filecoin user testers,
+ and more from around the ecosystem!
+author: Emily Vaughan
+date: 2021-04-14
+permalink: "/weekly-131/"
+translationKey: ipfs-weekly-131
+header_image: "/header-image-weekly-newsletter.png"
+tags:
+- weekly
+
+---
+Here’s what’s happening in the [**InterPlanetary File System**](https://ipfs.io/) galaxy!
+
+## Decentralized Uniswap Interface Hosting on IPFS
+
+
+
+Uniswap has merged the code to continuously deploy its interface on Crust Network! Hosting a website/DApp frontend on IPFS grants you several benefits, such as serverless hosting, potential resilience to DNS hijacks (together with IPNS/ENS), and high uptime. Uniswap, as one of the most widely used DEX’s (Decentralized Exchange), has been integrated with IPFS for approximately a year. [This article](https://medium.com/crustnetwork/decentralized-uniswap-interface-hosting-on-ipfs-18a78d1209ac) explains the whole process in more detail, and also describes how to host a website in a more decentralized way using Crust.
+
+## Help improve the Filecoin storage network!
+
+
+
+The user research team at Protocol Labs is seeking members of the IPFS ecosystem to participate in an hour-long user testing session for the Filecoin storage network between April 19 and April 30. (No prior experience with Filecoin needed!) Participants who are selected and successfully complete these sessions will receive an Amazon gift card valued at $150 USD as compensation for their time. Complete this [short survey](https://airtable.com/shrOEfGSKe1WVALKi?prefill_Study=Filecoin%20storage%20and%20retrieval) to apply!
+
+## Brand new on IPFS
+
+* Palm NFT Studio announces the launch of their first project with Damien Hirst with permanent decentralized storage of NFT metadata on IPFS. [Read more.](https://consensys.net/blog/press-release/palm-a-new-nft-ecosystem-and-studio-for-creators-announces-launch-of-first-project-with-damien-hirst/)
+* IPFS now offers announcements, release notes, video tutorials, news coverage and events all in one place! [Check out our new blog.](https://blog.ipfs.io/)
+* [Apps are open for the Filecoin Launchpad Accelerator II.](https://t.co/mg4k3PNQ8y?amp=1) For startups building apps for the dweb through IPFS, Filecoin, and Ethereum networks.
+* Want to build a no-code NFT file but not sure where to start? Look no further! [Learn how to do it with Zapier and IPFS.](https://medium.com/pinata/build-a-no-code-nft-file-tool-with-zapier-and-ipfs-9bd44a3b23b7)
+
+## Around the ecosystem 🌏
+
+VideoCoin is integrating its decentralized video processing network with Filecoin to build the first platform specifically designed for creating and trading Video NFTs. [Read more.](https://filecoin.io/blog/posts/videocoin-and-filecoin-to-power-the-video-nft-market/)
+
+The Pinata team joined the NonFunGerbils podcast to chat about how IPFS and Pinata work, as well as current and future best practices for NFTs, and more. [Listen.](https://t.co/ig8zG1GQbP?amp=1)
+
+Omni Analytics developed a Filecoin Miner Index API to help enthusiasts get a high-level overview of the health and performance of storage miners. [Learn more.](https://t.co/JdwItOWl4T?amp=1)
+
+Want to catch up on crypto pop culture news? Check out the podcast and video series Pop Crypto Recap by Unstoppable Domains. [Watch.](https://t.co/LN88co720P?amp=1)
+
+Cloudflare is running a series of developer challenges to play with some of their new features. [Join the fun.](https://t.co/Zrbg89xd2E?amp=1)
+
+## Upcoming 📅
+
+The April IPFS meetup will be an opportunity to showcase what the community has been building with NFTs! [Sign up here](https://protocollabs.typeform.com/to/hLGfKhxn) to present, or [register to attend](https://www.meetup.com/San-Francisco-IPFS/events/276123324/) on April 27th and be prepared to learn more about the world of IPFS x NFTs!
+
+## Want to help build the new internet?
+
+[Chief of Staff](https://jobs.lever.co/protocol/dc3ca53d-b456-4f91-806d-4ec6b5821dc5): As Chief of Staff, you’ll play a key role enabling and supporting our CEO. The Chief of Staff will have an impact on the efficiency and productivity of the company, streamlining business initiatives, driving program management and communicating cross functional objectives. **Protocol Labs**, Remote.
+
+[Software Engineers](https://jobs.lever.co/protocol): Seeking seasoned software engineers with specializations in cryptography and systems, distributed systems, and peer-to-peer networks to help shape the next generation of network protocols. **Protocol Labs**, Remote.
+
+[Research Scientists](https://jobs.lever.co/protocol): Seeking research scientists in the following areas: cryptography, distributed systems, networking, independent research. **Protocol Labs**, Remote.
+
+[Senior Full Stack Engineer](https://textile.breezy.hr/p/d59ca1308346-senior-full-stack-engineer): This role is for someone with solid coding experience who likes to experiment, design, and learn new things. We are looking to fill this position soon. We are looking for someone who can rapidly scope and build new web applications and work with APIs and backend services. **Textile**, Remote.
+
+[Senior Go Engineer](https://textile.breezy.hr/p/421d4f71a227-senior-go-engineer): As a Senior Go Engineer, you will be responsible for writing and maintaining code on the Textile Go libraries, including [Threads](https://github.com/textileio/go-threads), [Buckets](https://github.com/textileio/go-buckets), [Hub](https://github.com/textileio/textile), and [Powergate](https://github.com/textileio/powergate). This role is for someone with solid coding experience and the ability to lead new features. **Textile**, Remote.
+
+[Consensus Protocol and DLT Engineer](https://angel.co/company/humanode-2/jobs/1265884-consensus-protocol-and-dlt-engineer): Consensus is looking for a Lead Engineer with solid experience in building or working with consensus mechanisms such as Snow family, Clique, Aura, pBFT. Knowledge and experience with Ethereum, EVM and Smart Contracts is crucial as EVM-compatibility is key in the market. **Consensus**, Humanode, Remote.
+
+**IPFS strives to make the web faster, safer, and more open.**
+
+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.**](https://ipfs.us4.list-manage.com/subscribe?u=25473244c7d18b897f5a1ff6b&id=cad54b2230)
\ No newline at end of file
diff --git a/src/assets/107-nix-ipfs-header-image.jpg b/src/assets/107-nix-ipfs-header-image.jpg
index 2fcec0e0..850a0f8c 100644
Binary files a/src/assets/107-nix-ipfs-header-image.jpg and b/src/assets/107-nix-ipfs-header-image.jpg differ
diff --git a/src/assets/111485037-90aa5d80-8736-11eb-9fbf-44e254214d1d.png b/src/assets/111485037-90aa5d80-8736-11eb-9fbf-44e254214d1d.png
index 1a0bdffd..5bb587e6 100644
Binary files a/src/assets/111485037-90aa5d80-8736-11eb-9fbf-44e254214d1d.png and b/src/assets/111485037-90aa5d80-8736-11eb-9fbf-44e254214d1d.png differ
diff --git a/src/assets/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg b/src/assets/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg
index c43a5436..9caff3b1 100644
Binary files a/src/assets/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg and b/src/assets/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg differ
diff --git a/src/assets/2021-03-23-cardheader-fission-demo-day.jpg b/src/assets/2021-03-23-cardheader-fission-demo-day.jpg
index b4d1ff35..09afde9c 100644
Binary files a/src/assets/2021-03-23-cardheader-fission-demo-day.jpg and b/src/assets/2021-03-23-cardheader-fission-demo-day.jpg differ
diff --git a/src/assets/2021-04-12-cardheader-gamedevjs-2021.png b/src/assets/2021-04-12-cardheader-gamedevjs-2021.png
index bbad99de..e4c8fd8d 100644
Binary files a/src/assets/2021-04-12-cardheader-gamedevjs-2021.png and b/src/assets/2021-04-12-cardheader-gamedevjs-2021.png differ
diff --git a/src/assets/2021-04-14-cardheader-scaling-ethereum.png b/src/assets/2021-04-14-cardheader-scaling-ethereum.png
new file mode 100644
index 00000000..55ebf4a6
Binary files /dev/null and b/src/assets/2021-04-14-cardheader-scaling-ethereum.png differ
diff --git a/src/assets/2021-04-15-cardheader-crust-ipfs-uniswap-integration.jpg b/src/assets/2021-04-15-cardheader-crust-ipfs-uniswap-integration.jpg
new file mode 100644
index 00000000..90b4ccec
Binary files /dev/null and b/src/assets/2021-04-15-cardheader-crust-ipfs-uniswap-integration.jpg differ
diff --git a/src/assets/2021-04-15-cardheader-hello-world.png b/src/assets/2021-04-15-cardheader-hello-world.png
new file mode 100644
index 00000000..b0170983
Binary files /dev/null and b/src/assets/2021-04-15-cardheader-hello-world.png differ
diff --git a/src/assets/2021-04-15-cardheader-ipfs-meetup-nft-april2021.png b/src/assets/2021-04-15-cardheader-ipfs-meetup-nft-april2021.png
new file mode 100644
index 00000000..3b0f6d86
Binary files /dev/null and b/src/assets/2021-04-15-cardheader-ipfs-meetup-nft-april2021.png differ
diff --git a/src/assets/2021-04-15-cardheader-palm-nft.png b/src/assets/2021-04-15-cardheader-palm-nft.png
new file mode 100644
index 00000000..549e89cd
Binary files /dev/null and b/src/assets/2021-04-15-cardheader-palm-nft.png differ
diff --git a/src/assets/2021-04-15-cardheader-zapier-nft-tool.png b/src/assets/2021-04-15-cardheader-zapier-nft-tool.png
new file mode 100644
index 00000000..4eb2e32b
Binary files /dev/null and b/src/assets/2021-04-15-cardheader-zapier-nft-tool.png differ
diff --git a/src/assets/crust-ipfs.jpg b/src/assets/crust-ipfs.jpg
new file mode 100644
index 00000000..37861f64
Binary files /dev/null and b/src/assets/crust-ipfs.jpg differ
diff --git a/src/assets/filecoin-usertesting.png b/src/assets/filecoin-usertesting.png
new file mode 100644
index 00000000..947baaeb
Binary files /dev/null and b/src/assets/filecoin-usertesting.png differ
diff --git a/src/assets/opera-ios-app-store-short.png b/src/assets/opera-ios-app-store-short.png
index ec6eec41..27bcb903 100644
Binary files a/src/assets/opera-ios-app-store-short.png and b/src/assets/opera-ios-app-store-short.png differ
diff --git a/src/assets/opera-ios-app-store.png b/src/assets/opera-ios-app-store.png
index d392547f..71f9bb6e 100644
Binary files a/src/assets/opera-ios-app-store.png and b/src/assets/opera-ios-app-store.png differ
diff --git a/src/assets/opera-ios-wikipedia-short.png b/src/assets/opera-ios-wikipedia-short.png
index 8b730095..12e5edb2 100644
Binary files a/src/assets/opera-ios-wikipedia-short.png and b/src/assets/opera-ios-wikipedia-short.png differ
diff --git a/src/assets/opera-ios-wikipedia.png b/src/assets/opera-ios-wikipedia.png
index 655f0755..2c3ef441 100644
Binary files a/src/assets/opera-ios-wikipedia.png and b/src/assets/opera-ios-wikipedia.png differ
diff --git a/src/assets/screen-shot-2021-04-12-at-5-56-44-pm.png b/src/assets/screen-shot-2021-04-12-at-5-56-44-pm.png
index 6d2a4e1d..cc30a7cc 100644
Binary files a/src/assets/screen-shot-2021-04-12-at-5-56-44-pm.png and b/src/assets/screen-shot-2021-04-12-at-5-56-44-pm.png differ