<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>0xHashbrown</title>
        <link>https://paragraph.com/@0xhashbrown</link>
        <description>undefined</description>
        <lastBuildDate>Thu, 24 Sep 2026 00:29:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>0xHashbrown</title>
            <url>https://storage.googleapis.com/papyrus_images/9efcd20f7c433d5d129b6ab759c239fe.jpg</url>
            <link>https://paragraph.com/@0xhashbrown</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[From Lurking to Working]]></title>
            <link>https://paragraph.com/@0xhashbrown/from-lurking-to-working</link>
            <guid>zrs9UzYm1ZJVuFzkloB9</guid>
            <pubDate>Sat, 10 Aug 2024 18:51:20 GMT</pubDate>
            <description><![CDATA[A number of months ago, I was introduced to Cabin DAO (aka Creator Cabins) through my friend Mxmnr. He’s been a member of ATXDAO and we w...]]></description>
            <content:encoded><![CDATA[<p>A number of months ago, I was introduced to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://creatorcabins.com">Cabin DAO (aka Creator Cabins)</a> through my friend <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mobile.twitter.com/mxmnr">Mxmnr</a>. He’s been a member of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.atxdao.com/">ATXDAO</a> and we were discussing local DAOs and opportunities surrounding land development and collectivism. He mentioned Cabin, and I was immediately hooked.</p><p>I was exploring and fascinated with the idea of building something in Texas Hill Country, it’s West of Austin and so easily accessed from the city. I was imagining a shared space that had various levels of structures to support different needs, and it being open to anyone that wanted to develop their own ideas and projects on property.</p><p>Once I found out about Cabin, I was immediately so excited that something existed along these lines, but at the scale and progress that Cabin had already build up. I was fortunate to be in the right place, at the right time, with the right information.</p><p>As we were sitting there at Blacksheep Lodge, I immediately joined <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/ttgRU7QKVE">Cabin’s Discord</a> and looked into the requirements to join the DAO and participate. I needed to purchase or earn some CABIN, so I jumped on Uniswap, grabbed my tokens and headed over to the verification channel and I was in!</p><p>The first thing to do, like many Discord Servers, was choosing a role. In Cabin they have the following Guilds (roles):</p><ul><li><p>✍️ Media Guild</p></li><li><p>⛺️ Placemaker&apos;s Guild</p></li><li><p>🛠 Product Guild</p></li><li><p>🏗 Community Guild</p></li></ul><p>I joined the Placemaker and Product Guilds. As I jumped in and cruised around the channels, I found some interesting ongoing ideas/projects that I could contribute to. There was one in particular that caught my eye. Some of the Placemakers Guild were talking about making a sign, I had a laser cutter/engraver, and the rest is internet history.</p><img src="https://storage.googleapis.com/papyrus_images/334b69e3ab95ee5ed5bae3a35dfea013.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAIAAAAUMWhjAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFXUlEQVR4nKWT228UVRjAT6FU2tK1Le3OZee2c9u5z+zOzM7Mzuxsd0tbSoVgDGoMGAIRE5SCJRRBwHARjJEHEhJifDAxMd6eTNR/ASMRWySUKL4obWwraKIidKlrZtpCQwwBPPnl5Dvf5Jzf+c45A5jU0lQSBCpdkHBfJgoyVTAzQV52dN5UGZXHFqNwyGLiDHpPUuFQNYOrPGYIhMiRwBQgPo2Wg6AclCtBpbvYXQnKvV29q8Kg5OmOzrlGxtF51+AdI+Pbjm+7nuV4llOwHEcXPcvybTdO5ud617QsjXV0PidREkeAgoZlRbqvu29t//o1fev6uwfW9K0rB92uabgG75mCb0ueKUa9pZa8cnEOtxJ6lYKlF91i6PWEfiVwy11+T+B2BU7RzQm+rZgKHQk8LaVlqIKVD5zAt33f9oO871mFvK7ldTavc5bKmAqdk2lbY02ZtLW0KZOWSlkKZam0KVO2Stla2or7vEZnxZTKp1QeywqExJGRQBeo0C10B5WyH5a8YiUoxXEhdNQIVys6ajEK9CCvlDwjdLSio4WuXnSULi9b8gzPFAum7NuKbyuWxmoZ3BCorLhI0OVpZd8IHTl05JKnFvNSuWCErlbyjHIhW/ZzoaPNzQ/ySpDXvJzg5QQ3JxQs0TUyix9CvDphCMS8oKCjhkjaqpCTuaxI5mTGECgtg2vxS9AzpMZjWZG0NdY3hcCW/GhFzlJoI4PNI+A5kbhDdoGcRMo8CSSOEDh6++Ytw0O7du/cvmdw26tDLx/Yu/vA3qEDe4f2D7+yb8+uQ/v3PLG6J01gPENxNMUzD0SGSTNpEiQhnBWMzz794Mex0V+mf5+eHK/O/Flb1GZnZ2u12pGjJxoTSZzkkBT94MBoGsAIyXDS2bNfXR0f/+nnq5NT01fHJ8bHJyYnp8YnJianpmZmZmLBG02JJEGxKEY/OEgqDWCUollhZOS7G3/fnP712vXrv127fv2Pv27Mzs5W4zYnOHzkeHMr9FACDGdglIoqoOjMpbHLtVrt1sxMtXr75q1b/9RqtertWjU6nGq1WqvVjh47EVfAPciuYZSCUQpJpZMQBpBUOs2Kn3/x5eXvf7h06fLY2OVvR0ZHL1wc+fr8yLnzoxcunjv3zZUrVwZ3Dj3eDuNkXEEqvbBcOmYhk0pjOJ1mRUkxBUlXdZuX9EhAUBzNZDK8LAoKz4kIQsAIEe+CjKFghIQREpoDJiGEgu4OiXkWMsiCHsOZ6A6SENYJ4YDUAKkDxgKMCVhzKakuZfR6Uq2n9XrWWMLmlrPZBKu2cNkWLpuglahn1QSrttJKgtVbaTkRBWqC0xO0soI1VsJEEsKiI0pCGIwQ60P/uYq/zvcG8mavrvSyZJlCSwQSoJ1BqjNA2nkU6UCoZAwEk3EQ7Tca3i1oLqY60fSdymIBTLzVJ330pPROhTldZE55zAmTPMB3DNOJHamGLRB4oQO4SGtbNAGDYDyeiS8E/8ndT6ATwhCUPFTOHAyoAG4swc1mC7AaYxpAcTl4ZiXY1AHySFsseGgiAYwQb/byW+X2OgCaQdTaAWiMg0YA+uvAsw3AaG9qh8n/IejjV2PLAAAt4N4WAPB8M8glV7Q9sgBBiGOr+A10k7AMKC2AqwMkmAcGwAdgYwMwO5sfXYCi5P6QfbuID6sdm1JNAytApb6uuKSuvAT0LAH99aAfACVR3x69n/tc7H0FW018AAIh1PCUiJ7Z0fvu69s+ef+9g5vWH+5nBsP2Y2vQbglJJKMf8KEFHUkcI+inTdp8DEidTTs2rz3z2sYPTw5+fHp430sbT20rnnwxf3yD7PFIG/Qor+hfGrzcFPFw7+MAAAAASUVORK5CYII=" nextheight="1542" nextwidth="2030" class="image-node embed"><p>I grabbed some wood planks from ReStore and mocked up a few test cuts.</p><img src="https://images.mirror-media.xyz/publication-images/ZHJyI7k-urcQvAqau9UfG.jpeg?height=3024&amp;width=4032" alt="Test Laser-cut Sign for Cabin" title="null" class="image-node embed"><p>Once I had the tests done, I threw a fresh piece on the laser and engraved “Live, Laugh, Love, LARP as a City-State. A fitting quote for a proper <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thenetworkstate.com/dashboard">“Network State”</a> startup society.</p><img src="https://images.mirror-media.xyz/publication-images/ALkOy2qAGmnK9PNauiT3u.jpeg?height=1427&amp;width=3641" alt="Laser engraved sign with the quote “Live, Laugh, Love, LARP as a City-State" title="null" class="image-node embed"><p>My wife and I were headed out to California on a vacation that happen to coincide with Cabin’s <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://creators.mirror.xyz/fVSrShT9PIEWBu4T0M7ws8nNJ9NEj76NVhNQLNOrNmo">Build Week 2</a>. We headed out on Wednesday, loaded up with coffee from our shop <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://madrone.coffee/">Madrone Mountain Coffee</a>, along with a brewing setup.</p><p>We arrived at Cabin just outside Johnson City and were warmly greeted by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/levin_phil">Phil</a> and others. Had a nice time getting the tour and meeting people while making a batch of coffee for everyone.</p><img src="https://images.mirror-media.xyz/publication-images/oObbg_-4MPloZK7C5xejS.jpeg?height=2938&amp;width=3667" alt="" title="null" class="image-node embed"><p>We parted ways having a wonderful connection with people there IRL and a deeper one for those in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/ttgRU7QKVE">community on Discord too</a>. It was great to complete the loop that resulted in us visiting the space and connecting to people.</p><img src="https://images.mirror-media.xyz/publication-images/adyRAMk8Zmb8PUr7p_RxK.jpeg?height=1321&amp;width=804" alt="Hashbrown (a.k.a. Robert C Edwards) with sign at Neighborhood Zero" title="null" class="image-node embed"><p>Since then, I’ve been circling the next few projects that might be interesting. I’ve been dipping into product to help with a framework for the website and with some upcoming Placemaker projects.</p><p>Can’t wait to visit again, for the next retreat, and to connect with everyone IRL at Cabin!</p><p>p.s. Link List in order of appearance:</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.creatorcabins.com/">https://www.creatorcabins.com/</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://twitter.com/mxmnr">http://twitter.com/mxmnr</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://atxdao.com">https://atxdao.com</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/ttgRU7QKVE">https://discord.gg/ttgRU7QKVE</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thenetworkstate.com/dashboard">https://thenetworkstate.com/dashboard</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://creators.mirror.xyz/fVSrShT9PIEWBu4T0M7ws8nNJ9NEj76NVhNQLNOrNmo">https://creators.mirror.xyz/fVSrShT9PIEWBu4T0M7ws8nNJ9NEj76NVhNQLNOrNmo</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://madrone.coffee">https://madrone.coffee</a></p>]]></content:encoded>
            <author>0xhashbrown@newsletter.paragraph.com (0x_Hashbrown)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/334b69e3ab95ee5ed5bae3a35dfea013.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Building a PFP GIF tool with Airstack]]></title>
            <link>https://paragraph.com/@0xhashbrown/airstack-nft-gif</link>
            <guid>17tyCU7cXxtc7cMIpDHW</guid>
            <pubDate>Thu, 28 Mar 2024 16:35:25 GMT</pubDate>
            <description><![CDATA[After the last build where we built a tool combining Neynar & Airstack, this round we're going to focus on creating a solution solely using Airstack....]]></description>
            <content:encoded><![CDATA[<p>After the last build where we built a tool combining <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://neynar.com/">Neynar</a> &amp; <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://airstack.xyz/">Airstack</a>, this round we're going to focus on creating a solution solely using Airstack.<br>The last tool was a narrowly focused solution for specific problem, this time, we're going to make something that has a broader market fit and more people might actually find fun and useful!<br></p><figure src="https://storage.googleapis.com/papyrus_images/7f0c1cc04a1c89cb5f9e3af7d2f8f1ac.gif" float="right" width="50%" data-type="figure" class="img-float-right" style="max-width: 50%;"><img src="https://storage.googleapis.com/papyrus_images/7f0c1cc04a1c89cb5f9e3af7d2f8f1ac.gif" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">willywonka.eth <span data-name="trashcan" class="emoji" data-type="emoji">🗑</span><span data-name="top_hat" class="emoji" data-type="emoji">🎩</span><span data-name="rainbow" class="emoji" data-type="emoji">🌈</span> avatar</figcaption></figure><p></p><p></p><p>At ETHDenver, our friends from ATXDAO were launching a new PFP project called <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.trashnfts.com/">TrashNFTs</a> based on the new ERC-404 standard and we got to talking about how the team's profiles had a GIF with their favorite NFTs.<br></p><figure float="left" width="50%" data-type="figure" class="img-float-left" style="max-width: 50%;"><img src="https://storage.googleapis.com/papyrus_images/c251c3a5c5c780d3cea5e4b028716167.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Warpcast DC Convo between 0xHashbrown &lt;-&gt; Willyogo</figcaption></figure><p></p><p></p><p></p><p>I asked <strong>willywonka.eth (</strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/willyogo"><strong>https://warpcast.com/willyogo</strong></a><strong>) </strong>about how he created their profile images and mentioned using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.canva.com/create/gif-maker/">Canva's GIF tool</a>. It was clear, this could be a tool I could build that was interesting to people in the space + something to potentially integrate into a Frame to make it more accessible and interactive.</p><p></p><p></p><p></p><p>The ideation phase was over and it was time to build a tool so anyone can enter their ENS and get a GIF back with their favorite NFTs.</p><p>Now that we have our idea, let's structure the app before we write any code.</p><p><strong>Structure:</strong></p><p>We'll need a basic HTML/CSS structure, some sort of library for GIF creation, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://airstack.xyz/">Airstack</a>  to fetch blockchain data. </p><p>Let's expand on this slightly. Basically, the user will be served HTML with a form to enter their ENS/Wallet Address, if valid, using the front-end script, submit ENS/Wallet address to our back-end script that contains our Airstack GraphQL Query. That will return an array of data via a json response with the images that will be display in a grid, allowing the user to select NFT images then create and download an animated GIF.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/33f32183a8ad092557cd04972502400b.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAIAAAD4YuoOAAAACXBIWXMAAAsTAAALEwEAmpwYAAADeklEQVR4nK2Tz4/bRBTH54J6gisSZ8SJA1KlHqBCHAGJGwJxQBy4cOEElfoPUIEEt6X82Aq0zWGhTbolrdpso816s07sxLHjnzP2jD0ee+zY3iS77KZVD3soynq73VSVkArWV9bT07z3eW/eG+DiqFYRaldbtauta7+3lD5Kd8aSga+31DVhWBW0v9o6ZkmcFh0LVrvSDblXk+V6r+/zzLHMQXtdFZtq+57WbQU8sQy4tXZHvN1s1xvi7aaHQ7D8/U1w/J0BALz/+lePHh2+/Ol3ALwNXvkIvPgBeOG9uqgfPjwEF78Gb7wG3n0HnD8Lzp8d8EnlwocfA/Dlq+Dzl8BnZ4DnmT988sU5AN4C4E0AzgHQWPkDmJb/07e1y5euL1269uM3VUmEu/v7goKWqsLl6uava1vLa22bsGS001DVpbt3f240frnX/G1jg8SZPpCFG5XN+qpwc3W7/mfAE03Wbi2v1K9Ubl2p3FlZhYgAlhZ7D2dRlks9uziYmrYtdvuqqhVFvj1wRnkxm82SfMLSYjLZ29+7H8dZUUwnkz2WFnxnN5nMcDKNxvvx+IDyjGXj0cEDWkzj6d+jgwdhWgDKM0y550dDG2PKMY1LBTxZ75oaJJKsyIqq6oY00CDyal3JwAGmsY0IwsRnfKjrhEY+45RnPuOEcoip50eEcp/xOYDyjLDEIWFpn8ghIWHJacVJ3lSHiuVajisriqabmCVSWzjKnp8EIp9hlpT2AiA8lT3kmeEGJ+ceO/OO4aAgClnsEt/1KUsLTdPK8p9UhnxM46cBtkdLo/xHabbRsxXLsz1quv5jBUPbk/pKX9U7stJTNOiRISSmGzgkLAWDSBJ7CJIwLRYAbshDnvGjebK0iNJMUJwh9BEmqmZI8vxCwihZV1QSJ+woeD7VtLzJ9HQHKIgWroilGcKsvaXN90w3ddM2bOgz3uqZKOBxWvB8PN+ZfEx5ZhNadrk4qkWAHz4LsK37cQKR15GVoWkHPNlUbBTwgJcTTsu85eT/DbA4ZJZmEFFRtII4Nh3YV3XLccPoGBA+a7WeD2BAD+smNB1o2BBhLGrofwMgzETRwpRajrshdBRV58noPwDCxXeQZqZDRNHAlJoO1E1b062Qp5KB8WLk0bM/XvAnnkVe6TkpAmAaqwYU+5qkmchn6c4uzyc8n5SdPRX5HPoHycXm5Nl2XCYAAAAASUVORK5CYII=" nextheight="668" nextwidth="1350" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">App Structure &amp; Flow Diagram</figcaption></figure><p>This structure and flow helps us understand how the data moves within the app, the necessary files, and how to interconnect them. Now we can sort out what tools we need to accomplish our desired functionality.</p><p>First, we'll tackle using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://airstack.xyz/">Airstack</a> to get our blockchain data. Airstack is web3 native tool, enabling developers to integrate blockchain data into their dApps easily.</p><p>We'll be using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://airstack.xyz/">Airstack</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.airstack.xyz/airstack-docs-and-faqs/get-started/quickstart/node">@airstack/node</a>, and their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.airstack.xyz/api-studio">API studio</a> to help craft our GraphQL query. They have an awesome AI Assistant tool that uses natural language to create GraphQL automagically <span data-name="magic_wand" class="emoji" data-type="emoji">🪄</span>.</p><figure src="https://storage.googleapis.com/papyrus_images/5514ce6b7e384b3c25e3546929e1ccff.png" float="left" width="50%" data-type="figure" class="img-float-left" style="max-width: 50%;"><img src="https://storage.googleapis.com/papyrus_images/5514ce6b7e384b3c25e3546929e1ccff.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>It's a wonderful way to explore Airstack and learn how to query all of the data easily and they have shared public queries.</p><p>Here's an example of the query we'll be using to fetch Minted NFTs to avoid random spam/airdrops. Airstack also has a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.airstack.xyz/airstack-docs-and-faqs/guides/nft/spam-nft">spam attribute</a> to filter against NFTs that have been labeled, but for the sake of simplicity here, we'll use just NFTs that the user has minted.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e2cf9fec87f512313f96bb7cfb45fd7.gif" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAATCAIAAAB+9pigAAAACXBIWXMAAAPoAAAD6AG1e1JrAAADHUlEQVR4nLWU247bRBiAvZvEyTjjscfjiT0en9aH2Nl1bEwSL9kkq5YqLKeqaumCKqFWbEUlDhISN3uBEFIluIa78jhc8QpIIF6lKPEqWgJLK3WRPs3V6P/+w/wjDAaj2Ww5my2r6jiOc99Pt3Ddfo3n9qm5d3Zy55dvn/763ff3j24KLRlCTUYUAFXRmIyojGizKVfVYvnWSVmODcMRptNbZ4+/Oj9/+vDh50UxzbJqNJqPRvO8nI7H8yw/5DzmPGIs8Ny+rPOfH3/5/Lffn//x5w8fPhIAgRKm5p7U1TRqy4hq1JaQ8eDBpz8++2b5btVpE4FSjrGpEVNVqAwJQnQLSm3biZOk4DxkzO8Zrox6OuUaMQkxKbURoqbh6IRhbOjE0rDRaHR3d9Uu7CGkC4QwSu17t0+L8UxCBgDqZSDUMDYn1eKTsy+yvNoL0jAcWDzKy6nvp3GcZ9lk1b240K0wjrPxeO75Cefx+OikPLxFiCUoqqEqNAmK49PP7OT15k67I6KOiDYCCLVGo7uz0xFFeQ2CUKsviKIiAVUQWs/Onvz06MnNt++e3v84SUZleZQmrx3sj1YCzgNCGPMGYVopiqFRG1OOKZe6GgBKLahNW8VtMhCE9vntD75+7y4x3DDMOI/WzQwYC1cCnVoIUcsb7E+Wxez97PCEB0M3KhXVXCerXxV6w6qIFmpImml6huGtQ1+wEkhdrdWE8XA6unEvSMemk5hOann7isZeUiCKSCes17O3ol8I6oY6QR4XcwDU3Z22KMqtJgRA2cwAvEiAsUGIdaUAAJX7B/1i0S8WPDjotJX1ANSXFICLm/pW9L9VEO2/US7uuFFBWVDnfs0CN8onb566UQkA3nok8NUFAKjMSXhYkPWW/k8VFNXyo+H0HRWzzZZdjwAhuprBcBYNZyq1JUjqda2Bry5Yf3aGxfsm87FCtdWDYxsQ6l2DgBDm+8kwn0yqY8Y8iwc1nIfyatH09eRfAIT03wWOExFiNRpd8VLrL0OpvRekGJu+n/6HDKHelQJK+Wae/6Te0vpEqHcVGJuEWFtgbPwFJemtoecEOogAAAAASUVORK5CYII=" nextheight="773" nextwidth="1320" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Airstack API Explorer with AI Assistant</figcaption></figure><p>In this example, I queried the User:0xHashbrown, but for our example, we'll pass variables via the GraphQL query. </p><p>Here's the our actual query will be using with the variable definitions so they'll be valid for the call. I'm only going to include the ETH example here, but you can download the full code/query at the bottom of the article which includes all multiple blockchains.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">query GetTokens($tokenType: [TokenType!], $limit: Int, $sortBy: OrderBy, $owner: Identity) {
    
  ethereum: TokenBalances(
    input: {filter: {owner: {_eq: $owner},tokenType: {_in: $tokenType}}, blockchain: ethereum, limit: $limit, order: {lastUpdatedTimestamp: $sortBy}}
  ) {
    TokenBalance {
      
      amount
tokenType
blockchain
formattedAmount
tokenId
tokenAddress
lastUpdatedTimestamp
owner {
    addresses
}
tokenNfts {
    tokenId
    contentValue {
        image {
          medium
        }
    }
    erc6551Accounts {
      address {
        addresses
        tokenBalances {
          tokenAddress
          tokenId
          tokenNfts {
            contentValue {
              image {
                medium
              }
            }
          }
        }
      }
    }
}
token {
  isSpam
  name
  symbol
  logo {
    small
  }
  projectDetails {
    imageUrl
  }
}
tokenTransfers(input: {filter: {from: {_eq: "0x0000000000000000000000000000000000000000"},operator: {_eq: $owner},to: {_eq: $owner}}, order: {blockTimestamp: ASC}, limit: 1}) {
    type
  }

    }
  }</code></pre><figure src="https://storage.googleapis.com/papyrus_images/644d28dd9061eeca9750c3b4ea1509d0.png" float="left" width="50%" data-type="figure" class="img-float-left" style="max-width: 50%;"><img src="https://storage.googleapis.com/papyrus_images/644d28dd9061eeca9750c3b4ea1509d0.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p></p><p>Getting started with Airstack is super easy. You'll need a free account, and if you sign-up with your ENS/Farcaster/Lens account, they'll give you a $50 Credit, plus if you provide a CC card, you'll be able to use a Test API key that doesn't count against your credits.</p><p></p><p></p><p>Now that we have our query, we'll need to create our back-end that will serve an API route so we can use the form data containing the ENS or Wallet Address, and the function that will use that data to fetch the NFTs from Airstack.<br></p><p><strong>Project Setup:</strong></p><p>Now that we have our structure and tools sorted out, let's initialize our project.</p><pre class="dont-break-out text-sm md:text-base"><code>npm install express @airstack/node dotenv</code></pre><p>This installs our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://expressjs.com/">Express server</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.airstack.xyz/airstack-docs-and-faqs/nodejs-sdk-reference/overview">Airstack's Node.js library</a>, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.dotenv.org/blog/2023/03/13/how-to-use-dotenv.html">dotenv</a> for storing our Airstack API key safely in a .env file locally or stored as environmental variables for your deployment. </p><p>Next we'll initialize Express, import init &amp; fetchQuery from @airstack/node, and load our environmental variables from our .env, start our Express server at port 3000, and initialize our Airstack API key from .env.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">const express = require('express');
const { init, fetchQuery } = require("@airstack/node");
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;
init(process.env.AIRSTACK_API_KEY);</code></pre><p>We'll need to define our query to Airstack next. We'll use the query that we created with Airstack's API Studio. We'll use the full query here, but below is the basic definition for it.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">const query = `FULL AIRSTACK QUERY HERE`</code></pre><p>Now we need to setup Express to serve our static files.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">app.use(express.static('public'));</code></pre><p>Next we'll need to create our API route function for the /api/fetch-nfts endpoint for our front-end.js to call. It will then extract the ENS Address, validate the input, query our variables, fetch the NFT data, check for errors in the data and handle server errors, and finally return our successful response.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">app.get('/api/fetch-nfts', async (req, res) =&gt; {
    const ensAddress = req.query.ensAddress;

    if (!ensAddress) {
        return res.status(400).send({ error: 'ENS address is required.' });
    }

    const variables = {
        tokenType: ["ERC721"],
        limit: 10,
        sortBy: "DESC",
        owner: ensAddress
    };

    try {
        const { data, errors } = await fetchQuery(query, variables);

        if (errors) {
            console.error("Error fetching NFT data:", errors);
            return res.status(500).send({ error: 'Failed to fetch NFT data.' });
        }

        res.send(data);
    } catch (error) {
        console.error("Server error:", error);
        res.status(500).send({ error: 'Internal server error.' });
    }
});</code></pre><p>Now that we have an Express Server to handle our static files, the ENS input, and fetching and returning the data, we can move on to our front-end to create the HTML/CSS/JS that takes the user's input, fetches the NFT images, displays them on the page, allows the user to select the desired NFTs, previews them, and ultimately creates the GIF.</p><p><strong>Front-end:</strong></p><p>Let's setup a basic front-end with HTML and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tailwindcss.com">Tailwind</a> for styling.</p><p>We'll include some basic HTML/utility classes for Tailwind and includes a front-end.js script.<br>The code below has the HTML structure to include the javascript, CSS, form and the "Make GIF" button. There are also DIVs to contain the returned images, a preview, and the GIF output.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;NFT Gallery from ENS&lt;/title&gt;
    &lt;link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.1.2/dist/tailwind.min.css" rel="stylesheet"&gt;
    &lt;link href="style.css" rel="stylesheet"&gt;
    &lt;script defer src="front-end.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body class="bg-gray-900 text-white"&gt;
    &lt;div class="container mx-auto px-4 py-12"&gt;
        &lt;h1 class="text-3xl font-bold text-center mb-6"&gt;Fetch NFTs and Create GIF&lt;/h1&gt;
        &lt;div class="flex justify-center mb-8"&gt;
            &lt;input type="text" id="ensAddress" placeholder="ENS Address" class="input border border-gray-700 p-2 text-black"&gt;
            &lt;button id="fetchNfts" class="ml-4 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"&gt;Fetch NFTs&lt;/button&gt;
        &lt;/div&gt;
        &lt;div id="nftGallery" class="carousel grid grid-cols-1 md:grid-cols-3 gap-4"&gt;
        &lt;/div&gt;

        &lt;div id="gifOutput" class="mt-8"&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;footer id="stickyFooter" class="sticky-footer sticky inset-x-0 bottom-0 bg-gray-200 text-center p-4"&gt;
        &lt;div id="selectedImagesPreview" class="preview-area"&gt;&lt;/div&gt;
        &lt;button id="createGifButton" class="mt-8 bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded"&gt;Make GIF&lt;/button&gt;
    &lt;/footer&gt;
     
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>Next up, we'll build the front-end.js script. <br>First setup an event listener for the "Fetch NFTs" button to send the address to our API route (more on this when we build back-end.js). Then the functions for displaying the NFTs, user selecting the images, previewing those images, and finally creating the GIF once the user clicks on the "Make GIF" button.</p><p><br>This is an async function that checks for a valid address, otherwise alert the user. If valid, then await the json response and send that data to the next function -&gt; displayNfts, otherwise catch the error.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">document.addEventListener('DOMContentLoaded', () =&gt; {
    document.getElementById('fetchNfts').addEventListener('click', fetchAndDisplayNFTs);
});

