<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>showmehow.eth</title>
<subtitle>A blog about blockchain, ENS, and related technologies</subtitle><link href="https://showmehow.eth.limo/full.xml" rel="self"/>
<link href="https://showmehow.eth.limo/" rel="alternate" />
<updated>2023-08-28T00:00:00Z</updated>
<id>https://showmehow.eth.limo/</id>
<author>
  <name>Zadok7.eth</name>
  <uri>https://blog.showmehow.eth.limo/</uri>
</author><entry><title>Podcast Experiment with 1W3.io No-Code Builder Customization Options</title>
<link href="https://showmehow.eth.limo/podcast-experiment-with-1w3io-no-code-builder-customization-options/"/>
<updated>2023-08-28T00:00:00Z</updated>
<id>https://showmehow.eth.limo/podcast-experiment-with-1w3io-no-code-builder-customization-options/</id><content type="html">&lt;p&gt;When first jumping into web3, my journey began with research into hosting websites on the blockchain. I figured there had to be a way to store content on the blockchain, and not rely on a single point of failure in a server somewhere. There are ways to achieve redundancy and availability using services through AWS or CDNs. It’s kind of overkill for what I was trying to accomplish in the event I forget to pay for a cloud server or if my hosting company goes away.&lt;/p&gt;
&lt;p&gt;Of course there are still advantages to having a server run backend code, especially in the cases of extremely dynamic or complex websites. However, there are a lot of use cases for just running a static website. Doing so will allow you to deploy a site to distributed storage networks such as &lt;a href=&quot;https://ipfs.com/&quot;&gt;IPFS&lt;/a&gt; or &lt;a href=&quot;https://arweave.org/&quot;&gt;Arweave&lt;/a&gt; and not depend on any hosting servers.&lt;/p&gt;
&lt;h2 id=&quot;no-code-buidlers-for-decentralized-websites&quot;&gt;No-code buidlers for decentralized websites&lt;/h2&gt;
&lt;p&gt;Previously I wrote a guide on how to &lt;a href=&quot;https://showmehow.eth.limo/create-a-decentralized-podcast-on-ipfs-with-an-ens-name/&quot;&gt;create a decentralized podcast on IPFS with an ENS name&lt;/a&gt;. After creating that proof of concept I wanted to experiment with creating a podcast with a no-code builder. Though my previous guide isn’t too technically involved, it still is not for the average user. For instance you have to install IPFS Desktop, or know how to upload files into IPFS and then reference those CIDs in your site’s file. You also have to edit a few lines of code, which may be intimidating to some. I wondered if there was a way to create a podcast using a no-code builder like &lt;a href=&quot;https://1w3.io/&quot;&gt;1W3&lt;/a&gt; that specifically works with distributed storage networks like IPFS and Arweave.&lt;/p&gt;
&lt;p&gt;It’s kind of a “hacky” workaround, but it works.&lt;/p&gt;
&lt;h2 id=&quot;login-to-1w3-and-add-some-blocks&quot;&gt;Login to 1W3 and add some blocks&lt;/h2&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://app.1w3.io/dashboard&quot;&gt;1W3 Dashboard&lt;/a&gt; and login. Next, add an Image block.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-addblock.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-pickimage.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;add-the-image-for-the-first-episode-song&quot;&gt;Add the image for the first episode / song.&lt;/h3&gt;
&lt;p&gt;Upload an image you want displayed while the episode or song plays. This image will also be used in the podcast feed.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-uploadimage.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;add-your-audio-file-mp3&quot;&gt;Add your audio file (.mp3)&lt;/h3&gt;
&lt;p&gt;Immediately below the Image block, add an Audio block.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-pickaudio.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Upload an .mp3 file. Be sure to give it a title.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-upload-audio-1.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;add-a-paragraph-block&quot;&gt;Add a Paragraph block&lt;/h3&gt;
&lt;p&gt;This will be used for the episode / song description.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-upload-paragraph-1.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Enter in a description.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-upload-paragraph-desc-1.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Here is what it should look like so far.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-first-three.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;add-more-image-audio-and-paragraph-blocks&quot;&gt;Add more Image, Audio, and Paragraph blocks.&lt;/h2&gt;
&lt;p&gt;Repeat the process. Each time adding an Image, Audio, and Paragraph block in that order.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-all-three.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;I added 3 total images and audio files. Notice how it scrolls which doens’t look all that great. No worries, we will introduce a custom script to reformat things.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-scrolling.gif&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;customize-with-js-and-css&quot;&gt;Customize with JS and CSS&lt;/h2&gt;
&lt;p&gt;Let’s fix the player. Click on &lt;code&gt;Customizations&lt;/code&gt; in 1W3 then click on &lt;code&gt;Advanced&lt;/code&gt;. Copy in the following custom CSS and custom JS.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-customize.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;custom-js&quot;&gt;&lt;code&gt;custom JS&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;DOMContentLoaded&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Hide empty div elements at the top&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.col-12.my-2 .card&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;div&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasChildNodes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            div&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;none&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; slideshowContainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;div&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    slideshowContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;slideshow-container&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; pairs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; pair&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; images &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.col-12.my-2 img.img-fluid.rounded&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; players &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.col-12.my-2 audio&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; paragraphs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.col-12.my-2 .card-body&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;images&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; players&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; images&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; paragraphs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        players&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;player&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            pair &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;div&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;pair&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; index &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;block&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;none&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;// Create and append the title as a &amp;lt;span&gt;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;span&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            title&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; player&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;title&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Using audio title&lt;/span&gt;
            title&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;white&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            title&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontWeight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;bold&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;// Append elements to the pair&lt;/span&gt;
            pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;images&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;player&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Title below audio player, above paragraph&lt;/span&gt;
            pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paragraphs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

            pairs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pair&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            slideshowContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pair&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; nextButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    nextButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;next-button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    nextButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Next&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    nextButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onclick&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;navigateSlide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; prevButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    prevButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;prev-button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    prevButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Prev&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    prevButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onclick&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;navigateSlide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    slideshowContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prevButton&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    slideshowContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextButton&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; downloadButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    downloadButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;download-button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; iconElem &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;i&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    iconElem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;far fa-arrow-alt-circle-down&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    downloadButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;iconElem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; textNode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createTextNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; RSS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    downloadButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;textNode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    downloadButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;rss-button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    slideshowContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;downloadButton&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;links&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;slideshowContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    downloadButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;onclick &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; generateRSS&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;navigateSlide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; activeIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        pairs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pair&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pair&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;block&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                activeIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;activeIndex &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; direction&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; pairs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newIndex &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; newIndex &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; pairs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        pairs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;activeIndex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;none&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        pairs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;newIndex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;block&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;generateRSS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; podcast &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;My Podcast Title&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Author Name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Podcast Description&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; episodes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; imagesHref &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; episodeDescriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; episodeTitles &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; players&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; audioSrc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; players&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;source&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; imageSrc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; images&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; episodeDescription &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paragraphs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; episodeTitle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; players&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;title&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Using audio title&lt;/span&gt;

            episodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;audioSrc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            imagesHref&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;imageSrc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            episodeDescriptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;episodeDescription&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            episodeTitles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;episodeTitle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rssHeader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&amp;lt;rss version=&quot;2.0&quot; xmlns:itunes=&quot;http://www.itunes.com/dtds/podcast-1.0.dtd&quot;&gt;&amp;lt;channel&gt;&amp;lt;title&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;podcast&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/title&gt;&amp;lt;link&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/link&gt;&amp;lt;language&gt;en&amp;lt;/language&gt;&amp;lt;itunes:author&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;podcast&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;author&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/itunes:author&gt;&amp;lt;description&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;podcast&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/description&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; rssItems &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; episodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; episodeTitle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; episodeTitles&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; episodeDescription &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; episodeDescriptions&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pubDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUTCString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

            rssItems &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;item&gt;&amp;lt;title&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;episodeTitle&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/title&gt;&amp;lt;description&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;episodeDescription&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/description&gt;&amp;lt;enclosure url=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;episodes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; length=&quot;0&quot; type=&quot;audio/mpeg&quot; /&gt;&amp;lt;itunes:image href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;imagesHref&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; /&gt;&amp;lt;pubDate&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;pubDate&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/pubDate&gt;&amp;lt;/item&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rssFooter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/channel&gt;&amp;lt;/rss&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Blob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;rssHeader &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; rssItems &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; rssFooter&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;application/rss+xml&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createObjectURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rss&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;display: none&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; url&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;download &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;podcast.rss&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;revokeObjectURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;custom-css&quot;&gt;&lt;code&gt;Custom CSS&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#next-button,
