diff --git a/.forestry/settings.yml b/.forestry/settings.yml index 79bcd7fd..b209c62a 100644 --- a/.forestry/settings.yml +++ b/.forestry/settings.yml @@ -65,10 +65,10 @@ sections: match: "**/*" templates: - blog-post -upload_dir: src/.vuepress/public -public_path: '' +upload_dir: src/assets +public_path: "../assets" front_matter_path: '' -use_front_matter_path: false +use_front_matter_path: true file_template: ":filename:" build: preview_output_directory: dist diff --git a/package-lock.json b/package-lock.json index 453adfb1..a23a01f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "1.0.0", "dependencies": { "dayjs": "^1.10.4", + "markdown-it-image-lazy-loading": "^1.0.2", + "markdown-it-imsize": "^2.0.1", "tailwindcss-typography": "^3.1.0", "v-lazy-image": "^1.4.0", "v-scroll-lock": "^1.3.1", @@ -24,6 +26,7 @@ "@vuepress/plugin-blog": "^1.9.4", "@vuepress/plugin-html-redirect": "^0.1.2", "@vuepress/plugin-last-updated": "^1.8.2", + "autoprefixer": "^9.8.6", "eslint": "^7.21.0", "eslint-config-prettier": "^6.15.0", "eslint-config-standard": "^16.0.2", @@ -41,7 +44,7 @@ "markdown-it-task-lists": "^2.1.1", "markdown-it-video": "^0.6.3", "npm-run-all": "^4.1.5", - "postcss-nested": "^4.2.3", + "postcss": "^7.0.35", "prettier": "^2.2.1", "slug": "^4.0.3", "standard-version": "^9.1.1", @@ -51,7 +54,7 @@ "svg-sprite-loader": "^5.2.1", "svgo": "^1.3.2", "svgo-loader": "^2.2.2", - "tailwindcss": "^1.9.6", + "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0", "tailwindcss-line-clamp": "^1.0.5", "tailwindcss-touch": "^1.0.1", "vue": "^2.6.12", @@ -206,52 +209,6 @@ "semver": "^6.3.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/caniuse-lite": { - "version": "1.0.30001194", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz", - "integrity": "sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA==", - "dev": true - }, - "node_modules/@babel/helper-compilation-targets/node_modules/electron-to-chromium": { - "version": "1.3.678", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.678.tgz", - "integrity": "sha512-E5ha1pE9+aWWrT2fUD5wdPBWUnYtKnEnloewbtVyrkAs79HvodOiNO4rMR94+hKbxgMFQG4fnPQACOc1cfMfBg==", - "dev": true - }, - "node_modules/@babel/helper-compilation-targets/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3290,13 +3247,12 @@ } }, "node_modules/@fullhuman/postcss-purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", - "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-3.1.3.tgz", + "integrity": "sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA==", "dev": true, "dependencies": { - "postcss": "7.0.32", - "purgecss": "^2.3.0" + "purgecss": "^3.1.3" } }, "node_modules/@jsdevtools/rehype-url-inspector": { @@ -5409,6 +5365,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -5431,14 +5396,14 @@ } }, "node_modules/autoprefixer": { - "version": "9.8.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", - "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "dependencies": { "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001087", - "colorette": "^1.2.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.32", @@ -5446,6 +5411,10 @@ }, "bin": { "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, "node_modules/aws-sign2": { @@ -5966,21 +5935,26 @@ } }, "node_modules/browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", - "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer": { @@ -6389,9 +6363,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001094", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz", - "integrity": "sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA==", + "version": "1.0.30001207", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001207.tgz", + "integrity": "sha512-UPQZdmAsyp2qfCTiMU/zqGSWOYaY9F9LL61V8f+8MrubsaDGpaHD9HRV/EWZGULZn0Hxu48SKzI5DgFwTvHuYw==", "dev": true }, "node_modules/caseless": { @@ -6972,13 +6946,13 @@ } }, "node_modules/color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "dependencies": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "node_modules/color-convert": { @@ -6997,9 +6971,9 @@ "dev": true }, "node_modules/color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "dev": true, "dependencies": { "color-name": "^1.0.0", @@ -7007,9 +6981,9 @@ } }, "node_modules/colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "node_modules/combined-stream": { @@ -7031,9 +7005,9 @@ "dev": true }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, "engines": { "node": ">= 6" @@ -8045,52 +8019,6 @@ "semver": "7.0.0" } }, - "node_modules/core-js-compat/node_modules/browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/core-js-compat/node_modules/caniuse-lite": { - "version": "1.0.30001194", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz", - "integrity": "sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA==", - "dev": true - }, - "node_modules/core-js-compat/node_modules/electron-to-chromium": { - "version": "1.3.678", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.678.tgz", - "integrity": "sha512-E5ha1pE9+aWWrT2fUD5wdPBWUnYtKnEnloewbtVyrkAs79HvodOiNO4rMR94+hKbxgMFQG4fnPQACOc1cfMfBg==", - "dev": true - }, - "node_modules/core-js-compat/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/core-js-compat/node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, "node_modules/core-js-compat/node_modules/semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -9133,6 +9061,12 @@ "node": ">=0.8.0" } }, + "node_modules/didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -9171,6 +9105,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -9457,9 +9397,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.488", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", - "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "version": "1.3.708", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.708.tgz", + "integrity": "sha512-+A8ggYZ5riOLMcVAuzHx6bforaPzaiLnW1QOMD2SlMYQVi7QQTyQ/WrlZoebIH9ikmgr+tLJGpNITFFCUiQcPw==", "dev": true }, "node_modules/elliptic": { @@ -9674,9 +9614,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" @@ -11912,6 +11852,49 @@ "node": "*" } }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -13331,6 +13314,18 @@ "rgba-regex": "^1.0.0" } }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -13408,6 +13403,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -14005,15 +14009,6 @@ "lint-staged": "bin/lint-staged.js" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/lint-staged/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -14199,6 +14194,12 @@ "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", "dev": true }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, "node_modules/lodash.trimend": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", @@ -14497,6 +14498,11 @@ "integrity": "sha512-JVW6fCmZWjvMdDQSbOT3nnOQtd9iAXmw7hTSh26+v42BnvXeVyGMDBm5b/EZocMed2MbCAHiTX632vY0FyGB8A==", "dev": true }, + "node_modules/markdown-it-image-lazy-loading": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-image-lazy-loading/-/markdown-it-image-lazy-loading-1.0.2.tgz", + "integrity": "sha512-FBGKcF+zDSE7HEN9rGar6+36RtO3ozakqNLpbl2uL91DZQEIkXxN8uUZXJGCjvQL4O5f9IxeP5lagxX3FZ2SgA==" + }, "node_modules/markdown-it-img-lazy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/markdown-it-img-lazy/-/markdown-it-img-lazy-1.0.2.tgz", @@ -15215,6 +15221,18 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/modern-normalize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.0.0.tgz", + "integrity": "sha512-1lM+BMLGuDfsdwf3rsgBSrxJwAZHFIrQ8YR61xIqdHo0uNKI9M52wNpHSrliZATJp51On6JD0AfRxd4YGSU0lw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -15270,6 +15288,18 @@ "dev": true, "optional": true }, + "node_modules/nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -15408,9 +15438,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "node_modules/nopt": { @@ -15484,12 +15514,6 @@ "node": ">=4" } }, - "node_modules/normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", - "dev": true - }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -15773,9 +15797,9 @@ } }, "node_modules/object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", "dev": true, "engines": { "node": ">= 6" @@ -16181,6 +16205,42 @@ "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", "dev": true }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -16413,9 +16473,9 @@ } }, "node_modules/postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "dependencies": { "chalk": "^2.4.2", @@ -16424,6 +16484,10 @@ }, "engines": { "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-calc": { @@ -17208,14 +17272,15 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" @@ -17618,18 +17683,45 @@ } }, "node_modules/purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", - "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-3.1.3.tgz", + "integrity": "sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ==", "dev": true, "dependencies": { - "commander": "^5.0.0", + "commander": "^6.0.0", "glob": "^7.0.0", - "postcss": "7.0.32", + "postcss": "^8.2.1", "postcss-selector-parser": "^6.0.2" }, "bin": { - "purgecss": "bin/purgecss" + "purgecss": "bin/purgecss.js" + } + }, + "node_modules/purgecss/node_modules/postcss": { + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", + "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/purgecss/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/q": { @@ -18012,9 +18104,9 @@ } }, "node_modules/reduce-css-calc": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", - "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", "dev": true, "dependencies": { "css-unit-converter": "^1.1.1", @@ -18445,12 +18537,16 @@ "dev": true }, "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "dependencies": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { @@ -19603,15 +19699,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/standard-version/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/standard-version/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -20225,30 +20312,6 @@ "node": ">=6" } }, - "node_modules/stylelint/node_modules/autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "dev": true, - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - } - }, - "node_modules/stylelint/node_modules/caniuse-lite": { - "version": "1.0.30001197", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz", - "integrity": "sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==", - "dev": true - }, "node_modules/stylelint/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -20438,61 +20501,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylelint/node_modules/postcss/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/stylelint/node_modules/postcss/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/stylelint/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -20591,15 +20599,6 @@ "node": ">=10" } }, - "node_modules/stylelint/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/stylelint/node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -20614,18 +20613,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/stylelint/node_modules/type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", @@ -21234,40 +21221,48 @@ } }, "node_modules/tailwindcss": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", - "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "name": "@tailwindcss/postcss7-compat", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss7-compat/-/postcss7-compat-2.1.0.tgz", + "integrity": "sha512-1Z6nPrkOp0Aa+NH5q6DYNizKf3qc6x735We0kpnIj1k5Cn+RkP69z+MpFLvz5lGGPRV/i+uS9uItoafnjIoZoQ==", "dev": true, "dependencies": { - "@fullhuman/postcss-purgecss": "^2.1.2", - "autoprefixer": "^9.4.5", - "browserslist": "^4.12.0", + "@fullhuman/postcss-purgecss": "^3.1.3", + "autoprefixer": "^9", "bytes": "^3.0.0", - "chalk": "^3.0.0 || ^4.0.0", - "color": "^3.1.2", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "color": "^3.1.3", "detective": "^5.2.0", - "fs-extra": "^8.0.0", + "didyoumean": "^1.2.1", + "dlv": "^1.1.3", + "fast-glob": "^3.2.5", + "fs-extra": "^9.1.0", "html-tags": "^3.1.0", - "lodash": "^4.17.20", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.0.0", "node-emoji": "^1.8.1", - "normalize.css": "^8.0.1", - "object-hash": "^2.0.3", - "postcss": "^7.0.11", - "postcss-functions": "^3.0.0", - "postcss-js": "^2.0.0", - "postcss-nested": "^4.1.1", - "postcss-selector-parser": "^6.0.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.1.1", + "parse-glob": "^3.0.4", + "postcss": "^7", + "postcss-functions": "^3", + "postcss-js": "^2", + "postcss-nested": "^4", + "postcss-selector-parser": "^6.0.4", "postcss-value-parser": "^4.1.0", "pretty-hrtime": "^1.0.3", - "reduce-css-calc": "^2.1.6", - "resolve": "^1.14.2" + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.13.0" } }, "node_modules/tailwindcss-line-clamp": { @@ -21293,6 +21288,135 @@ "lodash": "^4.17.15" } }, + "node_modules/tailwindcss/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tailwindcss/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/tailwindcss/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/tailwindcss/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/tailwindcss/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tailwindcss/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -24143,43 +24267,6 @@ "semver": "^6.3.0" }, "dependencies": { - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, - "caniuse-lite": { - "version": "1.0.30001194", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz", - "integrity": "sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.678", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.678.tgz", - "integrity": "sha512-E5ha1pE9+aWWrT2fUD5wdPBWUnYtKnEnloewbtVyrkAs79HvodOiNO4rMR94+hKbxgMFQG4fnPQACOc1cfMfBg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -27101,13 +27188,12 @@ } }, "@fullhuman/postcss-purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", - "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-3.1.3.tgz", + "integrity": "sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA==", "dev": true, "requires": { - "postcss": "7.0.32", - "purgecss": "^2.3.0" + "purgecss": "^3.1.3" } }, "@jsdevtools/rehype-url-inspector": { @@ -28992,6 +29078,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -29008,14 +29100,14 @@ } }, "autoprefixer": { - "version": "9.8.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", - "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001087", - "colorette": "^1.2.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.32", @@ -29487,15 +29579,16 @@ } }, "browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", - "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" } }, "buffer": { @@ -29834,9 +29927,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001094", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz", - "integrity": "sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA==", + "version": "1.0.30001207", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001207.tgz", + "integrity": "sha512-UPQZdmAsyp2qfCTiMU/zqGSWOYaY9F9LL61V8f+8MrubsaDGpaHD9HRV/EWZGULZn0Hxu48SKzI5DgFwTvHuYw==", "dev": true }, "caseless": { @@ -30328,13 +30421,13 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -30353,9 +30446,9 @@ "dev": true }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -30363,9 +30456,9 @@ } }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "combined-stream": { @@ -30384,9 +30477,9 @@ "dev": true }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "commondir": { @@ -31221,43 +31314,6 @@ "semver": "7.0.0" }, "dependencies": { - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, - "caniuse-lite": { - "version": "1.0.30001194", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz", - "integrity": "sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.678", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.678.tgz", - "integrity": "sha512-E5ha1pE9+aWWrT2fUD5wdPBWUnYtKnEnloewbtVyrkAs79HvodOiNO4rMR94+hKbxgMFQG4fnPQACOc1cfMfBg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -32116,6 +32172,12 @@ "minimist": "^1.1.1" } }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -32152,6 +32214,12 @@ } } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -32415,9 +32483,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.488", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", - "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "version": "1.3.708", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.708.tgz", + "integrity": "sha512-+A8ggYZ5riOLMcVAuzHx6bforaPzaiLnW1QOMD2SlMYQVi7QQTyQ/WrlZoebIH9ikmgr+tLJGpNITFFCUiQcPw==", "dev": true }, "elliptic": { @@ -32603,9 +32671,9 @@ "dev": true }, "escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-goat": { @@ -34422,6 +34490,42 @@ "path-is-absolute": "^1.0.0" } }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -35608,6 +35712,15 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -35671,6 +35784,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -36161,12 +36280,6 @@ "stringify-object": "^3.3.0" }, "dependencies": { - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -36336,6 +36449,12 @@ "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", "dev": true }, + "lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, "lodash.trimend": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", @@ -36586,6 +36705,11 @@ "integrity": "sha512-JVW6fCmZWjvMdDQSbOT3nnOQtd9iAXmw7hTSh26+v42BnvXeVyGMDBm5b/EZocMed2MbCAHiTX632vY0FyGB8A==", "dev": true }, + "markdown-it-image-lazy-loading": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-image-lazy-loading/-/markdown-it-image-lazy-loading-1.0.2.tgz", + "integrity": "sha512-FBGKcF+zDSE7HEN9rGar6+36RtO3ozakqNLpbl2uL91DZQEIkXxN8uUZXJGCjvQL4O5f9IxeP5lagxX3FZ2SgA==" + }, "markdown-it-img-lazy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/markdown-it-img-lazy/-/markdown-it-img-lazy-1.0.2.tgz", @@ -37189,6 +37313,12 @@ "minimist": "^1.2.5" } }, + "modern-normalize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.0.0.tgz", + "integrity": "sha512-1lM+BMLGuDfsdwf3rsgBSrxJwAZHFIrQ8YR61xIqdHo0uNKI9M52wNpHSrliZATJp51On6JD0AfRxd4YGSU0lw==", + "dev": true + }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -37238,6 +37368,12 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -37371,9 +37507,9 @@ } }, "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "nopt": { @@ -37434,12 +37570,6 @@ "sort-keys": "^2.0.0" } }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", - "dev": true - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -37661,9 +37791,9 @@ } }, "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", "dev": true }, "object-inspect": { @@ -38001,6 +38131,35 @@ "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", "dev": true }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -38184,9 +38343,9 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -38930,14 +39089,15 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -39244,15 +39404,34 @@ } }, "purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", - "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-3.1.3.tgz", + "integrity": "sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ==", "dev": true, "requires": { - "commander": "^5.0.0", + "commander": "^6.0.0", "glob": "^7.0.0", - "postcss": "7.0.32", + "postcss": "^8.2.1", "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "postcss": { + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", + "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" + } + }, + "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 + } } }, "q": { @@ -39572,9 +39751,9 @@ } }, "reduce-css-calc": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", - "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", "dev": true, "requires": { "css-unit-converter": "^1.1.1", @@ -39943,11 +40122,12 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -40953,12 +41133,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -41463,27 +41637,6 @@ "write-file-atomic": "^3.0.3" }, "dependencies": { - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001197", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz", - "integrity": "sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==", - "dev": true - }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -41628,53 +41781,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -41753,12 +41859,6 @@ "lru-cache": "^6.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -41770,15 +41870,6 @@ "strip-ansi": "^6.0.0" } }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", @@ -42303,33 +42394,133 @@ } }, "tailwindcss": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", - "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "version": "npm:@tailwindcss/postcss7-compat@2.1.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss7-compat/-/postcss7-compat-2.1.0.tgz", + "integrity": "sha512-1Z6nPrkOp0Aa+NH5q6DYNizKf3qc6x735We0kpnIj1k5Cn+RkP69z+MpFLvz5lGGPRV/i+uS9uItoafnjIoZoQ==", "dev": true, "requires": { - "@fullhuman/postcss-purgecss": "^2.1.2", - "autoprefixer": "^9.4.5", - "browserslist": "^4.12.0", + "@fullhuman/postcss-purgecss": "^3.1.3", + "autoprefixer": "^9", "bytes": "^3.0.0", - "chalk": "^3.0.0 || ^4.0.0", - "color": "^3.1.2", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "color": "^3.1.3", "detective": "^5.2.0", - "fs-extra": "^8.0.0", + "didyoumean": "^1.2.1", + "dlv": "^1.1.3", + "fast-glob": "^3.2.5", + "fs-extra": "^9.1.0", "html-tags": "^3.1.0", - "lodash": "^4.17.20", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.0.0", "node-emoji": "^1.8.1", - "normalize.css": "^8.0.1", - "object-hash": "^2.0.3", - "postcss": "^7.0.11", - "postcss-functions": "^3.0.0", - "postcss-js": "^2.0.0", - "postcss-nested": "^4.1.1", - "postcss-selector-parser": "^6.0.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.1.1", + "parse-glob": "^3.0.4", + "postcss": "^7", + "postcss-functions": "^3", + "postcss-js": "^2", + "postcss-nested": "^4", + "postcss-selector-parser": "^6.0.4", "postcss-value-parser": "^4.1.0", "pretty-hrtime": "^1.0.3", - "reduce-css-calc": "^2.1.6", - "resolve": "^1.14.2" + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "tailwindcss-line-clamp": { diff --git a/package.json b/package.json index 4e15d161..482dcb02 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@vuepress/plugin-blog": "^1.9.4", "@vuepress/plugin-html-redirect": "^0.1.2", "@vuepress/plugin-last-updated": "^1.8.2", + "autoprefixer": "^9.8.6", "eslint": "^7.21.0", "eslint-config-prettier": "^6.15.0", "eslint-config-standard": "^16.0.2", @@ -37,7 +38,7 @@ "markdown-it-task-lists": "^2.1.1", "markdown-it-video": "^0.6.3", "npm-run-all": "^4.1.5", - "postcss-nested": "^4.2.3", + "postcss": "^7.0.35", "prettier": "^2.2.1", "slug": "^4.0.3", "standard-version": "^9.1.1", @@ -47,7 +48,7 @@ "svg-sprite-loader": "^5.2.1", "svgo": "^1.3.2", "svgo-loader": "^2.2.2", - "tailwindcss": "^1.9.6", + "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0", "tailwindcss-line-clamp": "^1.0.5", "tailwindcss-touch": "^1.0.1", "vue": "^2.6.12", @@ -70,6 +71,8 @@ }, "dependencies": { "dayjs": "^1.10.4", + "markdown-it-image-lazy-loading": "^1.0.2", + "markdown-it-imsize": "^2.0.1", "tailwindcss-typography": "^3.1.0", "v-lazy-image": "^1.4.0", "v-scroll-lock": "^1.3.1", diff --git a/src/.vuepress/config.js b/src/.vuepress/config.js index 88dba8e2..251e1af8 100644 --- a/src/.vuepress/config.js +++ b/src/.vuepress/config.js @@ -91,6 +91,8 @@ module.exports = { md.use(require('markdown-it-footnote')) md.use(require('markdown-it-task-lists')) md.use(require('markdown-it-deflist')) + md.use(require('markdown-it-imsize')) + md.use(require('markdown-it-image-lazy-loading')) }, }, themeConfig: { @@ -151,7 +153,6 @@ module.exports = { ], [require('./plugins/pageData')], [require('./plugins/vuepress-plugin-trigger-scroll')], - ['vuepress-plugin-img-lazy'], [ '@vuepress/blog', { @@ -250,6 +251,15 @@ module.exports = { chainWebpack: (config, isServer) => { config.module.rules.delete('svg') + config.module + .rule('images') + .use('url-loader') + .loader('url-loader') + .tap((options) => { + options.limit = -1 + return options + }) + // prettier-ignore config.module .rule('svg') diff --git a/src/.vuepress/config/head.js b/src/.vuepress/config/head.js index 4bf24149..1faea127 100644 --- a/src/.vuepress/config/head.js +++ b/src/.vuepress/config/head.js @@ -25,6 +25,6 @@ module.exports = [ ], ['meta', { name: 'theme-color', content: '#16161F' }], ['meta', { name: 'msapplication-TileColor', content: '#156ff7' }], - ['meta', { name: 'apple-mobile-web-app-title', content: 'Protocol Labs' }], - ['meta', { name: 'application-name', content: 'Protocol Labs' }], + ['meta', { name: 'apple-mobile-web-app-title', content: 'IPFS Blog & News' }], + ['meta', { name: 'application-name', content: 'IPFS Blog & News' }], ].concat(favicons) diff --git a/src/.vuepress/public/ipfs-404.html b/src/.vuepress/public/ipfs-404.html index 5760c39e..f7c903fa 100644 --- a/src/.vuepress/public/ipfs-404.html +++ b/src/.vuepress/public/ipfs-404.html @@ -4,7 +4,10 @@ diff --git a/src/.vuepress/theme/components/base/LazyImage.vue b/src/.vuepress/theme/components/base/LazyImage.vue index 48e88986..ae70a6f1 100644 --- a/src/.vuepress/theme/components/base/LazyImage.vue +++ b/src/.vuepress/theme/components/base/LazyImage.vue @@ -5,8 +5,8 @@ :class="imgClass" :sizes="sizes" :srcset="srcsetString" - :src="withBase(src, ctx)" - :src-placeholder="withBase(srcPlaceholder, ctx)" + :src="requireAsset(src)" + :src-placeholder="requireAsset(srcPlaceholder)" loading="lazy" />

{{ caption }}

@@ -14,11 +14,11 @@

-During our IPFS Planning “Spike”, we took stock of our wider ecosystem and project health. We synthesized feedback from [top IPFS users](/top-ipfs-users.png), sourcing many ideas and needs from the ‘core needs & gaps’ section of each 2020 Theme Proposal. We also reflected on the biggest pain points and risks to the IPFS Project’s long term goals and mission to refocus on our north star. Looking at the skills and capacity of our core working groups, we created a set of [decision-making criteria](https://github.com/ipfs/roadmap#2020-h1-priority-selection-criteria) to identify where to allocate this subset of IPFS contributors for maximum impact, expanded on a set of top candidates (sourced both from the 2020 theme proposals and the exploration of wider project pain points), and ultimately made a decision. +During our IPFS Planning “Spike”, we took stock of our wider ecosystem and project health. We synthesized feedback from [top IPFS users](../assets/top-ipfs-users.png), sourcing many ideas and needs from the ‘core needs & gaps’ section of each 2020 Theme Proposal. We also reflected on the biggest pain points and risks to the IPFS Project’s long term goals and mission to refocus on our north star. Looking at the skills and capacity of our core working groups, we created a set of [decision-making criteria](https://github.com/ipfs/roadmap#2020-h1-priority-selection-criteria) to identify where to allocate this subset of IPFS contributors for maximum impact, expanded on a set of top candidates (sourced both from the 2020 theme proposals and the exploration of wider project pain points), and ultimately made a decision. ### 2020 Focus: Improving Content Routing @@ -84,7 +84,7 @@ During our IPFS Planning “Spike”, we took stock of our wider ecosystem and p To achieve this goal, we’ve formed a Content Routing team (and spun down our Package Managers working group) to focus our main engineering effort on this problem for the next 6 months. Improving content routing performance requires making improvements and bugfixes to the go-libp2p DHT _at scale_, and changing how we form, query, and resolve content in the IPFS network to be faster and more resilient. This involves a combination of research, design, implementation, and testing. Making changes to the _configuration of the entire network_ is non-trivial, which is why we’ve been investing in the [InterPlanetary Testground](https://github.com/ipfs/testground/), a new set of tools for testing next generation P2P applications, to help us diagnose issues and evaluate improvements prior to rolling out upgrades to the entire public network. You can follow along with the team's work in the [Content Routing ZenHub Roadmap](https://app.zenhub.com/workspaces/content-routing-2020-5e29be25ab9d8da0b032cfcc/roadmap): -[![2020-roadmap](/2020-roadmap.png)](https://app.zenhub.com/workspaces/content-routing-2020-5e29be25ab9d8da0b032cfcc/roadmap) +[![2020-roadmap](../assets/2020-roadmap.png)](https://app.zenhub.com/workspaces/content-routing-2020-5e29be25ab9d8da0b032cfcc/roadmap) We considered a number of other potential goals—especially all the great [2020 Theme Proposals](https://github.com/ipfs/roadmap/issues/)—before selecting this priority. However, we decided it was more important to focus core working group development time on the main blockers and pain points to enable the entire ecosystem to grow and succeed. Many of our theme proposals are actually very well suited for community ownership via [DevGrants](https://github.com/ipfs/devgrants) and collaborations. Some of them, like [“IPFS in Rust”](https://github.com/ipfs/roadmap/issues/54) and [“Examples and Tutorials”](https://github.com/ipfs/roadmap/issues/50), already have grants or bounties associated with them, and community teams actively pushing forward! 🙌 diff --git a/src/_blog/083-improved-bitswap-with-netflix.md b/src/_blog/083-improved-bitswap-with-netflix.md index d04c919c..b673af12 100644 --- a/src/_blog/083-improved-bitswap-with-netflix.md +++ b/src/_blog/083-improved-bitswap-with-netflix.md @@ -15,13 +15,13 @@ Web 2.0 services increasingly depend on large scale computing infrastructure to After [IPFS Camp 2019](https://camp.ipfs.io/), Netflix and IPFS began collaborating on ways to incorporate peer-to-peer services into Netflix's developer tooling. Together, we figured out a way to leverage IPFS to speed up cloud builds, designing and testing solutions for faster Continuous Integration (CI) pipelines powered by efficient p2p container image distribution. -[![](/netflix-containers-edgar-lee.png =700x)](https://youtu.be/wNfk05D887M) +[![](../assets/netflix-containers-edgar-lee.png =700x)](https://youtu.be/wNfk05D887M) As part of this collaboration, we made big improvements over the last two quarters to [Bitswap](https://github.com/ipfs/go-bitswap), the mechanism IPFS uses to transfer pieces of a file between two or more peers. A key factor enabling this improvement was [p2plab](https://github.com/Netflix/p2plab) - a performance benchmarking tool created by Netflix to run reproducible tests - allowing us to target and measure improvements. Our specific focus was a container distribution challenge Netflix wanted to address: how to efficiently pull container images in a large scale, multi-region environment. Image layers often reside in different regions. Leveraging IPFS as a peer-to-peer CDN lets nodes inside Netflix’s infrastructure collaborate and seed common pieces to neighboring nodes, helping make container distribution faster. To speed this up even more, we added some useful new capabilities to the Bitswap protocol which cut transfer time **in half** for benchmarked use cases around container distribution. In the previous version of Bitswap, it took on average 9.08 seconds to pull a 300 MiB image to 32 leeching peers. The optimized branch brought this down to 3.16 seconds -- 20% faster than DockerHub (3.93 seconds)! When the number of leeching peers exceed the seeders, we observed that pieces downloaded by leechers are reseeded, reducing the contention on the seeding peers. -![container_image_benchmark](/container-image-benchmark.png) +![container_image_benchmark](../assets/container-image-benchmark.png) ## How Bitswap works @@ -37,7 +37,7 @@ In order to improve Bitswap performance and efficiency, the IPFS team made some Initially a node wants to know which of its peers have the root block, but doesn’t actually want to receive the block itself (because it sends this “discovery” want to many peers). So one new change is that when Bitswap sends a want it can ask for a HAVE message in response (instead of getting back the whole block). -[![](/p2p-image-distribution.png =600x)](https://docs.google.com/presentation/d/1mbFFGIIKNvboHyLn-k26egOSWkt9nXjlNbxpmCEQfqQ/edit#slide=id.g41cabeb941_0_1376) +[![](../assets/p2p-image-distribution.png =600x)](https://docs.google.com/presentation/d/1mbFFGIIKNvboHyLn-k26egOSWkt9nXjlNbxpmCEQfqQ/edit#slide=id.g41cabeb941_0_1376) Once a node has added peers to the session, it can also use these HAVE messages to figure out which of the session peers have the rest of the blocks it needs relatively cheaply, because it doesn’t have to worry about duplicate blocks. At this stage the node also wants the peer to say if it doesn’t have the block. So we added a DONT_HAVE response. @@ -47,10 +47,10 @@ The node can also quickly recognize when all the peers in a session don’t have For more details on how Bitswap worked before ("master"), and the changes we’ve made ("poc"), check out [these slides](https://docs.google.com/presentation/d/1mbFFGIIKNvboHyLn-k26egOSWkt9nXjlNbxpmCEQfqQ), this [presentation at the IPFS Weekly Call](https://www.youtube.com/watch?v=G_Q7iTpwYQU), and [this recent performance comparison](https://github.com/ipfs/go-ipfs/issues/6782#issuecomment-579973116). -![5ms-1024MB](/5ms-1024MB.png =400x) -![5ms-160MB](/5ms-160MB.png =400x) -![5ms-40MB](/5ms-40MB.png =400x) -![5ms-20MB](/5ms-20MB.png =400x) +![5ms-1024MB](../assets/5ms-1024MB.png =400x) +![5ms-160MB](../assets/5ms-160MB.png =400x) +![5ms-40MB](../assets/5ms-40MB.png =400x) +![5ms-20MB](../assets/5ms-20MB.png =400x) ## Container distribution at Netflix @@ -60,7 +60,7 @@ The docker registry is designed to decouple the notion of what an image referenc ## p2plab -[![image](/p2plab.png)](https://github.com/Netflix/p2plab) +[![image](../assets/p2plab.png)](https://github.com/Netflix/p2plab) Netflix infrastructure is deployed on Amazon Web Services (AWS) across multiple availability zones and regions around the world. In order to emulate that kind of environment, [p2plab](https://github.com/Netflix/p2plab) was created to measure the throughput of data transfer on the IPFS network in multi-region clusters. Using p2plab, we can reliably determine whether a change in IPFS will improve performance. An operator is able to provision live clusters with cluster definitions and benchmark a data transfer scenario with scenario definitions. Nodes in a p2plab cluster can also hot swap the IPFS binary under test, allowing Protocol Labs and Netflix engineers to quickly test a branch of an IPFS component like bitswap. diff --git a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool.md b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool.md index f0337467..22203578 100644 --- a/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool.md +++ b/src/_blog/084-explore-the-anatomy-of-a-cid-on-protoschool.md @@ -13,8 +13,8 @@ tags: The [ProtoSchool](https://proto.school/#/) team is pleased to announce the launch of a shiny new multiple-choice tutorial on the **[Anatomy of a CID](https://proto.school/#/anatomy-of-a-cid)**, built by the fabulous [José Bateira](https://github.com/zebateira)! It’s our first multiple-choice content and the first to explore Multiformats. 🎉 -![Table of Contents](/084-explore-the-anatomy-of-a-cid-on-protoschool-table-of-contents.png) -![Sample Lesson](/084-explore-the-anatomy-of-a-cid-on-protoschool-sample-lesson.png) +![Table of Contents](../assets/084-explore-the-anatomy-of-a-cid-on-protoschool-table-of-contents.png) +![Sample Lesson](../assets/084-explore-the-anatomy-of-a-cid-on-protoschool-sample-lesson.png) Content identifiers (CIDs) and cryptographic hashing make content addressing possible, allowing us to securely locate and identify data on the decentralized web. The string representations of CIDs used by IPFS look like random characters strung together, but there’s a lot more going on under the hood. In this new tutorial we explore all of the data revealed by these self-describing content-addressed identifiers, digging deep into multihash, multicodec, multibase, and version prefixes. @@ -26,7 +26,7 @@ We also take a look at the evolution of the [CID specification](https://github.c Did you know you can paste any IPFS CID into the [**CID Inspector**](https://cid.ipfs.io/) for a human-friendly breakdown of its multihash format and length, multicodec, multibase, and version? It can even convert CIDv0 to CIDv1! The awesome [Oli Evans](https://github.com/olizilla) built this super-useful visualization tool that we explore in this new tutorial and which you can now access from our coding challenges. -![CID Inspector](/084-explore-the-anatomy-of-a-cid-on-protoschool-cid-inspector.png) +![CID Inspector](../assets/084-explore-the-anatomy-of-a-cid-on-protoschool-cid-inspector.png) ### IPFS Camp Course: Understanding How IPFS Deals with Files @@ -34,7 +34,7 @@ If you’d like to dig a little deeper into CIDs via video, we recommend checkin Watch the recording below or check out the [slides](https://github.com/ipfs/camp/blob/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_A/IPFS_Camp_Core_Course_A_Slides.pdf)! -[![Video: Understanding How IPFS Deals with Files](/core-a-thumbnail.png)](https://youtu.be/Z5zNPwMDYGg) +[![Video: Understanding How IPFS Deals with Files](../assets/core-a-thumbnail.png)](https://youtu.be/Z5zNPwMDYGg) _Video: [Understanding How IPFS Deals with Files](https://youtu.be/Z5zNPwMDYGg)_ @@ -44,7 +44,7 @@ _Video: [Understanding How IPFS Deals with Files](https://youtu.be/Z5zNPwMDYGg)_ The new [Anatomy of a CID](https://proto.school/#/anatomy-of-a-cid) tutorial is our first to include **multiple-choice quizzes** to keep you sharp on the concepts introduced in each lesson. 😉 -![Multiple-Choice Quiz](/084-explore-the-anatomy-of-a-cid-on-protoschool-quiz.png) +![Multiple-Choice Quiz](../assets/084-explore-the-anatomy-of-a-cid-on-protoschool-quiz.png) Kudos to [Teri Chadbourne](https://github.com/terichadbourne) and [Diogo Silva](https://github.com/fsdiogo), who laid the groundwork for our multiple choice lessons. @@ -56,11 +56,11 @@ We also offer a **text-based** tutorial on [Decentralized Data Structures](https We’re excited to create beginner-friendly content suitable for a variety of learners, regardless of their coding experience. To that end, we recently added **spiffy new icons** throughout the site to represent our coding challenges, multiple-choice quizzes, and text-only lessons, making it easy to identify lesson formats before you get started. -![Lesson Type Icons](/084-explore-the-anatomy-of-a-cid-on-protoschool-type-icons.png) +![Lesson Type Icons](../assets/084-explore-the-anatomy-of-a-cid-on-protoschool-type-icons.png) We also updated our [tutorial listings](https://proto.school/#/tutorials) with a **handy toggle to help you hide coding challenges** if you’d like to stick to text-based and multiple-choice content. 👏 -![Toggle Coding Challenges](/084-explore-the-anatomy-of-a-cid-on-protoschool-toggle-coding-challenges.png) +![Toggle Coding Challenges](../assets/084-explore-the-anatomy-of-a-cid-on-protoschool-toggle-coding-challenges.png) A shoutout to [Teri Chadbourne](https://github.com/terichadbourne) for taking the lead on these improvements, and to [Agata Krych](https://github.com/akrych) for the aforementioned spiffy new icons. diff --git a/src/_blog/085-announcing-rust-ipfs.md b/src/_blog/085-announcing-rust-ipfs.md index 0e43ae73..e20150da 100644 --- a/src/_blog/085-announcing-rust-ipfs.md +++ b/src/_blog/085-announcing-rust-ipfs.md @@ -43,7 +43,7 @@ Instead of forking and/or starting fresh, this project aims to support and build ## What can be expected, and when? -![Rust IPFS Timeline](/rust-ipfs-timeline.png) +![Rust IPFS Timeline](../assets/rust-ipfs-timeline.png) As you can see in the [Rust-IPFS DevGrant Roadmap](https://github.com/ipfs/devgrants/tree/master/open-grants/ipfs-rust) implementation work takes place mostly over early Q2 2020 and covers the use case of **IPLD applications**, diff --git a/src/_blog/086-ipfs-in-opera-for-android.md b/src/_blog/086-ipfs-in-opera-for-android.md index ad7a18f2..d4f85277 100644 --- a/src/_blog/086-ipfs-in-opera-for-android.md +++ b/src/_blog/086-ipfs-in-opera-for-android.md @@ -10,13 +10,13 @@ tags: - 'mobile' --- -![IPFS built-in to Opera for Android](/086-ipfs-in-opera-for-android-banner.png) +![IPFS built-in to Opera for Android](../assets/086-ipfs-in-opera-for-android-banner.png) As we hinted in our previous post about [IPFS in web browsers](https://blog.ipfs.io/2019-10-08-ipfs-browsers-update/), IPFS support in the Opera web browser has been in development for some time. Today, **Opera for Android 57** is live in the Google Play Store with default support for IPFS with a native handler for `ipfs://` addresses that redirects to the HTTP gateway of your choosing! [Install Opera Android with IPFS now](https://play.google.com/store/apps/details?id=com.opera.browser). -[![Screenshot of Opera for Android in the Google Play Store, linked to the URL of that page](/086-ipfs-in-opera-for-android-play-store.png)](https://play.google.com/store/apps/details?id=com.opera.browser) +[![Screenshot of Opera for Android in the Google Play Store, linked to the URL of that page](../assets/086-ipfs-in-opera-for-android-play-store.png)](https://play.google.com/store/apps/details?id=com.opera.browser) This release is a huge leap forward for the IPFS project, with a couple of important milestones: @@ -34,7 +34,7 @@ IPFS and other peer-to-peer protocols are a paradigmatic change to the network a IPFS support is enabled by default, so as a user you don’t need to do anything to turn it on. -![Screenshots of entering an ipfs:// address in Opera for Android, and loading it.](/086-ipfs-in-opera-for-android-protocol-demo.png) +![Screenshots of entering an ipfs:// address in Opera for Android, and loading it.](../assets/086-ipfs-in-opera-for-android-protocol-demo.png) You can load an IPFS content address such as: @@ -82,7 +82,7 @@ You can easily check compatibility and level of implementation using the [IPFS p Here’s what it looks like in a browser that doesn't support IPFS addresses. In Opera for Android, the image loads the same in both cases. -![Screenshot of a failed image test in the IPFS protocol handler smoketests.](/086-ipfs-in-opera-for-android-test-page.png) +![Screenshot of a failed image test in the IPFS protocol handler smoketests.](../assets/086-ipfs-in-opera-for-android-test-page.png) ## HTTP Gateways @@ -90,7 +90,7 @@ Opera for Android 57 adds IPFS support by navigating native IPFS addresses to an The default gateway in this release of Opera for Android is `dweb.link`, but you can also easily configure the gateway in the Crypto Wallet settings, as shown here: -![IPFS HTTP gateway configuration in the Crypto Wallet settings in Opera for Android](/086-ipfs-in-opera-for-android-settings.gif) +![IPFS HTTP gateway configuration in the Crypto Wallet settings in Opera for Android](../assets/086-ipfs-in-opera-for-android-settings.gif) The setting has several choices of gateway built in, and also allows you to set a _custom_ gateway. Perhaps you run your own gateway, are running an IPFS node on your device with a local gateway, or want to use one of the many [public gateways provided by the community](https://ipfs.github.io/public-gateway-checker/). diff --git a/src/_blog/087-ipfs-mobile-design-research.md b/src/_blog/087-ipfs-mobile-design-research.md index 9551d3a1..bbd80b72 100644 --- a/src/_blog/087-ipfs-mobile-design-research.md +++ b/src/_blog/087-ipfs-mobile-design-research.md @@ -13,7 +13,7 @@ The focus of development of IPFS to date has been primarily on desktop and serve This growth at the furthest edge of the network requires solutions at the edge. While the IPFS network continues to grow on mobile (for instance, IPFS now has default support on Opera for Android), more research is needed for the value of the network to be fully realized. IPFS should be directly available and accessible to end users in all their devices - and the design of IPFS integrations should make this clear and easy to use. To create that level of clarity, developers need good guidelines that align with user needs while unlocking all the power of the mobile dweb. -![Graph of global internet device sales showing devices explosively growing from 2005 to 2016.](/087-ipfs-mobile-design-research-device-sales-2005-2016.jpg) +![Graph of global internet device sales showing devices explosively growing from 2005 to 2016.](../assets/087-ipfs-mobile-design-research-device-sales-2005-2016.jpg) In emerging markets and for under-served audiences and marginalized or oppressed peoples the need for data sovereignty, offline-first applications and trustable computing is especially dire, so IPFS should function optimally on the devices used by them in order to serve their use-cases. diff --git a/src/_blog/089-ipfs-mobile-design-research-findings.md b/src/_blog/089-ipfs-mobile-design-research-findings.md index 067f76da..2305d1d9 100644 --- a/src/_blog/089-ipfs-mobile-design-research-findings.md +++ b/src/_blog/089-ipfs-mobile-design-research-findings.md @@ -20,13 +20,13 @@ A short summary of the findings is below. You can read the full findings and det We surveyed the two most used mobile browsers, Android’s Chrome and iOS’s Safari. Neither of these browsers has native P2P capabilities, but we surveyed them to understand mobile users’ first stop on the internet and how they may think about sharing to and from there. -![Google Android sharing photo interaction](/android-chrome-share.png) +![Google Android sharing photo interaction](../assets/android-chrome-share.png) Mobile sharing of files is a very common activity for all ranges of users, but the type of file shared varies from the desktop. We chose sharing photos as an interaction to study on both Android and iOS. This was to understand clearly how mobile users experience getting a file from their phone to another device. We then tested a variety of publicly released mobile P2P apps. This was to understand previous approaches to designing and developing mobile P2P applications. The applications explored in the survey were spread across three main areas of use: messaging, posting and community boards. From this we learned which features, interface components, and design patterns are currently used in designing for P2P on mobile, to inform future designs for IPFS. -![Status.im's key recovery process](/status-recover.png) +![Status.im's key recovery process](../assets/status-recover.png) After in-depth review, we found many intriguing approaches to several shared core areas: diff --git a/src/_blog/090-go-ipfs-0-5-0.md b/src/_blog/090-go-ipfs-0-5-0.md index 503f59cd..8e132516 100644 --- a/src/_blog/090-go-ipfs-0-5-0.md +++ b/src/_blog/090-go-ipfs-0-5-0.md @@ -9,7 +9,7 @@ tags: - 'go-ipfs' --- -![Announcing IPFS 0.5](/090-go-ipfs-0-5-0-header-image.png) +![Announcing IPFS 0.5](../assets/090-go-ipfs-0-5-0-header-image.png) _go-ipfs 0.5.0 is a major step forward on our journey toward a more efficient, secure, and resilient web to preserve and grow humanity’s knowledge._ @@ -40,7 +40,7 @@ Our performance work centered around **content routing**, the process of finding Here are a few of the improvements made in IPFS 0.5.0: -![Improvements to go-ipfs 0.5.0](/090-go-ipfs-0-5-0-Infographic.png) +![Improvements to go-ipfs 0.5.0](../assets/090-go-ipfs-0-5-0-Infographic.png) - **Faster content discovery:** IPFS 0.5.0 makes finding and sharing data in the network much faster, thanks to large improvements to our [DHT logic](https://docs.ipfs.io/concepts/dht/). More efficient routing and providing—already 2-3x faster—lowers bandwidth usage and background traffic. We’ve also updated our experimental QUIC transport to reduce connection latency and round-trips—with the aim to make this the default next release! - **Speedy files transfers:** We sped up our file transfer mechanism, [Bitswap](https://docs.ipfs.io/concepts/bitswap/), to make sharing data between many nodes much faster. [Read more](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/) about how we worked with Netflix to benchmark and stress-test these improvements! @@ -67,7 +67,7 @@ With our new testing and release process, IPFS 0.5.0 has already been put to use **_Matt Ober, Pinata:_** “IPFS 0.5 makes big improvements to Bitswap, which de-dupes data transfer between nodes. This means data providers like Pinata who are transferring a lot of data all around the world every day, can send each block only once and it gets to its destination. That cuts our bandwidth costs down significantly. And, it’s also faster.” -![Improved container image performance](/090-go-ipfs-0-5-0-container-image.png) +![Improved container image performance](../assets/090-go-ipfs-0-5-0-container-image.png) **_Michael Godsey, Infura:_** “Our collaboration with Protocol Labs and the latest go-ipfs v0.5 release are essential to our upcoming premium IPFS product release later this year. The upgraded subdomain gateway support greatly improves the security of our offering while helping us support some great new features. The improvements to the DHT and stability of peering allow us to provide an even more reliable product and continue to get IPFS into the hands of decentralized application developers.” @@ -92,13 +92,13 @@ There is no way IPFS 0.5.0 could have been our biggest update yet without the he Also, a huge thank you to [everyone who contributed](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#contributors) patches and improvements in this release, all **98** of you! We couldn’t have made this happen without your help and feedback. ❤ -[![IPFS Contributors](/090-go-ipfs-0-5-0-ipfs-contributors.png)](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#contributors) +[![IPFS Contributors](../assets/090-go-ipfs-0-5-0-ipfs-contributors.png)](https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#contributors) . ## Want to learn more...or even, better get involved? We’d like to know what you think and help answer any questions you may have. [Please join us for a virtual meetup](https://www.meetup.com/San-Francisco-IPFS/events/270212268/) on **Friday, May 1st**, to deep-dive on the improvements in this release and field questions and feedback. -[![IPFS 0.5 Launch Meetup](/090-go-ipfs-0-5-0-launch-Meetup.png)](https://www.meetup.com/San-Francisco-IPFS/events/270212268/) +[![IPFS 0.5 Launch Meetup](../assets/090-go-ipfs-0-5-0-launch-meetup.png)](https://www.meetup.com/San-Francisco-IPFS/events/270212268/) In the meantime, get started by [installing go-ipfs](https://dist.ipfs.io/#go-ipfs) or [upgrading to go-ipfs 0.5](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/update-procedure) to see the improvements yourself! diff --git a/src/_blog/091-dev-exp.md b/src/_blog/091-dev-exp.md index cc6eb203..4db5ab7e 100644 --- a/src/_blog/091-dev-exp.md +++ b/src/_blog/091-dev-exp.md @@ -28,7 +28,7 @@ After discussion with active IPFS contributors and research into other OSS commu - New contributors to repositories will now receive automated responses on their first submission, giving context on the process outlined above and reminders for needed information. This will help reduce the number of round trips for contributors and reviewers/maintainers. - A [major review of the documentation](https://docs.ipfs.io/) site is already underway to provide better developer documentation for our major implementations and products. [Watch this space!](https://github.com/ipfs/docs/milestones) -![IPFS Autoresponder and labels](/091-dev-exp-labels-autoresponder.png) +![IPFS Autoresponder and labels](../assets/091-dev-exp-labels-autoresponder.png) At the same time, there are some things that are NOT changing: @@ -39,4 +39,4 @@ We want to empower the developer community to build amazing things with IPFS, an We hope these measures help everyone build a happy and growing IPFS developer community! -![IPFS Contributors](/090-go-ipfs-0-5-0/ipfs-contributors.png) +![IPFS Contributors](../assets/090-go-ipfs-0-5-0-ipfs-contributors.png) diff --git a/src/_blog/092-launching-testground.md b/src/_blog/092-launching-testground.md index 86bbd7f3..9229a198 100644 --- a/src/_blog/092-launching-testground.md +++ b/src/_blog/092-launching-testground.md @@ -9,7 +9,7 @@ tags: - 'Testground' --- -![Launching Testground](/092-launching-testground-header-image.png) +![Launching Testground](../assets/092-launching-testground-header-image.png) Testing peer-to-peer (p2p) systems is hard. Doing so reliably and reproducibly is even harder. Today, **we’re releasing [Testground v0.5](https://github.com/testground/testground/releases/tag/v0.5.0) to the world**. This is a huge milestone for us, and for the wider p2p ecosystem. In this post, we’ll walk you through what Testground is, how to get started, what’s coming next, and the backstory behind Testground itself. @@ -44,7 +44,7 @@ To illustrate the above, consider a 200-instance test run. With Kubernetes, it c The cherry on the top of all this is the **observation pipeline (experimental)**. Test plans can record raw data points or aggregate metrics (histograms, [EWMA](https://en.wikipedia.org/wiki/EWMA_chart), counters, etc.) about the system under test, as well as emit arbitrary output assets. **The Testground platform will harvest them and make them available for one-stop collection.** -![Testground Architecture](/092-launching-testground-architecture.png) +![Testground Architecture](../assets/092-launching-testground-architecture.png)

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

@@ -75,7 +75,7 @@ At the tail end of that sprint, we will produce v0.7 of the Testground Core, whi
Needless to say, you’re welcome to pitch in at any point in time! Continue reading to learn how. -![Testground flowchart](/092-launching-testground-flowchart.png) +![Testground flowchart](../assets/092-launching-testground-flowchart.png) ## Getting involved diff --git a/src/_blog/093-ipfs-pinning-summit-recap.md b/src/_blog/093-ipfs-pinning-summit-recap.md index ee38c9e3..87206eb5 100644 --- a/src/_blog/093-ipfs-pinning-summit-recap.md +++ b/src/_blog/093-ipfs-pinning-summit-recap.md @@ -14,7 +14,7 @@ tags: - 'project planning' --- -![](/093-ipfs-pinning-summit-recap-header-image.png) +![](../assets/093-ipfs-pinning-summit-recap-header-image.png) The first-ever [IPFS Pinning Summit](https://ipfspinningsummit.com/) brought together [IPFS pinning services](https://docs.ipfs.io/guides/concepts/pinning/), infra providers, and users for 2 days of presentations & meetings to discuss the current state of IPFS infrastructure, services, and tools - and the future opportunities in this space. diff --git a/src/_blog/094-gossipsub-v1.1.md b/src/_blog/094-gossipsub-v1.1.md index c70a22b4..3b7fb1e7 100644 --- a/src/_blog/094-gossipsub-v1.1.md +++ b/src/_blog/094-gossipsub-v1.1.md @@ -11,7 +11,7 @@ tags: - 'Gossipsub' --- -![](/094-gossipsub-v1.1-header-image+grid.jpeg =780x) +![](../assets/094-gossipsub-v1.1-header-image+grid.jpeg =780x) The gossip you’ve heard on the streets is correct, Gossipsub v1.1 is here and it packs several security hardening extensions along with new testing, documentation, and an updated specification. @@ -47,7 +47,7 @@ Additionally, with the new release, the [reference implementation of Gossipsub]( We’ve prepared a brand new example for you to give the latest Gossipsub a try. In this example, you get to experiment with a chat application powered by libp2p. It will enable you to join different channels by subscribing to PubSub topics and see other peers joining the room as they subscribe to the topic. -![](/chat-example.gif =780x) +![](../assets/chat-example.gif =780x) You can find the code for this example at https://github.com/libp2p/go-libp2p-examples/tree/master/pubsub/chat @@ -55,7 +55,7 @@ You can find the code for this example at https://github.com/libp2p/go-libp2p-ex We are also releasing a brand new libp2p Test Plan that uses [Testground](https://github.com/testground/testground) to benchmark Gossipsub v1.1. -![](/gossipsubv1.1-jupyter.gif =780x) +![](../assets/gossipsubv1.1-jupyter.gif =780x) With this Test Plan, you can run an emulation (yes, it will run real Gossipsub nodes!) of a Gossipsub Network in which you can adjust: diff --git a/src/_blog/095-road-to-dht.md b/src/_blog/095-road-to-dht.md index cfb726ee..65750e29 100644 --- a/src/_blog/095-road-to-dht.md +++ b/src/_blog/095-road-to-dht.md @@ -11,7 +11,7 @@ tags: - 'Testground' --- -![](/095-road-to-dht-header-image.png =1000x) +![](../assets/095-road-to-dht-header-image.png =1000x) At the end of April, we released our largest update to go-ipfs to date: [IPFS 0.5.0](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/). This upgrade brings major performance and reliability improvements to IPFS — especially on the content discovery and routing front. These gains are brought to you largely by our rework of the Distributed Hash Table (DHT) which powers most peer and content discovery in the IPFS Public Network. @@ -20,7 +20,7 @@ We’d like to take you through our journey to _re-write_ the DHT - from identif **If you want to make use of these new improvements, please [upgrade IPFS now](https://docs.ipfs.io/recent-releases/go-ipfs-0-5/update-procedure/#use-ipfs-update)!**
-![](/095-road-to-dht-brendan-quote.png =1000x) +![](../assets/095-road-to-dht-brendan-quote.png =1000x) ## First a refresher: What’s the DHT? @@ -57,7 +57,7 @@ With this analysis and the feedback synthesized from our core users and communit This meant some hard calls on prioritization: focusing our working groups on a targeted set of improvements to the DHT and routing logic to ensure we resolved these underlying performance and reliability concerns. In turn, we adjusted our product roadmap and stood up new core working groups, including one focused strictly on content routing and another on a new test infrastructure: [Testground](https://docs.testground.ai/). -![](/092-launching-testground-hero-image.png =1000x) +![](../assets/092-launching-testground-header-image.png =1000x) ## Test, test, test diff --git a/src/_blog/097-js-ipfs-0.46.md b/src/_blog/097-js-ipfs-0.46.md index 7bca0914..5ee134c6 100644 --- a/src/_blog/097-js-ipfs-0.46.md +++ b/src/_blog/097-js-ipfs-0.46.md @@ -25,7 +25,7 @@ See [ipfs/js-ipfs-bitswap#204](https://github.com/ipfs/js-ipfs-bitswap/pull/204) The Bitswap module has had a bit of an overhaul and is now much faster at pulling blocks from other nodes across the network. Before, we waited a little while before sending our wantlist to newly connected peers—we’ve reduced that window and seen a massive speedup (smaller bars are better): -![Graphs showing Bitswap speedups](/097-js-ipfs-0.46-bitswap-speedup.png) +![Graphs showing Bitswap speedups](../assets/097-js-ipfs-0.46-bitswap-speedup.png) As you can see, the new js-IPFS is about 3x faster at pulling large files from other nodes on the network than the previous release, and that increases to about 5x as the files get smaller. diff --git a/src/_blog/098-libp2p-in-2020.md b/src/_blog/098-libp2p-in-2020.md index a71c844e..0494e216 100644 --- a/src/_blog/098-libp2p-in-2020.md +++ b/src/_blog/098-libp2p-in-2020.md @@ -20,7 +20,7 @@ The past year has seen amazing improvements to libp2p with the protocol quickly Probably the most significant news on that front is the official adoption of libp2p as the networking layer for the [Ethereum 2.0 Network Specification](https://github.com/ethereum/eth2.0-specs/pull/1328). Ethereum 2.0 is the next generation of Ethereum, with a large and thriving network of clients, dapps, and developers. A big focus for libp2p in 2019 was leveling up stability, scalability, and ease of use to meet the requirements of such a large scale blockchain. -![libp2p at DevConV](/098-devcon.png) +![libp2p at DevConV](../assets/098-devcon.png) libp2p now has 7 language implementations: @@ -84,13 +84,13 @@ Throughout the first half of the year, our top focus was supporting the needs of To support IPFS and all our other dapp users out there, we’ve improved libp2p’s content routing and connectivity to make finding and sharing content in distributed networks fast and reliable. This meant we needed to dive deep into major systems like the libp2p DHT, providing subsystem, NAT traversal, and more to optimize and refactor for performance. We’ve been collaborating closely with Protocol Labs’ IPFS and Testground teams to make this a reality. Read more about our progress in the [IPFS 0.5 launch](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/) post, and our path to get there in the [Road to the New DHT](https://blog.ipfs.io/2020-05-19-road-to-dht/) post! -![Content Routing Speed](/098-libp2p-in-2020-find-perf.png) +![Content Routing Speed](../assets/098-libp2p-in-2020-find-perf.png) ### Launching Testground to the world What is [Testground](https://blog.ipfs.io/2020-05-06-launching-testground/) you ask? Only the coolest new testing tool for large-scale p2p networks! When starting our network upgrade plans, it was clear that the scope and complexity of changes we’d need to make to core IPFS network functions would be impossible to optimize without powerful testing tools to simulate each change to network performance at scale. We couldn’t find a tool with the scale and configurability we needed, so we built the testing tool we needed, and made it modular and system agnostic just like libp2p so other p2p networks can take advantage of this new OSS infrastructure too! -![Launching Testground](/092-launching-testground-header-image.png) +![Launching Testground](../assets/092-launching-testground-header-image.png) ### Gossipsub security enhancements @@ -100,7 +100,7 @@ This work is of extreme importance as our adopters (e.g., Filecoin and Ethereum You can find the [specification](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) and [implementation](https://github.com/libp2p/go-libp2p-pubsub/) on GitHub. We will be releasing a report that fully describes how we identified the attack vectors, developed the motivations and went through implementing, testing, evaluating under multiple network conditions and got it audited. Stay tuned. -![Gossipsub v1.1](/094-gossipsub-v1.1-header-image+grid.jpeg) +![Gossipsub v1.1](../assets/094-gossipsub-v1.1-header-image+grid.jpeg) ### Going forward diff --git a/src/_blog/099-identity-ipfs-ion.md b/src/_blog/099-identity-ipfs-ion.md index ed1fabb7..d194966e 100644 --- a/src/_blog/099-identity-ipfs-ion.md +++ b/src/_blog/099-identity-ipfs-ion.md @@ -10,7 +10,7 @@ tags: - 'community' --- -![IPFS logo and ION logo](/099-identity-ipfs-ion-header.png) +![IPFS logo and ION logo](../assets/099-identity-ipfs-ion-header.png) Identity is a key part of how we all interact with each other on the internet every day—sometimes every moment of every day. And sometimes each raging moment as we do the “forgot your password?” dance yet again. Regardless, forging a path forward for user-controlled online identity is a table-stakes requirement for the dweb to succeed. @@ -22,13 +22,13 @@ However, today we’re celebrating the launch of a decentralized identity protoc Microsoft has been increasingly present in open-source tools and services in the past few years, and has now [launched a standards-based decentralized identity service called ION](https://techcommunity.microsoft.com/t5/identity-standards-blog/ion-booting-up-the-network/ba-p/1441552). -![ION logo](/099-identity-ipfs-ion-logo.png) +![ION logo](../assets/099-identity-ipfs-ion-logo.png) ION has been under development for over a year, and is an instance implementation of [Sidetree (a blockchain-agnostic distributed PKI protocol)](https://github.com/decentralized-identity/sidetree) that runs on the Bitcoin blockchain. And it stores transaction data on IPFS. -![ION architecture diagram](/099-identity-ipfs-ion-architecture.png) +![ION architecture diagram](../assets/099-identity-ipfs-ion-architecture.png) Like HTTP, IPFS does not have user identity built into the protocol. However, IPFS provides resiliency, validation, and future-proofing features that HTTP cannot: diff --git a/src/_blog/100-IPFS-mobile-design-guidelines.md b/src/_blog/100-IPFS-mobile-design-guidelines.md index 7355b434..5a776a8d 100644 --- a/src/_blog/100-IPFS-mobile-design-guidelines.md +++ b/src/_blog/100-IPFS-mobile-design-guidelines.md @@ -67,7 +67,7 @@ From the research, we developed an initial set of principles to address issues a We’ve also created a handy cheat sheet for the design principles which you can download below. -![Design principles cheat sheet](/100-IPFS-mobile-design-guidelines-cheat-sheet-preview.png) +![Design principles cheat sheet](../assets/100-IPFS-mobile-design-guidelines-cheat-sheet-preview.png) _Download full size in [PDF](/100-IPFS-mobile-design-guidelines-cheat-sheet.pdf) or [PNG](/100-IPFS-mobile-design-guidelines-cheat-sheet.png)_ @@ -81,7 +81,7 @@ With the design principles developed, we then created use case scenarios to illu - IPFS’s unique ability to transfer files without centralised servers can help offline users in particular. - A safe means for helping users connect with and contact one another. -![Illustrations of the Scenarios](/100-IPFS-mobile-design-guidelines-scenarios.png) +![Illustrations of the Scenarios](../assets/100-IPFS-mobile-design-guidelines-scenarios.png) _Illustrations of the Scenarios_ @@ -97,7 +97,7 @@ Read the full conclusion of [these findings](https://protocol-labs.gitbook.io/ip While we refined our understanding of IPFS and P2P mobile design with this project, we need more research to realise the full value of the network to users. This is especially true for emerging markets and under-served and marginalised users. Their need for data privacy, portability, and stability is as great, if not greater, than for those where the internet works most of the time. These users also serve as a way to understand not only under-explored markets, but also more resilient methods of computing that helps everyone. -![Illustrations of the design principles](/100-IPFS-mobile-design-guidelines-principles.png) +![Illustrations of the design principles](../assets/100-IPFS-mobile-design-guidelines-principles.png) _Illustrations of the design principles_ diff --git a/src/_blog/102-case-study-audius.md b/src/_blog/102-case-study-audius.md index 9cae0deb..01659e5b 100644 --- a/src/_blog/102-case-study-audius.md +++ b/src/_blog/102-case-study-audius.md @@ -11,7 +11,7 @@ tags: - 'streaming' --- -![IPFS Case Study Seriew - Audius](/102-case-study-audius-header-image.jpg) +![IPFS Case Study Seriew - Audius](../assets/102-case-study-audius-header-image.png) ## You asked, we delivered! diff --git a/src/_blog/102-gossipsub-reports.md b/src/_blog/102-gossipsub-reports.md index 8745707c..3d65738b 100644 --- a/src/_blog/102-gossipsub-reports.md +++ b/src/_blog/102-gossipsub-reports.md @@ -11,7 +11,7 @@ tags: - 'pubsub' --- -![Gossipsub logo](/Gossipsub_fullcolor.png =400x) +![Gossipsub logo](../assets/Gossipsub_fullcolor.png =400x) We are back with a direct follow up on the [Gossipsub v1.1 release from May](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1) with the much awaited Evaluation Report and three other presents we have for you. @@ -23,7 +23,7 @@ You can find all the [logo assets here](https://ipfs.io/ipfs/QmVSk8VvxWExnYCjqg7 ## 📊 Evaluation Report -[![](/report-eval.png =600x)](https://gateway.ipfs.io/ipfs/QmRAFP5DBnvNjdYSbWhEhVRJJDFCLpPyvew5GwCCB4VxM4) +[![](../assets/report-eval.png =600x)](https://gateway.ipfs.io/ipfs/QmRAFP5DBnvNjdYSbWhEhVRJJDFCLpPyvew5GwCCB4VxM4) We are sharing with you a comprehensive, 61-page evaluation report, in which you can learn how we approached the testing of Gossipsub v1.1, the setting in which tests were run, and detailed descriptions of the conclusions we were able to take from such evaluation. With this evaluation, we demonstrate that GossipSub is resilient against all of the attacks studied, capable of recovering the mesh and meeting the message delivery deadline requirements of the Filecoin and the ETH2.0 blockchains. @@ -43,7 +43,7 @@ These are all very challenging attacks, which we wanted to test GossipSub agains ## 🔏 Security Audit by Least Authority -![](/report-la.png =600x) +![](../assets/report-la.png =600x) Additionally, we are delighted to release Least Authority’s audit report for GossipSub. Least Authority has carried out an extensive audit on GossipSub v1.1 hardening extensions, both in theory and in implementation. @@ -53,7 +53,7 @@ Least Authority produced a report detailing all of the tests they have carried o ## 📜 Gossipsub Paper -[![](/paper.png =600x)](https://arxiv.org/abs/2007.02754) +[![](../assets/paper.png =600x)](https://arxiv.org/abs/2007.02754) Finally, we are proud to share with you a preprint of a 16-page paper that puts everything together, justifies our design choices, and outlines the most important results we have gathered throughout. With this paper we want to put everything in one place, from the spec, to the details of the test setup, and the insights we have gathered from the most challenging of attacks, in a concise manner. The paper benchmarks performance of GossipSub with Bitcoin’s broadcast/flooding protocol, ETH1.0’s pubsub protocol and the vanilla version of GossipSup (the one without mitigation strategies and the scoring function integrated). The performance improvements brought by GossipSub v1.1 are really impressive and certainly rewarding of the effort that has gone into the design and testing of the protocol. diff --git a/src/_blog/104-dht-deep-dive.md b/src/_blog/104-dht-deep-dive.md index 5983e100..b790c65e 100644 --- a/src/_blog/104-dht-deep-dive.md +++ b/src/_blog/104-dht-deep-dive.md @@ -12,7 +12,7 @@ tags: - 'Kademlia' --- -![](/104-dht-deep-dive-header-image.png =1000x) +![](../assets/104-dht-deep-dive-header-image.png =1000x) At the end of April, we released our largest update to go-ipfs to date: [IPFS 0.5](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/). While there have been many improvements, the changes to IPFS’s Distributed Hash Table (DHT) were especially critical to improving the performance and stability of finding data in IPFS. For some background on how we arrived at the most recent set of DHT changes, take a look at [The Road to the New DHT](https://blog.ipfs.io/2020-05-19-road-to-dht/), or try them out yourself in the [latest version of go-ipfs](https://dist.ipfs.io/#go-ipfs). @@ -118,9 +118,9 @@ While the lookup algorithm is what allows us to put and get records into the DHT - Get: Do a lookup for the `K` closest peers to `X=SHA256(H)`, but instead of just asking each peer in the lookup “who are the `K` closest peers to `X` you know about?” also ask “please send me the record corresponding to `X` if you have it”. - The peer adds all new providers it has learned about and continues until the lookup terminates. Depending on which API is used, the lookup can also be forced to abort after receiving a certain number of provider records. - IPNS Records (For an IPNS key where the multihash of the public key is `H`) - - Put: Do a standard lookup for the `K` closest peers to `SHA256(/ipns/H)` + - Put: Do a standard lookup for the `K` closest peers to `SHA256(../assets/ipns/H)` - Put the IPNS record at those `K` closest peers (and also store it ourselves) - - Get: Do a lookup for the `K` closest peers to `X=SHA256(/ipns/H)`, but instead of just asking each peer in the lookup “who are the `K` closest peers to `X` you know about?” also ask “please send me the record corresponding to `X` if you have it”. + - Get: Do a lookup for the `K` closest peers to `X=SHA256(../assets/ipns/H)`, but instead of just asking each peer in the lookup “who are the `K` closest peers to `X` you know about?” also ask “please send me the record corresponding to `X` if you have it”. - If a user receives a newer record (i.e., a record that has a higher IPNS sequence number), it updates its existing one and continues until the lookup terminates. This is needed in order to make sure that the user gets the latest record. Recall that IPNS records are mutable and therefore, we need to make sure that we point a request to the latest version of the content. - The default in go-ipfs will abort early after receiving 16 records, but it can be set to go until the query terminates - Once the lookup is done, if any of the `K` closest peers to `X` did not have the newest IPNS record, send them the newest record @@ -137,8 +137,8 @@ Throughout the development process we ran many Testground tests to get an unders As can be seen in the graphs, the most drastic changes are to 95th percentile lookup times and to the operations that spent more time doing their lookups and could not terminate as early. This meant IPFS Provide and IPNS Put, which require actually completing a search through the network, got a very large boost (for Provide 24x speedup on average and 33x speedup for the 95th percentile). This was followed by IPNS Get which needs to find many records, then Find Peer which is looking for one very specific record, and finally the time to find just one IPFS Provider record was sped up by 2.2x on average and 6.4x for the 95th percentile. -![](/104-dht-deep-dive-find-time-dht.png =1000x) -![](/104-dht-deep-dive-ipns-time-dht.png =1000x) +![](../assets/104-dht-deep-dive-find-time-dht.png =1000x) +![](../assets/104-dht-deep-dive-ipns-time-dht.png =1000x) ## Parting Thoughts diff --git a/src/_blog/108-js-ipfs-0.50.0.md b/src/_blog/108-js-ipfs-0.50.0.md index e368f932..dc919e5e 100644 --- a/src/_blog/108-js-ipfs-0.50.0.md +++ b/src/_blog/108-js-ipfs-0.50.0.md @@ -47,7 +47,7 @@ As you add and remove pins, this DAG grows and shrinks. [CID]s of intermediate n `js-ipfs@0.50.0` has changed the default storage of pins to use the datastore instead of a [DAG] and has seen a corresponding speedup as the number of pinned blocks in your repo increases: -![](/108-js-ipfs-0.50.0-pinning-performance.png =1000x) +![](../assets/108-js-ipfs-0.50.0-pinning-performance.png =1000x) In the diagram above you can see that as the number of pinned items increases, so does the time it takes to add the next pin. There's a steep increase at 8,192 pins, which is when the first bucket is considered full and multiple buckets are created which then involves more operations to add the next pin. diff --git a/src/_blog/explore-merkle-dags-at-protoschool.md b/src/_blog/explore-merkle-dags-at-protoschool.md index 3eb2a179..a3d6d5c3 100644 --- a/src/_blog/explore-merkle-dags-at-protoschool.md +++ b/src/_blog/explore-merkle-dags-at-protoschool.md @@ -16,7 +16,7 @@ The [ProtoSchool](https://proto.school) team is pleased to announce the launch o This new content is inspired by feedback on our Decentralized Data Structures tutorial, which originally explored both content addressing and data structures. Based on learner feedback, we’ve split the content in two! You’ll now find the majority of our original content in our rebranded tutorial, [Content Addressing on the Decentralized Web](https://proto.school/content-addressing), which highlights the key differences in how data is shared and retrieved on the centralized web and decentralized web. Meanwhile, our brand new tutorial, [Merkle DAGs: Structuring Data for the Distributed Web](https://proto.school/merkle-dags), is chock full of new content exploring the intricacies of the magical data structure that much of the decentralized web relies on. -![Merkle DAG diagram](/dag-deduplication.png) +![Merkle DAG diagram](../assets/dag-deduplication.png) In IPFS, as across the decentralized web, content addressing enables us to securely locate and identify data stored by peers. The Content Identifiers (CIDs) we often use to link to individual files, or pieces of data, can also be used to express complex webs of data in their entirety, when we structure that data as content-addressable Merkle DAGs. Merkle DAGs, structured using schemas provided by IPLD, are key to the interoperability of IPFS, libp2p, Filecoin, and other distributed protocols. In this new code-free ProtoSchool tutorial, we take a deep dive into the properties that make Merkle DAGs the backbone of the distributed web, and explore the many benefits that the data structure unlocks, from verifiability to distributability to deduplication. [Check it out!](https://proto.school/merkle-dags) @@ -50,7 +50,7 @@ Prefer your learning in video format? Check out these presentations on the super ProtoSchool is a team effort, and we depend on folks in the IPFS and dweb community to outline new content, add new features, fix bugs, catch typos, and test-drive new tutorials like this one. There are many ways to [contribute to the project](https://proto.school/contribute), no matter your background, and our new multiple-choice format makes it super easy to [create new tutorials](https://proto.school/build) without any coding experience. In fact, the awesome Mitch Wagner, who created our latest tutorial, built it with the help of our user-friendly ProtoWizard CLI! -![Screenshot of ProtoWizard CLI](/protowizard.png) +![Screenshot of ProtoWizard CLI](../assets/protowizard.png) One of the easiest ways to help is by sharing your feedback as you explore our tutorials. You’ll find a link at the bottom of every lesson to help you submit your suggestions. diff --git a/src/_blog/go-ipfs-0.8.0-and-remote-pinning-is-here.md b/src/_blog/go-ipfs-0.8.0-and-remote-pinning-is-here.md index 6af7d8a8..ce8f0486 100644 --- a/src/_blog/go-ipfs-0.8.0-and-remote-pinning-is-here.md +++ b/src/_blog/go-ipfs-0.8.0-and-remote-pinning-is-here.md @@ -30,7 +30,7 @@ This feature is a redesign of how we're thinking about pinning and includes some Command-line users benefit from `ipfs pin remote` commands, simplifying remote pinning operations. The built-in pinning service API client also executes all necessary remote calls under the hood: -![go-ipfs 0.8.0 + pinning service flow diagram](/blog-125-go-ipfs-0-8-0-diagram.png) +![go-ipfs 0.8.0 + pinning service flow diagram](../assets/blog-125-go-ipfs-0-8-0-diagram.png) As long as a pinning service supports the vendor-agnostic [IPFS Pinning Service API](https://ipfs.github.io/pinning-services-api-spec/), it can be used directly in go-ipfs. (If you're a Pinata user, you can already [check out their docs](https://pinata.cloud/documentation#PinningServicesAPI) for how to set everything up.) diff --git a/src/_blog/how-we-put-ipfs-in-brave.md b/src/_blog/how-we-put-ipfs-in-brave.md index ca220032..5645c327 100644 --- a/src/_blog/how-we-put-ipfs-in-brave.md +++ b/src/_blog/how-we-put-ipfs-in-brave.md @@ -19,19 +19,19 @@ You may have heard the news: as of [release 1.19.86](https://github.com/brave/br Both Brave and IPFS have a long history of successful partnerships with other projects and vendors. Brave now ships with built-in wallets for cryptocurrencies, private windows that leverage Tor, and a highly integrated VPN option. IPFS, meanwhile, has collaborated with such names as Microsoft (developing a [decentralized identity stack](https://blog.ipfs.io/2020-06-11-identity-ipfs-ion/)), Netflix (experimenting [fetching Docker images via IPFS](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/)), and NixOS (decentralizing [source code and build products](https://blog.ipfs.io/2020-09-08-nix-ipfs-milestone-1/)). -_![Early experiment showcasing IPFS URI resolution in Brave](/2021-01-21-ipfs-early.png) +_![Early experiment showcasing IPFS URI resolution in Brave](../assets/2021-01-21-ipfs-early.png) Early experiment showcasing IPFS URI resolution in Brave_ This integration between IPFS and Brave is itself the product of a long-running experimental collaboration that began in [2017](https://github.com/brave/browser-laptop/issues/9556#issuecomment-352453877), back in the days when the Brave UI was still powered by Muon (a fork of Electron). In fact, this initiative got as far as a [proof of concept implementation](https://github.com/brave/browser-laptop/issues/9556#issuecomment-369757871) that provided for the resolution of the IPFS URIs in Brave’s address bar! -_![An initial attempt at streaming IPFS files in Brave via IPFS Companion](/2021-01-21-ipfs-streaming.jpg) +_![An initial attempt at streaming IPFS files in Brave via IPFS Companion](../assets/2021-01-21-ipfs-streaming.jpg) An initial attempt at streaming IPFS files in Brave via IPFS Companion_ Shortly after this initial success, however, Brave switched to Chromium for its engine. While this was a set-back for IPFS integration in the short-term, this early work laid the foundation for recent efforts at combining the two projects. The switch also gave Brave full compatibility with Chromium browser extensions to Brave, allowing users to take full advantage of the [IPFS Companion extension](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch?hl=en) while we developed a native solution. Over the next two years, the teams behind Brave and IPFS would continue to come together to work toward full IPFS compatibility within the browser. [New plans](https://github.com/brave/brave-browser/issues/819#issuecomment-415792868) were made, and contributors from both teams and [the broader community](https://github.com/brave/brave-core-crx-packager/pull/21) began to chart the path toward this vision. In the interim, control over the browser source code allowed the teams to more tightly integrate the IPFS Companion extension into Brave: the Chrome sockets API (not normally exposed to Chrome Apps) made it possible to [embed a js-ipfs node with true TCP transport](https://github.com/brave/brave-browser/issues/819#issuecomment-456039555) within the extension, and Brave updated their settings menu to include a [one-click install](https://github.com/brave/brave-browser/issues/819#issuecomment-552444341) of the Companion. -![One-click install of the IPFS Companion in the Brave settings menu](/2021-01-21-ipfs-install.png) +![One-click install of the IPFS Companion in the Brave settings menu](../assets/2021-01-21-ipfs-install.png) _One-click install of the IPFS Companion in the Brave settings menu_ Eventually, a confluence of factors, including the [deprecation of the Chrome sockets API](https://9to5google.com/2020/01/15/google-killing-chrome-apps/), generated [a push](https://github.com/brave/brave-browser/issues/10220) to get a full IPFS node running, fully managed, within Brave. After six months of work, we have finally realized this long-term goal! diff --git a/src/_blog/ipfs-at-ethdenver-2021.md b/src/_blog/ipfs-at-ethdenver-2021.md index 2a38e34b..13b8abe7 100644 --- a/src/_blog/ipfs-at-ethdenver-2021.md +++ b/src/_blog/ipfs-at-ethdenver-2021.md @@ -16,7 +16,7 @@ header_image: '/2021-03-01-cardheader-ipfs-at-ethdenver.png' The annual premier hackathon event for the North American Ethereum community, ETHDenver and ColoradoJam, has come to a close. The 2021 event was 100% virtual, utilizing the gaming platform Gamerjibe as a virtual event venue, creating a unique and refreshing way for the dweb community to gather together. -![ETHDenver & ColoradoJam 2021 Bounty, Track & Quadratic Funding Winners](/2021-02-26-blog-ethdenver-winners.png) +![ETHDenver & ColoradoJam 2021 Bounty, Track & Quadratic Funding Winners](../assets/2021-02-26-blog-ethdenver-winners.png) ## Event highlights @@ -29,7 +29,7 @@ When it came to building with IPFS, we saw NFT marketplaces, decentralized and o See all of the [ETHDenver submissions here](https://ethdenver2021.devfolio.co/submissions) and read [about the winners](https://medium.com/ethdenver/ethdenver-coloradojam-2021-bounty-track-quadratic-funding-winners-805cf5f2de76), too! -![Folks from Slate and Textile chill in the bean bag area of the Shill Zone](/2021-02-26-blog-virtual-castle.jpeg) +![Folks from Slate and Textile chill in the bean bag area of the Shill Zone](../assets/2021-02-26-blog-virtual-castle.jpeg) ## The Virtual Castle @@ -37,7 +37,7 @@ Alongside the event Discord, the livestream, and the hacks, ETHDenver also creat In lieu of a sponsor booth, the IPFS Help Desk returned! Folks from IPFS, Slate, Fleek, Pinata, Opera, and Foundation all took turns hosting as their digital avatars, even occasionally running into a rainbow Pegabufficorn. -![The IPFS Help Desk at ETHDenver 2021](/2021-02-26-blog-help-desk.png) +![The IPFS Help Desk at ETHDenver 2021](../assets/2021-02-26-blog-help-desk.png) ## On the main stage diff --git a/src/_blog/ipfs-in-2021-call-for-proposals.md b/src/_blog/ipfs-in-2021-call-for-proposals.md index 2bdcf949..5439c381 100644 --- a/src/_blog/ipfs-in-2021-call-for-proposals.md +++ b/src/_blog/ipfs-in-2021-call-for-proposals.md @@ -27,7 +27,7 @@ We want to hear from you in the form of public Github issues. Issues should cont Aside from new theme proposals, we’d also very much appreciate comments on theme proposals, especially if there are additional important workstreams you’d like to see as part of that theme. Existing proposals for themes can be found [here](https://github.com/ipfs/roadmap/issues?q=is%3Aissue+is%3Aopen+label%3A%222021+Theme+Proposal%22). -[![Proposals Screenshot](/screenshot.png)](https://github.com/ipfs/roadmap/issues?q=is%3Aissue+is%3Aopen+label%3A%222021+Theme+Proposal%22) +[![Proposals Screenshot](../assets/screenshot.png)](https://github.com/ipfs/roadmap/issues?q=is%3Aissue+is%3Aopen+label%3A%222021+Theme+Proposal%22) To suggest a theme proposal, please create a [new 2021 Proposal issue](https://github.com/ipfs/roadmap/issues/new/choose) in this repo. The hope with using github issues is to allow for clarifying conversation in comments, help others build on your great ideas, and also be inspired to propose their own thoughts. You are welcome to submit more than one proposal! diff --git a/src/_blog/ipfs-in-brave-native-access-to-the-distributed-web.md b/src/_blog/ipfs-in-brave-native-access-to-the-distributed-web.md index 1b15d847..b2f3c095 100644 --- a/src/_blog/ipfs-in-brave-native-access-to-the-distributed-web.md +++ b/src/_blog/ipfs-in-brave-native-access-to-the-distributed-web.md @@ -24,7 +24,7 @@ While the IPFS protocol is still in development, making it more easily available Brave has integrated IPFS into its desktop web browser for Windows, macOS, and Linux. When Brave detects an address which is an HTTP gateway URL to IPFS content, or a native IPFS address such as ipfs:// or ipns:// it will prompt the user to install and enable the native IPFS node, or to use an HTTP gateway. The default gateway used is dweb.link, which is run by Protocol Labs. Users can also specify a gateway of their choice in the browser settings. You can access the IPFS administrative UI at brave://ipfs,, or enable IPFS Companion and select “My Node” button in the main menu. -![Screencast gif showing how an IPFS address triggers the infobar in Brave for enabling a full IPFS node.](/2021-01-19-brave-enable-ipfs.gif) +![Screencast gif showing how an IPFS address triggers the infobar in Brave for enabling a full IPFS node.](../assets/2021-01-19-brave-enable-ipfs.gif) ## Why Web Browsers? diff --git a/src/_blog/ipfs-in-opera-touch-on-ios.md b/src/_blog/ipfs-in-opera-touch-on-ios.md index ed1f8d55..72338e0d 100644 --- a/src/_blog/ipfs-in-opera-touch-on-ios.md +++ b/src/_blog/ipfs-in-opera-touch-on-ios.md @@ -17,7 +17,7 @@ In 2020 we announced a big moment for IPFS: The first official support of IPFS p First, Opera has now added support for IPFS addressing to Opera Touch, their iOS browser. -![A screenshot of Wikipedia on IPFS in Opera Touch](/opera-ios-wikipedia-short.png 'Wikipedia on IPFS in Opera Touch') +![A screenshot of Wikipedia on IPFS in Opera Touch](../assets/opera-ios-wikipedia-short.png 'Wikipedia on IPFS in Opera Touch') Second, support for IPFS addressing in Opera desktop browser for Windows, macOS and Linux will be coming in their next release, currently planned for March 2021. @@ -27,7 +27,7 @@ With these releases, Opera will not support ipfs:// and ipns:// addressing acros First, install Opera Touch on your iOS device. If you’re reading this on an iOS device, [click to install now](https://apps.apple.com/us/app/opera-touch-web-browser/id1411869974) -![](/opera-ios-app-store-short.png) +![](../assets/opera-ios-app-store-short.png) ## How Does it Work? diff --git a/src/_blog/join-us-at-ethdenver-2021-year-of-the-spork-marmot.md b/src/_blog/join-us-at-ethdenver-2021-year-of-the-spork-marmot.md index 697a558d..b06b3f49 100644 --- a/src/_blog/join-us-at-ethdenver-2021-year-of-the-spork-marmot.md +++ b/src/_blog/join-us-at-ethdenver-2021-year-of-the-spork-marmot.md @@ -14,13 +14,13 @@ tags: author: Jenn Turner --- -![Join us at ETHDenver, where Flying Bufficorns and Spork Marmots reign free](/2021-02-02-ipfs-at-ethdenver-flyingspork.png) +![Join us at ETHDenver, where Flying Bufficorns and Spork Marmots reign free](../assets/2021-02-02-ipfs-at-ethdenver-flyingspork.png) It’s hard to explain what [ETHDenver](https://www.ethdenver.com/) is, exactly. Is it a conference? Yes. Is it a hackathon? Is it a week of technical workshops directed by industry leaders? Yes. Is it an art exhibition? Also, yes. Is it a live dj set? Again, yes. But even those labels don’t do justice to the magic that happens when all of those things combine and settle on the Denver tech scene. That is why we’re so excited to be part of this year’s ETHDenver, which is 100% virtual so everyone around the globe can experience the magic for themselves! In this, the year of the Spork Marmot, attendees worldwide will be able to participate in one of North America’s largest Ethereum gatherings: an innovation festival and #BUIDLathon, including a virtual replication of the famed Sports Castle, with a built-in game experience for IRL swag, and more. -![A wild Bufficorn appears at the IPFS Help Desk in 2020](/2021-02-02-ipfs-at-ethdenver-helpdesk2020.jpg) +![A wild Bufficorn appears at the IPFS Help Desk in 2020](../assets/2021-02-02-ipfs-at-ethdenver-helpdesk2020.jpg) In years past, the IPFS community has had a large presence at ETHDenver, partially due to the incredibly welcoming and encouraging decentralization community built locally in Denver. [Last year](https://blog.ipfs.io/2020-02-07-ethdenver-2020/), we were truly blown away by how much we saw the ETHDenver community embrace IPFS. After all was said and done: @@ -31,7 +31,7 @@ In years past, the IPFS community has had a large presence at ETHDenver, partial Not only that, last year [Cryptorado](https://cryptorado.org/#/) organized the [Decentralized Network Summit](https://dnsummit.cryptorado.org/), inviting the IPFS community to a day full of speakers and workshops from the folks at 3Box, NEAR, Unstoppable Domains, Pinata, Tupelo, Textile, Kauri, The Graph and more, drawing 100+ attendees. It was a wonderful day full of meeting and making new friends, enjoying the company of old ones, and most importantly, intriguing conversations. -![](/2021-02-02-ipfs-at-ethdenver-ethdenver2019-1.jpeg) +![](../assets/2021-02-02-ipfs-at-ethdenver-ethdenver2019-1.jpeg) So in that spirit of ETHDenvers past, the IPFS Help Desk, spearheaded by [Pinata back in 2019](https://twitter.com/IPFSPinata/status/1096806565116399616), will be back this year, helmed by your favorite IPFS community folks, so be sure to come visit us in the **Spork Shill Zone**, right next to the 🥰 Textile booth 🥰, every day that the Virtual Castle is open and ask all of your questions, from hacking to hoping, and everything in between. @@ -47,4 +47,4 @@ We are so excited to be a part of this amazing experience once again, and stay t Join us! [Register to attend ETHDenver 2021](https://www.ethdenver.com/). -![Join us at the Virtual Sports Castle for the year of the Spork Marmot](/2021-02-02-ipfs-at-ethdenver-sportscastle.png) +![Join us at the Virtual Sports Castle for the year of the Spork Marmot](../assets/2021-02-02-ipfs-at-ethdenver-sportscastle.png) diff --git a/src/_blog/js-ipfs-0.51.0-adds-type-definitions-and-removes-secio.md b/src/_blog/js-ipfs-0.51.0-adds-type-definitions-and-removes-secio.md index ac1377d3..129aa4f7 100644 --- a/src/_blog/js-ipfs-0.51.0-adds-type-definitions-and-removes-secio.md +++ b/src/_blog/js-ipfs-0.51.0-adds-type-definitions-and-removes-secio.md @@ -27,7 +27,7 @@ With `js-IPFS@0.51.0` types are now a first-class citizen within the codebase. T Going forward all new code will be required to have types so to help contributors with that [aegir](https://github.com/ipfs/aegir) recently added stricter linting for JSDoc comments and we also [added a typecheck github action](https://github.com/ipfs/js-ipfs/pull/3327) to `js-IPFS` so any errors or missing types should be easy to spot in a PR. -![](/types.png =600x) +![](../assets/types.png =600x) ## SECIO Removal diff --git a/src/_blog/libp2p-comes-to-protoschool.md b/src/_blog/libp2p-comes-to-protoschool.md index 9ef27d77..aba4294d 100644 --- a/src/_blog/libp2p-comes-to-protoschool.md +++ b/src/_blog/libp2p-comes-to-protoschool.md @@ -16,11 +16,11 @@ author: Teri Chadbourne The [ProtoSchool](https://proto.school) team is pleased to announce the launch of a shiny new multiple-choice tutorial [introducing libp2p](https://proto.school/introduction-to-libp2p), the modular peer-to-peer networking stack that spun out of IPFS into its own first-class project and a dependency of IPFS itself. Today, IPFS focuses on _content addressing_ (i.e., finding, fetching and authenticating any piece of content in the web) while libp2p focuses on _process addressing_ (i.e., finding, connecting and authenticating any data transfer processes in the network). -![libp2p animation representing libp2p being extracted out of ipfs](/2021-02-17-libp2p-ipfs-animation.gif) +![libp2p animation representing libp2p being extracted out of ipfs](../assets/2021-02-17-libp2p-ipfs-animation.gif) Historically, companies that produced peer-to-peer applications like Skype or BitTorrent created their own protocols to support them. Those protocols made a lot of assumptions about the environments they’d run in and the needs they’d meet, making them incredibly hard to upgrade or adapt to new environments. libp2p, however, has been extracted from its original implementation as the networking stack of IPFS, and can now serve a broad variety of use cases. While everyone building on IPFS or Filecoin is using libp2p as a dependency, many folks are using libp2p independently or embedded in other projects such as Ethereum 2.0, Polkadot, and Status.im. -![libp2p animation representing libp2p modularity. Each block of the libp2p logo represents a component of the libp2p network stack.](/2021-02-17-libp2p-logo-animation.gif) +![libp2p animation representing libp2p modularity. Each block of the libp2p logo represents a component of the libp2p network stack.](../assets/2021-02-17-libp2p-logo-animation.gif) libp2p takes a modular approach to addressing the many components that can make up a network stack, from transports to multiplexing and beyond. A user can choose the specific pieces they need and compose their own configuration, tailored for their use cases. All of those pieces have very well defined interfaces that enable interoperability and easy upgrades, creating a future-proof networking stack. This ecosystem of interoperable modules is key to libp2p’s versatility across multiple environments. @@ -34,7 +34,7 @@ We’re excited to bring more libp2p content to ProtoSchool in the near future! ProtoSchool is a team effort, and we depend on folks in the IPFS and dweb community to outline new content, add new features, fix bugs, catch typos, and test-drive new tutorials like this one. There are many ways to [contribute to the project](https://proto.school/contribute), no matter your background, and our new multiple-choice format makes it super easy to [create new tutorials](https://proto.school/build) without any coding experience. In fact, the awesome José Bateira, who created our latest tutorial, built it with the help of our user-friendly ProtoWizard CLI! -![Screenshot of ProtoWizard CLI](/2021-02-17-protowizard.png) +![Screenshot of ProtoWizard CLI](../assets/2021-02-17-protowizard.png) One of the easiest ways to help is by sharing your feedback as you explore our tutorials. You’ll find a link at the bottom of every lesson to help you submit your suggestions. diff --git a/src/_blog/meet-the-community--Alan-Shaw-IPFS.md b/src/_blog/meet-the-community--Alan-Shaw-IPFS.md index 778cfb2b..e1a6f8da 100644 --- a/src/_blog/meet-the-community--Alan-Shaw-IPFS.md +++ b/src/_blog/meet-the-community--Alan-Shaw-IPFS.md @@ -17,7 +17,7 @@ tags: ## Meet the Community: Alan Shaw, Core Developer of the IPFS Protocol @ IPFS / Protocol Labs -![](/alan-shaw.jpg) +![](../assets/alan-shaw.jpg) ### Tell us a bit about yourself and your background. How did you get involved with IPFS and end up joining the team at Protocol Labs? diff --git a/src/_blog/meet-the-community--Carson-Farmer-Textile.md b/src/_blog/meet-the-community--Carson-Farmer-Textile.md index 6b409277..be682484 100644 --- a/src/_blog/meet-the-community--Carson-Farmer-Textile.md +++ b/src/_blog/meet-the-community--Carson-Farmer-Textile.md @@ -17,7 +17,7 @@ tags: ## Meet the Community: Carson Farmet, Core Developer @ Textile.io -![](/carson-farmer.jpg) +![](../assets/carson-farmer.jpg) ### Tell us a bit about yourself and your background. How did you get involved with IPFS and what’s your relationship with Protocol Labs? diff --git a/src/_blog/meet-the-community--Edgar-Lee-Netflix.md b/src/_blog/meet-the-community--Edgar-Lee-Netflix.md index a56a0713..76dc40d3 100644 --- a/src/_blog/meet-the-community--Edgar-Lee-Netflix.md +++ b/src/_blog/meet-the-community--Edgar-Lee-Netflix.md @@ -17,7 +17,7 @@ tags: # Meet the Community: Edgar Lee, Software Developer @ Netflix -![](/edgar-lee.jpg) +![](../assets/edgar-lee.jpg) ### Tell us a bit about yourself and your background. How did you get involved with IPFS? diff --git a/src/_blog/own-your-identity-with-ion.md b/src/_blog/own-your-identity-with-ion.md index 1a1e2bbd..7f30b00c 100644 --- a/src/_blog/own-your-identity-with-ion.md +++ b/src/_blog/own-your-identity-with-ion.md @@ -1,16 +1,17 @@ --- tags: -- identity + - identity title: Own Your Identity with ION -description: The new decentralized identity network launches with all transaction +description: + The new decentralized identity network launches with all transaction data distributed with IPFS. author: Dietrich Ayala date: 2021-03-24 -permalink: "/2021-03-24-own-your-identity-with-ion/" +permalink: '/2021-03-24-own-your-identity-with-ion/' translationKey: '' -header_image: "/2021-03-26-cardheader-127-ion-header.png" - +header_image: '/2021-03-26-cardheader-127-ion-header.png' --- + **We are many people!** Whether on Twitter, Zoom or paying the electricity bill, we assume identities to interact with others online. How much of that identity is you? How much of “you” is decided by those services? Why can’t the bag of bits that is “you” stick around while hopping from online service to online service? Well now it can! Decentralized identity services have matured to a point where usage is simple, they’re backed by public networks firmly rooted into the global business firmament, and now we’re seeing those businesses deploy them in earnest. @@ -25,7 +26,7 @@ We’ve been working with them to support their use of IPFS since 2019. IPFS com Additionally, ION has a network explorer at [identity.foundation/ion/explorer/](https://identity.foundation/ion/explorer/). -![ION network explorer](/ion-explorer.png) +![ION network explorer](../assets/ion-explorer.png) ## Using and Contributing to ION @@ -33,4 +34,4 @@ Today Microsoft launched v1.0 of ION, and in [the launch post](https://techcommu As ION is a public network, running a node of your own will contribute to the overall health, resilience and performance of the system. Instructions for building and installing a node are detailed in the [ION Github repository](https://github.com/decentralized-identity/ion). -Try ION today for an identity solution which gives your users more control and let us know how it goes! Share your feedback in the ION repo or let [@IPFS](https://twitter.com/ipfs) know on Twitter. \ No newline at end of file +Try ION today for an identity solution which gives your users more control and let us know how it goes! Share your feedback in the ION repo or let [@IPFS](https://twitter.com/ipfs) know on Twitter. diff --git a/src/_blog/weekly-006.md b/src/_blog/weekly-006.md index 7269f052..765b4e72 100644 --- a/src/_blog/weekly-006.md +++ b/src/_blog/weekly-006.md @@ -19,7 +19,7 @@ Here are some of the highlights for the [first week of March](https://github.com #### [**station**](https://github.com/ipfs/station) -![Station](/station.png) +![Station](../assets/station.png) The new version of [station](https://github.com/ipfs/station) is ready for developer preview! `station` is one of the easiest ways to get an IPFS daemon running on your machine. It acts as a service and you get many convenient features, such as the ability to turn an IPFS node on through a GUI and drag and drop to share through IPFS. To try it out, you need Node.js 4 ([installation instructions here](https://nodejs.org/en/)) and npm 3 (which comes with Node) installed. Then, do the following: @@ -98,7 +98,7 @@ central server for message exchange between peers. #### [**fc00**](https://github.com/fc00/spec) -![lgierth in Paris](/lgierth-in-paris.jpeg) +![lgierth in Paris](../assets/lgierth-in-paris.jpeg) [@lgierth](https://github.com/lgierth) spent a productive week in Paris, and chatted with [@cjdelisle](https://github.com/cjdelisle) and [@ansuz](https://github.com/ansuz) at [@xwiki](https://twitter.com/xwiki) about the state and future of cjdns/fc00, layed out ideas for routing improvements, and drafted spec documents for the switch and cryptoauth layers. You can find those specs [here](https://github.com/fc00/spec/pulls) (they'll be updated soon). Work will continue on these for the rest of March. The switch and routing layers of fc00 might be the foundation of a smarter swarm for IPFS/libp2p, so this is all very exciting. @@ -118,7 +118,7 @@ central server for message exchange between peers. #### [IPFS Dead drop](https://github.com/c-base/ipfs-deaddrop) -![cbase deadrop](/ipfs-dead-drop.ppeg 'Photo taken and cropped from https://www.flickr.com/photos/bergie/24769765569/in/datetaken-public/') +![cbase deadrop](../assets/ipfs-dead-drop.jpeg 'Photo taken and cropped from https://www.flickr.com/photos/bergie/24769765569/in/datetaken-public/') Some members of [c-base](http://www.c-base.org/) have written a dead drop-like system that automatically uploads files from a USB memory stick to IPFS. When you plug a USB memory into the device, it will automatically access the memory stick and publish all the files on the web. Thanks to IPFS the files are instantly available to the whole world. Check out [deaddrops.com](https://deaddrops.com/) for more information about dead drops. diff --git a/src/_blog/weekly-010.md b/src/_blog/weekly-010.md index 1c4c487b..927759bf 100644 --- a/src/_blog/weekly-010.md +++ b/src/_blog/weekly-010.md @@ -1,15 +1,15 @@ --- date: 2016-05-08 -permalink: "/16-ipfs-weekly-10/" +permalink: '/16-ipfs-weekly-10/' title: IPFS Weekly 10 -description: +description: author: Richard Littauer tags: -- weekly -- AEgir -header_image: "/header-image-weekly-newsletter.png" - + - weekly + - AEgir +header_image: '/header-image-weekly-newsletter.png' --- + [IPFS](https://ipfs.io/) is a new hypermedia distribution protocol, addressed by content and identities, aiming to make the web faster, safer, and more open. In these posts, we highlight some of the development that has happened in the past week. For anyone looking to get involved, follow the embedded hyperlinks, search the wealth of information on [GitHub](https://github.com/ipfs) or join us on [IRC](https://webchat.freenode.net/?channels=ipfs) (#ipfs on the Freenode network). If you would like to get this update as an email, sign up for our [weekly newsletter](http://eepurl.com/gL2Pi5)! @@ -28,7 +28,7 @@ See the [blog](http://blog.ipfs.io/14-ipfs-0-4-0-released/) for more details. [@haadcode](https://github.com/haadcode) upgraded all of his projects to use 0.4.0, got [orbit-db](https://github.com/haadcode/orbit-db) and [ipfs-log](https://github.com/haadcode/ipfs-log) working in the browser, and improved Orbit's UX. As a result, Orbit is much faster and more stable than it was under 0.3! We now have working distributables for [orbit-db](https://github.com/haadcode/orbit-db) and [ipfs-log](https://github.com/haadcode/ipfs-log) in the browser. They still require a local daemon to run to work but this will change when js-ipfs ships. [@haadcode](https://github.com/haadcode) added some new features to Orbit: preview files directly in the chat with code highlighting, players for audio and video, and improved the files browsing functionality in general. You can now also copy the hash of a file to clipboard. It looks like this: -![Orbit](/weekly-010-orbit.png) +![Orbit](../assets/weekly-010-orbit.png) Finally, [@haadcode](https://github.com/haadcode) also created a simple JavaScript logging module called [logplease](https://github.com/haadcode/logplease), which works in Node.js and browsers. logplease does two simple things: output log messages to the console and/or to a file (Node.js only) and display the log messages with nice colors. It was inspired by [log4js](https://github.com/stritti/log4js) and [debug](https://github.com/visionmedia/debug). @@ -46,7 +46,7 @@ As part of this, [@whyrusleeping](https://github.com/whyrusleeping) removed over ### js-ipld -![libp2p-cli](/weekly-010-js-libp2p.png) +![libp2p-cli](../assets/weekly-010-js-libp2p.png) [@dignifiedquire](https://github.com/dignifiedquire) shipped an updated version of [js-ipld](https://npmjs.org/ipld) which now conforms to the [latest spec of IPLD](https://github.com/ipfs/specs/tree/master/ipld). In addition [js-ipfs-ipld](https://npmjs.org/ipfs-ipld) was created, which implements the building blocks to use IPLD in js-ipfs. The third package that was published is [js-ipfs-cli](https://npmjs.org/ipld-cli) which gives you a cli tool to interact and experiment with IPLD. @@ -90,7 +90,7 @@ go-ipfs has support for restricting peer connections to certain IP address range ### MIT Meetup -![IPFS Meeting in Cambridge](/weekly-010-ipfs-boston.jpg) +![IPFS Meeting in Cambridge](../assets/weekly-010-ipfs-boston.jpg) We had the first ever IPFS meetup in Cambridge, at MIT. It was sponsored by [Consensys](https://consensys.net), and hosted by the [MIT Bitcoin Club](http://bitcoin.mit.edu/). [@jbenet](https://github.com/jbenet), [@nicola](https://github.com/nicola), and [@CReckhow](https://twitter.com/CReckhow) each gave talks. A full writeup will appear on the blog as soon as we have edited the videos and posted them on the IPFS YouTube channel. We'll let you know when that happens, here. @@ -205,4 +205,4 @@ Thanks, and see you next week! - Richard Littauer -_Submit feedback about this issue [here](https://github.com/ipfs/weekly/issues/35), or send us [feedback about the IPFS Weekly in general](https://github.com/ipfs/weekly/issues/7)._ \ No newline at end of file +_Submit feedback about this issue [here](https://github.com/ipfs/weekly/issues/35), or send us [feedback about the IPFS Weekly in general](https://github.com/ipfs/weekly/issues/7)._ diff --git a/src/_blog/weekly-032.md b/src/_blog/weekly-032.md index cb51d950..c987de88 100644 --- a/src/_blog/weekly-032.md +++ b/src/_blog/weekly-032.md @@ -21,7 +21,7 @@ Here are some of the highlights since the last IPFS Weekly.
-[![](/ipfs-camp-2019.png)](https://camp.ipfs.io) +[![](../assets/ipfs-camp-2019.png)](https://camp.ipfs.io)
diff --git a/src/_blog/weekly-034.md b/src/_blog/weekly-034.md index 64cc8382..b9cd446b 100644 --- a/src/_blog/weekly-034.md +++ b/src/_blog/weekly-034.md @@ -59,7 +59,7 @@ _[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated - [Almonit](almonit.eth): A decentralized website made with ENS + IPFS - Deploy DNSLink TXT Records To AWS Route53 Domains with [dnslink-route53](https://github.com/RTradeLtd/dnslink-route53) -![](/ipfs-camp-2019.png) +![](../assets/ipfs-camp-2019.png) ## Join us at the first ever IPFS Camp diff --git a/src/_blog/weekly-035.md b/src/_blog/weekly-035.md index 1c866160..1020de01 100644 --- a/src/_blog/weekly-035.md +++ b/src/_blog/weekly-035.md @@ -68,7 +68,7 @@ _[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated - [IPFS-Lite is an embeddable, lightweight IPFS-network peer for IPLD applications](https://github.com/hsanjuan/ipfs-lite) - [Happy 5th birthday, 18F!](https://18f.gsa.gov/2019/03/19/18F-5-Anniversary-achieve/) -![](/ipfs-camp-2019.png) +![](../assets/ipfs-camp-2019.png) ## Join us at the first ever IPFS Camp diff --git a/src/_blog/weekly-036.md b/src/_blog/weekly-036.md index 65d0993e..3c5fabf8 100644 --- a/src/_blog/weekly-036.md +++ b/src/_blog/weekly-036.md @@ -67,7 +67,7 @@ _[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated - The [AKASHA Foundation](https://akasha.org/about/), a non-profit born at the intersection of blockchain and collective intelligence, is currently hiring! - Check out this web app to check [a public IPFS gateway state](https://ipfs.fooock.com/) -![](/ipfs-camp-2019.png) +![](../assets/ipfs-camp-2019.png) ## Join us at the first ever IPFS Camp diff --git a/src/_blog/weekly-038.md b/src/_blog/weekly-038.md index c605c398..848a69e3 100644 --- a/src/_blog/weekly-038.md +++ b/src/_blog/weekly-038.md @@ -73,7 +73,7 @@ _[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated - [Genobank DNA Wallet](https://coinlist.co/build/nucypher/projects/a9f305f4-d0ff-4501-840e-4566608303ab) – A Decentralised and anonymous DNA wallet. Enables users to extract DNA, establish ownership, share (P2P) & control using Nucypher and Blockchain. - [deima](https://boramalper.github.io/deima/) is a decentralised image host that allows you to upload your images to IPFS distributed network. -![](/ipfs-camp-2019.png) +![](../assets/ipfs-camp-2019.png) ## Join us at the first ever IPFS Camp diff --git a/src/_blog/weekly-039.md b/src/_blog/weekly-039.md index d1a5f36d..db2f726c 100644 --- a/src/_blog/weekly-039.md +++ b/src/_blog/weekly-039.md @@ -58,7 +58,7 @@ _See the latest releases of IPFS tools and projects across the ecosystem._ - qri (“query”) is versioned, scriptable, exportable, collaborative datasets and [version 0.7.1](https://github.com/qri-io/frontend/releases/tag/v0.7.1) is out now. - The [Textile team](https://www.textile.photos/) recently shipped the latest [Textile Update | March 2019](https://medium.com/textileio/textile-update-march-2019-5da0c1581d3e). -![](/ipfs-camp-2019.png) +![](../assets/ipfs-camp-2019.png) ## Join us at the first ever IPFS Camp diff --git a/src/_blog/weekly-040.md b/src/_blog/weekly-040.md index 83846947..b96d4764 100644 --- a/src/_blog/weekly-040.md +++ b/src/_blog/weekly-040.md @@ -46,7 +46,7 @@ _[Awesome IPFS](https://awesome.ipfs.io/) is a community maintained and updated - [Matters.news](https://matters.news/faq) is a news publishing site hosted on IPFS with approximately 10K+ active users! - [galacteek](https://github.com/eversum/galacteek) is an experimental multi-platform Qt5-based browser/toolbox for the IPFS peer-to-peer network. -![](/ipfs-camp-2019.png) +![](../assets/ipfs-camp-2019.png) ## Join us at the first ever IPFS Camp diff --git a/src/_blog/weekly-049.md b/src/_blog/weekly-049.md index 54820d1a..1ad46fe3 100644 --- a/src/_blog/weekly-049.md +++ b/src/_blog/weekly-049.md @@ -16,7 +16,7 @@ Thanks for being part of our community, we truly couldn’t make IPFS what it is # Milestones -![](/050-ipfs-camp-recap-gif.gif) +![](../assets/050-ipfs-camp-recap-gif.gif) ## The first IPFS Camp was a blast diff --git a/src/_blog/weekly-083.md b/src/_blog/weekly-083.md index 3660c0d8..730924da 100644 --- a/src/_blog/weekly-083.md +++ b/src/_blog/weekly-083.md @@ -14,7 +14,7 @@ tags: Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 -![IPFS built-in to Opera for Android](/opera-android-banner.png) +![IPFS built-in to Opera for Android](../assets/opera-android-banner.png) ## IPFS in Opera for Android diff --git a/src/_blog/weekly-087.md b/src/_blog/weekly-087.md index 8a82158a..0f91f9ac 100644 --- a/src/_blog/weekly-087.md +++ b/src/_blog/weekly-087.md @@ -14,7 +14,7 @@ tags: Here’s what’s happening lately in the [InterPlanetary File System](https://ipfs.io/) galaxy and beyond! 🚀 -![Announcing IPFS 0.5](/090-go-ipfs-0-5-0-header-image.png) +![Announcing IPFS 0.5](../assets/090-go-ipfs-0-5-0-header-image.png) ## go-ipfs 0.5.0 is officially here 🚀 diff --git a/src/_blog/weekly-096.md b/src/_blog/weekly-096.md index 87e7c4ec..9d1f3bcc 100644 --- a/src/_blog/weekly-096.md +++ b/src/_blog/weekly-096.md @@ -27,7 +27,7 @@ We introduced the [IPFS Grants Platform](https://blog.ipfs.io/2020-04-20-ipfs-gr The [IPFS Distributions website](https://dist.ipfs.io/) got a fun IPFS rebrand. -![New updates to go-ipfs](/090-go-ipfs-0-5-0-header-image.png) +![New updates to go-ipfs](../assets/090-go-ipfs-0-5-0-header-image.png) Our largest upgrade to IPFS yet happened with [go-ipfs 0.5](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/)! And, we hosted [a launch meetup](https://www.youtube.com/watch?list=PLuhRWgmPaHtQ26F2MIuogvo0so9QUgH1r&v=RxJSUBeqOKU&feature=emb_log) with community members to share our many updates! @@ -53,7 +53,7 @@ We take some significant steps to improve the [IPFS Developer experience](https: [OrbitDB releases v0.24](https://github.com/orbitdb/orbit-db/issues/772#issuecomment-632357888) with support for both go-ipfs 0.5 and js-ipfs 0.44. -![Launching Testground](/092-launching-testground-header-image.png) +![Launching Testground](../assets/092-launching-testground-header-image.png) We launched [Testground v0.5](https://blog.ipfs.io/2020-05-06-launching-testground/), a platform for testing, benchmarking, and simulating distributed and p2p systems at scale. Designed to be multilingual and runtime-agnostic, scaling from 2 to 10k instances. @@ -83,7 +83,7 @@ Textile released the [Buckets JS library](https://textileio.github.io/js-hub/doc Jim Kosem shares the new [IPFS Mobile Design Guidelines](https://blog.ipfs.io/2020-06-25-ipfs-mobile-design-guidelines/), based on research conducted earlier in the quarter. Go download the pdf! -![IPFS and ION](/099-identity-ipfs-ion-header.png) +![IPFS and ION](../assets/099-identity-ipfs-ion-header.png) [ION](https://blog.ipfs.io/2020-06-11-identity-ipfs-ion/), launched by Microsoft, has been under development for over a year, and is an instance implementation of Sidetree that runs on the Bitcoin blockchain. And it stores transaction data on IPFS. diff --git a/src/_blog/welcome-to-ipfs-weekly-119.md b/src/_blog/welcome-to-ipfs-weekly-119.md index fb2f8b7a..97a8d80f 100644 --- a/src/_blog/welcome-to-ipfs-weekly-119.md +++ b/src/_blog/welcome-to-ipfs-weekly-119.md @@ -12,7 +12,7 @@ author: Jenn Turner Here’s what’s happening in the [InterPlanetary File System](https://ipfs.io/) galaxy! -![IPFS in Brave - Native Access to the Distributed Web](/2021-01-19-ipfs-in-brave.png) +![IPFS in Brave - Native Access to the Distributed Web](../assets/2021-01-19-ipfs-in-brave.png) ## IPFS now natively supported in Brave web browser @@ -26,7 +26,7 @@ Join us on January 22, as we kick off 2021 with some very big plans! Our feature [Register to attend](https://www.meetup.com/San-Francisco-IPFS/events/275755941/) -![IPFS in Browsers](/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png) +![IPFS in Browsers](../assets/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png) ## Igalia and IPFS join forces to empower the dweb diff --git a/src/.vuepress/public/000-hello-worlds-earthrise.png b/src/assets/000-hello-worlds-earthrise.png similarity index 100% rename from src/.vuepress/public/000-hello-worlds-earthrise.png rename to src/assets/000-hello-worlds-earthrise.png diff --git a/src/.vuepress/public/002-ipscend-screenshot.gif b/src/assets/002-ipscend-screenshot.gif similarity index 100% rename from src/.vuepress/public/002-ipscend-screenshot.gif rename to src/assets/002-ipscend-screenshot.gif diff --git a/src/.vuepress/public/002-ipscend.png b/src/assets/002-ipscend.png similarity index 100% rename from src/.vuepress/public/002-ipscend.png rename to src/assets/002-ipscend.png diff --git a/src/.vuepress/public/003-registry-mirror-interactive-logo.png b/src/assets/003-registry-mirror-interactive-logo.png similarity index 100% rename from src/.vuepress/public/003-registry-mirror-interactive-logo.png rename to src/assets/003-registry-mirror-interactive-logo.png diff --git a/src/.vuepress/public/003-registry-mirror.png b/src/assets/003-registry-mirror.png similarity index 100% rename from src/.vuepress/public/003-registry-mirror.png rename to src/assets/003-registry-mirror.png diff --git a/src/.vuepress/public/005-ipfs-0-4-0-released-fireworks.jpg b/src/assets/005-ipfs-0-4-0-released-fireworks.jpg similarity index 100% rename from src/.vuepress/public/005-ipfs-0-4-0-released-fireworks.jpg rename to src/assets/005-ipfs-0-4-0-released-fireworks.jpg diff --git a/src/.vuepress/public/006-distributions-screenshot.png b/src/assets/006-distributions-screenshot.png similarity index 100% rename from src/.vuepress/public/006-distributions-screenshot.png rename to src/assets/006-distributions-screenshot.png diff --git a/src/.vuepress/public/007-cbase-deaddrop.jpeg b/src/assets/007-cbase-deaddrop.jpeg similarity index 100% rename from src/.vuepress/public/007-cbase-deaddrop.jpeg rename to src/assets/007-cbase-deaddrop.jpeg diff --git a/src/.vuepress/public/007-talk.png b/src/assets/007-talk.png similarity index 100% rename from src/.vuepress/public/007-talk.png rename to src/assets/007-talk.png diff --git a/src/.vuepress/public/025-a-look-at-windows-build.gif b/src/assets/025-a-look-at-windows-build.gif similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-build.gif rename to src/assets/025-a-look-at-windows-build.gif diff --git a/src/.vuepress/public/025-a-look-at-windows-empty.png b/src/assets/025-a-look-at-windows-empty.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-empty.png rename to src/assets/025-a-look-at-windows-empty.png diff --git a/src/.vuepress/public/025-a-look-at-windows-filenames.png b/src/assets/025-a-look-at-windows-filenames.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-filenames.png rename to src/assets/025-a-look-at-windows-filenames.png diff --git a/src/.vuepress/public/025-a-look-at-windows-garbage.png b/src/assets/025-a-look-at-windows-garbage.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-garbage.png rename to src/assets/025-a-look-at-windows-garbage.png diff --git a/src/.vuepress/public/025-a-look-at-windows-log-after.png b/src/assets/025-a-look-at-windows-log-after.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-log-after.png rename to src/assets/025-a-look-at-windows-log-after.png diff --git a/src/.vuepress/public/025-a-look-at-windows-log-before.png b/src/assets/025-a-look-at-windows-log-before.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-log-before.png rename to src/assets/025-a-look-at-windows-log-before.png diff --git a/src/.vuepress/public/025-a-look-at-windows-overwrite 1.png b/src/assets/025-a-look-at-windows-overwrite-1.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-overwrite 1.png rename to src/assets/025-a-look-at-windows-overwrite-1.png diff --git a/src/.vuepress/public/025-a-look-at-windows-overwrite 2.png b/src/assets/025-a-look-at-windows-overwrite-2.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-overwrite 2.png rename to src/assets/025-a-look-at-windows-overwrite-2.png diff --git a/src/.vuepress/public/025-a-look-at-windows-pipe.png b/src/assets/025-a-look-at-windows-pipe.png similarity index 100% rename from src/.vuepress/public/025-a-look-at-windows-pipe.png rename to src/assets/025-a-look-at-windows-pipe.png diff --git a/src/.vuepress/public/035-go-ipfs-0-4-18-cpu-load.png b/src/assets/035-go-ipfs-0-4-18-cpu-load.png similarity index 100% rename from src/.vuepress/public/035-go-ipfs-0-4-18-cpu-load.png rename to src/assets/035-go-ipfs-0-4-18-cpu-load.png diff --git a/src/.vuepress/public/035-go-ipfs-0-4-18-gc-latency.png b/src/assets/035-go-ipfs-0-4-18-gc-latency.png similarity index 100% rename from src/.vuepress/public/035-go-ipfs-0-4-18-gc-latency.png rename to src/assets/035-go-ipfs-0-4-18-gc-latency.png diff --git a/src/.vuepress/public/040-crdt-research-meetup-video1.png b/src/assets/040-crdt-research-meetup-video1.png similarity index 100% rename from src/.vuepress/public/040-crdt-research-meetup-video1.png rename to src/assets/040-crdt-research-meetup-video1.png diff --git a/src/.vuepress/public/040-crdt-research-meetup-video2.png b/src/assets/040-crdt-research-meetup-video2.png similarity index 100% rename from src/.vuepress/public/040-crdt-research-meetup-video2.png rename to src/assets/040-crdt-research-meetup-video2.png diff --git a/src/.vuepress/public/040-crdt-research-meetup-video3.png b/src/assets/040-crdt-research-meetup-video3.png similarity index 100% rename from src/.vuepress/public/040-crdt-research-meetup-video3.png rename to src/assets/040-crdt-research-meetup-video3.png diff --git a/src/.vuepress/public/040-crdt-research-meetup-video4.png b/src/assets/040-crdt-research-meetup-video4.png similarity index 100% rename from src/.vuepress/public/040-crdt-research-meetup-video4.png rename to src/assets/040-crdt-research-meetup-video4.png diff --git a/src/.vuepress/public/043-ipfs-2019-roadmap-2019-epics.png b/src/assets/043-ipfs-2019-roadmap-2019-epics.png similarity index 100% rename from src/.vuepress/public/043-ipfs-2019-roadmap-2019-epics.png rename to src/assets/043-ipfs-2019-roadmap-2019-epics.png diff --git a/src/.vuepress/public/043-ipfs-2019-roadmap-goals.png b/src/assets/043-ipfs-2019-roadmap-goals.png similarity index 100% rename from src/.vuepress/public/043-ipfs-2019-roadmap-goals.png rename to src/assets/043-ipfs-2019-roadmap-goals.png diff --git a/src/.vuepress/public/043-ipfs-2019-roadmap-mission-statement.png b/src/assets/043-ipfs-2019-roadmap-mission-statement.png similarity index 100% rename from src/.vuepress/public/043-ipfs-2019-roadmap-mission-statement.png rename to src/assets/043-ipfs-2019-roadmap-mission-statement.png diff --git a/src/.vuepress/public/043-ipfs-2019-roadmap-q2-okrs.png b/src/assets/043-ipfs-2019-roadmap-q2-okrs.png similarity index 100% rename from src/.vuepress/public/043-ipfs-2019-roadmap-q2-okrs.png rename to src/assets/043-ipfs-2019-roadmap-q2-okrs.png diff --git a/src/.vuepress/public/045-js-libp2p-0.25-header-image.png b/src/assets/045-js-libp2p-0.25-header-image.png similarity index 100% rename from src/.vuepress/public/045-js-libp2p-0.25-header-image.png rename to src/assets/045-js-libp2p-0.25-header-image.png diff --git a/src/.vuepress/public/050-ipfs-camp-recap-gif.gif b/src/assets/050-ipfs-camp-recap-gif.gif similarity index 100% rename from src/.vuepress/public/050-ipfs-camp-recap-gif.gif rename to src/assets/050-ipfs-camp-recap-gif.gif diff --git a/src/.vuepress/public/050-ipfs-camp-recap-youtube-preview.jpg b/src/assets/050-ipfs-camp-recap-youtube-preview.jpg similarity index 100% rename from src/.vuepress/public/050-ipfs-camp-recap-youtube-preview.jpg rename to src/assets/050-ipfs-camp-recap-youtube-preview.jpg diff --git a/src/.vuepress/public/055-js-libp2p-0.26-header-image.png b/src/assets/055-js-libp2p-0.26-header-image.png similarity index 100% rename from src/.vuepress/public/055-js-libp2p-0.26-header-image.png rename to src/assets/055-js-libp2p-0.26-header-image.png diff --git a/src/.vuepress/public/056-pubsub-in-the-browser-demo-screenshot.png b/src/assets/056-pubsub-in-the-browser-demo-screenshot.png similarity index 100% rename from src/.vuepress/public/056-pubsub-in-the-browser-demo-screenshot.png rename to src/assets/056-pubsub-in-the-browser-demo-screenshot.png diff --git a/src/.vuepress/public/056-pubsub-in-the-browser-video.jpg b/src/assets/056-pubsub-in-the-browser-video.jpg similarity index 100% rename from src/.vuepress/public/056-pubsub-in-the-browser-video.jpg rename to src/assets/056-pubsub-in-the-browser-video.jpg diff --git a/src/.vuepress/public/057-ipfs-camp-course-videos-core-a-thumbnail.png b/src/assets/057-ipfs-camp-course-videos-core-a-thumbnail.png similarity index 100% rename from src/.vuepress/public/057-ipfs-camp-course-videos-core-a-thumbnail.png rename to src/assets/057-ipfs-camp-course-videos-core-a-thumbnail.png diff --git a/src/.vuepress/public/057-ipfs-camp-course-videos-core-d-thumbnail.png b/src/assets/057-ipfs-camp-course-videos-core-d-thumbnail.png similarity index 100% rename from src/.vuepress/public/057-ipfs-camp-course-videos-core-d-thumbnail.png rename to src/assets/057-ipfs-camp-course-videos-core-d-thumbnail.png diff --git a/src/.vuepress/public/058-ipfs-desktop-0-9-browse-wild.jpg b/src/assets/058-ipfs-desktop-0-9-browse-wild.jpg similarity index 100% rename from src/.vuepress/public/058-ipfs-desktop-0-9-browse-wild.jpg rename to src/assets/058-ipfs-desktop-0-9-browse-wild.jpg diff --git a/src/.vuepress/public/058-ipfs-desktop-0-9-evolution.jpg b/src/assets/058-ipfs-desktop-0-9-evolution.jpg similarity index 100% rename from src/.vuepress/public/058-ipfs-desktop-0-9-evolution.jpg rename to src/assets/058-ipfs-desktop-0-9-evolution.jpg diff --git a/src/.vuepress/public/058-ipfs-desktop-0-9-ipfs-cmd.jpg b/src/assets/058-ipfs-desktop-0-9-ipfs-cmd.jpg similarity index 100% rename from src/.vuepress/public/058-ipfs-desktop-0-9-ipfs-cmd.jpg rename to src/assets/058-ipfs-desktop-0-9-ipfs-cmd.jpg diff --git a/src/.vuepress/public/058-ipfs-desktop-0-9-npm-ipfs.jpg b/src/assets/058-ipfs-desktop-0-9-npm-ipfs.jpg similarity index 100% rename from src/.vuepress/public/058-ipfs-desktop-0-9-npm-ipfs.jpg rename to src/assets/058-ipfs-desktop-0-9-npm-ipfs.jpg diff --git a/src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-actyx.jpg b/src/assets/059-ipfs-camp-sci-fi-fair-videos-actyx.jpg similarity index 100% rename from src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-actyx.jpg rename to src/assets/059-ipfs-camp-sci-fi-fair-videos-actyx.jpg diff --git a/src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-catbot.jpg b/src/assets/059-ipfs-camp-sci-fi-fair-videos-catbot.jpg similarity index 100% rename from src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-catbot.jpg rename to src/assets/059-ipfs-camp-sci-fi-fair-videos-catbot.jpg diff --git a/src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-ipns.jpg b/src/assets/059-ipfs-camp-sci-fi-fair-videos-ipns.jpg similarity index 100% rename from src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-ipns.jpg rename to src/assets/059-ipfs-camp-sci-fi-fair-videos-ipns.jpg diff --git a/src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-marnee-minitel.jpg b/src/assets/059-ipfs-camp-sci-fi-fair-videos-marnee-minitel.jpg similarity index 100% rename from src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-marnee-minitel.jpg rename to src/assets/059-ipfs-camp-sci-fi-fair-videos-marnee-minitel.jpg diff --git a/src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-npm-in-box.jpg b/src/assets/059-ipfs-camp-sci-fi-fair-videos-npm-in-box.jpg similarity index 100% rename from src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-npm-in-box.jpg rename to src/assets/059-ipfs-camp-sci-fi-fair-videos-npm-in-box.jpg diff --git a/src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-vasa.jpg b/src/assets/059-ipfs-camp-sci-fi-fair-videos-vasa.jpg similarity index 100% rename from src/.vuepress/public/059-ipfs-camp-sci-fi-fair-videos-vasa.jpg rename to src/assets/059-ipfs-camp-sci-fi-fair-videos-vasa.jpg diff --git a/src/.vuepress/public/060-ipfs-camp-keynotes-interviews-header-image.png b/src/assets/060-ipfs-camp-keynotes-interviews-header-image.png similarity index 100% rename from src/.vuepress/public/060-ipfs-camp-keynotes-interviews-header-image.png rename to src/assets/060-ipfs-camp-keynotes-interviews-header-image.png diff --git a/src/.vuepress/public/071-ipfs-in-web-browsers-enable-embedded-node-in-brave.png b/src/assets/071-ipfs-in-web-browsers-enable-embedded-node-in-brave.png similarity index 100% rename from src/.vuepress/public/071-ipfs-in-web-browsers-enable-embedded-node-in-brave.png rename to src/assets/071-ipfs-in-web-browsers-enable-embedded-node-in-brave.png diff --git a/src/.vuepress/public/071-ipfs-in-web-browsers-enabling-ipfs-companion-in-brave.gif b/src/assets/071-ipfs-in-web-browsers-enabling-ipfs-companion-in-brave.gif similarity index 100% rename from src/.vuepress/public/071-ipfs-in-web-browsers-enabling-ipfs-companion-in-brave.gif rename to src/assets/071-ipfs-in-web-browsers-enabling-ipfs-companion-in-brave.gif diff --git a/src/.vuepress/public/071-ipfs-in-web-browsers-header-image.png b/src/assets/071-ipfs-in-web-browsers-header-image.png similarity index 100% rename from src/.vuepress/public/071-ipfs-in-web-browsers-header-image.png rename to src/assets/071-ipfs-in-web-browsers-header-image.png diff --git a/src/.vuepress/public/071-ipfs-in-web-browsers-opera-announcement.png b/src/assets/071-ipfs-in-web-browsers-opera-announcement.png similarity index 100% rename from src/.vuepress/public/071-ipfs-in-web-browsers-opera-announcement.png rename to src/assets/071-ipfs-in-web-browsers-opera-announcement.png diff --git a/src/.vuepress/public/071-ipfs-in-web-browsers-stages-of-browser-integration.png b/src/assets/071-ipfs-in-web-browsers-stages-of-browser-integration.png similarity index 100% rename from src/.vuepress/public/071-ipfs-in-web-browsers-stages-of-browser-integration.png rename to src/assets/071-ipfs-in-web-browsers-stages-of-browser-integration.png diff --git a/src/.vuepress/public/074-explore-the-files-api-on-protoschool-challenge_screenshot.png b/src/assets/074-explore-the-files-api-on-protoschool-challenge_screenshot.png similarity index 100% rename from src/.vuepress/public/074-explore-the-files-api-on-protoschool-challenge_screenshot.png rename to src/assets/074-explore-the-files-api-on-protoschool-challenge_screenshot.png diff --git a/src/.vuepress/public/074-explore-the-files-api-on-protoschool-header-image.png b/src/assets/074-explore-the-files-api-on-protoschool-header-image.png similarity index 100% rename from src/.vuepress/public/074-explore-the-files-api-on-protoschool-header-image.png rename to src/assets/074-explore-the-files-api-on-protoschool-header-image.png diff --git a/src/.vuepress/public/074-explore-the-files-api-on-protoschool-toc_screenshot.png b/src/assets/074-explore-the-files-api-on-protoschool-toc_screenshot.png similarity index 100% rename from src/.vuepress/public/074-explore-the-files-api-on-protoschool-toc_screenshot.png rename to src/assets/074-explore-the-files-api-on-protoschool-toc_screenshot.png diff --git a/src/.vuepress/public/076-ipfs-docs-beta-header-image.png b/src/assets/076-ipfs-docs-beta-header-image.png similarity index 100% rename from src/.vuepress/public/076-ipfs-docs-beta-header-image.png rename to src/assets/076-ipfs-docs-beta-header-image.png diff --git a/src/.vuepress/public/076-ipfs-docs-beta-screenshot.png b/src/assets/076-ipfs-docs-beta-screenshot.png similarity index 100% rename from src/.vuepress/public/076-ipfs-docs-beta-screenshot.png rename to src/assets/076-ipfs-docs-beta-screenshot.png diff --git a/src/.vuepress/public/076-ipfs-docs-beta-site-mindmap.png b/src/assets/076-ipfs-docs-beta-site-mindmap.png similarity index 100% rename from src/.vuepress/public/076-ipfs-docs-beta-site-mindmap.png rename to src/assets/076-ipfs-docs-beta-site-mindmap.png diff --git a/src/.vuepress/public/077-collaborative-clusters-header-image.png b/src/assets/077-collaborative-clusters-header-image.png similarity index 100% rename from src/.vuepress/public/077-collaborative-clusters-header-image.png rename to src/assets/077-collaborative-clusters-header-image.png diff --git a/src/.vuepress/public/081-js-libp2p-0.27-header-image.png b/src/assets/081-js-libp2p-0.27-header-image.png similarity index 100% rename from src/.vuepress/public/081-js-libp2p-0.27-header-image.png rename to src/assets/081-js-libp2p-0.27-header-image.png diff --git a/src/.vuepress/public/082-ethdenver-2020-header-image.png b/src/assets/082-ethdenver-2020-header-image.png similarity index 100% rename from src/.vuepress/public/082-ethdenver-2020-header-image.png rename to src/assets/082-ethdenver-2020-header-image.png diff --git a/src/.vuepress/public/082-our-focus-for-2020-header-image.png b/src/assets/082-our-focus-for-2020-header-image.png similarity index 100% rename from src/.vuepress/public/082-our-focus-for-2020-header-image.png rename to src/assets/082-our-focus-for-2020-header-image.png diff --git a/src/.vuepress/public/083-improved-bitswap-with-netflix-header-image.png b/src/assets/083-improved-bitswap-with-netflix-header-image.png similarity index 100% rename from src/.vuepress/public/083-improved-bitswap-with-netflix-header-image.png rename to src/assets/083-improved-bitswap-with-netflix-header-image.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-cid-inspector.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-cid-inspector.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-cid-inspector.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-cid-inspector.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-header-image.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-quiz.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-quiz.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-quiz.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-quiz.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-sample-lesson.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-sample-lesson.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-sample-lesson.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-sample-lesson.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-table-of-contents.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-table-of-contents.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-table-of-contents.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-table-of-contents.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-toggle-coding-challenges.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-toggle-coding-challenges.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-toggle-coding-challenges.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-toggle-coding-challenges.png diff --git a/src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-type-icons.png b/src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-type-icons.png similarity index 100% rename from src/.vuepress/public/084-explore-the-anatomy-of-a-cid-on-protoschool-type-icons.png rename to src/assets/084-explore-the-anatomy-of-a-cid-on-protoschool-type-icons.png diff --git a/src/.vuepress/public/085-announcing-rust-ipfs-header-image.png b/src/assets/085-announcing-rust-ipfs-header-image.png similarity index 100% rename from src/.vuepress/public/085-announcing-rust-ipfs-header-image.png rename to src/assets/085-announcing-rust-ipfs-header-image.png diff --git a/src/.vuepress/public/086-ipfs-in-opera-for-android-banner.png b/src/assets/086-ipfs-in-opera-for-android-banner.png similarity index 100% rename from src/.vuepress/public/086-ipfs-in-opera-for-android-banner.png rename to src/assets/086-ipfs-in-opera-for-android-banner.png diff --git a/src/.vuepress/public/086-ipfs-in-opera-for-android-header-image.png b/src/assets/086-ipfs-in-opera-for-android-header-image.png similarity index 100% rename from src/.vuepress/public/086-ipfs-in-opera-for-android-header-image.png rename to src/assets/086-ipfs-in-opera-for-android-header-image.png diff --git a/src/.vuepress/public/086-ipfs-in-opera-for-android-play-store.png b/src/assets/086-ipfs-in-opera-for-android-play-store.png similarity index 100% rename from src/.vuepress/public/086-ipfs-in-opera-for-android-play-store.png rename to src/assets/086-ipfs-in-opera-for-android-play-store.png diff --git a/src/.vuepress/public/086-ipfs-in-opera-for-android-protocol-demo.png b/src/assets/086-ipfs-in-opera-for-android-protocol-demo.png similarity index 100% rename from src/.vuepress/public/086-ipfs-in-opera-for-android-protocol-demo.png rename to src/assets/086-ipfs-in-opera-for-android-protocol-demo.png diff --git a/src/.vuepress/public/086-ipfs-in-opera-for-android-settings.gif b/src/assets/086-ipfs-in-opera-for-android-settings.gif similarity index 100% rename from src/.vuepress/public/086-ipfs-in-opera-for-android-settings.gif rename to src/assets/086-ipfs-in-opera-for-android-settings.gif diff --git a/src/.vuepress/public/086-ipfs-in-opera-for-android-test-page.png b/src/assets/086-ipfs-in-opera-for-android-test-page.png similarity index 100% rename from src/.vuepress/public/086-ipfs-in-opera-for-android-test-page.png rename to src/assets/086-ipfs-in-opera-for-android-test-page.png diff --git a/src/.vuepress/public/087-ipfs-mobile-design-research-device-sales-2005-2016.jpg b/src/assets/087-ipfs-mobile-design-research-device-sales-2005-2016.jpg similarity index 100% rename from src/.vuepress/public/087-ipfs-mobile-design-research-device-sales-2005-2016.jpg rename to src/assets/087-ipfs-mobile-design-research-device-sales-2005-2016.jpg diff --git a/src/.vuepress/public/088-ipfs-grants-platform-header-image.png b/src/assets/088-ipfs-grants-platform-header-image.png similarity index 100% rename from src/.vuepress/public/088-ipfs-grants-platform-header-image.png rename to src/assets/088-ipfs-grants-platform-header-image.png diff --git a/src/.vuepress/public/090-go-ipfs-0-5-0-Infographic.png b/src/assets/090-go-ipfs-0-5-0-Infographic.png similarity index 100% rename from src/.vuepress/public/090-go-ipfs-0-5-0-Infographic.png rename to src/assets/090-go-ipfs-0-5-0-Infographic.png diff --git a/src/.vuepress/public/090-go-ipfs-0-5-0-container-image.png b/src/assets/090-go-ipfs-0-5-0-container-image.png similarity index 100% rename from src/.vuepress/public/090-go-ipfs-0-5-0-container-image.png rename to src/assets/090-go-ipfs-0-5-0-container-image.png diff --git a/src/.vuepress/public/090-go-ipfs-0-5-0-header-image.png b/src/assets/090-go-ipfs-0-5-0-header-image.png similarity index 100% rename from src/.vuepress/public/090-go-ipfs-0-5-0-header-image.png rename to src/assets/090-go-ipfs-0-5-0-header-image.png diff --git a/src/.vuepress/public/090-go-ipfs-0-5-0-ipfs-contributors.png b/src/assets/090-go-ipfs-0-5-0-ipfs-contributors.png similarity index 100% rename from src/.vuepress/public/090-go-ipfs-0-5-0-ipfs-contributors.png rename to src/assets/090-go-ipfs-0-5-0-ipfs-contributors.png diff --git a/src/.vuepress/public/090-go-ipfs-0-5-0-launch-meetup.png b/src/assets/090-go-ipfs-0-5-0-launch-meetup.png similarity index 100% rename from src/.vuepress/public/090-go-ipfs-0-5-0-launch-meetup.png rename to src/assets/090-go-ipfs-0-5-0-launch-meetup.png diff --git a/src/.vuepress/public/091-dev-exp-labels-autoresponder.png b/src/assets/091-dev-exp-labels-autoresponder.png similarity index 100% rename from src/.vuepress/public/091-dev-exp-labels-autoresponder.png rename to src/assets/091-dev-exp-labels-autoresponder.png diff --git a/src/.vuepress/public/092-launching-testground-architecture.png b/src/assets/092-launching-testground-architecture.png similarity index 100% rename from src/.vuepress/public/092-launching-testground-architecture.png rename to src/assets/092-launching-testground-architecture.png diff --git a/src/.vuepress/public/092-launching-testground-flowchart.png b/src/assets/092-launching-testground-flowchart.png similarity index 100% rename from src/.vuepress/public/092-launching-testground-flowchart.png rename to src/assets/092-launching-testground-flowchart.png diff --git a/src/.vuepress/public/092-launching-testground-header-image.png b/src/assets/092-launching-testground-header-image.png similarity index 100% rename from src/.vuepress/public/092-launching-testground-header-image.png rename to src/assets/092-launching-testground-header-image.png diff --git a/src/.vuepress/public/093-ipfs-pinning-summit-recap-header-image.png b/src/assets/093-ipfs-pinning-summit-recap-header-image.png similarity index 100% rename from src/.vuepress/public/093-ipfs-pinning-summit-recap-header-image.png rename to src/assets/093-ipfs-pinning-summit-recap-header-image.png diff --git a/src/.vuepress/public/094-gossipsub-v1.1-header-image+grid.jpeg b/src/assets/094-gossipsub-v1.1-header-image+grid.jpeg similarity index 100% rename from src/.vuepress/public/094-gossipsub-v1.1-header-image+grid.jpeg rename to src/assets/094-gossipsub-v1.1-header-image+grid.jpeg diff --git a/src/.vuepress/public/094-gossipsub-v1.1-header-image.jpeg b/src/assets/094-gossipsub-v1.1-header-image.jpeg similarity index 100% rename from src/.vuepress/public/094-gossipsub-v1.1-header-image.jpeg rename to src/assets/094-gossipsub-v1.1-header-image.jpeg diff --git a/src/.vuepress/public/095-road-to-dht-brendan-quote.png b/src/assets/095-road-to-dht-brendan-quote.png similarity index 100% rename from src/.vuepress/public/095-road-to-dht-brendan-quote.png rename to src/assets/095-road-to-dht-brendan-quote.png diff --git a/src/.vuepress/public/095-road-to-dht-header-image.png b/src/assets/095-road-to-dht-header-image.png similarity index 100% rename from src/.vuepress/public/095-road-to-dht-header-image.png rename to src/assets/095-road-to-dht-header-image.png diff --git a/src/.vuepress/public/097-js-ipfs-0.46-bitswap-speedup.png b/src/assets/097-js-ipfs-0.46-bitswap-speedup.png similarity index 100% rename from src/.vuepress/public/097-js-ipfs-0.46-bitswap-speedup.png rename to src/assets/097-js-ipfs-0.46-bitswap-speedup.png diff --git a/src/.vuepress/public/098-devcon.png b/src/assets/098-devcon.png similarity index 100% rename from src/.vuepress/public/098-devcon.png rename to src/assets/098-devcon.png diff --git a/src/.vuepress/public/098-libp2p-in-2020-find-perf.png b/src/assets/098-libp2p-in-2020-find-perf.png similarity index 100% rename from src/.vuepress/public/098-libp2p-in-2020-find-perf.png rename to src/assets/098-libp2p-in-2020-find-perf.png diff --git a/src/.vuepress/public/099-identity-ipfs-ion-architecture.png b/src/assets/099-identity-ipfs-ion-architecture.png similarity index 100% rename from src/.vuepress/public/099-identity-ipfs-ion-architecture.png rename to src/assets/099-identity-ipfs-ion-architecture.png diff --git a/src/.vuepress/public/099-identity-ipfs-ion-header.png b/src/assets/099-identity-ipfs-ion-header.png similarity index 100% rename from src/.vuepress/public/099-identity-ipfs-ion-header.png rename to src/assets/099-identity-ipfs-ion-header.png diff --git a/src/.vuepress/public/099-identity-ipfs-ion-logo.png b/src/assets/099-identity-ipfs-ion-logo.png similarity index 100% rename from src/.vuepress/public/099-identity-ipfs-ion-logo.png rename to src/assets/099-identity-ipfs-ion-logo.png diff --git a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet-preview.png b/src/assets/100-IPFS-mobile-design-guidelines-cheat-sheet-preview.png similarity index 100% rename from src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet-preview.png rename to src/assets/100-IPFS-mobile-design-guidelines-cheat-sheet-preview.png diff --git a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-principles.png b/src/assets/100-IPFS-mobile-design-guidelines-principles.png similarity index 100% rename from src/.vuepress/public/100-IPFS-mobile-design-guidelines-principles.png rename to src/assets/100-IPFS-mobile-design-guidelines-principles.png diff --git a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-scenarios.png b/src/assets/100-IPFS-mobile-design-guidelines-scenarios.png similarity index 100% rename from src/.vuepress/public/100-IPFS-mobile-design-guidelines-scenarios.png rename to src/assets/100-IPFS-mobile-design-guidelines-scenarios.png diff --git a/src/.vuepress/public/100-mobile-design-guidelines-header-image.png b/src/assets/100-mobile-design-guidelines-header-image.png similarity index 100% rename from src/.vuepress/public/100-mobile-design-guidelines-header-image.png rename to src/assets/100-mobile-design-guidelines-header-image.png diff --git a/src/.vuepress/public/102-case-study-audius-header-image.png b/src/assets/102-case-study-audius-header-image.png similarity index 100% rename from src/.vuepress/public/102-case-study-audius-header-image.png rename to src/assets/102-case-study-audius-header-image.png diff --git a/src/.vuepress/public/102-gossipsub-reports-header-image.png b/src/assets/102-gossipsub-reports-header-image.png similarity index 100% rename from src/.vuepress/public/102-gossipsub-reports-header-image.png rename to src/assets/102-gossipsub-reports-header-image.png diff --git a/src/.vuepress/public/104-dht-deep-dive-find-time-dht.png b/src/assets/104-dht-deep-dive-find-time-dht.png similarity index 100% rename from src/.vuepress/public/104-dht-deep-dive-find-time-dht.png rename to src/assets/104-dht-deep-dive-find-time-dht.png diff --git a/src/.vuepress/public/104-dht-deep-dive-header-image.png b/src/assets/104-dht-deep-dive-header-image.png similarity index 100% rename from src/.vuepress/public/104-dht-deep-dive-header-image.png rename to src/assets/104-dht-deep-dive-header-image.png diff --git a/src/.vuepress/public/104-dht-deep-dive-ipns-time-dht.png b/src/assets/104-dht-deep-dive-ipns-time-dht.png similarity index 100% rename from src/.vuepress/public/104-dht-deep-dive-ipns-time-dht.png rename to src/assets/104-dht-deep-dive-ipns-time-dht.png diff --git a/src/.vuepress/public/107-nix-ipfs-header-image.jpg b/src/assets/107-nix-ipfs-header-image.jpg similarity index 100% rename from src/.vuepress/public/107-nix-ipfs-header-image.jpg rename to src/assets/107-nix-ipfs-header-image.jpg diff --git a/src/.vuepress/public/108-js-ipfs-0.50.0-pinning-performance.png b/src/assets/108-js-ipfs-0.50.0-pinning-performance.png similarity index 100% rename from src/.vuepress/public/108-js-ipfs-0.50.0-pinning-performance.png rename to src/assets/108-js-ipfs-0.50.0-pinning-performance.png diff --git a/src/.vuepress/public/108407727-bac93800-71e9-11eb-93bd-89e25a8b4349.png b/src/assets/108407727-bac93800-71e9-11eb-93bd-89e25a8b4349.png similarity index 100% rename from src/.vuepress/public/108407727-bac93800-71e9-11eb-93bd-89e25a8b4349.png rename to src/assets/108407727-bac93800-71e9-11eb-93bd-89e25a8b4349.png diff --git a/src/.vuepress/public/112-dht-hardening.jpg b/src/assets/112-dht-hardening.jpg similarity index 100% rename from src/.vuepress/public/112-dht-hardening.jpg rename to src/assets/112-dht-hardening.jpg diff --git a/src/.vuepress/public/113-community-rfp.jpg b/src/assets/113-community-rfp.jpg similarity index 100% rename from src/.vuepress/public/113-community-rfp.jpg rename to src/assets/113-community-rfp.jpg diff --git a/src/.vuepress/public/114-ipfs-2021.jpg b/src/assets/114-ipfs-2021.jpg similarity index 100% rename from src/.vuepress/public/114-ipfs-2021.jpg rename to src/assets/114-ipfs-2021.jpg diff --git a/src/.vuepress/public/115-protoschool-merkle-dags.png b/src/assets/115-protoschool-merkle-dags.png similarity index 100% rename from src/.vuepress/public/115-protoschool-merkle-dags.png rename to src/assets/115-protoschool-merkle-dags.png diff --git a/src/.vuepress/public/124-libp2p-comes-to-protoschool-1.png b/src/assets/124-libp2p-comes-to-protoschool-1.png similarity index 100% rename from src/.vuepress/public/124-libp2p-comes-to-protoschool-1.png rename to src/assets/124-libp2p-comes-to-protoschool-1.png diff --git a/src/.vuepress/public/124-libp2p-comes-to-protoschool.png b/src/assets/124-libp2p-comes-to-protoschool.png similarity index 100% rename from src/.vuepress/public/124-libp2p-comes-to-protoschool.png rename to src/assets/124-libp2p-comes-to-protoschool.png diff --git a/src/.vuepress/public/2015-05-02-tutorial-raspberrypi-siliconian.png b/src/assets/2015-05-02-tutorial-raspberrypi-siliconian.png similarity index 100% rename from src/.vuepress/public/2015-05-02-tutorial-raspberrypi-siliconian.png rename to src/assets/2015-05-02-tutorial-raspberrypi-siliconian.png diff --git a/src/.vuepress/public/2015-05-23-news-dataterranemo.png b/src/assets/2015-05-23-news-dataterranemo.png similarity index 100% rename from src/.vuepress/public/2015-05-23-news-dataterranemo.png rename to src/assets/2015-05-23-news-dataterranemo.png diff --git a/src/.vuepress/public/2015-08-02-news-holgerkrekel-europython.png b/src/assets/2015-08-02-news-holgerkrekel-europython.png similarity index 100% rename from src/.vuepress/public/2015-08-02-news-holgerkrekel-europython.png rename to src/assets/2015-08-02-news-holgerkrekel-europython.png diff --git a/src/.vuepress/public/2015-08-25-juanbenet-softwareengineeringdaily.png b/src/assets/2015-08-25-juanbenet-softwareengineeringdaily.png similarity index 100% rename from src/.vuepress/public/2015-08-25-juanbenet-softwareengineeringdaily.png rename to src/assets/2015-08-25-juanbenet-softwareengineeringdaily.png diff --git a/src/.vuepress/public/2015-09-08-news-dweb-neocities.png b/src/assets/2015-09-08-news-dweb-neocities.png similarity index 100% rename from src/.vuepress/public/2015-09-08-news-dweb-neocities.png rename to src/assets/2015-09-08-news-dweb-neocities.png diff --git a/src/.vuepress/public/2015-10-04-news-toolate-techcrunch.png b/src/assets/2015-10-04-news-toolate-techcrunch.png similarity index 100% rename from src/.vuepress/public/2015-10-04-news-toolate-techcrunch.png rename to src/assets/2015-10-04-news-toolate-techcrunch.png diff --git a/src/.vuepress/public/2015-10-12-news-decentralizingweb-resellerclub.png b/src/assets/2015-10-12-news-decentralizingweb-resellerclub.png similarity index 100% rename from src/.vuepress/public/2015-10-12-news-decentralizingweb-resellerclub.png rename to src/assets/2015-10-12-news-decentralizingweb-resellerclub.png diff --git a/src/.vuepress/public/2015-10-12-news-juanbenet-epicenterbitcoin.png b/src/assets/2015-10-12-news-juanbenet-epicenterbitcoin.png similarity index 100% rename from src/.vuepress/public/2015-10-12-news-juanbenet-epicenterbitcoin.png rename to src/assets/2015-10-12-news-juanbenet-epicenterbitcoin.png diff --git a/src/.vuepress/public/2015-10-18-news-changeseverything.png b/src/assets/2015-10-18-news-changeseverything.png similarity index 100% rename from src/.vuepress/public/2015-10-18-news-changeseverything.png rename to src/assets/2015-10-18-news-changeseverything.png diff --git a/src/.vuepress/public/2016-04-14-openbazaar-nasdaq.png b/src/assets/2016-04-14-openbazaar-nasdaq.png similarity index 100% rename from src/.vuepress/public/2016-04-14-openbazaar-nasdaq.png rename to src/assets/2016-04-14-openbazaar-nasdaq.png diff --git a/src/.vuepress/public/2017-04-29-news-multiblockchain-coindesk.png b/src/assets/2017-04-29-news-multiblockchain-coindesk.png similarity index 100% rename from src/.vuepress/public/2017-04-29-news-multiblockchain-coindesk.png rename to src/assets/2017-04-29-news-multiblockchain-coindesk.png diff --git a/src/.vuepress/public/2017-05-10-news-wikipedia-observer.png b/src/assets/2017-05-10-news-wikipedia-observer.png similarity index 100% rename from src/.vuepress/public/2017-05-10-news-wikipedia-observer.png rename to src/assets/2017-05-10-news-wikipedia-observer.png diff --git a/src/.vuepress/public/2017-05-18-pl-blueyard.png b/src/assets/2017-05-18-pl-blueyard.png similarity index 100% rename from src/.vuepress/public/2017-05-18-pl-blueyard.png rename to src/assets/2017-05-18-pl-blueyard.png diff --git a/src/.vuepress/public/2017-06-20-news-distributedstorage-coincenter.png b/src/assets/2017-06-20-news-distributedstorage-coincenter.png similarity index 100% rename from src/.vuepress/public/2017-06-20-news-distributedstorage-coincenter.png rename to src/assets/2017-06-20-news-distributedstorage-coincenter.png diff --git a/src/.vuepress/public/2018-08-29-news-supplychain-rtrade.png b/src/assets/2018-08-29-news-supplychain-rtrade.png similarity index 100% rename from src/.vuepress/public/2018-08-29-news-supplychain-rtrade.png rename to src/assets/2018-08-29-news-supplychain-rtrade.png diff --git a/src/.vuepress/public/2018-09-17-news-gateway-cloudflare.png b/src/assets/2018-09-17-news-gateway-cloudflare.png similarity index 100% rename from src/.vuepress/public/2018-09-17-news-gateway-cloudflare.png rename to src/assets/2018-09-17-news-gateway-cloudflare.png diff --git a/src/.vuepress/public/2019-09-06-news-supplychain-rtrade.png b/src/assets/2019-09-06-news-supplychain-rtrade.png similarity index 100% rename from src/.vuepress/public/2019-09-06-news-supplychain-rtrade.png rename to src/assets/2019-09-06-news-supplychain-rtrade.png diff --git a/src/.vuepress/public/2020-03-02-news-images-containerjournal.png b/src/assets/2020-03-02-news-images-containerjournal.png similarity index 100% rename from src/.vuepress/public/2020-03-02-news-images-containerjournal.png rename to src/assets/2020-03-02-news-images-containerjournal.png diff --git a/src/.vuepress/public/2020-03-02-news-juanbenet-zeroknowledge.png b/src/assets/2020-03-02-news-juanbenet-zeroknowledge.png similarity index 100% rename from src/.vuepress/public/2020-03-02-news-juanbenet-zeroknowledge.png rename to src/assets/2020-03-02-news-juanbenet-zeroknowledge.png diff --git a/src/.vuepress/public/2020-03-18-covid-coindesk.png b/src/assets/2020-03-18-covid-coindesk.png similarity index 100% rename from src/.vuepress/public/2020-03-18-covid-coindesk.png rename to src/assets/2020-03-18-covid-coindesk.png diff --git a/src/.vuepress/public/2020-04-28-latestipfs-cointelegraph.png b/src/assets/2020-04-28-latestipfs-cointelegraph.png similarity index 100% rename from src/.vuepress/public/2020-04-28-latestipfs-cointelegraph.png rename to src/assets/2020-04-28-latestipfs-cointelegraph.png diff --git a/src/.vuepress/public/2020-04-30-news-latestipfs-devops.png b/src/assets/2020-04-30-news-latestipfs-devops.png similarity index 100% rename from src/.vuepress/public/2020-04-30-news-latestipfs-devops.png rename to src/assets/2020-04-30-news-latestipfs-devops.png diff --git a/src/.vuepress/public/2020-09-11-tutorial-protoschool-blogging.png b/src/assets/2020-09-11-tutorial-protoschool-blogging.png similarity index 100% rename from src/.vuepress/public/2020-09-11-tutorial-protoschool-blogging.png rename to src/assets/2020-09-11-tutorial-protoschool-blogging.png diff --git a/src/.vuepress/public/2020-09-11-tutorial-protoschool-datalinks.png b/src/assets/2020-09-11-tutorial-protoschool-datalinks.png similarity index 100% rename from src/.vuepress/public/2020-09-11-tutorial-protoschool-datalinks.png rename to src/assets/2020-09-11-tutorial-protoschool-datalinks.png diff --git a/src/.vuepress/public/2020-09-11-tutorial-protoschool-regularfilesapi.png b/src/assets/2020-09-11-tutorial-protoschool-regularfilesapi.png similarity index 100% rename from src/.vuepress/public/2020-09-11-tutorial-protoschool-regularfilesapi.png rename to src/assets/2020-09-11-tutorial-protoschool-regularfilesapi.png diff --git a/src/.vuepress/public/2020-09-18-news-permanent-vice.png b/src/assets/2020-09-18-news-permanent-vice.png similarity index 100% rename from src/.vuepress/public/2020-09-18-news-permanent-vice.png rename to src/assets/2020-09-18-news-permanent-vice.png diff --git a/src/.vuepress/public/2020-10-08-digitaleconomy-modernconsensus.png b/src/assets/2020-10-08-digitaleconomy-modernconsensus.png similarity index 100% rename from src/.vuepress/public/2020-10-08-digitaleconomy-modernconsensus.png rename to src/assets/2020-10-08-digitaleconomy-modernconsensus.png diff --git a/src/.vuepress/public/2020-12-08-news-juanbenet-coindesk.png b/src/assets/2020-12-08-news-juanbenet-coindesk.png similarity index 100% rename from src/.vuepress/public/2020-12-08-news-juanbenet-coindesk.png rename to src/assets/2020-12-08-news-juanbenet-coindesk.png diff --git a/src/.vuepress/public/2020-12-11-event-meetup.png b/src/assets/2020-12-11-event-meetup.png similarity index 100% rename from src/.vuepress/public/2020-12-11-event-meetup.png rename to src/assets/2020-12-11-event-meetup.png diff --git a/src/.vuepress/public/2020-roadmap.png b/src/assets/2020-roadmap.png similarity index 100% rename from src/.vuepress/public/2020-roadmap.png rename to src/assets/2020-roadmap.png diff --git a/src/.vuepress/public/2021-01-12-news-bigtech-newamerica.png b/src/assets/2021-01-12-news-bigtech-newamerica.png similarity index 100% rename from src/.vuepress/public/2021-01-12-news-bigtech-newamerica.png rename to src/assets/2021-01-12-news-bigtech-newamerica.png diff --git a/src/.vuepress/public/2021-01-12-tutorial-protoschool-contentaddressing.png b/src/assets/2021-01-12-tutorial-protoschool-contentaddressing.png similarity index 100% rename from src/.vuepress/public/2021-01-12-tutorial-protoschool-contentaddressing.png rename to src/assets/2021-01-12-tutorial-protoschool-contentaddressing.png diff --git a/src/.vuepress/public/2021-01-13-news-cloudflare-coindesk.png b/src/assets/2021-01-13-news-cloudflare-coindesk.png similarity index 100% rename from src/.vuepress/public/2021-01-13-news-cloudflare-coindesk.png rename to src/assets/2021-01-13-news-cloudflare-coindesk.png diff --git a/src/.vuepress/public/2021-01-14-tutorial-protoschool-merkledags.png b/src/assets/2021-01-14-tutorial-protoschool-merkledags.png similarity index 100% rename from src/.vuepress/public/2021-01-14-tutorial-protoschool-merkledags.png rename to src/assets/2021-01-14-tutorial-protoschool-merkledags.png diff --git a/src/.vuepress/public/2021-01-19-brave-enable-ipfs.gif b/src/assets/2021-01-19-brave-enable-ipfs.gif similarity index 100% rename from src/.vuepress/public/2021-01-19-brave-enable-ipfs.gif rename to src/assets/2021-01-19-brave-enable-ipfs.gif diff --git a/src/.vuepress/public/2021-01-19-ipfs-in-brave.png b/src/assets/2021-01-19-ipfs-in-brave.png similarity index 100% rename from src/.vuepress/public/2021-01-19-ipfs-in-brave.png rename to src/assets/2021-01-19-ipfs-in-brave.png diff --git a/src/.vuepress/public/2021-01-19-news-brave-braveblog.png b/src/assets/2021-01-19-news-brave-braveblog.png similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-braveblog.png rename to src/assets/2021-01-19-news-brave-braveblog.png diff --git a/src/.vuepress/public/2021-01-19-news-brave-coindesk.png b/src/assets/2021-01-19-news-brave-coindesk.png similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-coindesk.png rename to src/assets/2021-01-19-news-brave-coindesk.png diff --git a/src/.vuepress/public/2021-01-19-news-brave-decrypt.jpg b/src/assets/2021-01-19-news-brave-decrypt.jpg similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-decrypt.jpg rename to src/assets/2021-01-19-news-brave-decrypt.jpg diff --git a/src/.vuepress/public/2021-01-19-news-brave-decrypt.png b/src/assets/2021-01-19-news-brave-decrypt.png similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-decrypt.png rename to src/assets/2021-01-19-news-brave-decrypt.png diff --git a/src/.vuepress/public/2021-01-19-news-brave-engadget.png b/src/assets/2021-01-19-news-brave-engadget.png similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-engadget.png rename to src/assets/2021-01-19-news-brave-engadget.png diff --git a/src/.vuepress/public/2021-01-19-news-brave-verge.png b/src/assets/2021-01-19-news-brave-verge.png similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-verge.png rename to src/assets/2021-01-19-news-brave-verge.png diff --git a/src/.vuepress/public/2021-01-19-news-brave-zdnet.png b/src/assets/2021-01-19-news-brave-zdnet.png similarity index 100% rename from src/.vuepress/public/2021-01-19-news-brave-zdnet.png rename to src/assets/2021-01-19-news-brave-zdnet.png diff --git a/src/.vuepress/public/2021-01-21-how-we-put-ipfs-in-brave.jpg b/src/assets/2021-01-21-how-we-put-ipfs-in-brave.jpg similarity index 100% rename from src/.vuepress/public/2021-01-21-how-we-put-ipfs-in-brave.jpg rename to src/assets/2021-01-21-how-we-put-ipfs-in-brave.jpg diff --git a/src/.vuepress/public/2021-01-21-ipfs-early.png b/src/assets/2021-01-21-ipfs-early.png similarity index 100% rename from src/.vuepress/public/2021-01-21-ipfs-early.png rename to src/assets/2021-01-21-ipfs-early.png diff --git a/src/.vuepress/public/2021-01-21-ipfs-install.png b/src/assets/2021-01-21-ipfs-install.png similarity index 100% rename from src/.vuepress/public/2021-01-21-ipfs-install.png rename to src/assets/2021-01-21-ipfs-install.png diff --git a/src/.vuepress/public/2021-01-21-ipfs-streaming.jpg b/src/assets/2021-01-21-ipfs-streaming.jpg similarity index 100% rename from src/.vuepress/public/2021-01-21-ipfs-streaming.jpg rename to src/assets/2021-01-21-ipfs-streaming.jpg diff --git a/src/.vuepress/public/2021-01-22-event-meetup.png b/src/assets/2021-01-22-event-meetup.png similarity index 100% rename from src/.vuepress/public/2021-01-22-event-meetup.png rename to src/assets/2021-01-22-event-meetup.png diff --git a/src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-ethdenver2019-1.jpeg b/src/assets/2021-02-02-ipfs-at-ethdenver-ethdenver2019-1.jpeg similarity index 100% rename from src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-ethdenver2019-1.jpeg rename to src/assets/2021-02-02-ipfs-at-ethdenver-ethdenver2019-1.jpeg diff --git a/src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-ethdenver2019.jpeg b/src/assets/2021-02-02-ipfs-at-ethdenver-ethdenver2019.jpeg similarity index 100% rename from src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-ethdenver2019.jpeg rename to src/assets/2021-02-02-ipfs-at-ethdenver-ethdenver2019.jpeg diff --git a/src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-flyingspork.png b/src/assets/2021-02-02-ipfs-at-ethdenver-flyingspork.png similarity index 100% rename from src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-flyingspork.png rename to src/assets/2021-02-02-ipfs-at-ethdenver-flyingspork.png diff --git a/src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-helpdesk2020.jpg b/src/assets/2021-02-02-ipfs-at-ethdenver-helpdesk2020.jpg similarity index 100% rename from src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-helpdesk2020.jpg rename to src/assets/2021-02-02-ipfs-at-ethdenver-helpdesk2020.jpg diff --git a/src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-sportscastle.png b/src/assets/2021-02-02-ipfs-at-ethdenver-sportscastle.png similarity index 100% rename from src/.vuepress/public/2021-02-02-ipfs-at-ethdenver-sportscastle.png rename to src/assets/2021-02-02-ipfs-at-ethdenver-sportscastle.png diff --git a/src/.vuepress/public/2021-02-11-news-cointelegraph-juanbenet.png b/src/assets/2021-02-11-news-cointelegraph-juanbenet.png similarity index 100% rename from src/.vuepress/public/2021-02-11-news-cointelegraph-juanbenet.png rename to src/assets/2021-02-11-news-cointelegraph-juanbenet.png diff --git a/src/.vuepress/public/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg b/src/assets/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg similarity index 100% rename from src/.vuepress/public/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg rename to src/assets/2021-02-17-cardheader-protoschool-intro-to-libp2p.jpg diff --git a/src/.vuepress/public/2021-02-17-libp2p-ipfs-animation.gif b/src/assets/2021-02-17-libp2p-ipfs-animation.gif similarity index 100% rename from src/.vuepress/public/2021-02-17-libp2p-ipfs-animation.gif rename to src/assets/2021-02-17-libp2p-ipfs-animation.gif diff --git a/src/.vuepress/public/2021-02-17-libp2p-logo-animation.gif b/src/assets/2021-02-17-libp2p-logo-animation.gif similarity index 100% rename from src/.vuepress/public/2021-02-17-libp2p-logo-animation.gif rename to src/assets/2021-02-17-libp2p-logo-animation.gif diff --git a/src/.vuepress/public/2021-02-17-protowizard.png b/src/assets/2021-02-17-protowizard.png similarity index 100% rename from src/.vuepress/public/2021-02-17-protowizard.png rename to src/assets/2021-02-17-protowizard.png diff --git a/src/.vuepress/public/2021-02-23-event-meetup.png b/src/assets/2021-02-23-event-meetup.png similarity index 100% rename from src/.vuepress/public/2021-02-23-event-meetup.png rename to src/assets/2021-02-23-event-meetup.png diff --git a/src/.vuepress/public/2021-02-26-blog-ethdenver-winners.png b/src/assets/2021-02-26-blog-ethdenver-winners.png similarity index 100% rename from src/.vuepress/public/2021-02-26-blog-ethdenver-winners.png rename to src/assets/2021-02-26-blog-ethdenver-winners.png diff --git a/src/.vuepress/public/2021-02-26-blog-help-desk.png b/src/assets/2021-02-26-blog-help-desk.png similarity index 100% rename from src/.vuepress/public/2021-02-26-blog-help-desk.png rename to src/assets/2021-02-26-blog-help-desk.png diff --git a/src/.vuepress/public/2021-02-26-blog-virtual-castle.jpeg b/src/assets/2021-02-26-blog-virtual-castle.jpeg similarity index 100% rename from src/.vuepress/public/2021-02-26-blog-virtual-castle.jpeg rename to src/assets/2021-02-26-blog-virtual-castle.jpeg diff --git a/src/.vuepress/public/2021-03-01-cardheader-ipfs-at-ethdenver.png b/src/assets/2021-03-01-cardheader-ipfs-at-ethdenver.png similarity index 100% rename from src/.vuepress/public/2021-03-01-cardheader-ipfs-at-ethdenver.png rename to src/assets/2021-03-01-cardheader-ipfs-at-ethdenver.png diff --git a/src/.vuepress/public/2021-03-04-event-ipfs-community-meetup.jpg b/src/assets/2021-03-04-event-ipfs-community-meetup.jpg similarity index 100% rename from src/.vuepress/public/2021-03-04-event-ipfs-community-meetup.jpg rename to src/assets/2021-03-04-event-ipfs-community-meetup.jpg diff --git a/src/.vuepress/public/2021-03-15-cardheader-ipfs-for-creators.png b/src/assets/2021-03-15-cardheader-ipfs-for-creators.png similarity index 100% rename from src/.vuepress/public/2021-03-15-cardheader-ipfs-for-creators.png rename to src/assets/2021-03-15-cardheader-ipfs-for-creators.png diff --git a/src/.vuepress/public/2021-03-23-cardheader-fission-demo-day.jpg b/src/assets/2021-03-23-cardheader-fission-demo-day.jpg similarity index 100% rename from src/.vuepress/public/2021-03-23-cardheader-fission-demo-day.jpg rename to src/assets/2021-03-23-cardheader-fission-demo-day.jpg diff --git a/src/.vuepress/public/2021-03-23-cardheader-ipfs-remote-pinning.png b/src/assets/2021-03-23-cardheader-ipfs-remote-pinning.png similarity index 100% rename from src/.vuepress/public/2021-03-23-cardheader-ipfs-remote-pinning.png rename to src/assets/2021-03-23-cardheader-ipfs-remote-pinning.png diff --git a/src/.vuepress/public/2021-03-26-cardheader-127-ion-header.png b/src/assets/2021-03-26-cardheader-127-ion-header.png similarity index 100% rename from src/.vuepress/public/2021-03-26-cardheader-127-ion-header.png rename to src/assets/2021-03-26-cardheader-127-ion-header.png diff --git a/src/.vuepress/public/2021-04-05-cardheader-newblog.png b/src/assets/2021-04-05-cardheader-newblog.png similarity index 100% rename from src/.vuepress/public/2021-04-05-cardheader-newblog.png rename to src/assets/2021-04-05-cardheader-newblog.png diff --git a/src/.vuepress/public/5ms-1024MB.png b/src/assets/5ms-1024MB.png similarity index 100% rename from src/.vuepress/public/5ms-1024MB.png rename to src/assets/5ms-1024MB.png diff --git a/src/.vuepress/public/5ms-160MB.png b/src/assets/5ms-160MB.png similarity index 100% rename from src/.vuepress/public/5ms-160MB.png rename to src/assets/5ms-160MB.png diff --git a/src/.vuepress/public/5ms-20MB.png b/src/assets/5ms-20MB.png similarity index 100% rename from src/.vuepress/public/5ms-20MB.png rename to src/assets/5ms-20MB.png diff --git a/src/.vuepress/public/5ms-40MB.png b/src/assets/5ms-40MB.png similarity index 100% rename from src/.vuepress/public/5ms-40MB.png rename to src/assets/5ms-40MB.png diff --git a/src/.vuepress/public/Gossipsub_fullcolor.png b/src/assets/Gossipsub_fullcolor.png similarity index 100% rename from src/.vuepress/public/Gossipsub_fullcolor.png rename to src/assets/Gossipsub_fullcolor.png diff --git a/src/.vuepress/public/academic-paper-placeholder.png b/src/assets/academic-paper-placeholder.png similarity index 100% rename from src/.vuepress/public/academic-paper-placeholder.png rename to src/assets/academic-paper-placeholder.png diff --git a/src/.vuepress/public/alan-shaw.jpg b/src/assets/alan-shaw.jpg similarity index 100% rename from src/.vuepress/public/alan-shaw.jpg rename to src/assets/alan-shaw.jpg diff --git a/src/.vuepress/public/android-chrome-share.png b/src/assets/android-chrome-share.png similarity index 100% rename from src/.vuepress/public/android-chrome-share.png rename to src/assets/android-chrome-share.png diff --git a/src/.vuepress/public/audius-hareesh-nagaraj.png b/src/assets/audius-hareesh-nagaraj.png similarity index 100% rename from src/.vuepress/public/audius-hareesh-nagaraj.png rename to src/assets/audius-hareesh-nagaraj.png diff --git a/src/.vuepress/public/blog-125-go-ipfs-0-8-0-diagram.png b/src/assets/blog-125-go-ipfs-0-8-0-diagram.png similarity index 100% rename from src/.vuepress/public/blog-125-go-ipfs-0-8-0-diagram.png rename to src/assets/blog-125-go-ipfs-0-8-0-diagram.png diff --git a/src/.vuepress/public/blog-post-placeholder.png b/src/assets/blog-post-placeholder.png similarity index 100% rename from src/.vuepress/public/blog-post-placeholder.png rename to src/assets/blog-post-placeholder.png diff --git a/src/.vuepress/public/browser-integration.png b/src/assets/browser-integration.png similarity index 100% rename from src/.vuepress/public/browser-integration.png rename to src/assets/browser-integration.png diff --git a/src/.vuepress/public/card-placeholder.png b/src/assets/card-placeholder.png similarity index 100% rename from src/.vuepress/public/card-placeholder.png rename to src/assets/card-placeholder.png diff --git a/src/.vuepress/public/carson-farmer.jpg b/src/assets/carson-farmer.jpg similarity index 100% rename from src/.vuepress/public/carson-farmer.jpg rename to src/assets/carson-farmer.jpg diff --git a/src/.vuepress/public/chat-example.gif b/src/assets/chat-example.gif similarity index 100% rename from src/.vuepress/public/chat-example.gif rename to src/assets/chat-example.gif diff --git a/src/.vuepress/public/chrome-web-store.png b/src/assets/chrome-web-store.png similarity index 100% rename from src/.vuepress/public/chrome-web-store.png rename to src/assets/chrome-web-store.png diff --git a/src/.vuepress/public/container-image-benchmark.png b/src/assets/container-image-benchmark.png similarity index 100% rename from src/.vuepress/public/container-image-benchmark.png rename to src/assets/container-image-benchmark.png diff --git a/src/.vuepress/public/content-routing.png b/src/assets/content-routing.png similarity index 100% rename from src/.vuepress/public/content-routing.png rename to src/assets/content-routing.png diff --git a/src/.vuepress/public/contribute-to-ipfs.gif b/src/assets/contribute-to-ipfs.gif similarity index 100% rename from src/.vuepress/public/contribute-to-ipfs.gif rename to src/assets/contribute-to-ipfs.gif diff --git a/src/.vuepress/public/core-a-thumbnail.png b/src/assets/core-a-thumbnail.png similarity index 100% rename from src/.vuepress/public/core-a-thumbnail.png rename to src/assets/core-a-thumbnail.png diff --git a/src/.vuepress/public/core-elective-courses.png b/src/assets/core-elective-courses.png similarity index 100% rename from src/.vuepress/public/core-elective-courses.png rename to src/assets/core-elective-courses.png diff --git a/src/.vuepress/public/dag-deduplication.png b/src/assets/dag-deduplication.png similarity index 100% rename from src/.vuepress/public/dag-deduplication.png rename to src/assets/dag-deduplication.png diff --git a/src/.vuepress/public/deep-dives.png b/src/assets/deep-dives.png similarity index 100% rename from src/.vuepress/public/deep-dives.png rename to src/assets/deep-dives.png diff --git a/src/.vuepress/public/devs-meeting-july-2018-group.gif b/src/assets/devs-meeting-july-2018-group.gif similarity index 100% rename from src/.vuepress/public/devs-meeting-july-2018-group.gif rename to src/assets/devs-meeting-july-2018-group.gif diff --git a/src/.vuepress/public/ecosystem-diagram.png b/src/assets/ecosystem-diagram.png similarity index 100% rename from src/.vuepress/public/ecosystem-diagram.png rename to src/assets/ecosystem-diagram.png diff --git a/src/.vuepress/public/edgar-lee.jpg b/src/assets/edgar-lee.jpg similarity index 100% rename from src/.vuepress/public/edgar-lee.jpg rename to src/assets/edgar-lee.jpg diff --git a/src/.vuepress/public/embedded-js-ipfs.gif b/src/assets/embedded-js-ipfs.gif similarity index 100% rename from src/.vuepress/public/embedded-js-ipfs.gif rename to src/assets/embedded-js-ipfs.gif diff --git a/src/.vuepress/public/eth1.png b/src/assets/eth1.png similarity index 100% rename from src/.vuepress/public/eth1.png rename to src/assets/eth1.png diff --git a/src/.vuepress/public/eth2.png b/src/assets/eth2.png similarity index 100% rename from src/.vuepress/public/eth2.png rename to src/assets/eth2.png diff --git a/src/.vuepress/public/event-placeholder.png b/src/assets/event-placeholder.png similarity index 100% rename from src/.vuepress/public/event-placeholder.png rename to src/assets/event-placeholder.png diff --git a/src/.vuepress/public/firefox-add-on.png b/src/assets/firefox-add-on.png similarity index 100% rename from src/.vuepress/public/firefox-add-on.png rename to src/assets/firefox-add-on.png diff --git a/src/.vuepress/public/glen-carrie-ypttedpwpgs-unsplash-710x458.webp b/src/assets/glen-carrie-ypttedpwpgs-unsplash-710x458.webp similarity index 100% rename from src/.vuepress/public/glen-carrie-ypttedpwpgs-unsplash-710x458.webp rename to src/assets/glen-carrie-ypttedpwpgs-unsplash-710x458.webp diff --git a/src/.vuepress/public/go-ipfs-as-a-library.gif b/src/assets/go-ipfs-as-a-library.gif similarity index 100% rename from src/.vuepress/public/go-ipfs-as-a-library.gif rename to src/assets/go-ipfs-as-a-library.gif diff --git a/src/.vuepress/public/go-ipfs-release-process.png b/src/assets/go-ipfs-release-process.png similarity index 100% rename from src/.vuepress/public/go-ipfs-release-process.png rename to src/assets/go-ipfs-release-process.png diff --git a/src/.vuepress/public/gossipsubv1.1-jupyter.gif b/src/assets/gossipsubv1.1-jupyter.gif similarity index 100% rename from src/.vuepress/public/gossipsubv1.1-jupyter.gif rename to src/assets/gossipsubv1.1-jupyter.gif diff --git a/src/.vuepress/public/header-image-ion.png b/src/assets/header-image-ion.png similarity index 100% rename from src/.vuepress/public/header-image-ion.png rename to src/assets/header-image-ion.png diff --git a/src/.vuepress/public/header-image-ipfs-weekly-placeholder.png b/src/assets/header-image-ipfs-weekly-placeholder.png similarity index 100% rename from src/.vuepress/public/header-image-ipfs-weekly-placeholder.png rename to src/assets/header-image-ipfs-weekly-placeholder.png diff --git a/src/.vuepress/public/header-image-js-ipfs-placeholder.png b/src/assets/header-image-js-ipfs-placeholder.png similarity index 100% rename from src/.vuepress/public/header-image-js-ipfs-placeholder.png rename to src/assets/header-image-js-ipfs-placeholder.png diff --git a/src/.vuepress/public/header-image-libp2p.png b/src/assets/header-image-libp2p.png similarity index 100% rename from src/.vuepress/public/header-image-libp2p.png rename to src/assets/header-image-libp2p.png diff --git a/src/.vuepress/public/header-image-placeholder.png b/src/assets/header-image-placeholder.png similarity index 100% rename from src/.vuepress/public/header-image-placeholder.png rename to src/assets/header-image-placeholder.png diff --git a/src/.vuepress/public/header-image-weekly-newsletter.png b/src/assets/header-image-weekly-newsletter.png similarity index 100% rename from src/.vuepress/public/header-image-weekly-newsletter.png rename to src/assets/header-image-weekly-newsletter.png diff --git a/src/.vuepress/public/ion-explorer.png b/src/assets/ion-explorer.png similarity index 100% rename from src/.vuepress/public/ion-explorer.png rename to src/assets/ion-explorer.png diff --git a/src/.vuepress/public/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png b/src/assets/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png similarity index 100% rename from src/.vuepress/public/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png rename to src/assets/ipfs-and-igalia-collaborate-on-dweb-in-browsers-header-image.png diff --git a/src/.vuepress/public/ipfs-camp-2019-campus.jpeg b/src/assets/ipfs-camp-2019-campus.jpeg similarity index 100% rename from src/.vuepress/public/ipfs-camp-2019-campus.jpeg rename to src/assets/ipfs-camp-2019-campus.jpeg diff --git a/src/.vuepress/public/ipcs-camp-2019-recap.png b/src/assets/ipfs-camp-2019-recap.png similarity index 100% rename from src/.vuepress/public/ipcs-camp-2019-recap.png rename to src/assets/ipfs-camp-2019-recap.png diff --git a/src/.vuepress/public/ipfs-camp-2019.png b/src/assets/ipfs-camp-2019.png similarity index 100% rename from src/.vuepress/public/ipfs-camp-2019.png rename to src/assets/ipfs-camp-2019.png diff --git a/src/.vuepress/public/ipfs-dead-drop.jpeg b/src/assets/ipfs-dead-drop.jpeg similarity index 100% rename from src/.vuepress/public/ipfs-dead-drop.jpeg rename to src/assets/ipfs-dead-drop.jpeg diff --git a/src/.vuepress/public/ipfs-devs-meeting-july-2018.png b/src/assets/ipfs-devs-meeting-july-2018.png similarity index 100% rename from src/.vuepress/public/ipfs-devs-meeting-july-2018.png rename to src/assets/ipfs-devs-meeting-july-2018.png diff --git a/src/.vuepress/public/ipfs-ecosystem-diagram.png b/src/assets/ipfs-ecosystem-diagram.png similarity index 100% rename from src/.vuepress/public/ipfs-ecosystem-diagram.png rename to src/assets/ipfs-ecosystem-diagram.png diff --git a/src/.vuepress/public/ipfs-ecosystem-molly-mackinlay.png b/src/assets/ipfs-ecosystem-molly-mackinlay.png similarity index 100% rename from src/.vuepress/public/ipfs-ecosystem-molly-mackinlay.png rename to src/assets/ipfs-ecosystem-molly-mackinlay.png diff --git a/src/.vuepress/public/ipfs-ethdenver-2020.png b/src/assets/ipfs-ethdenver-2020.png similarity index 100% rename from src/.vuepress/public/ipfs-ethdenver-2020.png rename to src/assets/ipfs-ethdenver-2020.png diff --git a/src/.vuepress/public/ipfs-using-crdt.png b/src/assets/ipfs-using-crdt.png similarity index 100% rename from src/.vuepress/public/ipfs-using-crdt.png rename to src/assets/ipfs-using-crdt.png diff --git a/src/.vuepress/public/ipfs-webui-explore.png b/src/assets/ipfs-webui-explore.png similarity index 100% rename from src/.vuepress/public/ipfs-webui-explore.png rename to src/assets/ipfs-webui-explore.png diff --git a/src/.vuepress/public/ipfs-webui-files.png b/src/assets/ipfs-webui-files.png similarity index 100% rename from src/.vuepress/public/ipfs-webui-files.png rename to src/assets/ipfs-webui-files.png diff --git a/src/.vuepress/public/ipfs-webui-peers.png b/src/assets/ipfs-webui-peers.png similarity index 100% rename from src/.vuepress/public/ipfs-webui-peers.png rename to src/assets/ipfs-webui-peers.png diff --git a/src/.vuepress/public/ipfs-webui-settings.png b/src/assets/ipfs-webui-settings.png similarity index 100% rename from src/.vuepress/public/ipfs-webui-settings.png rename to src/assets/ipfs-webui-settings.png diff --git a/src/.vuepress/public/ipfs-webui-status.png b/src/assets/ipfs-webui-status.png similarity index 100% rename from src/.vuepress/public/ipfs-webui-status.png rename to src/assets/ipfs-webui-status.png diff --git a/src/.vuepress/public/lgierth-in-paris.jpeg b/src/assets/lgierth-in-paris.jpeg similarity index 100% rename from src/.vuepress/public/lgierth-in-paris.jpeg rename to src/assets/lgierth-in-paris.jpeg diff --git a/src/.vuepress/public/lightning-talks.png b/src/assets/lightning-talks.png similarity index 100% rename from src/.vuepress/public/lightning-talks.png rename to src/assets/lightning-talks.png diff --git a/src/.vuepress/public/netflix-containers-edgar-lee.png b/src/assets/netflix-containers-edgar-lee.png similarity index 100% rename from src/.vuepress/public/netflix-containers-edgar-lee.png rename to src/assets/netflix-containers-edgar-lee.png diff --git a/src/.vuepress/public/news-coverage-placeholder.png b/src/assets/news-coverage-placeholder.png similarity index 100% rename from src/.vuepress/public/news-coverage-placeholder.png rename to src/assets/news-coverage-placeholder.png diff --git a/src/.vuepress/public/opera-android-banner.png b/src/assets/opera-android-banner.png similarity index 100% rename from src/.vuepress/public/opera-android-banner.png rename to src/assets/opera-android-banner.png diff --git a/src/.vuepress/public/opera-ios-app-store-short.png b/src/assets/opera-ios-app-store-short.png similarity index 100% rename from src/.vuepress/public/opera-ios-app-store-short.png rename to src/assets/opera-ios-app-store-short.png diff --git a/src/.vuepress/public/opera-ios-app-store.png b/src/assets/opera-ios-app-store.png similarity index 100% rename from src/.vuepress/public/opera-ios-app-store.png rename to src/assets/opera-ios-app-store.png diff --git a/src/.vuepress/public/opera-ios-wikipedia-short.png b/src/assets/opera-ios-wikipedia-short.png similarity index 100% rename from src/.vuepress/public/opera-ios-wikipedia-short.png rename to src/assets/opera-ios-wikipedia-short.png diff --git a/src/.vuepress/public/opera-ios-wikipedia.png b/src/assets/opera-ios-wikipedia.png similarity index 100% rename from src/.vuepress/public/opera-ios-wikipedia.png rename to src/assets/opera-ios-wikipedia.png diff --git a/src/.vuepress/public/opera-ipfs-header.png b/src/assets/opera-ipfs-header.png similarity index 100% rename from src/.vuepress/public/opera-ipfs-header.png rename to src/assets/opera-ipfs-header.png diff --git a/src/.vuepress/public/p2p-image-distribution.png b/src/assets/p2p-image-distribution.png similarity index 100% rename from src/.vuepress/public/p2p-image-distribution.png rename to src/assets/p2p-image-distribution.png diff --git a/src/.vuepress/public/p2plab.png b/src/assets/p2plab.png similarity index 100% rename from src/.vuepress/public/p2plab.png rename to src/assets/p2plab.png diff --git a/src/.vuepress/public/paper.png b/src/assets/paper.png similarity index 100% rename from src/.vuepress/public/paper.png rename to src/assets/paper.png diff --git a/src/.vuepress/public/poster-projects.png b/src/assets/poster-projects.png similarity index 100% rename from src/.vuepress/public/poster-projects.png rename to src/assets/poster-projects.png diff --git a/src/.vuepress/public/proposals.png b/src/assets/proposals.png similarity index 100% rename from src/.vuepress/public/proposals.png rename to src/assets/proposals.png diff --git a/src/.vuepress/public/protocol-labs-press-kit.zip b/src/assets/protocol-labs-press-kit.zip similarity index 100% rename from src/.vuepress/public/protocol-labs-press-kit.zip rename to src/assets/protocol-labs-press-kit.zip diff --git a/src/.vuepress/public/protowizard.png b/src/assets/protowizard.png similarity index 100% rename from src/.vuepress/public/protowizard.png rename to src/assets/protowizard.png diff --git a/src/.vuepress/public/release-notes-placeholder.png b/src/assets/release-notes-placeholder.png similarity index 100% rename from src/.vuepress/public/release-notes-placeholder.png rename to src/assets/release-notes-placeholder.png diff --git a/src/.vuepress/public/report-eval.png b/src/assets/report-eval.png similarity index 100% rename from src/.vuepress/public/report-eval.png rename to src/assets/report-eval.png diff --git a/src/.vuepress/public/report-la.png b/src/assets/report-la.png similarity index 100% rename from src/.vuepress/public/report-la.png rename to src/assets/report-la.png diff --git a/src/.vuepress/public/rust-ipfs-timeline.png b/src/assets/rust-ipfs-timeline.png similarity index 100% rename from src/.vuepress/public/rust-ipfs-timeline.png rename to src/assets/rust-ipfs-timeline.png diff --git a/src/.vuepress/public/sci-fi-fair.png b/src/assets/sci-fi-fair.png similarity index 100% rename from src/.vuepress/public/sci-fi-fair.png rename to src/assets/sci-fi-fair.png diff --git a/src/.vuepress/public/screenshot.png b/src/assets/screenshot.png similarity index 100% rename from src/.vuepress/public/screenshot.png rename to src/assets/screenshot.png diff --git a/src/.vuepress/public/security-model.png b/src/assets/security-model.png similarity index 100% rename from src/.vuepress/public/security-model.png rename to src/assets/security-model.png diff --git a/src/.vuepress/public/social-card.png b/src/assets/social-card.png similarity index 100% rename from src/.vuepress/public/social-card.png rename to src/assets/social-card.png diff --git a/src/.vuepress/public/station.png b/src/assets/station.png similarity index 100% rename from src/.vuepress/public/station.png rename to src/assets/station.png diff --git a/src/.vuepress/public/status-recover.png b/src/assets/status-recover.png similarity index 100% rename from src/.vuepress/public/status-recover.png rename to src/assets/status-recover.png diff --git a/src/.vuepress/public/talk-rod.png b/src/assets/talk-rod.png similarity index 100% rename from src/.vuepress/public/talk-rod.png rename to src/assets/talk-rod.png diff --git a/src/.vuepress/public/talk-tara.png b/src/assets/talk-tara.png similarity index 100% rename from src/.vuepress/public/talk-tara.png rename to src/assets/talk-tara.png diff --git a/src/.vuepress/public/top-ipfs-users.png b/src/assets/top-ipfs-users.png similarity index 100% rename from src/.vuepress/public/top-ipfs-users.png rename to src/assets/top-ipfs-users.png diff --git a/src/.vuepress/public/tutorial-20210210-cloudflare-ipfs.png b/src/assets/tutorial-20210210-cloudflare-ipfs.png similarity index 100% rename from src/.vuepress/public/tutorial-20210210-cloudflare-ipfs.png rename to src/assets/tutorial-20210210-cloudflare-ipfs.png diff --git a/src/.vuepress/public/tutorial-placeholder.png b/src/assets/tutorial-placeholder.png similarity index 100% rename from src/.vuepress/public/tutorial-placeholder.png rename to src/assets/tutorial-placeholder.png diff --git a/src/.vuepress/public/types.png b/src/assets/types.png similarity index 100% rename from src/.vuepress/public/types.png rename to src/assets/types.png diff --git a/src/.vuepress/public/unconf.png b/src/assets/unconf.png similarity index 100% rename from src/.vuepress/public/unconf.png rename to src/assets/unconf.png diff --git a/src/.vuepress/public/weekly-008-webui.gif b/src/assets/weekly-008-webui.gif similarity index 100% rename from src/.vuepress/public/weekly-008-webui.gif rename to src/assets/weekly-008-webui.gif diff --git a/src/.vuepress/public/weekly-009-lisbon.png b/src/assets/weekly-009-lisbon.png similarity index 100% rename from src/.vuepress/public/weekly-009-lisbon.png rename to src/assets/weekly-009-lisbon.png diff --git a/src/.vuepress/public/weekly-009-neo.jpg b/src/assets/weekly-009-neo.jpg similarity index 100% rename from src/.vuepress/public/weekly-009-neo.jpg rename to src/assets/weekly-009-neo.jpg diff --git a/src/.vuepress/public/weekly-009-orbit.png b/src/assets/weekly-009-orbit.png similarity index 100% rename from src/.vuepress/public/weekly-009-orbit.png rename to src/assets/weekly-009-orbit.png diff --git a/src/.vuepress/public/weekly-010-ipfs-boston.jpg b/src/assets/weekly-010-ipfs-boston.jpg similarity index 100% rename from src/.vuepress/public/weekly-010-ipfs-boston.jpg rename to src/assets/weekly-010-ipfs-boston.jpg diff --git a/src/.vuepress/public/weekly-010-js-libp2p.png b/src/assets/weekly-010-js-libp2p.png similarity index 100% rename from src/.vuepress/public/weekly-010-js-libp2p.png rename to src/assets/weekly-010-js-libp2p.png diff --git a/src/.vuepress/public/weekly-010-orbit.png b/src/assets/weekly-010-orbit.png similarity index 100% rename from src/.vuepress/public/weekly-010-orbit.png rename to src/assets/weekly-010-orbit.png diff --git a/src/.vuepress/public/weekly-5-hightlight.jpeg b/src/assets/weekly-5-hightlight.jpeg similarity index 100% rename from src/.vuepress/public/weekly-5-hightlight.jpeg rename to src/assets/weekly-5-hightlight.jpeg diff --git a/src/.vuepress/public/why-ipfs-juan-benet.png b/src/assets/why-ipfs-juan-benet.png similarity index 100% rename from src/.vuepress/public/why-ipfs-juan-benet.png rename to src/assets/why-ipfs-juan-benet.png