let selectedImagesData = [];

async function fetchAndDisplayNFTs() {
    const ensAddress = document.getElementById('ensAddress').value.trim();
    if (!ensAddress) {
        alert('Please enter a valid ENS address.');
        return;
    }

    try {
        const response = await fetch(`/api/fetch-nfts?ensAddress=${encodeURIComponent(ensAddress)}`);
        const data = await response.json();
        displayNfts(data);
    } catch (error) {
        console.error('Error fetching NFTs:', error);
    }
}</code></pre><p>This function setups the DOM modifications to update the HTML with the ID nftGallery, creates an object for each of the NFTs received by the script, a fallback image and sets an event listener for a 'click' to add a class 'selected' to each of the images.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">function displayNfts(data) {
    const gallery = document.getElementById('nftGallery');
    gallery.innerHTML = '';
    gallery.classList.add('carousel'); 

    Object.keys(data).forEach(blockchainKey =&gt; {
        const tokenBalances = data[blockchainKey].TokenBalance;
        tokenBalances.forEach(tokenBalance =&gt; {
            const imageUrl = tokenBalance.tokenNfts?.contentValue?.image?.medium || 'fallback-image-url.png';

            const imgElement = document.createElement('img');
            imgElement.src = imageUrl;
            imgElement.alt = tokenBalance.token?.name || 'NFT Image';
            imgElement.classList.add('nft-item');
            imgElement.addEventListener('click', function() {
                this.classList.toggle('selected');
                handleImageSelection(this, imageUrl);
            });

            gallery.appendChild(imgElement);
        });
    });
}</code></pre><p>Now that we have the HTML and javascript for handling the NFT images and selecting them, we'll need a way to create a GIF out of those images.</p><p><br>This function previews of the images that will be used for the GIF and displays them next to the "Make GIF" button.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">function updatePreviewAndButtonVisibility() {
    const previewArea = document.getElementById('selectedImagesPreview');
    previewArea.innerHTML = ''; 

    selectedImagesData.forEach(item =&gt; {
        const imgElement = document.createElement('img');
        imgElement.src = item.dataURL;
        imgElement.classList.add('preview-image'); 
        previewArea.appendChild(imgElement);
    });

    const createGifButton = document.getElementById('createGifButton');
    if (selectedImagesData.length &gt; 0) {
        createGifButton.classList.remove('hidden');
    } else {
        createGifButton.classList.add('hidden');
    }
}</code></pre><p>Now that we have a list of images selected and previewed, we'll need a way to create the GIF from that array.<br><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://jnordberg.github.io/gif.js/?utm_source=cdnjs&amp;utm_medium=cdnjs_link&amp;utm_campaign=cdnjs_library">GIF.js</a> is an awesome library that let's you create GIFs right in the browser. We'll include the CDN file for this library. Just add this tag below our style.css:</p><pre class="dont-break-out text-sm md:text-base"><code class="language-html">    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/gif.js/0.2.0/gif.js"&gt;&lt;/script&gt;</code></pre><p>Let's set up the functions that "Make GIF" calls. This function will create the GIFs from a dataUrl that allows the browser to store "<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Web/API/Blob">data blobs</a>". This is due to browser security that prevents tainting an HTML Canvas with images urls from different domains. In this case, we're fetching the images from Airstack, but serving the Canvas on our hosted domain. This is a CORS workaround that will allow us to store the images from Airstack and use them to create the GIF. </p><p>First up is the function to convert the selected images into a data blob.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">function convertImageToDataURL(imageSrc, callback) {
    const img = new Image();
    img.crossOrigin = 'Anonymous'; 
    img.onload = function() {
        const size = Math.min(img.width, img.height);
        const canvas = document.createElement('canvas');
        canvas.width = canvas.height = 300; 
        const ctx = canvas.getContext('2d');
        const x = (canvas.width / 2) - (img.width / 2) * (size / img.width);
        const y = (canvas.height / 2) - (img.height / 2) * (size / img.height);
        ctx.drawImage(img, x, y, img.width * (size / img.width), img.height * (size / img.height));
        const dataURL = canvas.toDataURL('image/png');
        callback(dataURL);
    };
    img.src = imageSrc;
}</code></pre><p>And this function takes those data blobs and uses GIF.js and webworkers to sequentially add the images to the GIF with a 200ms delay between the images, completes the rendering of the GIF, updates the preview image, adds a download button, and scrolls to the bottom of the page.</p><pre class="dont-break-out text-sm md:text-base"><code class="language-javascript">function createGifFromDataUrls(dataUrls) {
    if (dataUrls.length === 0) {
        console.log('No images selected for GIF creation.');
        return;
    }

    console.log('Create GIF button clicked');

    const gif = new GIF({
        workers: 2,
        quality: 10,
        workerScript: 'gif.worker.js', 
        width: 300, 
        height: 300,
    });

    let loadCount = 0;

    dataUrls.forEach(dataUrl =&gt; {
        const img = new Image();
        img.onload = () =&gt; {
            console.log('Adding image to GIF');
            gif.addFrame(img, { delay: 200 });

            loadCount++;
            if (loadCount === dataUrls.length) {
                console.log('All images loaded, starting GIF render...');
                gif.render();
            }
        };
        img.src = dataUrl;
    });

    gif.on('finished', function(blob) {
        const url = URL.createObjectURL(blob);
    
        let gifContainer = document.getElementById('gifContainer');
        if (!gifContainer) {
            gifContainer = document.createElement('div');
            gifContainer.id = 'gifContainer';
            gifContainer.classList.add('flex', 'flex-col', 'items-center', 'mt-4');
            document.body.appendChild(gifContainer);
        } else {
            gifContainer.innerHTML = ''; 
        }
    
        const previewImg = document.createElement('img');
        previewImg.src = url;
        gifContainer.appendChild(previewImg);
    
        const downloadLink = document.createElement('a');
        downloadLink.href = url;
        downloadLink.download = 'nft-collection.gif';
        downloadLink.textContent = 'Download GIF';
        downloadLink.id = 'download';
        downloadLink.classList.add('mt-8', 'bg-green-500', 'hover:bg-green-700', 'text-white', 'font-bold','py-2','px-4','rounded');
        gifContainer.appendChild(downloadLink);
        scrollToPageBottom();
    });
};</code></pre><p>We've completed the front-end.js so we can handle the images coming from our API call, a way to select and preview those images and finally a method to create the GIF and download it.</p><p><strong>Note on Deployment:</strong></p><p>Currently our app is structured with our HTML, CSS, and front-end.js in our public folder, with our back-end.js in our root. We'll need to move and rename back-end.js to api/index.ts. This is a deployment detail for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vercel.com">Vercel</a> in order to uses edge functions. Learn more here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vercel.com/guides/using-express-with-vercel">Express.js Guide</a>. </p><p>Let's install the needed packages and spin up a local dev version so we can take a look at what we've built. Run this from the root of the project.</p><pre class="dont-break-out text-sm md:text-base"><code>npm install &amp;&amp; node api/index.ts</code></pre><p>Now we can navigate to in our browser to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://localhost:3000">https://localhost:3000</a> and check out our work.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e110d706a6eaa2d97f94cf24b0a2fa4f.gif" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAVCAIAAACor3u9AAAACXBIWXMAAAPoAAAD6AG1e1JrAAAB4ElEQVR4nGP49O3/qzcfX71+/+z526fPXn/4+O337/8/fv37+ev/z1//fv/+jwX9RSLB6P3Hf1++/Xv89N+rd//evPv/8ClI5OW7/y/f/GcQk9cTRUVi8vpiIFJPTMFAQEqTW0yVT0IdQvKJq/OKqUG43GJqvOJqApKaYgoGYMVgLRCGggGcy8DALIWCGMEIwmaQUNC0NLR0U9G1sXUOMLHxUNSy0jVz1jVz0jYBIVMbD3UDWwYGcQZWaXQT4IiBWxY7YpdhYJWWUze1dws2sfawcPDXMXUyt/W2dArQN3OzcQq0cQ40sfaSVzdnYJBg4JTBaQ5IDg2xy7AIKKjo2EirmihqWTFxyvCJqXELK/FLaLDxy/OJqgrKqArIKPNLSglKCstrWippWSpqWTHzK4LchGkaFiGwc7jFVNmFFAXl9HMqOmvbple1TqlqndrYNSunusNAJynIaYq/U4+DSZ2wtBGXmDKnsAp2c3BaAPKHLAOjBLeU/slLD56//fbw+cf7z96/+/L/2JVb3tZzJqT/7Ml8Xxn6gFvAkIFZAqSYZAvgiFeZgV8FgXiVGDhlGVhlGFjB8URQO2EV7FLoiFMaCVFuATdGwuCUQ0KUW8BJGRq1gHM0iGRGUxHDUM9oAJx28ZKEdlRVAAAAAElFTkSuQmCC" nextheight="699" nextwidth="1054" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">App running on localhost:3000</figcaption></figure><p>Looking good! Now that we've verified that it's working, we can focus on deployment.<br>We'll need <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vercel.com/home">Vercel</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/">Github</a> accounts, both free version will work for our purposes. Fork our project into your own account.</p><div data-type="embedly" src="https://github.com/robertcedwards/Airstack-NFT-GIF-Builder" data="{&quot;provider_url&quot;:&quot;https://github.com&quot;,&quot;description&quot;:&quot;A tool built with Airstack to create an animated GIF from NFTs - robertcedwards/Airstack-NFT-GIF-Builder&quot;,&quot;title&quot;:&quot;GitHub - robertcedwards/Airstack-NFT-GIF-Builder: A tool built with Airstack to create an animated GIF from NFTs&quot;,&quot;url&quot;:&quot;https://github.com/robertcedwards/Airstack-NFT-GIF-Builder&quot;,&quot;author_name&quot;:&quot;robertcedwards&quot;,&quot;thumbnail_width&quot;:1200,&quot;thumbnail_url&quot;:&quot;https://opengraph.githubassets.com/f17409c6e6a767bd7bdc9e19b27b28ab49c7c33ec804f2f3f6980cd891ccbae3/robertcedwards/Airstack-NFT-GIF-Builder&quot;,&quot;author_url&quot;:&quot;https://github.com/robertcedwards&quot;,&quot;version&quot;:&quot;1.0&quot;,&quot;provider_name&quot;:&quot;GitHub&quot;,&quot;type&quot;:&quot;link&quot;,&quot;thumbnail_height&quot;:600}" format="small"><div class="react-component embed my-5" data-drag-handle="true" data-node-view-wrapper="" style="white-space:normal"><a class="twitter-card-link" href="https://github.com/robertcedwards/Airstack-NFT-GIF-Builder" target="_blank" rel="noreferrer"><div class="twitter-summary"><img src="https://opengraph.githubassets.com/f17409c6e6a767bd7bdc9e19b27b28ab49c7c33ec804f2f3f6980cd891ccbae3/robertcedwards/Airstack-NFT-GIF-Builder" class="false"><div class="twitter-summary-card-text"><span>https://github.com</span><h2>GitHub - robertcedwards/Airstack-NFT-GIF-Builder: A tool built with Airstack to create an animated GIF from NFTs</h2><p>A tool built with Airstack to create an animated GIF from NFTs - robertcedwards/Airstack-NFT-GIF-Builder</p></div></div></a></div></div><p>Once you have your fork you'll proceed to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vercel.com/new">Vercel</a> to import and deploy from there.</p><p>Login to your Vercel account and click Add new - Project. You'll see the screen below, import our Airstack-NFT-GIF-Builder repo.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/098f3d62a4d690cc862e0e181dcb1928.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAaCAIAAABZ+cloAAAACXBIWXMAABYlAAAWJQFJUiTwAAADE0lEQVR4nKWWwWqrQBSGhUKhT5C8TPsK3XXbvkBLqdBNt80qu6666S6rErIpXZSgSAgSphAiQcIQDIKDiIiCDDMMIl7qUWO8aZK232IQHc8/5z9nHCUhRFKS1qjfTP6ABO9zzmFkJRBa5CRJkv2KNE2lLMsQQg8PD7IsPz09PT8/39zcPD4+Xl9fdzqd29vbTqfz8vIihPilQJIkQoggCAghjDEhBIyEEM/zgiCIoogQAgJ1D6sQ35Fl2ZdFIKDruu/7GGPLspY5YRjWF5KWleCcRzm+71NKdwjAK18CSZIsl0vP8+bzOcZ4nuP7fmOBooQxFsex7/uMsf8jVtPWGTSy3ps7AHMaPVO3rhAAKeiiMAwJIb7vO47j5nie57ouYyyKIkrpjnaCR3d3d61Wq91uy7IMYQsBSqkQAmOsqqqu65PJZD6fTyaT0Wg0HA4JIbZtY4wppd8JcM6zLGu1WlJOu90uBBr7a2/b7aUesLCougulC4IgDEO4iOOYUhrHMecc3tltUbfbPT09PTs763a7WZYJIdYWcc4Xi4WqqpqmzWaz0Wg0Ho9N0wRzHMfZnRxYdHx8DBadnJxsWFTl9Rdz0jRljHk5jLF1F1UCnHNKKVhES0TJ7gqBRb1e7/Ly8urqqtfrNS1ijC0WC4TQ+/s7QkhRlOFwqGnadDp1XdcwjCiK9loE/kiSdHR0lGUZY2xLFzU2S3oYkAEhBOVAzdYZOI5j2zYsRAgBY3WRbDswtgooitLNURSlEIBqXFxcnJ+fh2E4GAw0TRuPx6qqIoQ+Pj6m06llWaZp/sgiSZIKiyAD6HqoVX1FaXl9YAaz2azf77++vhqGUWRQb9BGFPAnLZ/uBuYYhtHLWQtUXUQpxRgjhFRV/fz81HX97e1ttVq5rmua5t5Tc6tFGxsNPuWwFeonc1Ke2Id0Ub/fl2X5/v5+MBhsZHCIAwdSd6z4q4jj2LIsQggcmZZlrVYrjPFyuYSvUBRFh5QBItZ/RNYCGGPP82zbhg3h5OAc27Z3N+huPSmO4+pngm/SOIR/Cnzn/wFzMfUwIUUt6AAAAABJRU5ErkJggg==" nextheight="1090" nextwidth="1348" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Importing our Project from Github in to Vercel</figcaption></figure><p>We'll need to add an Environment Variable for our Airstack API Key. Add the key "AIRSTACK_API_KEY" and your API key in the value field. Vercel will auto-detect the rest of our configuration, so all we need to do it hit the Deploy button.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ea772b2a3f7040f0830f8f8b1ac81f41.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAaCAIAAABZ+cloAAAACXBIWXMAABYlAAAWJQFJUiTwAAACg0lEQVR4nK2VvW7bMBDHZWTw2BZo5gx+jeYhkueIx8JbEOQlOmTwg3gxECBA1nhrENsIpMq0ICr8EMmSJ7KQzjZUJHWKWL9BIAjq/rzjfUQA4L0PDb5ht64OBgAi7z2lNE3TJEnyPCeErFYrQkie5+FgvPe1wNPT0/39/d3d3e3t7cPDw2w2m06nj4+PnQmEv7fa68OpBYQQRVFQSq21bdPdeBBCUErleU4pLYqCMUYpNcZ05kEIQWudpmmWZev1mhCSJImUsssQSSmFEGVZFkUBAF2ZDrtHBgDGGCHEOYf5e7h1AEA7myxSSlFKu7j3WwKYRZxzzCLfBaFdB84509BJcBAhBDahWqBDuzviODbGbAR2vC6TD7NrlxsBKSUhBEsBwaQKh7ERAABrrWlhrVVKWWvdAWAiRVVVlWUphMBb4/WTJCnLEgD+9TNq21fs8sUYo7Wu5wEAYP7gxdEVrXVVVW8+SdVkxP/EB/VqD7BP7HnhqhFDL7Et4mhSSrW9tNZ5H7IsWywWcRxjDDYeEEKWy2WapjjO2n07bL9SyuVyOZ/Pn5+f5/M5IaSqKox1g7PWBO9PT78dH3/98vnTZDIJIdQeKKU454wxscVa274aNCWjtcZmzjnHytdaqy2lMrLUv53/cXNzeXV9eXX9s5mJdRZxzimljDFsq6iEm0VjSCn1Zog553iecZ5y/4v7+MVLF3IXqAvaOgBXC2CjZowVW3DNWuDIyxrolvZfrF5Tzl5o/Uh5lq2llJuBc3Z2FkVRv9/v7eXo6GgwGJycnOw/1uv1+v1+FEXn5+d1iEII4/F4OByORqPv73HZ8O6x0Wh0cXExHo9rAWxJH+0F+8Da+gMewPlFNeTv8QAAAABJRU5ErkJggg==" nextheight="1348" nextwidth="1686" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Setting the Environment Variable for Airstack API + Deploy</figcaption></figure><p>Congrats <span data-name="rocket" class="emoji" data-type="emoji">🚀</span><span data-name="party" class="emoji" data-type="emoji">🎉</span> - You've deployed a Airstacked powered NFT GIF maker!</p><p>From concept to ideation, back-end to front-end, we've come a long way. But hopefully this project helped you to better understand how to create any blockchain based project using the power of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://airstack.xyz/">Airstack</a> and modern build &amp; deployment tools.<br>If you need any help, feel free to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/0xhashbrown">reach out on Warpcast</a>. My DCs are open!</p><p>Now get out there and build something with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://airstack.xyz/">Airstack</a> and share it in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/airstack">/airstack channel</a>!</p>]]></content:encoded>
            <author>0xhashbrown@newsletter.paragraph.com (0x_Hashbrown)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/ca02afacca6e22c8cd739469ffecf355.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[Welcome to Decentral Texas Hikers!]]></title>
            <link>https://paragraph.com/@0xhashbrown/dtx-hikers</link>
            <guid>M2dq5eEcZspgHc5zG2SD</guid>
            <pubDate>Mon, 13 Jun 2022 22:59:33 GMT</pubDate>
            <description><![CDATA[Gettin' started]]></description>
            <content:encoded><![CDATA[<p>Explore the great outdoors and discover the potential of web3 technology with <strong>Decentralized Texas Hikers</strong></p><p>Each week we meet together to share thoughts, ideas, and little slice of nature.</p><p>Our plan is to have regular hikes that happen on a cadence and add special events, partnerships, and a bunch more to come.</p><p>Join Us Here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out dont-break-out" href="https://rare-pepper-7f5.notion.site/Decentralized-Texas-Hikers-06cbb3c6f620432cbbe63d5f53ed2452">https://rare-pepper-7f5.notion.site/Decentralized-Texas-Hikers-06cbb3c6f620432cbbe63d5f53ed2452</a></p><div><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"/><div class="callout-content"><div><img src="https://storage.googleapis.com/papyrus_images/1090789436a744d2b0b03da1860be558.png" blurDataURL="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAP0lEQVR4nAE0AMv/ABgiOwACIgAWNgcbNADr6uXU1M/c3df6+/kA8/P29/b1497R/Pv7AP///9bd6r7N5f///7WTIjSn5DC8AAAAAElFTkSuQmCC" class="image-node embed"></div></div></div></div><p></p>]]></content:encoded>
            <author>0xhashbrown@newsletter.paragraph.com (0x_Hashbrown)</author>
            <category>event</category>
        </item>
    </channel>
</rss>