CINXE.COM
ProtoSchool | Interactive tutorials on decentralized web protocols
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="google-site-verification" content="kex8f9OaacZS2GAJ_M5UupW0x-h4X3zYj8qaPJNV2JM"><link rel="icon" href="/favicon.png"><link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet"><style>body { font-family: 'Roboto', sans-serif; }</style><link href="/css/build~contribute~course~error~events~home~host~lessons~news~resources~tutorial~tutorials.9f55d702.css" rel="prefetch"><link href="/css/course.31c08d4e.css" rel="prefetch"><link href="/css/course~tutorials.27374047.css" rel="prefetch"><link href="/css/events.4c481b3e.css" rel="prefetch"><link href="/css/home.c0f58b45.css" rel="prefetch"><link href="/css/host.31c08d4e.css" rel="prefetch"><link href="/css/lessons~news~resources.20a35763.css" rel="prefetch"><link href="/css/lessons~resources.3652ded5.css" rel="prefetch"><link href="/css/news.e977f534.css" rel="prefetch"><link href="/css/tutorial.03be5c30.css" rel="prefetch"><link href="/css/tutorials.add412f2.css" rel="prefetch"><link href="/js/build.943932f9.js" rel="prefetch"><link href="/js/build~contribute~course~error~events~home~host~lessons~news~resources~tutorial~tutorials.b8a0a0f7.js" rel="prefetch"><link href="/js/chunk-2d2308b7.6545c029.js" rel="prefetch"><link href="/js/chunk-57f93a34.17161cb9.js" rel="prefetch"><link href="/js/contribute.e80e18ae.js" rel="prefetch"><link href="/js/course.bbd1c058.js" rel="prefetch"><link href="/js/course~home~lessons~resources~tutorial~tutorials.079464d3.js" rel="prefetch"><link href="/js/course~tutorials.e74c9221.js" rel="prefetch"><link href="/js/error.40b634fd.js" rel="prefetch"><link href="/js/events.e291911a.js" rel="prefetch"><link href="/js/home.c4f67a23.js" rel="prefetch"><link href="/js/host.8f5c6970.js" rel="prefetch"><link href="/js/lessons.bc344ab5.js" rel="prefetch"><link href="/js/lessons~news~resources.22b8280e.js" rel="prefetch"><link href="/js/lessons~resources.b1f7d577.js" rel="prefetch"><link href="/js/news.8f7b61c4.js" rel="prefetch"><link href="/js/resources.4d6694a0.js" rel="prefetch"><link href="/js/tutorial.844a23e6.js" rel="prefetch"><link href="/js/tutorials.afeff307.js" rel="prefetch"><link href="/css/app.1237bf28.css" rel="preload" as="style"><link href="/css/chunk-vendors.a4530562.css" rel="preload" as="style"><link href="/js/app.2bf6cc0e.js" rel="preload" as="script"><link href="/js/chunk-vendors.15f6ce0a.js" rel="preload" as="script"><link href="/css/chunk-vendors.a4530562.css" rel="stylesheet"><link href="/css/app.1237bf28.css" rel="stylesheet"><style type="text/css">.resize-observer[data-v-8859cc6c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-8859cc6c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}</style><link rel="stylesheet" type="text/css" href="/css/build~contribute~course~error~events~home~host~lessons~news~resources~tutorial~tutorials.9f55d702.css"><script charset="utf-8" src="/js/build~contribute~course~error~events~home~host~lessons~news~resources~tutorial~tutorials.b8a0a0f7.js"></script><script charset="utf-8" src="/js/course~home~lessons~resources~tutorial~tutorials.079464d3.js"></script><link rel="stylesheet" type="text/css" href="/css/home.c0f58b45.css"><script charset="utf-8" src="/js/home.c4f67a23.js"></script><title>ProtoSchool | Interactive tutorials on decentralized web protocols</title><link data-vue-meta="1" rel="canonical" href="https://proto.school/"><meta data-vue-meta="1" property="og:url" content="https://proto.school/" data-vmid="og:url"><meta data-vue-meta="1" property="og:type" content="website" data-vmid="og:type"><meta data-vue-meta="1" property="og:image" content="https://proto.school/social-tiles/twitter/brand.jpg" data-vmid="og:image"><meta data-vue-meta="1" property="og:site_name" content="ProtoSchool" data-vmid="og:site_name"><meta data-vue-meta="1" name="twitter:card" content="summary_large_image" data-vmid="twitter:card"><meta data-vue-meta="1" name="twitter:image" content="https://proto.school/social-tiles/twitter/brand.jpg" data-vmid="twitter:image"><meta data-vue-meta="1" name="twitter:image:alt" content="ProtoSchool: Interactive tutorials on decentralized web protocols" data-vmid="twitter:image:alt"><meta data-vue-meta="1" name="twitter:site" content="@ProtoSchool" data-vmid="twitter:site"><meta data-vue-meta="1" property="og:title" content="ProtoSchool | Interactive tutorials on decentralized web protocols" data-vmid="og:title"><meta data-vue-meta="1" property="og:description" content="Interactive tutorials on decentralized web protocols. Explore IPFS and Filecoin through code challenges, code-free lessons, and local events." data-vmid="og:description"><meta data-vue-meta="1" name="description" content="Interactive tutorials on decentralized web protocols. Explore IPFS and Filecoin through code challenges, code-free lessons, and local events." data-vmid="description"></head><body><noscript><strong>We're sorry but ProtoSchool doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"><div><div data-v-4cf932a9="" class="home" current="Home"><header data-v-4cf932a9=""><section data-v-4cf932a9="" class="bg-navy white pv3"><div data-v-4cf932a9="" class="flex-auto flex items-center center mw7 ph3"><a data-v-4cf932a9="" href="/" aria-current="page" class="router-link-exact-active router-link-active"><svg data-v-4cf932a9="" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116 135" alt="ProtoSchool" class="w3"><path data-v-4cf932a9="" d="M58.291 0L0 33.518v67.035l58 33.517 58-33.517V33.518L58.291 0zm53.92 44.593l-33.226-27.98 33.518 19.236v8.744h-.292zM13.407 63.246L25.94 28.563l8.16-1.457-20.693 36.14zm23.025-34.1h43.719l21.859 37.89-21.86 37.889H36.433l-21.86-37.89 21.86-37.89zM11.658 67.909l20.694 36.141L8.744 75.779l2.914-7.87zm65.578 39.93l-36.14 6.412-5.247-6.412h41.387zm25.94-37.015l-12.533 34.684-8.16 1.457 20.693-36.14zm1.749-4.663L83.94 30.02l23.608 28.27-2.623 7.87zm-65.87-39.93l36.141-6.412 5.246 6.412H39.055zm35.85-9.035l-44.01 7.87 37.014-13.408 6.995 5.538zM23.316 27.688L8.16 69.658l6.995-39.055 8.16-2.915zM6.704 77.528l28.562 34.392L4.955 86.271l1.749-8.743zm34.974 39.638l44.01-7.87-37.306 13.408-6.704-5.538zm51.588-10.784l15.156-41.97-6.995 39.055-8.16 2.915zm16.613-49.84l-28.854-34.1L111.337 47.8l-1.458 8.744zM65.869 9.036L24.774 23.9 58.29 4.663l7.578 4.372zM11.95 31.477L4.08 74.613V35.85l7.87-4.372zm-7.869 58l33.518 27.98L4.08 98.221v-8.744zm46.634 35.558l41.095-14.864-33.517 19.236-7.578-4.372zm53.919-22.442l7.578-43.136v38.764l-7.578 4.372z" fill="url(#paint0_linear)"></path><defs data-v-4cf932a9=""><linearGradient data-v-4cf932a9="" id="paint0_linear" x1=".136" y1="67.052" x2="116.42" y2="67.052" gradientUnits="userSpaceOnUse"><stop data-v-4cf932a9="" stop-color="#22F2AD"></stop><stop data-v-4cf932a9="" offset="1" stop-color="#AB21F4"></stop></linearGradient></defs></svg></a><div data-v-4cf932a9="" class="header-text ml3"><a data-v-4cf932a9="" href="/" aria-current="page" class=" header-title ma0 fw4 white router-link-exact-active router-link-active"><span data-v-4cf932a9="" class="montserrat fw4">Proto</span><span data-v-4cf932a9="" class="montserrat fw2">School</span></a><div data-v-4cf932a9="" class="header-slogan ma0 montserrat fw3"> Interactive tutorials on decentralized web protocols </div></div></div></section><nav data-v-133bbc60="" data-v-4cf932a9="" class="bg-aqua"><div data-v-133bbc60="" class="dn db-ns center mw7 pv3 ph3"><div data-v-133bbc60="" class="link-list dn flex overflow-auto items-center bg-aqua white tc mw7"><a data-v-133bbc60="" href="/" aria-current="page" class="router-link-exact-active router-link-active white nav-link"> Home </a><a data-v-133bbc60="" href="/tutorials" class="navy nav-link"> Tutorials </a><a data-v-133bbc60="" href="/events" class="navy nav-link"> Events </a><a data-v-133bbc60="" href="/contribute" class="navy nav-link"> Contribute </a><a data-v-133bbc60="" href="/host" class="navy nav-link"> Host </a><a data-v-133bbc60="" href="/build" class="navy nav-link"> Build </a><a data-v-133bbc60="" href="/news" class="navy nav-link"> News </a></div></div><div data-v-133bbc60="" class="db dn-ns"><div data-v-133bbc60="" class="flex items-center bg-aqua ph3 pv3 w-100"><div data-v-133bbc60="" class="flex-auto link fw6 f5 db bb border-aqua">Home</div><button data-v-133bbc60="" class="menu-toggle button-reset bg-transparent b--transparent"><svg data-v-133bbc60="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="#2c3e50" stroke-width="3" style="display:inline-block;vertical-align:middle;overflow:visible;" alt="open navigation menu" class=""><path data-v-133bbc60="" d="M0 2.5 L16 2.5"></path><path data-v-133bbc60="" d="M0 8 L16 8"></path><path data-v-133bbc60="" d="M0 13.5 L16 13.5"></path></svg></button></div><div data-v-133bbc60="" class="dn"><div data-v-133bbc60="" class="tc bg-aqua-muted white"><div data-v-133bbc60=""><a data-v-133bbc60="" href="/" aria-current="page" class="router-link-exact-active router-link-active white link pa3 fw5 f4 db bb border-aqua">Home</a></div><div data-v-133bbc60=""><a data-v-133bbc60="" href="/tutorials" class="navy link pa3 fw5 f4 db bb border-aqua">Tutorials</a></div><div data-v-133bbc60=""><a data-v-133bbc60="" href="/events" class="navy link pa3 fw5 f4 db bb border-aqua">Events</a></div><div data-v-133bbc60=""><a data-v-133bbc60="" href="/contribute" class="navy link pa3 fw5 f4 db bb border-aqua">Contribute</a></div><div data-v-133bbc60=""><a data-v-133bbc60="" href="/host" class="navy link pa3 fw5 f4 db bb border-aqua">Host</a></div><div data-v-133bbc60=""><a data-v-133bbc60="" href="/build" class="navy link pa3 fw5 f4 db bb border-aqua">Build</a></div><div data-v-133bbc60=""><a data-v-133bbc60="" href="/news" class="navy link pa3 fw5 f4 db bb border-aqua">News</a></div></div></div></div></nav></header></div><section class="mw7 center ph3"><h1 class="mt4">Interactive Tutorials</h1><p class="f4 fw5 lh-copy ma0 pb3"> Our self-guided interactive tutorials are designed to introduce you to decentralized web concepts, protocols, and tools. Select your topic and track your progress as you go, in a format that's right for you. Complete JavaScript code challenges right in your web browser or stick to our text-based or multiple-choice tutorials for a code-free experience.</p><div><a data-v-836385cc="" href="/tutorials" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 mb2 mr3"> View All Tutorials </a><a data-v-836385cc="" href="/build" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 mb2"> Build a Tutorial </a></div><h2 id="featured">Featured Tutorials</h2><div data-v-df9430c4="" class="tutorials-grid flex flex-wrap justify-between"><div data-v-02a5d413="" data-v-4b740afc="" data-v-df9430c4="" class="card br3 tutorial flex mb4 tutorial"><a data-v-4b740afc="" href="/content-addressing" class="flex flex-column w-100 pa4 no-underline" data-v-02a5d413=""><div data-v-4b740afc="" class="flex items-center justify-between mb3"><div data-v-4b740afc="" class="flex items-center"><svg data-v-4b740afc="" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116 135" class="mr2" style="height: 23px;"><path d="M58.291 0L0 33.518v67.035l58 33.517 58-33.517V33.518L58.291 0zm53.92 44.593l-33.226-27.98 33.518 19.236v8.744h-.292zM13.407 63.246L25.94 28.563l8.16-1.457-20.693 36.14zm23.025-34.1h43.719l21.859 37.89-21.86 37.889H36.433l-21.86-37.89 21.86-37.89zM11.658 67.909l20.694 36.141L8.744 75.779l2.914-7.87zm65.578 39.93l-36.14 6.412-5.247-6.412h41.387zm25.94-37.015l-12.533 34.684-8.16 1.457 20.693-36.14zm1.749-4.663L83.94 30.02l23.608 28.27-2.623 7.87zm-65.87-39.93l36.141-6.412 5.246 6.412H39.055zm35.85-9.035l-44.01 7.87 37.014-13.408 6.995 5.538zM23.316 27.688L8.16 69.658l6.995-39.055 8.16-2.915zM6.704 77.528l28.562 34.392L4.955 86.271l1.749-8.743zm34.974 39.638l44.01-7.87-37.306 13.408-6.704-5.538zm51.588-10.784l15.156-41.97-6.995 39.055-8.16 2.915zm16.613-49.84l-28.854-34.1L111.337 47.8l-1.458 8.744zM65.869 9.036L24.774 23.9 58.29 4.663l7.578 4.372zM11.95 31.477L4.08 74.613V35.85l7.87-4.372zm-7.869 58l33.518 27.98L4.08 98.221v-8.744zm46.634 35.558l41.095-14.864-33.517 19.236-7.578-4.372zm53.919-22.442l7.578-43.136v38.764l-7.578 4.372z" fill="url(#paint0_linear)"></path><defs><linearGradient id="paint0_linear" x1=".136" y1="67.052" x2="116.42" y2="67.052" gradientUnits="userSpaceOnUse"><stop stop-color="#22F2AD"></stop><stop offset="1" stop-color="#AB21F4"></stop></linearGradient></defs></svg><div data-v-4b740afc="" class="f6 mv0 fw5 charcoal-muted">DWeb Concepts</div></div><!----></div><div data-v-4b740afc="" class="flex flex-row justify-between items-start navy"><div data-v-4b740afc="" data-cy="tutorial-card-title" class="ma0 f3 fw7">Content Addressing on the Decentralized Web</div><svg data-v-4b740afc="" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 50 50" alt="Text only" class="h2 ml3 type-icon has-tooltip" data-original-title="null"><path d="M12.92 35.38h26.66V42H12.92a2.5 2.5 0 01-2.5-2.5v-1.62a2.5 2.5 0 012.5-2.5z" stroke-miterlimit="10" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="3px"></path><path d="M17.42 15.55h15M17.42 21.55h11" stroke-linejoin="round" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="3px"></path><path d="M10.42 37.18V10.66A2.66 2.66 0 0113 8h26.58v29.18" stroke-miterlimit="10" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="3px"></path></svg></div><p data-v-4b740afc="" class="f5 fw5 ma0 mt3 lh-copy dark-gray">Learn how hashing and content addressing enable verifiable data sharing with peers on the decentralized web.</p></a></div><div data-v-02a5d413="" data-v-4b740afc="" data-v-df9430c4="" class="card br3 tutorial flex mb4 tutorial"><a data-v-4b740afc="" href="/merkle-dags" class="flex flex-column w-100 pa4 no-underline" data-v-02a5d413=""><div data-v-4b740afc="" class="flex items-center justify-between mb3"><div data-v-4b740afc="" class="flex items-center"><svg data-v-4b740afc="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 81" class="mr2" style="height: 23px;"><g fill-rule="nonzero" fill="none"><path d="M70.638 58.696V21.994c0-1.25-.667-2.405-1.75-3.03L37.103.613a3.499 3.499 0 00-3.498 0L1.82 18.963a3.498 3.498 0 00-1.75 3.03v36.703c0 1.25.667 2.405 1.75 3.03l31.785 18.35a3.499 3.499 0 003.498 0l31.785-18.35a3.498 3.498 0 001.75-3.03z" fill="#1D74F2"></path><g transform="translate(3.754 4.692)" fill="#FFF"><path d="M31.6 70.24L1.23 52.455V19.034L31.6 1.066l.043.024L61.97 18.317v34.139l-.043.025L31.6 70.239v.001zM1.402 52.356L31.6 70.039l30.198-17.682v-33.94L31.6 1.266 1.402 19.132v33.225-.001z"></path><path d="M30.909 10.953h1.382v59.186h-1.382z"></path><circle cx="31.6" cy="11.068" r="2.175"></circle><path d="M30.939 27.127l-6.642-4.196v-8.048h1.382v7.287l5.998 3.789z"></path><g transform="translate(31.346 32.284)"><path d="M.784 22.438L.046 21.27l22.73-14.36V3.77h1.383v3.903z"></path><circle cx="23.468" cy="2.308" r="2.175"></circle></g><path d="M42.357 31.103h1.382v16.121h-1.382V31.103zM31.086 43.632L14.26 34.383V27.01h1.382v6.58l16.139 8.848-.695 1.194z"></path><circle cx="14.951" cy="26.396" r="2.175"></circle><circle cx="24.988" cy="16.52" r="2.175"></circle><g transform="translate(31.158 22.149)"><path d="M14.308 3.784v3.143L.124 15.887c.011.533.03 1.068.049 1.603L15.69 7.688V3.785h-1.382v-.001z"></path><circle cx="14.999" cy="2.323" r="2.175"></circle></g><path d="M32.08 31.103l6.641-4.195v-8.049H37.34v7.287l-5.998 3.789z"></path><circle cx="38.03" cy="18.859" r="2.175"></circle><circle cx="24.657" cy="30.397" r="2.175"></circle><path d="M23.966 30.917h1.382v8.687h-1.382z"></path><g transform="translate(6.194 34.537)"><path d="M25.031 20.367l.739-1.168L3.038 6.804V3.662H1.656v3.904z"></path><circle cx="2.347" cy="2.201" r="2.175"></circle></g><path d="M16.78 35.652h1.238v11.171H16.78z"></path><circle cx="31.6" cy="69.912" r="1.213"></circle><g transform="translate(0 18.02)"><circle cx="1.23" cy="34.437" r="1.213"></circle><circle cx="1.23" cy="1.351" r="1.213"></circle></g><g transform="translate(60.627 18.02)"><circle cx="1.343" cy="34.359" r="1.213"></circle><circle cx="1.343" cy="1.273" r="1.213"></circle></g><circle cx="31.599" cy="1.393" r="1.213"></circle></g></g></svg><div data-v-4b740afc="" class="f6 mv0 fw5 charcoal-muted">IPLD</div></div><!----></div><div data-v-4b740afc="" class="flex flex-row justify-between items-start navy"><div data-v-4b740afc="" data-cy="tutorial-card-title" class="ma0 f3 fw7">Merkle DAGs: Structuring Data for the Distributed Web</div><svg data-v-4b740afc="" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" alt="Multiple-choice quizzes" class="h2 ml3 type-icon has-tooltip" data-original-title="null"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 14.2h-19.8" class="cls-1"></path><circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" cx="13.08" cy="14.2" r="2.7" class="cls-1"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 25h-19.8" class="cls-1"></path><circle cx="13.08" cy="25" r="2.7" fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 35.8h-19.8" class="cls-1"></path><circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" cx="13.08" cy="35.8" r="2.7" class="cls-1"></circle></svg></div><p data-v-4b740afc="" class="f5 fw5 ma0 mt3 lh-copy dark-gray">Learn how we can use CIDs to create content-addressable data structures for the distributed web!</p></a></div><div data-v-02a5d413="" data-v-4b740afc="" data-v-df9430c4="" class="card br3 tutorial flex mb4 tutorial"><a data-v-4b740afc="" href="/introduction-to-libp2p" class="flex flex-column w-100 pa4 no-underline" data-v-02a5d413=""><div data-v-4b740afc="" class="flex items-center justify-between mb3"><div data-v-4b740afc="" class="flex items-center"><svg data-v-4b740afc="" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 112 129" class="mr2" style="height: 23px;"><path d="M111.498 75.118l-18.43 10.563-.158.078v21.413l18.588-10.64V75.118z" fill="#A33768"></path><path d="M92.91 85.76L74.48 96.321l-.157.079v21.413l18.587-10.642V85.759z" fill="#3DA1BD"></path><path d="M18.587 106.911V85.498L0 74.752V96.14l18.587 10.771zM37.175 117.683V96.27L18.588 85.498v21.413l18.587 10.772z" fill="#81D2E0"></path><path d="M55.762 128.455v-21.413L37.175 96.27v21.414l18.587 10.771z" fill="#36A4CB"></path><path d="M74.324 96.4L55.92 106.963l-.157.079v21.413l18.56-10.641V96.4z" fill="#3DA1BD"></path><path d="M111.499 53.757l-18.592 10.62-.022 21.408h.026l18.561-10.614.027-21.414z" fill="#994FA0"></path><path d="M92.91 64.373L74.48 74.935l-.157.079v21.413l18.587-10.64V64.372v.026-.026z" fill="#994FA0"></path><path d="M18.587 85.498V64.111L0 53.313v21.413l18.587 10.772z" fill="#FFC41A"></path><path d="M37.15 96.27l.025-21.387-18.587-10.798v21.413L37.149 96.27z" fill="#F39B35"></path><path d="M55.736 107.068V85.655L37.175 74.883l-.027 21.386.027.027 18.56 10.772z" fill="#38727B"></path><path d="M74.324 75.014L55.894 85.55l-.158.105v21.413l18.588-10.641V75.014z" fill="#1C6B7D"></path><path d="M55.736 21.442l.218-.122 18.37-10.52L55.735.028 37.175 10.67l18.561 10.773z" fill="#C4CD46"></path><path d="M74.324 32.214l.157-.105 18.43-10.537L74.324 10.8 55.736 21.442l18.588 10.772z" fill="#F064A4"></path><path d="M92.91 42.986l.158-.105 18.404-10.537L92.91 21.572 74.323 32.214 92.91 42.986z" fill="#AA6AAB"></path><path d="M111.498 32.344l-18.43 10.537-.158.105v21.387l18.588-10.616V32.344z" fill="#994FA0"></path><path d="M37.175 32.083l.184-.105L55.736 21.44 37.176 10.67 18.587 21.311l18.587 10.772z" fill="#CDDD40"></path><path d="M55.736 42.855l18.587-10.642-18.587-10.772-18.561 10.642 18.561 10.772z" fill="#CDDD40"></path><path d="M74.323 53.626l18.588-10.64-18.588-10.851h-.104.105L55.683 42.88l18.64 10.745z" fill="#8F499E"></path><path d="M92.91 42.96L74.482 53.521l-.157.105-.004 21.398L92.934 64.36l-.023-21.4z" fill="#5F356B"></path><path d="M18.587 42.724l.158-.104 18.43-10.537-18.588-10.772L0 31.952l18.587 10.772z" fill="#FFD75A"></path><path d="M18.587 64.111V42.724L0 31.952v21.413l18.587 10.746z" fill="#FFC41A"></path><path d="M37.2 53.526l18.562-10.668-18.586-10.775L18.57 42.72 37.2 53.526z" fill="#F8B730"></path><path d="M37.175 74.883V53.496L18.588 42.724v21.413l18.587 10.746z" fill="#F39B35"></path><path d="M55.762 64.242l.158-.079 18.409-10.536-18.567-10.773-18.587 10.642L55.762 64.24z" fill="#F8B730"></path><path d="M55.733 85.654l.03-21.412L37.174 53.47v21.413l18.558 10.771z" fill="#F39B35"></path><path d="M74.323 53.627L55.919 64.162l-.157.079v.026l-.032 21.4 18.593-10.655V53.626z" fill="#FAAA36"></path></svg><div data-v-4b740afc="" class="f6 mv0 fw5 charcoal-muted">libp2p</div></div><!----></div><div data-v-4b740afc="" class="flex flex-row justify-between items-start navy"><div data-v-4b740afc="" data-cy="tutorial-card-title" class="ma0 f3 fw7">Introduction to libp2p</div><svg data-v-4b740afc="" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" alt="Multiple-choice quizzes" class="h2 ml3 type-icon has-tooltip" data-original-title="null"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 14.2h-19.8" class="cls-1"></path><circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" cx="13.08" cy="14.2" r="2.7" class="cls-1"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 25h-19.8" class="cls-1"></path><circle cx="13.08" cy="25" r="2.7" fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 35.8h-19.8" class="cls-1"></path><circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" cx="13.08" cy="35.8" r="2.7" class="cls-1"></circle></svg></div><p data-v-4b740afc="" class="f5 fw5 ma0 mt3 lh-copy dark-gray">Learn how libp2p solves common networking problems through modularity, aiming to be the de facto peer-to-peer (P2P) library for the decentralized web.</p></a></div><div data-v-02a5d413="" data-v-4b740afc="" data-v-df9430c4="" class="card br3 tutorial flex mb4 tutorial"><a data-v-4b740afc="" href="/verifying-storage-on-filecoin" class="flex flex-column w-100 pa4 no-underline" data-v-02a5d413=""><div data-v-4b740afc="" class="flex items-center justify-between mb3"><div data-v-4b740afc="" class="flex items-center"><svg data-v-4b740afc="" viewBox="0 0 40 40" class="mr2" style="height: 23px;"><path d="M20 40C9 40 0 31 0 19.9.1 8.9 9-.1 20.1 0 31.1.1 40 9 40 20.2 39.9 31.1 31 40 20 40" fill="#0090ff"></path><path d="M21.9 17.6l-.6 3.2 5.7.8-.4 1.5-5.6-.8c-.4 1.3-.6 2.7-1.1 3.9-.5 1.4-1 2.8-1.6 4.1-.8 1.7-2.2 2.9-4.1 3.2-1.1.2-2.3.1-3.2-.6-.3-.2-.6-.6-.6-.9 0-.4.2-.9.5-1.1.2-.1.7 0 1 .1.3.3.6.7.8 1.1.6.8 1.4.9 2.2.3.9-.8 1.4-1.9 1.7-3 .6-2.4 1.2-4.7 1.7-7.1v-.4l-5.3-.8.2-1.5 5.5.8.7-3.1-5.7-.9.2-1.6 5.9.8c.2-.6.3-1.1.5-1.6.5-1.8 1-3.6 2.2-5.2 1.2-1.6 2.6-2.6 4.7-2.5.9 0 1.8.3 2.4 1 .1.1.3.3.3.5 0 .4 0 .9-.3 1.2-.4.3-.9.2-1.3-.2-.3-.3-.5-.6-.8-.9-.6-.8-1.5-.9-2.2-.2-.5.5-1 1.2-1.3 1.9-.7 2.1-1.2 4.3-1.9 6.5l5.5.8-.4 1.5-5.3-.8" fill="#fff"></path></svg><div data-v-4b740afc="" class="f6 mv0 fw5 charcoal-muted">Filecoin</div></div><!----></div><div data-v-4b740afc="" class="flex flex-row justify-between items-start navy"><div data-v-4b740afc="" data-cy="tutorial-card-title" class="ma0 f3 fw7">Verifying Storage on Filecoin</div><svg data-v-4b740afc="" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" alt="Multiple-choice quizzes" class="h2 ml3 type-icon has-tooltip" data-original-title="null"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 14.2h-19.8" class="cls-1"></path><circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" cx="13.08" cy="14.2" r="2.7" class="cls-1"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 25h-19.8" class="cls-1"></path><circle cx="13.08" cy="25" r="2.7" fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M39.63 35.8h-19.8" class="cls-1"></path><circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" cx="13.08" cy="35.8" r="2.7" class="cls-1"></circle></svg></div><p data-v-4b740afc="" class="f5 fw5 ma0 mt3 lh-copy dark-gray">Learn how Filecoin's built-in verification methods make it possible to trust peers in an incentivized, decentralized file storage system.</p></a></div></div><h2>Courses</h2><p class="f4 fw5 lh-copy ma0 pb3"> Interested in a specific distributed web protocol or storage network? Explore these curated collections of tutorials on projects including IPFS, Filecoin, and Multiformats. </p><div class="flex flex-wrap items-start mb4 mt4"><a data-v-836385cc="" href="/course/ipfs" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 bg-navy white mb3 mr3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="mr2" style="height: 1.5em;"><defs><linearGradient id="a" y2="771.51" gradientUnits="userSpaceOnUse" x2="527.72" y1="771.51" x1="84.315"><stop stop-color="#4a9ea1" offset="0"></stop></linearGradient><linearGradient id="b" y2="771.48" gradientUnits="userSpaceOnUse" x2="512.36" y1="771.48" x1="99.675"><stop stop-color="#63d3d7" offset="0"></stop></linearGradient></defs><path d="M84.315 899.51l221.7 128 221.7-128v-256l-221.7-127.99-221.7 128z" fill="url(#a)" transform="translate(-50.017 -515.51)"></path><path fill="url(#b)" d="M283.13 546.35l-160.74 92.806a38.396 38.396 0 010 8.59l160.75 92.805c13.554-10 32.043-10 45.597 0l160.75-92.807a38.343 38.343 0 01-.001-8.588l-160.74-92.806c-13.554 10.001-32.044 10.001-45.599 0zm221.79 127.03L344 767.22c1.884 16.739-7.361 32.751-22.799 39.489l.18 184.58a38.386 38.386 0 017.439 4.294l160.75-92.805c-1.884-16.739 7.36-32.752 22.799-39.49v-185.61a38.397 38.397 0 01-7.44-4.294zm-397.81 1.032a38.387 38.387 0 01-7.438 4.295v185.61c15.438 6.738 24.683 22.75 22.799 39.489l160.74 92.806a38.4 38.4 0 017.44-4.295v-185.61c-15.439-6.738-24.684-22.75-22.8-39.49l-160.74-92.81z" transform="translate(-50.017 -515.51)"></path><path d="M256 512l221.7-128V128L256 256v256z" fill-opacity=".251"></path><path d="M256 512V256L34.3 128v256L256 512z" fill-opacity=".039"></path><path d="M34.298 128l221.7 128 221.7-128-221.7-128-221.7 128z" fill-opacity=".13"></path></svg><span>IPFS Course</span></a><a data-v-836385cc="" href="/course/ipld" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 bg-navy white mb3 mr3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 81" class="mr2" style="height: 1.5em;"><g fill-rule="nonzero" fill="none"><path d="M70.638 58.696V21.994c0-1.25-.667-2.405-1.75-3.03L37.103.613a3.499 3.499 0 00-3.498 0L1.82 18.963a3.498 3.498 0 00-1.75 3.03v36.703c0 1.25.667 2.405 1.75 3.03l31.785 18.35a3.499 3.499 0 003.498 0l31.785-18.35a3.498 3.498 0 001.75-3.03z" fill="#1D74F2"></path><g transform="translate(3.754 4.692)" fill="#FFF"><path d="M31.6 70.24L1.23 52.455V19.034L31.6 1.066l.043.024L61.97 18.317v34.139l-.043.025L31.6 70.239v.001zM1.402 52.356L31.6 70.039l30.198-17.682v-33.94L31.6 1.266 1.402 19.132v33.225-.001z"></path><path d="M30.909 10.953h1.382v59.186h-1.382z"></path><circle cx="31.6" cy="11.068" r="2.175"></circle><path d="M30.939 27.127l-6.642-4.196v-8.048h1.382v7.287l5.998 3.789z"></path><g transform="translate(31.346 32.284)"><path d="M.784 22.438L.046 21.27l22.73-14.36V3.77h1.383v3.903z"></path><circle cx="23.468" cy="2.308" r="2.175"></circle></g><path d="M42.357 31.103h1.382v16.121h-1.382V31.103zM31.086 43.632L14.26 34.383V27.01h1.382v6.58l16.139 8.848-.695 1.194z"></path><circle cx="14.951" cy="26.396" r="2.175"></circle><circle cx="24.988" cy="16.52" r="2.175"></circle><g transform="translate(31.158 22.149)"><path d="M14.308 3.784v3.143L.124 15.887c.011.533.03 1.068.049 1.603L15.69 7.688V3.785h-1.382v-.001z"></path><circle cx="14.999" cy="2.323" r="2.175"></circle></g><path d="M32.08 31.103l6.641-4.195v-8.049H37.34v7.287l-5.998 3.789z"></path><circle cx="38.03" cy="18.859" r="2.175"></circle><circle cx="24.657" cy="30.397" r="2.175"></circle><path d="M23.966 30.917h1.382v8.687h-1.382z"></path><g transform="translate(6.194 34.537)"><path d="M25.031 20.367l.739-1.168L3.038 6.804V3.662H1.656v3.904z"></path><circle cx="2.347" cy="2.201" r="2.175"></circle></g><path d="M16.78 35.652h1.238v11.171H16.78z"></path><circle cx="31.6" cy="69.912" r="1.213"></circle><g transform="translate(0 18.02)"><circle cx="1.23" cy="34.437" r="1.213"></circle><circle cx="1.23" cy="1.351" r="1.213"></circle></g><g transform="translate(60.627 18.02)"><circle cx="1.343" cy="34.359" r="1.213"></circle><circle cx="1.343" cy="1.273" r="1.213"></circle></g><circle cx="31.599" cy="1.393" r="1.213"></circle></g></g></svg><span>IPLD Course</span></a><a data-v-836385cc="" href="/course/filecoin" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 bg-navy white mb3 mr3"><svg viewBox="0 0 40 40" class="mr2" style="height: 1.5em;"><path d="M20 40C9 40 0 31 0 19.9.1 8.9 9-.1 20.1 0 31.1.1 40 9 40 20.2 39.9 31.1 31 40 20 40" fill="#0090ff"></path><path d="M21.9 17.6l-.6 3.2 5.7.8-.4 1.5-5.6-.8c-.4 1.3-.6 2.7-1.1 3.9-.5 1.4-1 2.8-1.6 4.1-.8 1.7-2.2 2.9-4.1 3.2-1.1.2-2.3.1-3.2-.6-.3-.2-.6-.6-.6-.9 0-.4.2-.9.5-1.1.2-.1.7 0 1 .1.3.3.6.7.8 1.1.6.8 1.4.9 2.2.3.9-.8 1.4-1.9 1.7-3 .6-2.4 1.2-4.7 1.7-7.1v-.4l-5.3-.8.2-1.5 5.5.8.7-3.1-5.7-.9.2-1.6 5.9.8c.2-.6.3-1.1.5-1.6.5-1.8 1-3.6 2.2-5.2 1.2-1.6 2.6-2.6 4.7-2.5.9 0 1.8.3 2.4 1 .1.1.3.3.3.5 0 .4 0 .9-.3 1.2-.4.3-.9.2-1.3-.2-.3-.3-.5-.6-.8-.9-.6-.8-1.5-.9-2.2-.2-.5.5-1 1.2-1.3 1.9-.7 2.1-1.2 4.3-1.9 6.5l5.5.8-.4 1.5-5.3-.8" fill="#fff"></path></svg><span>Filecoin Course</span></a><a data-v-836385cc="" href="/course/multiformats" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 bg-navy white mb3 mr3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 577.638 525.052" class="mr2" style="height: 1.5em;"><g id="Warstwa_4"><path fill="#0565d8" d="M288.819 236.327V405.306l100.962 58.291V294.618z"></path><path fill="#055aad" d="M187.856 294.618v168.979l100.963-58.291V236.327z"></path><path fill="#50a5f9" d="M389.781 61.456l-100.962 58.29-100.963-58.29-100.962 58.29 100.962 58.291 100.963 58.29 100.962-58.29 100.963-58.291z"></path><path fill="#2b94fc" d="M187.856 178.037L86.894 119.746v285.56l100.962 58.291V294.618l100.963 58.291V236.327z"></path><path fill="#127bf9" d="M389.781 178.037l-100.962 58.29v116.582l100.962-58.291v168.979l100.963-58.291v-285.56z"></path></g></svg><span>Multiformats Course</span></a></div><h2>Local Events</h2><p class="f4 fw5 lh-copy ma0 pv3"> Groups and individuals around the world host in-person events using our tutorials as curriculum, with mentors available to help you work through the challenges. </p><!----><div class="mv3"><a data-v-836385cc="" href="/events" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 mb2 mr3"> View All Events </a><a data-v-836385cc="" href="/host" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 mb2"> Host an Event </a></div><br><h2>Video Tutorials</h2><p class="f4 fw5 lh-copy ma0 pv3"> Check this series of video tutorials that cover the entire stack of protocols for the decentralised web. The tutorials cover broad concepts and then go deep into protocol details too, so that you get a complete understanding of the system's operation. </p><div class="mv3"><a data-v-836385cc="" href="https://research.protocol.ai/tutorials/resnetlab-on-tour/" target="__blank" class="inline-flex justify-center avenir dib v-mid fw7 nowrap lh-copy bn br1 pointer bg-navy white outline-focus pv2 ph3 mb2 mr3"> View All Videos </a></div></section><footer data-v-a0fc7dd0="" data-cy="footer-component" class="bg-navy white pt5-m pt5-l pt4 pb2 footer-margin"><div data-v-a0fc7dd0="" class="flex mw7 ph3 center flex-wrap"><div data-v-a0fc7dd0="" class="w-33-l w-100 mb0-l mb3"><a data-v-a0fc7dd0="" href="/" aria-current="page" class="flex items-center link router-link-exact-active router-link-active"><svg data-v-a0fc7dd0="" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116 135" alt="ProtoSchool" class="w2 mr2 "><path data-v-a0fc7dd0="" d="M58.291 0L0 33.518v67.035l58 33.517 58-33.517V33.518L58.291 0zm53.92 44.593l-33.226-27.98 33.518 19.236v8.744h-.292zM13.407 63.246L25.94 28.563l8.16-1.457-20.693 36.14zm23.025-34.1h43.719l21.859 37.89-21.86 37.889H36.433l-21.86-37.89 21.86-37.89zM11.658 67.909l20.694 36.141L8.744 75.779l2.914-7.87zm65.578 39.93l-36.14 6.412-5.247-6.412h41.387zm25.94-37.015l-12.533 34.684-8.16 1.457 20.693-36.14zm1.749-4.663L83.94 30.02l23.608 28.27-2.623 7.87zm-65.87-39.93l36.141-6.412 5.246 6.412H39.055zm35.85-9.035l-44.01 7.87 37.014-13.408 6.995 5.538zM23.316 27.688L8.16 69.658l6.995-39.055 8.16-2.915zM6.704 77.528l28.562 34.392L4.955 86.271l1.749-8.743zm34.974 39.638l44.01-7.87-37.306 13.408-6.704-5.538zm51.588-10.784l15.156-41.97-6.995 39.055-8.16 2.915zm16.613-49.84l-28.854-34.1L111.337 47.8l-1.458 8.744zM65.869 9.036L24.774 23.9 58.29 4.663l7.578 4.372zM11.95 31.477L4.08 74.613V35.85l7.87-4.372zm-7.869 58l33.518 27.98L4.08 98.221v-8.744zm46.634 35.558l41.095-14.864-33.517 19.236-7.578-4.372zm53.919-22.442l7.578-43.136v38.764l-7.578 4.372z" fill="url(#paint0_linear)"></path><defs data-v-a0fc7dd0=""><linearGradient data-v-a0fc7dd0="" id="paint0_linear" x1=".136" y1="67.052" x2="116.42" y2="67.052" gradientUnits="userSpaceOnUse"><stop data-v-a0fc7dd0="" stop-color="#22F2AD"></stop><stop data-v-a0fc7dd0="" offset="1" stop-color="#AB21F4"></stop></linearGradient></defs></svg><div data-v-a0fc7dd0="" class="ma0 fw4 white f3"><span data-v-a0fc7dd0="" class="montserrat fw4">Proto</span><span data-v-a0fc7dd0="" class="montserrat fw2">School</span></div></a></div><div data-v-a0fc7dd0="" class="w-20-l w-25-m w-33 column "><span data-v-a0fc7dd0="" class="fw7">Courses</span><ul data-v-a0fc7dd0="" class="list pl0"><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/course/ipfs" class="link underline-hover white o-80 glow">IPFS </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/course/ipld" class="link underline-hover white o-80 glow">IPLD </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/course/filecoin" class="link underline-hover white o-80 glow">Filecoin </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/course/multiformats" class="link underline-hover white o-80 glow">Multiformats </a></li></ul></div><div data-v-a0fc7dd0="" class="w-20-l w-25-m w-33 column "><span data-v-a0fc7dd0="" class="fw7">Community</span><ul data-v-a0fc7dd0="" class="list pl0"><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://github.com/protoschool" class="link underline-hover white o-80 glow">GitHub </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://twitter.com/protoschool" class="link underline-hover white o-80 glow">Twitter </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/news" class="link underline-hover white o-80 glow">Newsletter </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/contribute" class="link underline-hover white o-80 glow">Contribute </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="" data-cy="footer-link-internal" href="/contribute#contact" class="link underline-hover white o-80 glow">Contact </a></li></ul></div><div data-v-a0fc7dd0="" class="w-20-l w-25-m w-33 column "><span data-v-a0fc7dd0="" class="fw7">Related Projects</span><ul data-v-a0fc7dd0="" class="list pl0"><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://ipfs.io" class="link underline-hover white o-80 glow">IPFS </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://filecoin.io" class="link underline-hover white o-80 glow">Filecoin </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://ipld.io" class="link underline-hover white o-80 glow">IPLD </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://libp2p.io" class="link underline-hover white o-80 glow">libp2p </a></li><li data-v-a0fc7dd0="" class="pv1"><a data-v-a0fc7dd0="" target="_blank" data-cy="footer-link-external" href="https://multiformats.io" class="link underline-hover white o-80 glow">Multiformats </a></li></ul></div></div><div data-v-a0fc7dd0="" class="flex justify-start mt4 mw7 center ph3 f7 o-70"><div data-v-a0fc7dd0="" class="w-33-l"></div><p data-v-a0fc7dd0="">漏 <a data-v-a0fc7dd0="" target="_blank" href="https://protocol.ai" class="link underline white o-80 glow">Protocol Labs</a> | Except as <a data-v-a0fc7dd0="" target="_blank" href="https://protocol.ai/legal/" class="link underline white o-80 glow">noted</a>, content licensed <a data-v-a0fc7dd0="" target="_blank" href="https://creativecommons.org/licenses/by/3.0/deed.en" class="link underline white o-80 glow">CC-BY 3.0</a>.</p></div></footer></div><div class="vue-portal-target"></div></div><script type="text/javascript" async="" src="https://countly.proto.school/sdk/web/countly.min.js"></script><script>// https://github.com/schalkneethling/dnt-helper/blob/master/js/dnt-helper.js function _dntEnabled (dnt, userAgent) { 'use strict' var dntStatus = dnt || navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack var ua = userAgent || navigator.userAgent var anomalousWinVersions = ['Windows NT 6.1', 'Windows NT 6.2', 'Windows NT 6.3'] var fxMatch = ua.match(/Firefox\/(\d+)/) var ieRegEx = /MSIE|Trident/i var isIE = ieRegEx.test(ua) var platform = ua.match(/Windows.+?(?=;)/g) if (isIE && typeof Array.prototype.indexOf !== 'function') { return false } else if (fxMatch && parseInt(fxMatch[1], 10) < 32) { dntStatus = 'Unspecified' } else if (isIE && platform && anomalousWinVersions.indexOf(platform.toString()) !== -1) { dntStatus = 'Unspecified' } else { dntStatus = { '0': 'Disabled', '1': 'Enabled' }[dntStatus] || 'Unspecified' } return dntStatus === 'Enabled' } // Some default pre init var Countly = Countly || {}; Countly.q = Countly.q || []; const COUNTLY_KEY_PROTOSCHOOL = 'c785b6eaa9c61617e1a7db83cb437e5f3dfe4280'; const COUNTLY_KEY_PROTOSCHOOL_TEST = '50f696b92cba4fe18cf60f37349f7c757625a871'; const COUNTLY_URL = 'https://countly.proto.school'; (function(){ if (!window.Cypress && !_dntEnabled()) { // Provide countly initialization parameters Countly.app_key = location.hostname === 'proto.school' ? COUNTLY_KEY_PROTOSCHOOL : COUNTLY_KEY_PROTOSCHOOL_TEST; Countly.url = COUNTLY_URL; // Choose what to track Countly.q.push(['track_sessions']); Countly.q.push(['track_pageview']); Countly.q.push(['track_clicks']); Countly.q.push(['track_scrolls']); Countly.q.push(['track_links']); // Load countly script asynchronously var cly = document.createElement('script'); cly.type = 'text/javascript'; cly.async = true; cly.src = 'https://countly.proto.school/sdk/web/countly.min.js'; cly.onload = function(){ Countly.init() Countly.getViewUrl = function () { return location.pathname + location.search + location.hash; } }; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(cly, s); } })();</script><script src="/js/chunk-vendors.15f6ce0a.js"></script><script src="/js/app.2bf6cc0e.js"></script></body></html>