#prev-button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f0f0f0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid #ccc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 150px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 6px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;button,
.rss-button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 150px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #7a807d&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 6px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;button:hover,
#next-button:hover,
#prev-button:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #7a807d&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Remove hover effect for the rss-button */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.rss-button:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #7a807d&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;preview-the-site-and-publish&quot;&gt;Preview the site and publish&lt;/h2&gt;
&lt;p&gt;As you can see we’ve used Javascript and some custom CSS styling to reformat the image, audio, and paragraph blocks into groupings. It also has a podcast feed generator for downloading of the podcast.RSS file based on decentralized content it finds.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-with-custom.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Connect the site to an ENS name&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/1w3-1-connect-ens3.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Here’s a published example of what we’ve done above: &lt;a href=&quot;https://1w3podcast.showmehow.eth.limo/&quot;&gt;1w3podcast.showmehow.eth.limo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;future-of-web-templates-as-nfts&quot;&gt;Future of web templates as NFTs&lt;/h2&gt;
&lt;p&gt;1W3 has recently begun experimenting with alowing creators to mint an NFT from a template they have designed. If another user owns that NFT template, they can use that in their own decentralized website design.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The first NFT has been published on 1W3 by our amazing community member, &lt;a href=&quot;https://twitter.com/CRVNE_eth?ref_src=twsrc%5Etfw&quot;&gt;@CRVNE_eth&lt;/a&gt;. &lt;br /&gt;🎉 He brilliantly designed the decentralized website, which has been converted into a template. Now, anyone holding the NFT can effortlessly use crvne.eth&amp;#39;s stunning design to build their own… &lt;a href=&quot;https://t.co/j7h73b3wFR&quot;&gt;pic.twitter.com/j7h73b3wFR&lt;/a&gt;&lt;/p&gt;&amp;mdash; 1W3.eth (@1W3io) &lt;a href=&quot;https://twitter.com/1W3io/status/1686813109691027456&quot;&gt;August 2, 2023&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;This is a really interesting idea to facilate growth of creator economies! Check out the &lt;a href=&quot;https://github.com/zadok7/decentralized-podcast-ipfs-1w3&quot;&gt;GitHub&lt;/a&gt; repo for more this experiment.&lt;/p&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/create-a-decentralized-podcast-on-ipfs-with-an-ens-name&quot;&gt;Create a decentralized podcast on IPFS with an ENS name&lt;/a&gt; - Original proof of concept to create a decentralized podcast on IPFS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/setting-up-a-customizable-decentralized-blog-with-an-ens-name-and-ipfs-desktop&quot;&gt;Setting up a customizable decentralized blog with an ENS name and IPFS desktop&lt;/a&gt; - Set up a decentralized blog on IPFS similar to vitalik.eth’s blog.&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>A guide for issuing POAPs using an IYK badge and an ENS name</title>
<link href="https://showmehow.eth.limo/a-guide-for-issuing-poaps-using-an-iyk-badge-and-an-ens-name/"/>
<updated>2023-08-02T00:00:00Z</updated>
<id>https://showmehow.eth.limo/a-guide-for-issuing-poaps-using-an-iyk-badge-and-an-ens-name/</id><content type="html">&lt;p&gt;Attendees of conferences are sometimes gifted an ENS physical badge that has an NFC chip. NFC stands for Near Field Communication. This technology makes it easy to share a POAP with others you meet in real like events. By simply holding a mobile device that is NFC capable, the POAP can automatically be issued. You can also showcase your online and on-chain persona in a single tap.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/ens-badge-ethcc6.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;connect-your-wallet-to-the-iyk-site&quot;&gt;Connect your wallet to the IYK site&lt;/h2&gt;
&lt;p&gt;First head over to the IYK admin dashboard. You can find it here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://iyk.app/admin&quot;&gt;iyk.app/admin&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/iyk-connect.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Connect with the wallet that was given ownership of the IYK card. If youn received this from an ENS event, then the wallet you registered with to receive your card should be used to connect with.&lt;/p&gt;
&lt;h2 id=&quot;login-to-the-iyk-dashboard&quot;&gt;Login to the IYK Dashboard&lt;/h2&gt;
&lt;p&gt;Once you are connected to the site with your wallet, click “Login”. You will be asked to sign a gasless transaction on your wallet to allow you to access the administrator dashbaord of IYK.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/iyk-login.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;choose-the-iyk-card-you-want-to-manage&quot;&gt;Choose the IYK card you want to manage&lt;/h2&gt;
&lt;p&gt;Any IYK cards your wallet is the owner of will appear now for you to manage. You might own multiple cards if you gone to multiple events where ENS has given this cards away.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/iyk-card-list.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;create-a-poap&quot;&gt;Create a POAP&lt;/h2&gt;
&lt;p&gt;It’s easy to share a &lt;a href=&quot;https://poap.xyz/about-the-protocol&quot;&gt;POAP&lt;/a&gt;. The Proof of Attendance Protocol turns a moment like meeting frENS or attending an event into a collectible. To share a POAP collectible, first you’ll need to create one. Do this by heading over to the POAP drop admin panel. Here is the link:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://drops.poap.xyz/&quot;&gt;drops.poap.xyz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enter an email address and you’ll be sent a code to enter the site.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-login-code.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Give your POAP a title, description, and pick a beginning and end date for event. Also, fill in any other details like the event type, a website, or social platform links. Mark the visibility as “private” if you are just doing a test. Don’t forget to upload your artwork! When you’re done, click “Create Drop”.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-details.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;setup-your-mint-links&quot;&gt;Setup your mint links&lt;/h2&gt;
&lt;p&gt;You will need these to input into the IYK admin panel later.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-summary.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;pick-the-number-of-mint-links&quot;&gt;Pick the number of mint links&lt;/h2&gt;
&lt;p&gt;Set the total amount of POAPs you think you might use at the event and submit your request.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-mint-links.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Your request will be review by POAP, and you should soon receive an email with a text file attachment.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-review.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;If you don’t receive the email, you can always log back into &lt;a href=&quot;https://drops.poap.xyz/&quot;&gt;drops.poap.xyz&lt;/a&gt; and check the status of your POAP. You can also download the links.txt file from there.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-status.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;upload-your-linkxtxt-file-into-iyk&quot;&gt;Upload your linkx.txt file into IYK&lt;/h2&gt;
&lt;p&gt;Once your POAP has been approved and you receive your links.txt, you will need to upload these into the &lt;a href=&quot;https://iyk.app/admin/items&quot;&gt;IYK admin panel&lt;/a&gt;. Click on the IYK card you want to associate the POAP with. Then click “Edit”&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/iyk-edit.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;On the next screen click “Upload codes to add selectable events”&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-links-upload.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Confirm the upload of your links file.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/poap-links-submit.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;In IYK go back to your list of cards. Click the one you want to associate with the newly created POAP. Change the event to the one you just created and click&amp;quot;Save&amp;quot;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-08/iyk-events.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;You’ve successfully setup a new POAP which you can distribute using your IYK ENS name badge!&lt;/p&gt;
</content>
</entry><entry><title>Create a decentralized podcast on IPFS with an ENS name</title>
<link href="https://showmehow.eth.limo/create-a-decentralized-podcast-on-ipfs-with-an-ens-name/"/>
<updated>2023-07-20T00:00:00Z</updated>
<id>https://showmehow.eth.limo/create-a-decentralized-podcast-on-ipfs-with-an-ens-name/</id><content type="html">&lt;p&gt;In this example, we will learn how to create a decentralized podcast using ENS and IPFS. You’ll be able to store and stream your podcast content from IPFS. Because IPFS is peer to peer, the hosting for your podcast will utilize decentralized storage instead of traditional web server storage solutions. In this way your podcast will not have any bandwidth or monthly download limits. You will also be able to give your users a podcast subscription feed link, so that they can listen through podcast apps like Apple Podcast. When a new episode is uploaded the podcast player and feed will automatically detect the new episodes.&lt;/p&gt;
&lt;h2 id=&quot;how-does-this-work&quot;&gt;How does this work?&lt;/h2&gt;
&lt;p&gt;This is a project uses javascript, so it’s purely frontend code. Because of that, you can point your ENS name’s &lt;code&gt;contenthash&lt;/code&gt; record to the location of the content on IPFS. The javascript looks at your IPFS directory using its &lt;code&gt;contenthash&lt;/code&gt; saved in the ENS records. It then populates a list of episodes and episode descriptions it finds in the directory structure. As long as the episodes are uploaded using a naming convention like, episode1.mp3 and episode1.txt, the podcast content and data will show up in the web app audio player so your episodes can be played from a browser. Optionally you can generate an RSS podcast feed file which can be used to subscribe in a podcast player like Apple Podcast.&lt;/p&gt;
&lt;p&gt;The script also works without using an ENS name, and instead can use an IPFS gateway you specify. However, it’s easier with an ENS name and the links structured better.&lt;/p&gt;
&lt;h2 id=&quot;working-demo&quot;&gt;Working demo&lt;/h2&gt;
&lt;p&gt;Podcast Web Player - &lt;a href=&quot;https://podcast.showmehow.eth.limo/&quot;&gt;podcast.showmehow.eth&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IPFS CID: &lt;code&gt;QmQW316xfuubnkwfZXynh6MQVsYwsS4q1Jx2mheXTax72s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Podcast Subscription RSS Feed (you can add this to Apple Podcast to subscribe) - &lt;a href=&quot;https://feed.podcast.showmehow.eth.limo/&quot;&gt;feed.podcast.showmehow.eth&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IPFS CID: &lt;code&gt;QmaR1NKFxqP3kN9SSKdbVj3p8revjh3qDAQLw9dvfGwqdA&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Podcast RSS Feed Generator (works with ENS names or public IPFS gateways - &lt;a href=&quot;https://podcast.showmehow.eth.limo/generator&quot;&gt;podcast.showmehow.eth/generator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IPFS CID: &lt;code&gt;QmZ9A88gpJvvutMcnMpMhxfJACXQhceyoXGN2g7a6GtyHS&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/zadok7/ipfs-ens-podcast/&quot;&gt;https://github.com/zadok7/ipfs-ens-podcast/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;setting-up-the-podast-content&quot;&gt;Setting up the podast content&lt;/h2&gt;
&lt;p&gt;First download the &lt;code&gt;/mypodcast&lt;/code&gt; folder. You can find this on the GitHub &lt;a href=&quot;https://github.com/zadok7/ipfs-ens-podcast/&quot;&gt;repo&lt;/a&gt;. You can also &lt;a href=&quot;https://gateway.lighthouse.storage/ipfs/QmbMC9aPmYGmjwkEGRQqfgSc2adKzz8fei1yVV8pscn365&quot;&gt;download the zip&lt;/a&gt; file which is hosted on IPFS. This will have the example folder structure and files for the podcast episodes. We will be running IPFS Desktop to upload the modified &lt;code&gt;/mypodcast&lt;/code&gt; folder. Additionally we’ll use &lt;a href=&quot;https://lighthouse.storage/&quot;&gt;Lighthouse.storage&lt;/a&gt; to upload the same files for duplicate pinning. This way the podcast does not rely on your local IPFS gateway (via IPFS Desktop) to stay up.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;adding-your-own-episodes-images-and-descriptions&quot;&gt;Adding your own episodes, images, and descriptions&lt;/h3&gt;
&lt;p&gt;On your local computer, go into the directory structure of &lt;code&gt;/mypodcast&lt;/code&gt;. There you will see some folders which will contain your episode audio files, episode images, descriptions, and main podcast image and description.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-podcast_content.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4 id=&quot;add-the-audio-files-mp3-for-your-episodes&quot;&gt;Add the audio files (.mp3) for your episodes&lt;/h4&gt;
&lt;p&gt;Look in the folder &lt;code&gt;/mypodcast/podcast_content/episodes&lt;/code&gt;. You’ll notice 3 episodes there. episode1.mp3, episode2.mp3 and episode3.mp3. Just replace these with your own audio files. You can even add episode4.mp3 5, etc. The script will end up querying all that exist (as long as this naming convention is followed).&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-podcast_content-audio.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4 id=&quot;add-the-episode-images&quot;&gt;Add the episode images&lt;/h4&gt;
&lt;p&gt;Look in the folder &lt;code&gt;/mypodcast/podcast_content/episode_images&lt;/code&gt;. You’ll notice 3 image filers there. episode1.png, episode2.png and episode3.png. Just replace these with your image files. The script hard codes .png, so be sure to use that format. Of course the script could be updated to look for any image type.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-episode-img.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4 id=&quot;add-the-episode-descriptions&quot;&gt;Add the episode descriptions&lt;/h4&gt;
&lt;p&gt;Look in the folder &lt;code&gt;/mypodcast/podcast_content/episode_descriptions&lt;/code&gt;. You’ll see three text files there; episode1.txt, episode2.txt, episode3.txt. Edit each of these with a text editor so they have the episode’s title, description, and release date. The screenshot below is of the content view in IPFS Desktop. You won’t be able to edit there so use any text editor or a development environment like &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VSCode&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-episode-txt.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4 id=&quot;edit-the-main-podcast-image-and-description&quot;&gt;Edit the main podcast image and description&lt;/h4&gt;
&lt;p&gt;Go into the folder the folder &lt;code&gt;/mypodcast/podcast_content&lt;/code&gt; and replace &lt;code&gt;podcast.png&lt;/code&gt; with your own podcast image. This will be displayed on the podcast web player and when you subscribe to the podcast in apps. We’ll generate the RSS subscription file/link later. Also, edit &lt;code&gt;podcast.txt&lt;/code&gt; with your podcast’s title, description, and author.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-podcast-desc.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;setting-up-an-ens-name-for-your-podcast&quot;&gt;Setting up an ENS name for your podcast&lt;/h3&gt;
&lt;p&gt;The podcast player is purely Javascript. We can use meta tags in the &lt;head&gt; section of the code in &lt;code&gt;index.html&lt;/code&gt;. Open this file in a text editor or VSCode and add your ENS name there.&lt;/head&gt;&lt;/p&gt;
&lt;h4 id=&quot;edit-indexhtml-and-add-your-ens-name-to-the-meta-tag&quot;&gt;Edit index.html and add your ENS name to the meta tag&lt;/h4&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-index.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Look for this line:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta name=&amp;quot;ensName&amp;quot; content=&amp;quot;podcast.showmehow.eth&amp;quot;&amp;gt; &amp;lt;!-- If set, this ENS name will be used instead of &#39;ipfsGateway&#39; and &#39;directoryHash&#39; to retrieve the content --&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace &lt;code&gt;podcast.showmehow.eth&lt;/code&gt; with the ENS subname you want to use for the podcast.&lt;/p&gt;
&lt;h4 id=&quot;optionally-use-another-ens-subname-for-the-podcast-subscription-feed-location&quot;&gt;Optionally, use another ENS subname for the podcast subscription feed location&lt;/h4&gt;
&lt;p&gt;Look for this line:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta name=&amp;quot;feedName&amp;quot; content=&amp;quot;feed.podcast.showmehow.eth&amp;quot;&amp;gt; &amp;lt;!-- If set, this ENS name will be used instead of &#39;ipfsGateway&#39; and &#39;feedHash&#39; to retrieve the feed --&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace &lt;code&gt;feed.podcast.showmehow.eth&lt;/code&gt; with the ENS subname you will use to allow people to subscribe to your podcast. For instance &lt;a href=&quot;https://feed.podcast.showmehow.eth.limo/&quot;&gt;https://feed.podcast.showmehow.eth.limo&lt;/a&gt; can be used to subscribe in Apple Podcast player. Since we are letting the script know we are using an ENS name, it will automatically use the &lt;a href=&quot;https://eth.limo/&quot;&gt;.limo resolver&lt;/a&gt; to fetch the IPFS content.&lt;/p&gt;
&lt;h4 id=&quot;point-your-ens-names-contenthash-record-to-the-ipfs-location&quot;&gt;Point your ENS name’s &lt;code&gt;contenthash&lt;/code&gt; record to the IPFS location&lt;/h4&gt;
&lt;p&gt;First get the IPFS CID of the &lt;code&gt;/mypodcast&lt;/code&gt; folder. You can easily find this in IPFS Desktop by right clicking on “mypodcast” then “Copy CID”. If you’re using an IPFS uploading service like Lighthouse or Pinata, you can easily find the CID there as well. &lt;strong&gt;Be sure that you’ve made all the changes to /&lt;code&gt;/mypodcast&lt;/code&gt; folder first before getting it’s CID hash.&lt;/strong&gt; If you add or edit any files in &lt;code&gt;/mypodcast&lt;/code&gt; the CID will change!&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-cid.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://app.ens.domains/&quot;&gt;ENS Manager App&lt;/a&gt; to point to the IPFS locations for the podcast web player and podcast RSS feed location for subscriptions.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-mypodcast-ens-cid.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Be sure the place &lt;code&gt;ipfs://&lt;/code&gt; before the CID you copied so it looks like this in the ENS records (but with your own CID):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ipfs://QmQW316xfuubnkwfZXynh6MQVsYwsS4q1Jx2mheXTax72s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you need help editing the &lt;code&gt;contenthash&lt;/code&gt; record, see the &lt;a href=&quot;https://support.ens.domains/articles/7890637-create-a-decentralized-website#h_aeeb903a9a&quot;&gt;ENS Support Guide: Building a Website&lt;/a&gt;. You should now be able to visit your ENS name, in this example, &lt;a href=&quot;https://podcast.showmehow.eth.limo/&quot;&gt;podcast.showmehow.eth.limo&lt;/a&gt; in your browser and play your podcast episodes but by using your very own ENS name!&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-player.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;You can now play the decentrally hosted podcast on IPFS right in your browser. However, if we’ve setup an ENS name for the podcast feed and set the meta tag variable for &lt;code&gt;feedName&lt;/code&gt; we need to generate a feed file. You can do this using the included generator in &lt;code&gt;/mypodcast/generator/index.html&lt;/code&gt;. You can also reach the podcast feed file generator script from &lt;a href=&quot;https://podcast.showmehow.eth.limo/generator&quot;&gt;podcast.showmehow.eth/generator&lt;/a&gt;. Just input the ENS name you used for the meta tag variable &lt;code&gt;ensName&lt;/code&gt; in &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-generator.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Once you download &lt;code&gt;podcast.rss&lt;/code&gt;, simply upload this file to IPFS, then grab its CID like you did to get the CID of &lt;code&gt;/mypodcast&lt;/code&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-rss.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Now, go to the &lt;a href=&quot;https://app.ens.domains/&quot;&gt;ENS Manager App&lt;/a&gt; and point the &lt;code&gt;contenthash&lt;/code&gt; record to the &lt;code&gt;podcast.rss&lt;/code&gt; IPFS hash.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-feed.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Now in a podcast player like Apple Podcast you can subscribe to the podcast using &lt;a href=&quot;https://feed.podcast.showmehow.eth.limo/&quot;&gt;feed.podcast.showmehow.eth.limo&lt;/a&gt; but of course with your very own ENS name.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-apple.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;optional-use-an-ipns-location-instead-of-ipfs&quot;&gt;Optional - Use an IPNS location instead of IPFS&lt;/h2&gt;
&lt;p&gt;If you don’t want to update your ENS content records each time you use IPFS Desktop to publish an IPNS location. For a guide on that, see &lt;a href=&quot;https://showmehow.eth.limo/setting-up-a-customizable-decentralized-blog-with-an-ens-name-and-ipfs-desktop/&quot;&gt;Setting up a customizable decentralized blog with an ENS name and IPFS desktop&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-07/ipfs-mypodcast-ipns.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;optional-also-use-an-ipfs-public-gateway-instead-of-an-ens-name-and-the-limo-resolver&quot;&gt;Optional also - Use an IPFS public gateway instead of an ENS name and the .limo resolver&lt;/h2&gt;
&lt;p&gt;You can choose to use a public IPFS gateway you specify instead of an ENS name and the default .limo resolver. To do this, leave the meta tag variables of &lt;code&gt;ensName&lt;/code&gt; and &lt;code&gt;feedname&lt;/code&gt; empty. The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; would look something like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta name=&amp;quot;directoryHash&amp;quot; content=&amp;quot;QmfHWotD3BNryxBQcbKxsZfvfRytGewo779C1iWScALQGJ&amp;quot;&amp;gt; &amp;lt;!-- Sets the IPFS directory hash. ie. IPFS CID hash of /podcast_content. If &#39;ensName&#39; is not provided, this will be used to locate the content --&amp;gt;&lt;/code&gt;
&lt;code&gt;&amp;lt;meta name=&amp;quot;feedHash&amp;quot; content=&amp;quot;QmaR1NKFxqP3kN9SSKdbVj3p8revjh3qDAQLw9dvfGwqdA&amp;quot;&amp;gt; &amp;lt;!-- Sets the IPFS feed hash. If &#39;feedName&#39; is not provided, this will be used to retrieve the feed --&amp;gt;&lt;/code&gt;
&lt;code&gt;&amp;lt;meta name=&amp;quot;ensName&amp;quot; content=&amp;quot;&amp;quot;&amp;gt; &amp;lt;!-- If set, this ENS name will be used instead of &#39;ipfsGateway&#39; and &#39;directoryHash&#39; to retrieve the content --&amp;gt;&lt;/code&gt;
&lt;code&gt;&amp;lt;meta name=&amp;quot;feedName&amp;quot; content=&amp;quot;&amp;quot;&amp;gt; &amp;lt;!-- If set, this ENS name will be used instead of &#39;ipfsGateway&#39; and &#39;feedHash&#39; to retrieve the feed --&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For a more technical explanation on how this works see the GitHub &lt;a href=&quot;https://github.com/zadok7/ipfs-ens-podcast/&quot;&gt;repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/setting-up-a-customizable-decentralized-blog-with-an-ens-name-and-ipfs-desktop/&quot;&gt;Setting up a customizable decentralized blog with an ENS name and IPFS desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/decentralized-website-concepts-and-tools/&quot;&gt;Decentralized Website Concepts and Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/docs/howto/decentralized_website&quot;&gt;Support Docs - Create a Decentralized Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ipfs.tech/concepts/dnslink/&quot;&gt;IPFS - DNSLink Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>Setting up a customizable decentralized blog with an ENS name and IPFS desktop.</title>
<link href="https://showmehow.eth.limo/setting-up-a-customizable-decentralized-blog-with-an-ens-name-and-ipfs-desktop/"/>
<updated>2023-06-26T00:00:00Z</updated>
<id>https://showmehow.eth.limo/setting-up-a-customizable-decentralized-blog-with-an-ens-name-and-ipfs-desktop/</id><content type="html">&lt;p&gt;In this guide, we will build a simple, easily updatable, and customizable blog website. It will be hosted on IPFS and linked to an ENS name. For this guide we will be using the &lt;a href=&quot;https://11ty.dev/&quot;&gt;Eleventy static site generator&lt;/a&gt;. The generator will output the entire website into static files that can be uploaded and ran on IPFS as a decentralized website. Using a static site generator is not required, but makes it easier to develop and make changes to your blog. You could also look for static template online and use a code editor like &lt;a href=&quot;https://code.visualstudio.com/download&quot;&gt;VS Code&lt;/a&gt; to make changes to the static files.&lt;/p&gt;
&lt;h3 id=&quot;download-the-eleventy-base-blog-example&quot;&gt;Download the Eleventy base blog example&lt;/h3&gt;
&lt;p&gt;For now let’s use the static site generator and create a simple blog similar to &lt;a href=&quot;https://vitalik.eth.limo/&quot;&gt;vitalik.eth.limo&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-vitalikweb.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;We will use the Eleventy base blog starter template to get going. It’s not exactly the same layout or generator, if any, that Vitalik.eth uses. However, you can understand the concepts behind it. &lt;a href=&quot;https://eleventy-base-blog.netlify.app/&quot;&gt;View a live demo&lt;/a&gt; of the simple blog site we will make in this proof of concept. There are other &lt;a href=&quot;https://www.11ty.dev/docs/starter/&quot;&gt;Eleventy starter templates&lt;/a&gt; you could try out with more features and design elements. We will keep it simple for the purposes of this guide.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-11ty-base.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;Eleventy base blog starter&lt;/a&gt; and click the download link and unzip it to the folder you would like.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-11ty-github.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;If you have git installed, you can also clone the repo using:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone https://github.com/11ty/eleventy-base-blog.git .&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;make-sure-npm-is-installed&quot;&gt;Make sure npm is installed&lt;/h3&gt;
&lt;p&gt;We’re going to need the package manager npm installed. This is cross platform so it should work on Windows, OSX, and Linux. It’s best to use a package manager to install npm to avoid permission issues. You can find more details on &lt;a href=&quot;https://docs.npmjs.com/downloading-and-installing-node-js-and-npm&quot;&gt;downloading and installing npm&lt;/a&gt;. Here you can find &lt;a href=&quot;https://nodejs.org/en/download&quot;&gt;node.js installers&lt;/a&gt; for different operating systems. This is probably the most difficult step in the guide, but you can do it!&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-npm.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;install-the-eleventy-static-site-generator-and-sample-blog-template&quot;&gt;Install the Eleventy static site generator and sample blog template&lt;/h3&gt;
&lt;p&gt;First we want to run the command to install all the dependcies the Eleventy static site generator will need. After npm is installed on your system, navigate to where you unzipped the download. Then on the command line or terminal run:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;test-what-it-looks-like-on-a-locally-running-server&quot;&gt;Test what it looks like on a locally running server&lt;/h3&gt;
&lt;p&gt;Run this command to start up a local web server to see your blog running locally.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npx @11ty/eleventy --serve&lt;/code&gt;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-11ty-serve.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;You should now be able to visit the site running locally at &lt;code&gt;https://localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-localhost.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;make-some-content-changes&quot;&gt;Make some content changes&lt;/h3&gt;
&lt;p&gt;First modify the metadata for your site. For the base template we’re using you can find  it here:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_data/metadata.js&lt;/code&gt; with your blog’s information&lt;/p&gt;
&lt;p&gt;After, let’s add a new post. Create a new markdown file ending in &lt;code&gt;.md&lt;/code&gt; and place it in the &lt;code&gt;/content/blog&lt;/code&gt; folder. You can name it whatever as long as it ends in &lt;code&gt;.md&lt;/code&gt; The “source” files for your blog will be in this &lt;code&gt;/content&lt;/code&gt; folder. Browse around the file structure here and view the existing &lt;code&gt;.md&lt;/code&gt; files and folders.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-content.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    Images go in the &quot;assets/images&quot; folder in your working directory.
  &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;You can use the code snippet below in a markdown file named something like &lt;code&gt;anewpost.md&lt;/code&gt;. The sample includes some of the metadata Eleventy will use(&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;draft&lt;/code&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: A new post
date: 2023-06-23
draft: false
---
This is a new post
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Don’t forget to modify &lt;code&gt;_includes/layouts/home.njk&lt;/code&gt; to remove the yellow metadata update reminder box. Go back to your browser and you will notice that the local web server will update with the changes you’ve made.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-updated.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;build-the-site&quot;&gt;Build the site&lt;/h3&gt;
&lt;p&gt;You can hit Ctrl-C to stop the the local web server. Then let’s build the static version of the site we can upload to IPFS:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npx @11ty/eleventy&lt;/code&gt;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-11ty-build.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;It will output to the &lt;code&gt;_site&lt;/code&gt; folder of your working diretory. You can view the site by opening the &lt;code&gt;index.html&lt;/code&gt; file in a web browser.&lt;/p&gt;
&lt;h3 id=&quot;host-the-files-on-ipfs-using-a-local-node&quot;&gt;Host the files on IPFS using a local node&lt;/h3&gt;
&lt;p&gt;As you can see, now that the website is static there is no need for a web server to render the content. Everything is already rendered and optimized by the Eleventy static generator.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-11ty-static.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Now let’s copy the static files to IPFS so we can use that to host the website instead of a server. First download and &lt;a href=&quot;https://docs.ipfs.tech/install/ipfs-desktop/&quot;&gt;install IPFS Desktop&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;setup-ipns&quot;&gt;Setup IPNS&lt;/h3&gt;
&lt;p&gt;Let’s edit some of the settings for IPFS Desktop. We will also be using &lt;a href=&quot;https://docs.ipfs.tech/concepts/ipns/&quot;&gt;IPNS&lt;/a&gt; pointers instead of using just &lt;a href=&quot;https://docs.ipfs.tech/concepts/content-addressing/#what-is-a-cid&quot;&gt;IPFS CIDs&lt;/a&gt;. We’ll do this so we don’t need to spend Ethereum gas fees to update our ENS records each time we change the static website content. On IPFS Desktop go under settings and generate a new IPNS Key.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-ipns.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Also adjust the lifetime and republish settings.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-settings.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;copy-your-static-website-folder-to-ipfs&quot;&gt;Copy your static website folder to IPFS&lt;/h3&gt;
&lt;p&gt;On IPFS Desktop, click &lt;code&gt;Files&lt;/code&gt;, then click &lt;code&gt;Import&lt;/code&gt; and select the folder &lt;code&gt;_site&lt;/code&gt; from your Eleventy working directory. The content will get added to iPFS and your local node will share it with other peers.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-folder.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;find-the-cid-of-the-ipfs-content&quot;&gt;Find the CID of the IPFS content&lt;/h3&gt;
&lt;p&gt;Click the &lt;code&gt;...&lt;/code&gt; menu and select &lt;code&gt;Inspect&lt;/code&gt;. Notate the CID for the IPFS content location as we may use this later with a pinning service for redundancy.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-inspect.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;You can view the content through the browser using your own gateway, or a public one.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-gateway.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;publish-the-ipfs-content-to-ipns&quot;&gt;Publish the IPFS content to IPNS&lt;/h3&gt;
&lt;p&gt;In IPFS Desktop, under &lt;code&gt;Settings&lt;/code&gt; click &lt;code&gt;Publish to IPNS&lt;/code&gt;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-ipns-publish.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Then, copy the IPNS location from the &lt;code&gt;Settings&lt;/code&gt; page of IPFS Desktop.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-11ty-ipns-hash.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;You can now open up a browser and visit:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://k51qzi5uqu5dkfmv1lofqjb4twoyrz95ccnzl8k37h0804d3zarb250zz9p6ef.ipns.localhost:8081/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace &lt;code&gt;k51qzi...&lt;/code&gt; with your own IPNS hash you copied from IPFS Desktop.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-smh-local.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;store-the-decentralized-content-hash-record-for-your-ens-name&quot;&gt;Store the decentralized content hash record for your ENS name&lt;/h3&gt;
&lt;p&gt;If we didn’t use IPNS, we’d need to update the ENS records each time. This is because when you upload content to IPFS, the hash is generated from the content itself. So for instance if users uploaded the same exact file, then that file’s(or directory) IPFS CID (eg. &lt;code&gt;QmTBa7...&lt;/code&gt;) would be exactly the same. Since our &lt;code&gt;_site&lt;/code&gt; folder will have different data each time we generate the site, it’s not going to be the same IPFS CID. To solve this we’re going to use an IPNS hash there which will point to the newest IPFS CID which we update using our local node running on IPFS Desktop.&lt;/p&gt;
&lt;p&gt;Log into the &lt;a href=&quot;https://app.ens.domains/&quot;&gt;ENS Manager App&lt;/a&gt; and click &lt;code&gt;Edit Profile&lt;/code&gt;. Click on &lt;code&gt;Website&lt;/code&gt;, then the &lt;code&gt;IPFS&lt;/code&gt; button.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-content-record.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Copy in the IPNS location into the content record for your ENS name.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-smh-add-ipns.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;It should be in this format: &lt;code&gt;ipns://k51qzi5...&lt;/code&gt;. Approve the transaction with your connected wallet.&lt;/p&gt;
&lt;h3 id=&quot;use-the-limo-resolver-to-view-your-decentralized-website&quot;&gt;Use the .LIMO resolver to view your decentralized website&lt;/h3&gt;
&lt;p&gt;Once your ENS name’s content record is set, you can use a resolver like &lt;a href=&quot;https://eth.limo/&quot;&gt;.limo&lt;/a&gt; to render the site on any browser. Simply append .limo to the end of the ENS name that has a content record set. So for instance this blog can be reached at, &lt;a href=&quot;https://showmehow.eth.limo/&quot;&gt;showmehow.eth.limo&lt;/a&gt;. The &lt;code&gt;.limo&lt;/code&gt; resolver uses a gateway to fetch the content hash from the &lt;a href=&quot;https://app.ens.domains/showmehow.eth?tab=records&quot;&gt;ENS records&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-smh-records.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;pin-the-ipfs-cid-externally&quot;&gt;Pin the IPFS CID externally&lt;/h3&gt;
&lt;p&gt;You can pin the IPFS CID to an external pinning service like &lt;a href=&quot;https://pinata.cloud/&quot;&gt;Pinata&lt;/a&gt;. This provides some redundancy and higher data speeds by utilizing a faster node compared to the locally running node with IPFS Desktop. As visitors access your site and nodes retrieve the IPFS data, the caching of recent content fetches by nodes on the IPFS network enables faster delivery of the data.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-external-pin.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;An alternative pinning service is &lt;a href=&quot;https://lighthouse.storage/&quot;&gt;Lighthouse.storage&lt;/a&gt;. You can upload the same exact &lt;code&gt;_site&lt;/code&gt; folder there, and your IPFS CID should match the one on your IPFS Desktop. This is because it is the same exact folder, identical bit by bit. The difference is that the content is not only pinned to your local IPFS nodenow, but also through a third party IPFS service like Lighthouse. Take a look at the IPFS CID in Lighthouse.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-lighthouse-match.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Compare that to the IPFS CID you uploaded the same &lt;code&gt;_site&lt;/code&gt; folder within IPFS Desktop.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-ipfsdesktop-match.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;upload-a-new-version-of-the-static-site&quot;&gt;Upload a new version of the static site&lt;/h3&gt;
&lt;p&gt;To change your website content, delete the &lt;code&gt;_site&lt;/code&gt; folder from IPFS Desktop. Then from the command line you will need to rebuild the &lt;code&gt;_site&lt;/code&gt; folder by running:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npx @11ty/eleventy&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After, import the new &lt;code&gt;_site&lt;/code&gt; folder into your &lt;code&gt;Files&lt;/code&gt; on IPFS Desktop. You will notice the IPFS CID has changed because the file contents have as well. Don’t forget to publish to IPNS again on IPFS Desktop. This will update the IPNS pointer to your new IPFS CID.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ipfs-ens-repub-ipns.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;No updating of ENS records is necessary. Using the .limo resolver after your ENS name should soon show the new content. Remember to pin or upload the new &lt;code&gt;_site&lt;/code&gt; folder to other nodes like Pinata or Lighthouse. This way your data persistance doesn’t rely on a single IPFS node for content pinning.&lt;/p&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/decentralized-website-concepts-and-tools&quot;&gt;Decentralized Website Concepts and Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/docs/howto/decentralized_website&quot;&gt;Support Docs - Create a Decentralized Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ipfs.tech/concepts/dnslink/&quot;&gt;IPFS - DNSLink Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/serve-dynamic-blockchain-content-through-dns-records&quot;&gt;Serve Dynamic Blockchain Content through DNS records&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>Decentralized Website Concepts and Tools</title>
<link href="https://showmehow.eth.limo/decentralized-website-concepts-and-tools/"/>
<updated>2023-06-11T00:00:00Z</updated>
<id>https://showmehow.eth.limo/decentralized-website-concepts-and-tools/</id><content type="html">&lt;p&gt;Decentralized websites function by having their content separated from a central server. Instead, the content is stored in a decentralized way on the blockchain. The InterPlanetary File System (IPFS) is commonly used to store decentralized website data. IPFS is a peer-to-peer protocol and facilitates the decentralized storing and sharing of data, ensuring it could be accessible even if the original publisher of the content goes offline. It functions much like peer-to-peer torrent networks, distributing data across numerous nodes, eliminating single-point failures.&lt;/p&gt;
&lt;h3 id=&quot;how-does-a-decentralized-website-work-on-ipfs&quot;&gt;How does a decentralized website work on IPFS?&lt;/h3&gt;
&lt;p&gt;With IPFS, each node (user) in the network is both a client and a server, which contrasts with the traditional client-server model where data is hosted on centralized servers. Each file and all of the blocks within it are given a unique fingerprint called a cryptographic hash. When you look up a file on IPFS, you’re asking the network to find nodes that are storing the content behind that file’s hash. It’s important to note that IPFS removes any data that is unused. However, IPFS hashes can be pinned by nodes so that they are always available. IPFS locations are referenced via a content identifier (CID), which is a unique cryptographic hash assigned to the content that gets posted to the IPFS network.&lt;/p&gt;
&lt;h3 id=&quot;how-can-you-point-a-dns-domaineg-com-to-decentralized-content-on-ipfs&quot;&gt;How can you point a DNS domain(eg .com) to decentralized content on IPFS?&lt;/h3&gt;
&lt;p&gt;You can use a traditional domain name (.com, .org, etc.), referencing IPFS content using DNSLink text records. This will map your domain name to the IPFS content, using a gateway that is able to resolve the decentralized content and render it in the browser. In traditional web hosting, this is performed by a web server. DNS is the Internet infrastructure also known as the domain names system, which relies on centralized architecture to map domain names to servers. In the world of blockchain, you can use ENS, or the Ethereum Name Service to save a long CID hash to visit a decentralized content location, you could attach that CID to an ENS name. ENS names are human-readable blockchain names that can point to any location you wish including the content hashes using IPFS locations.&lt;/p&gt;
&lt;p&gt;One way to visit a decentralized website can be achieved through DNSLink, which would work to point to a normal domain name like a .com, so that a website visitors will see the decentralized content rendered when visiting the .com. In this way the content is stored decentralized, but the domain you use to reach the content would rely on centralized architecture like DNS and the domain name itself, for instance a .com name.&lt;/p&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    For a guide on DNSLink, see: &lt;a href=&quot;https://showmehow.eth.limo/host-in-parallel-dns-and-ens-static-content-from-ipfs&quot;&gt;Host in Parallel DNS and ENS static content from IPFS&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;using-an-ens-name-for-a-decentralized-website&quot;&gt;Using an ENS name for a decentralized website&lt;/h3&gt;
&lt;p&gt;But what if you have an ENS name? ENS .eth names are owned on the blockchain, and work via smart contracts. Because Ethereum is the blockchain that ENS is built on top of, you can use an ENS name to point to blockchain content. One way to do this is to visit the ENS Manager App and view the dWeb content record of the name to see where the IPFS content location is. You could then copy the IPFS CID to any &lt;a href=&quot;https://docs.ipfs.tech/concepts/ipfs-gateway/#gateway-providers&quot;&gt;IPFS gateway service&lt;/a&gt;, which reads content on IPFS, and view the website.&lt;/p&gt;
&lt;p&gt;Though it’s great that the IPFS hash can be stored immutably on a record for the ENS name, copying and pasting the hash value into an IPFS gateway isn’t ideal. There are a few browsers that you can type in name.eth and it will visit the decentralized website by automatically reading the IPFS hash. Two popular browsers that perform this are &lt;a href=&quot;https://brave.com/&quot;&gt;Brave&lt;/a&gt; and &lt;a href=&quot;https://opera.com/&quot;&gt;Opera&lt;/a&gt;. Browsers that also have &lt;a href=&quot;https://metamask.io/&quot;&gt;Metamask&lt;/a&gt; installed can view .eth ENS name’s website content directly in the browser.&lt;/p&gt;
&lt;p&gt;Finally, one of the easiest ways is to simply attach .limo to the end of the ENS name and it will resolve in the browser the website content that is stored on IPFS, that is read from your ENS records. For instance, Vitalik’s blog, the founder of Ethereum is here: &lt;a href=&quot;https://vitalik.eth.limo/&quot;&gt;vitalik.eth.limo&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/vitalik-limo.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;how-can-i-store-the-location-of-decentralized-content-in-the-ens-content-record&quot;&gt;How can I store the location of decentralized content in the ENS content record?&lt;/h3&gt;
&lt;p&gt;Storing content on a decentralized website involves uploading the content on networks like IPFS and having a pinning service ensure the content stays up. Popular pinning services are Pinata, Filebase, or your own node of IPFS you can run on your local computer. Content is added to the IPFS network, while pinning services ensure the data remains available by preserving it across multiple nodes. Within ENS, you can also use Swarm, Onion, Skynet, and Arweave locations. You can save the decentralized content record using the &lt;a href=&quot;https://app.ens.domains/&quot;&gt;ENS Manager App&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ens-dweb-options.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    For help on adding the content hash to your ENS records, see the support docs: &lt;a href=&quot;https://support.ens.domains/articles/7890637-create-a-decentralized-website#h_aeeb903a9a&quot;&gt;Configure the ENS name content hash record&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;how-do-you-build-a-simple-decentralized-website&quot;&gt;How do you build a simple decentralized website?&lt;/h3&gt;
&lt;p&gt;Building a decentralized website involves creating frontend code locally and then uploading it to IPFS. The content is then “pinned” to ensure its persistence on the network if using IPFS. You could also use website builders like 1w3, which are tailored for creating decentralized sites. To do that, you would simply log into the project’s dApp with your wallet. &lt;a href=&quot;https://1w3.eth.limo/&quot;&gt;1W3&lt;/a&gt; is great for building decentralized linktr.ee type websites, along with a few other website templates using just your ENS name. The project takes care of uploading and pinning the content to IPFS automatically.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/1w3.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4 id=&quot;redirecting-an-ens-name-to-an-existing-domain&quot;&gt;Redirecting an ENS name to an existing domain&lt;/h4&gt;
&lt;p&gt;Maybe you have a regular .com website for example, and haven’t built a decentralized version of it yet. One thing you can do if you have an ENS name is to just redirect it to your website address. This way if someone goes to mycooltshirts.eth.limo, the content record could point to a redirect file stored on IPFS, that would navigate the user to your existing website. You can visit &lt;a href=&quot;https://ensredirect.xyz/&quot;&gt;ENSRedirect&lt;/a&gt; to set this up.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/2023-06/ensredirect.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 id=&quot;how-do-you-build-a-custom-decentralized-website&quot;&gt;How do you build a custom decentralized website?&lt;/h3&gt;
&lt;p&gt;In order to have a functioning website stored on IPFS, you will need to have a static version available. This means that the website won’t be dynamic in the sense that the website content can change through user interactions. For instance, a user forum won’t make for a good static website since it always changes with new posts and comments. It is possible to run decentralized user forum with the frontend on IPFS, and the dynamic data can be read or updated using the blockchain rather than centralized data servers. This process is out of scope for this article.&lt;/p&gt;
&lt;p&gt;One solution to create a static website is to use static site generators like &lt;a href=&quot;https://gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt;, &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;, &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, or &lt;a href=&quot;https://11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;. These generators will allow you to develop a website locally, and then it will generate the entire static website for you which you can then upload to IPFS.&lt;/p&gt;
&lt;p&gt;Without using a generator, you can also just download a static template and edit the files in the downloaded folder. You can create a static website easily by downloading &lt;a href=&quot;https://bootstrapmade.com/&quot;&gt;BootstrapMade Templates&lt;/a&gt;. From there, just edit the website files and upload the folder to IPFS.&lt;/p&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    For a guide on using IPFS desktop to publish static content to IPFS, see: &lt;a href=&quot;https://showmehow.eth.limo/setting-up-a-customizable-decentralized-blog-with-an-ens-name-and-ipfs-desktop&quot;&gt;Setting up a customizable decentralized blog with an ENS name and IPFS desktop&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;</content>
</entry><entry><title>Mapping of DNS vs ENS</title>
<link href="https://showmehow.eth.limo/mapping-of-dns-vs-ens/"/>
<updated>2023-04-20T00:00:00Z</updated>
<id>https://showmehow.eth.limo/mapping-of-dns-vs-ens/</id><content type="html">&lt;p&gt;In the traditional DNS system, the DNS root zone file is managed by the Internet Assigned Numbers Authority (&lt;a href=&quot;https://iana.org/&quot;&gt;IANA&lt;/a&gt;), which is part of the Internet Corporation for Assigned Names and Numbers (&lt;a href=&quot;https://icann.org/&quot;&gt;ICANN&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;IANA is responsible for coordinating the assignment of unique identifiers on the Internet, including domain names to IP addresses mapping. The entire root zone file that IANA oversees can be viewed and downloaded here: &lt;a href=&quot;https://www.iana.org/domains/root/files&quot;&gt;https://www.iana.org/domains/root/files&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;source srcset=&quot;https://showmehow.eth.limo/images/dnstoens/root-zone-file.png&quot; media=&quot;(prefers-color-scheme: dark)&quot; /&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/dnstoens/light-root-zone-file.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;Depending on DNS caching, ie. if the ISP already knows where to find the authoritative nameservers for a website, the DNS query might not need to check against the root zone file. The important thing to note here is that the root zone file is at the highest level of the Domain Name System architecture, and that zone file mapping is maintained by a single entity (IANA).&lt;/p&gt;
&lt;h2 id=&quot;blockchain-and-immutable-data-storage-on-the-blockchain&quot;&gt;Blockchain and Immutable Data Storage on the Blockchain&lt;/h2&gt;
&lt;p&gt;On the contrary, instead of relying on a single organization’s authority to maintain the truth of mapping, the blockchain is a decentralized global database of information whose state is agreed on by the entire blockchain network.&lt;/p&gt;
&lt;p&gt;This is possible because the storage of this data is distributed among all of the validator nodes that secure the entire Ethereum Virtual Machine blockchain. The blockchain data is stored in an immutable ledger. This means ones the transactions are added to the blockchain, they cannot be reversed, altered or removed.&lt;/p&gt;
&lt;p&gt;Transaction data can be queried by services like  &lt;a href=&quot;https://etherscan.io/&quot;&gt;Etherscan.io&lt;/a&gt;. Below is an example of recent transactions found on Etherscan for wallets that have interacted with the &lt;a href=&quot;https://etherscan.io/address/0x253553366da8546fc250f225fe3d25d0c782303b&quot;&gt;ETH Registrar Controller&lt;/a&gt; which is the smart contract responsible for registering ENS names.&lt;/p&gt;
&lt;br /&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/dnstoens/etherscan-registrations2.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Data security for the Ethereum blockchain is afforded by network consensus, where multiple nodes must agree on the state of the data. In addition, access to update blockchain data is cryptographically secured.&lt;/p&gt;
&lt;p&gt;This means that only the authorized party with the cryptographic private keys are allowed to update or make changes to the data stored on the blockchain. In other words, only the user with the cryptographic private keys is allowed to make updates to the data stored on the blockchain associated with the wallet address they own.&lt;/p&gt;
&lt;p&gt;There are no credentials stored on central databases, SSO(Single sign on), or email logins to change data on the blockchain. Only a wallet can approve a transaction, which only that user should know the private keys for.&lt;/p&gt;
&lt;p&gt;The combination of these factors make the blockchain more secure compared to traditional centralized infrastructure, where a single point of failure can lead to data breaches and other security issues.&lt;/p&gt;
&lt;h2 id=&quot;adding-or-updating-blockchain-data&quot;&gt;Adding or Updating Blockchain Data&lt;/h2&gt;
&lt;p&gt;In order to add or change data on the blockchain, a user needs to interact with the smart contract(s) by cryptographic signing requests using their wallet. Since users own their own private key data, only they can authorize the transaction to be added to the blockchain.&lt;/p&gt;
&lt;p&gt;The smart contract is available globally because the blockchain is a global ledger of data that can contain more than data, but code that runs as programs in the form of these smart contracts.&lt;/p&gt;
&lt;p&gt;This means that many different dApps can be built to allow users to interact with the blockchain using their own wallets, relying on the user owning their own private keys in order to make those transactions. Private keys should never be shared, or stored in an insecure manner.&lt;/p&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    To learn about how a front end is used to edit blockchain data, the ENS Manager App is a great example, see: &lt;a href=&quot;https://support.ens.domains/en/articles/7890802-set-a-record&quot;&gt;Set an ENS record&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;decentralized-apps&quot;&gt;Decentralized Apps&lt;/h2&gt;
&lt;p&gt;A dApp is also known as a Decentralized Application. These applications are built to interact with the blockchain. Because the data storage dApps interact with is the blockchain itself, it is by design transparent, secure, and autonomous, with no central authority controlling the user’s ability to update their own data.&lt;/p&gt;
&lt;p&gt;For instance, a user could not be blocked, or worse, have their email address hacked and unauthorized access gained to reconfigure what Ethereum blockchain address their ENS name points to. That can only be accessed through having the private keys of the cryptographic wallet that has permission to update such record.&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;source srcset=&quot;https://showmehow.eth.limo/images/dnstoens/dapp-design.png&quot; media=&quot;(prefers-color-scheme: dark)&quot; /&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/dnstoens/light-dapp-design.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;A way to understand this concept is in the case of NFT(non-fungible token) marketplaces. NFTs are digital items stored on the blockchain. It’s important to understand that digital tokens like NFTs or crypto currency do not physically reside within a crypto wallet.&lt;/p&gt;
&lt;p&gt;Instead, the wallet’s address is noted in the public blockchain ledger as being the owner of that NFT. Because the NFT is not inside the wallet itself, but rather the blockchain, there can be many apps or interfaces that are able to interact with the token.&lt;/p&gt;
&lt;p&gt;An ERC-721 NFT exists on the Ethereum blockchain and would be able to appear on any market without the need to “add” it to each market. This is because the data (or database) is stored within the global EVM’s blockchain.&lt;/p&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/contract-api-reference/.eth-permanent-registrar&quot;&gt;.eth Permanent Registrar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ethereum.org/smart-contracts/&quot;&gt;Ethereum.org - Introduction to smart contracts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/articles/7900624-security&quot;&gt;ENS Support Docs - Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>Requirements for DNS to ENS Integration</title>
<link href="https://showmehow.eth.limo/requirements-for-dns-to-ens-integration/"/>
<updated>2023-04-20T00:00:00Z</updated>
<id>https://showmehow.eth.limo/requirements-for-dns-to-ens-integration/</id><content type="html">&lt;p&gt;There are only two steps required to prepare a DNS domain for usage within the blockchain leveraging the ENS protocol. These steps are relatively straightforward for most users who may already be familiar with adding DNS records to their legacy domain names.&lt;/p&gt;
&lt;h2 id=&quot;two-required-steps-for-dns-to-ens&quot;&gt;Two Required Steps for DNS to ENS&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Enable DNSSEC for the DNS domain&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/dnstoens/turn-dnsec-on.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Create a domain verification record (TXT record) set to an Ethereum wallet address&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center;&quot;&gt;
&lt;picture&gt;
    &lt;img src=&quot;https://showmehow.eth.limo/images/dnstoens/requirements-dns-to-ens-1.png&quot; alt=&quot;Image description&quot; /&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    For detailed instructions see: &lt;a href=&quot;https://showmehow.eth.limo/connect-a-dns-name-to-the-ens-protocol&quot;&gt;DNS + ENS Guide - Connect a DNS name to the ENS Protocol&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;fees-to-ens-enable-a-dns-domain&quot;&gt;Fees to ENS-enable a DNS Domain&lt;/h2&gt;
&lt;p&gt;There are &lt;strong&gt;no registration fees&lt;/strong&gt; to enable a DNS domain for use on the blockchain with the ENS protocol. DNS domains that have been ENS-enabled have available to them ENS functionality such as secure &amp;amp; decentralized records, the ability to set multiple cryptocurrency payment addresses, unlimited subname creation for different identities, avatar support, and to assign the name as the Primary web3 username/identity.&lt;/p&gt;
&lt;p&gt;To learn more about the differences between ENS-enabled domains names and .eth names, see &lt;a href=&quot;https://showmehow.eth.limo/imported-dns-compared-to-ens-native-eth-name&quot;&gt;Imported DNS Compared to ENS Native .eth Name&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/dns-and-ens-further-development&quot;&gt;DNS and ENS Further Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/contract-api-reference/dns-registrar&quot;&gt;DNS + ENS Guide - Cloudflare DNS and Web3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/contract-api-reference/dns-registrar&quot;&gt;ENS Documentation - DNS Registrar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/articles/7882690-claim-your-dns-name&quot;&gt;ENS Support Docs - Claim your DNS name&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>Overview of DNS to ENS</title>
<link href="https://showmehow.eth.limo/overview-of-dns-to-ens/"/>
<updated>2023-04-20T00:00:00Z</updated>
<id>https://showmehow.eth.limo/overview-of-dns-to-ens/</id><content type="html">&lt;p&gt;Traditional DNS domains do not work natively within the blockchain, however it is possible to “supercharge” a DNS domain name using the Ethereum Name Service(ENS) protocol as a bridge.&lt;/p&gt;
&lt;p&gt;In this article and others on this site we’ll cover some basics of the Ethereum blockchain, smart contracts, current use cases of DNS within the blockchain, and how traditional domain name owners utilize this functionality today.&lt;/p&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    If you would like to get started with DNS to ENS integration, you may skip to this set of guides: &lt;a href=&quot;https://showmehow.eth.limo/dns-to-ens-guides&quot;&gt;DNS to ENS Guides&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;dns-compatibility-with-blockchain&quot;&gt;DNS Compatibility with Blockchain&lt;/h2&gt;
&lt;p&gt;Traditional DNS domain names (e.g. &lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;.org&lt;/code&gt;, &lt;code&gt;.xyz&lt;/code&gt; etc…) are not natively be compatible with the blockchain. This is because the blockchain is built upon decentralized architecture whereas DNS relies upon centralized services and data storage.&lt;/p&gt;
&lt;p&gt;Enabling forward-compatibility of domain names to the blockchain has many fascinating and practical use cases. The ENS protocol has been developing its own infrastructure that ensures legacy DNS domain names will forward with today’s modern blockchain using the Ethereum ecosystem.&lt;/p&gt;
&lt;p&gt;DNS domain owners can have the added benefit of blockchain functionality, without sacrificing how their domain names currently function on the Internet.&lt;/p&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    To learn about current DNS to ENS use cases, see: &lt;a href=&quot;https://showmehow.eth.limo/dns-ens-use-case-examples&quot;&gt;DNS + ENS Use Case Examples&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/connect-a-dns-name-to-the-ens-protocol&quot;&gt;DNS to ENS Guides - Connect a DNS name to the ENS Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/dns-compared-to-ens&quot;&gt;DNS Compared to ENS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/&quot;&gt;ENS Support Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/&quot;&gt;ENS Technical Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>Imported DNS Compared to ENS Native .eth Name</title>
<link href="https://showmehow.eth.limo/imported-dns-compared-to-ens-native-eth-name/"/>
<updated>2023-04-20T00:00:00Z</updated>
<id>https://showmehow.eth.limo/imported-dns-compared-to-ens-native-eth-name/</id><content type="html">&lt;p&gt;The following is a comparison of native  ENS .eth names with DNS names that have been imported to ENS protocol. By utilizing the ENS protocol, it’s possible to extend DNS functionality into the blockchain. There are however some important differences that should be noted.&lt;/p&gt;
&lt;h2 id=&quot;dns-to-ens-vs-ens-eth-names&quot;&gt;[DNS to ENS] VS [ENS .eth Names]&lt;/h2&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Functionality&lt;/strong&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;strong&gt;DNS to ENS&lt;/strong&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;strong&gt;ENS .eth&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expires&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;em&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Registration fee&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;em&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Relies on DNS&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;em&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Create subnames&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fuse permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;em&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tradeable (NFTs)&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;em&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blockhain Record Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resolve dWeb content&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Universal Avatar (PFP)&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use as Web3 Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Point to multiple coins&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;notice&quot;&gt;
  &lt;p&gt;
    There may be some exceptions with TLDs (.art, .box etc) that more deepy integrate with ENS. The architecture is different than an imported DNS name. For information on importing a DNS name into ENS see the support doc: &lt;a href=&quot;https://support.ens.domains/articles/7882690-claim-your-dns-name&quot;&gt;Claim your DNS name&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expires&lt;/strong&gt; - DNS names imported into ENS have no expiration date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regisration fee&lt;/strong&gt; - 2LD (e.g. name.eth) names have a yearly registration fee. DNS names claimed within ENS do not have any registration fees.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relies on DNS&lt;/strong&gt; - Claiming a DNS name within the ENS protocol relies on a DNSSEC proof of domain ownership and a DNS TXT record to verify the Controlling wallet of the DNS name within ENS and the blockchain. Proof of ownership of the DNS name on ENS could be changed if the DNS provider is changed, or if the DNS domain expires and is registered by another. ENS .eth names do not rely on DNS for their functionality or existence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuse permissions&lt;/strong&gt; - DNS names within ENS will not be able to use advanced permissions with the &lt;a href=&quot;https://github.com/ensdomains/ens-contracts/tree/master/contracts/wrapper&quot;&gt;NameWrapper Contract&lt;/a&gt;. To note, this is technically possible, but because the imported DNS name is not “unruggable”, there’s no way to guarantee users will permissionlessly own their names.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create subnames&lt;/strong&gt; - Both ENS .eth names and DNS imported ENS names can create unlimited subnames. There are no registration fees for either.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tradeable (NFTs)&lt;/strong&gt; - Only ENS .eth and subnames will have the ability to be traded as trustless (unruggable) &lt;a href=&quot;https://ethereum.org/en/nft/&quot;&gt;NFT (Non-fungible Token)&lt;/a&gt;.A DNS name imported into ENS would rely on DNS records to prove ownership and cannot be trustlessly issued.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blockhain Record Storage&lt;/strong&gt; - DNS names imported to ENS will have their record storage data resolved from the blockchain just as ENS .eth records do.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolve dWeb content&lt;/strong&gt; - DNS names within ENS are able to store a dWeb content hash record, the same record is availble to ENS .eth names.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Universal Avatar (PFP)&lt;/strong&gt; - DNS to ENS, and ENS .eth names are able to choose an avatar or profile picture that will appear across the Internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use as Web3 Identity&lt;/strong&gt; - A DNS name imported into ENS can use set a Primary name which allows an Ethereum wallet to display as your ENS name instead of the long alphanumeric string. Any ENS .eth name can also be set as a Primary name, inlcuding subnames of the parent .eth 2LD (e.g. user1.name.eth).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Point to multiple coins&lt;/strong&gt; - ENS records can point to blockchain addresses outside of Ethereum like Bitcoin, LTC, Polygon, and more. See &lt;a href=&quot;https://support.ens.domains/en/articles/7888628-add-a-wallet-address#h_c1d700fa3b&quot;&gt;supported cryptocurrency addresses&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/ens-improvement-proposals/ensip-9-multichain-address-resolution&quot;&gt;ENSIP-9: Multichain Address Resolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/manage-ens-records-for-a-dns-name&quot;&gt;Manage ENS Records for a DNS Name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/dns-offchain-subname-issuance-coinbase-wallet-cbid&quot;&gt;DNS OffChain Subname Issuance - Coinbase Wallet (cb.id)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/articles/7890756-the-primary-name&quot;&gt;ENS Support Docs - Set a Primary name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.ens.domains/articles/7883271-how-to-set-an-avatar&quot;&gt;ENS Support Docs - How to set an Avatar on your ENS name&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry><entry><title>DNS and ENS Further Development</title>
<link href="https://showmehow.eth.limo/dns-and-ens-further-development/"/>
<updated>2023-04-20T00:00:00Z</updated>
<id>https://showmehow.eth.limo/dns-and-ens-further-development/</id><content type="html">&lt;p&gt;The ENS protocol continues to embrace forward compatibility with DNS to allow for wider web3 and blockchain adoption. Enabling a DNS domain to be used within the ENS protocol has seen considerable development changes since first introduced in 2017.&lt;/p&gt;
&lt;h2 id=&quot;current-dns-to-ens-process&quot;&gt;Current DNS to ENS Process&lt;/h2&gt;
&lt;p&gt;Currently importing a DNS name for blockchain usage through the ENS protocol requires a significant amount of gas to add the data to the blockchain. Gas is paid in &lt;a href=&quot;https://ethereum.org/en/developers/docs/intro-to-ether/&quot;&gt;Ether&lt;/a&gt; which is Ethereum’s native cryptocurrency token. One primary function of the token is that it is used for paying transaction fees to node validators to compute and add new data to the blockchain. Since the ENS protocol is built for public good usage, there &lt;strong&gt;will never be registration fees&lt;/strong&gt; to use the ENS protocol with DNS domains.&lt;/p&gt;
&lt;h2 id=&quot;gasless-dns-to-ens-integration&quot;&gt;Gasless DNS to ENS Integration&lt;/h2&gt;
&lt;p&gt;Currently, in order to use a DNS domain within the ENS protocol a DNSSEC proof must be submitted to the &lt;a href=&quot;https://github.com/ensdomains/dnssec-oracle&quot;&gt;DNSSEC Oracle smart contract&lt;/a&gt;. The computational requirements are heavy to submit the proof of ownership of the DNS domain which results in users having to pay a large amount of gas to the Ethereum network to make their DNS domain compatible with the blockchain through ENS.&lt;/p&gt;
&lt;p&gt;offchain DNS Registrar support will soon be available to DNS domain owners. Instead of submitting DNSSEC proofs to the blockchain, a DNS owner can simply set a TXT record that points to an offchain resolver contract using &lt;a href=&quot;https://docs.ens.domains/ens-improvement-proposals/ensip-10-wildcard-resolution&quot;&gt;ENSIP-10 Wildcard Resolution&lt;/a&gt;. The result will be that a DNS domain owner will no longer need to pay gas fees to the Ethereum network to enable their DNS domain within the ENS protocol. Instead, the resolver address will be specified within a DNS TXT record containing its location. The result is that DNS domain name owners will save hundreds in transactional gas fees, while still leveraging their web2 domain within the blockchain.&lt;/p&gt;
&lt;h2 id=&quot;gasless-ens-records&quot;&gt;Gasless ENS Records&lt;/h2&gt;
&lt;p&gt;Once offchain DNS registration permits gasless integration of DNS domains within ENS, record creation will continue to require Ethereum gas fees since the records will be set up on chain. Further implementation work is being done to allow secure offchain record retrieval using &lt;a href=&quot;https://eips.ethereum.org/EIPS/eip-3668&quot;&gt;CCIP-read&lt;/a&gt;. An advanced resolver is being developed that will be able to resolve a DNS to ENS name’s records, entirely by its DNS text records. As a result, setting ENS records for ENS enabled DNS domains will not cost any gas since those records will be able to be resolved entirely through DNS TXT records.&lt;/p&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/dns-to-ens-guides&quot;&gt;DNS to ENS Import Guide&lt;/a&gt; - A guide to enable DNS domains in ENS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://showmehow.eth.limo/dns-offchain-subname-issuance-coinbase-wallet-cbid&quot;&gt;DNS offchain Subname Issuance - Coinbase Wallet (cb.id)&lt;/a&gt; - A look at Coinbase integration with ENS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/contract-api-reference/dns-registrar&quot;&gt;ENS Documentation - DNS Registrar&lt;/a&gt; - About the DNS Registrar.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ethereum.org/en/developers/docs/gas/&quot;&gt;Ethereum Gas&lt;/a&gt; - What is gas?&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ens.domains/ens-improvement-proposals/ensip-10-wildcard-resolution&quot;&gt;ENSIP-10: Wildcard Resolution&lt;/a&gt; - A method to support wildcard resolution of ENS names.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://eips.ethereum.org/EIPS/eip-3668&quot;&gt;EIP-3668: CCIP Read: Secure offchain data retrieval&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry></feed>
