<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alison Haire</title>
    <description>The latest articles on DEV Community by Alison Haire (@developerally).</description>
    <link>https://dev.to/developerally</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F174919%2Fbcbad267-d847-4d02-a3fe-5fe27d67b00d.jpg</url>
      <title>DEV Community: Alison Haire</title>
      <link>https://dev.to/developerally</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/developerally"/>
    <language>en</language>
    <item>
      <title>🌈🦄 Build your own AI-generated Art NFT DApp!</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Fri, 27 Jan 2023 14:51:45 +0000</pubDate>
      <link>https://dev.to/developerally/build-your-own-ai-generated-art-nft-dapp-4dop</link>
      <guid>https://dev.to/developerally/build-your-own-ai-generated-art-nft-dapp-4dop</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🦄 &lt;strong&gt;Quick links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@ETHGlobal/videos"&gt;Video version&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/DeveloperAlly/bacalhau-fvm-nft"&gt;GitHub code&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.bacalhau.org/examples/model-inference/stable-diffusion-gpu/"&gt;Bacalhau Docs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  👩💻 What we'll do...
&lt;/h2&gt;

&lt;p&gt;This blog will walk you through how to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Build an opensource python-based text-to-image script based on Tensorflow (you can also just use the Bacalhau HTTP endpoint if this isn't of interest to you)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run this script on Bacalhau (an open p2p off-chain compute platform)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an NFT Contract in Solidity (based on an Open Zeppelin ERC721 contract)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy the NFT Contract to the Filecoin Virtual Machine (FVM) Hyperspace Testnet with Hardhat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Front-end interactions - How to interact with Bacalhau text-to-image script and your NFT contract in React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to save your NFT Metadata to NFT.Storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to deploy your Front-End DApp to Fleek&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've deliberately chosen to use as much open-source and decentralised tech as is available in this stack.&lt;/p&gt;

&lt;p&gt;This blog is going to be pretty lengthy (hey - I want to give ALL THE INFO and make sure we're being beginner-friendly and inclusive!) - so feel free to skip through to the parts that are useful to you in the table of contents &amp;lt;3&lt;/p&gt;

&lt;h2&gt;
  
  
  🎮 Try it!
&lt;/h2&gt;

&lt;p&gt;This app is hosted live here&lt;/p&gt;

&lt;p&gt;[Fleek link coming soon]&lt;/p&gt;

&lt;h2&gt;
  
  
  🏛 Architecture Diagram (kinda)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kk-K2zw_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674859307004/bc763d43-90f7-4720-a118-d5b4ccbcadb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kk-K2zw_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674859307004/bc763d43-90f7-4720-a118-d5b4ccbcadb0.png" alt="" width="528" height="753"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🥞 DApp Technology Stack
&lt;/h2&gt;

&lt;p&gt;(get it - it's a pancake stack #sorrynotsorry)&lt;/p&gt;

&lt;p&gt;Open Source &amp;amp; Web3-valued from the ground up :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1v3kn2aU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674859217007/1255a637-b266-4245-afaa-a623d5672a2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1v3kn2aU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674859217007/1255a637-b266-4245-afaa-a623d5672a2a.png" alt="" width="714" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Contract&lt;/strong&gt; [Solidity, Open Zeppelin]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Contract IDE&lt;/strong&gt; [Hardhat]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blockchain Testnet&lt;/strong&gt; [Filecoin Virtual Machine Hyperspace]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NFT Metadata Storage&lt;/strong&gt; [NFT.Storage]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Front-End&lt;/strong&gt; [NextJS / React + NPM]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Contract Interactions&lt;/strong&gt; from client [Metamask, Ethers, Chainstack RPC Node]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI &lt;strong&gt;Text-To-Image Stable Diffusion Script&lt;/strong&gt; [Python, Tensorflow]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decentralised &lt;strong&gt;Off-Chain Compute&lt;/strong&gt; for AI Text-To-Image Generation [Bacalhau]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decentralised &lt;strong&gt;DApp Deployment&lt;/strong&gt; [Fleek]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏗 Building the Python Text-To-Image Script
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;TLDR Tip&lt;/strong&gt; 💡&lt;/p&gt;

&lt;p&gt;This script is already available for use through Bacalhau via the CLI and an HTTP endpoint, so feel free to skip this part.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Quick Intro to Stable Diffusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stable Diffusion is currently the leading Machine Learning Model for doing text-to-image processing (&amp;amp; is the same model Dall-E uses). It is a type of Deep Learning - a subset of Machine Learning that teaches itself to perform a specific task - in this case converting a text input to an image output.&lt;/p&gt;

&lt;p&gt;In this example, we're using a diffusion probabilistic model that uses a transformer to generate images from text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YiGzXnUd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/HsqyhPMmmduSXSPuOeNUw1qjXGEgx_YovmKcvF2_oFbVeDjrkx69RhgwkscTmiC3x9PoUSTYf8uAATESivaQ-a21qU2Ka1H9kAwxXXFOvd-JE0Y_Tsg5wfoeKmRBUPSF7RCKKCMahTZeqUfoyRIsUJih3w%3Ds2048" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YiGzXnUd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/HsqyhPMmmduSXSPuOeNUw1qjXGEgx_YovmKcvF2_oFbVeDjrkx69RhgwkscTmiC3x9PoUSTYf8uAATESivaQ-a21qU2Ka1H9kAwxXXFOvd-JE0Y_Tsg5wfoeKmRBUPSF7RCKKCMahTZeqUfoyRIsUJih3w%3Ds2048" alt="" width="880" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't worry though - we don't need to go and train a machine learning model for this (though hey - if that's your thing - you totally could!)&lt;/p&gt;

&lt;p&gt;Instead, we're going to use a pre-trained model from Google's TensorFlow open-source Machine Learning library in our python script because the ML weights have been pre-calculated for us.&lt;/p&gt;

&lt;p&gt;More correctly, we're using an optimised &lt;a href="https://github.com/fchollet/stable-diffusion-tensorflow/blob/master/text2image.py"&gt;Keras/TensorFlow implementation fork&lt;/a&gt; of the original ML model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Python Script&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🦄 You can find a &lt;strong&gt;complete&lt;/strong&gt; walkthrough of how to build and Dockerise this text-to-image script and run it on Bacalhau in both the &lt;a href="https://docs.bacalhau.org/examples/model-inference/stable-diffusion-gpu/"&gt;Bacalhau docs&lt;/a&gt; and in this &lt;a href="https://www.youtube.com/watch?v=53uY48e1lis"&gt;@BacalhauProject YouTube video&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
🦄 You can also run it in this &lt;a href="https://colab.research.google.com/github/bacalhau-project/examples/blob/main/model-inference/stable-diffusion-gpu/index.ipynb"&gt;Google Collabs Notebook&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the full python script!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import argparse
from stable_diffusion_tf.stable_diffusion import Text2Image
from PIL import Image
import os

parser = argparse.ArgumentParser(description="Stable Diffusion")
parser.add_argument("--h",dest="height", type=int,help="height of the image",default=512)
parser.add_argument("--w",dest="width", type=int,help="width of the image",default=512)
parser.add_argument("--p",dest="prompt", type=str,help="Description of the image you want to generate",default="cat")
parser.add_argument("--n",dest="numSteps", type=int,help="Number of Steps",default=50)
parser.add_argument("--u",dest="unconditionalGuidanceScale", type=float,help="Number of Steps",default=7.5)
parser.add_argument("--t",dest="temperature", type=int,help="Number of Steps",default=1)
parser.add_argument("--b",dest="batchSize", type=int,help="Number of Images",default=1)
parser.add_argument("--o",dest="output", type=str,help="Output Folder where to store the Image",default="./")

args=parser.parse_args()
height=args.height
width=args.width
prompt=args.prompt
numSteps=args.numSteps
unconditionalGuidanceScale=args.unconditionalGuidanceScale
temperature=args.temperature
batchSize=args.batchSize
output=args.output

generator = Text2Image(
    img_height=height,
    img_width=width,
    jit_compile=False, # You can try True as well (different performance profile)
)

img = generator.generate(
    prompt,
    num_steps=numSteps,
    unconditional_guidance_scale=unconditionalGuidanceScale,
    temperature=temperature,
    batch_size=batchSize,
)
for i in range(0,batchSize):
  pil_img = Image.fromarray(img[i])
  image = pil_img.save(f"{output}/image{i}.png")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script above simply takes in a text prompt input argument and some other optional parameters and then calls the forked TensorFlow library to generate the image(s) and save them to an outputs file.&lt;/p&gt;

&lt;p&gt;All of the heavy lifting done here happens in the section below - this is where the Machine Learning Model does its magic. 🪄&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generator = Text2Image(
    img_height=height,
    img_width=width,
    jit_compile=False,
)

img = generator.generate(
    prompt,
    num_steps=numSteps,
    unconditional_guidance_scale=unconditionalGuidanceScale,
    temperature=temperature,
    batch_size=batchSize,
)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great, we can generate images from a text prompt, but um... where to run this GPU-required script..... 🤔🤔&lt;/p&gt;

&lt;p&gt;If there's one thing that blockchain technology does not do inherently well, it is large data processing. This is due to the cost of computing over a distributed system to provide other powerful properties like trustlessness and censorship resistance.&lt;/p&gt;

&lt;p&gt;Using your local machine for small examples is possible - in fact I did manage to get this particular example working on my (very unhappy about it) Mac M1, however, it was a very long wait on results (game of table tennis anyone?) so, once you start doing bigger data processing, you are going to need more gas (pun intended) and if you dont have a dedicated server lying around the house, then youre going to need to use a virtual machine on a cloud computing platform. Not only is that centralised, it's also inefficient - due to the data being an unknown distance from the computation machine, and it can get costly fast. I failed to find any free-tier cloud computing service that offered GPU processing for this (did someone say crypto mining bans..?) and plans came in at &amp;gt; US$400 a month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HJdBSAjK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh4.googleusercontent.com/LnnSpxEN-MXg4fm2ZBxxowXm2E296RM9Vnth-0Y1lYUZFDRt5RPSBEdwSpRmzQbykG6_BCVHxWcbiEXSwKRjkHHLn9MhLeenOHvH6MUgEXxHUghzOn7xE6CelL-SK453mRw4OzoD6-HmRNhKU-T0XxwUcA%3Ds2048" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HJdBSAjK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh4.googleusercontent.com/LnnSpxEN-MXg4fm2ZBxxowXm2E296RM9Vnth-0Y1lYUZFDRt5RPSBEdwSpRmzQbykG6_BCVHxWcbiEXSwKRjkHHLn9MhLeenOHvH6MUgEXxHUghzOn7xE6CelL-SK453mRw4OzoD6-HmRNhKU-T0XxwUcA%3Ds2048" alt="" width="360" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bacalhau!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Luckily though, these problems are some of the issues Bacalhau is trying to solve. Making data processing and computation open and available to everyone and speeding up the processing times is possible in Bacalhau, firstly - by using batch processing across multiple nodes and secondly by putting the processing nodes where the data lives!&lt;/p&gt;

&lt;p&gt;Bacalhau is aiming to help democratise the future of data processing by enabling off-chain computation over data without giving up the decentralisation values inherent to IPFS, Filecoin &amp;amp; Web3 more broadly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.bacalhau.org/"&gt;Bacalhau&lt;/a&gt; is a peer-to-peer open computation network that provides a platform for public, transparent and optionally verifiable computation processes where users can run Docker containers or Web Assembly images as tasks against &lt;em&gt;any&lt;/em&gt; data including data stored in IPFS (&amp;amp; soon Filecoin). It even has support for GPU jobs (something that I couldn't find on any free tier from a cloud provider!)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SzLul0e9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.bacalhau.org/assets/images/bacalhau-high-level-view-4866977e82dcfd7b4ec1872ce327f856.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SzLul0e9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.bacalhau.org/assets/images/bacalhau-high-level-view-4866977e82dcfd7b4ec1872ce327f856.png" alt="intro | Bacalhau Docs" width="880" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running the script on Bacalhau&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To run this script, we can Dockerise it for use on Bacalhau. You can follow the &lt;a href="https://docs.bacalhau.org/examples/model-inference/stable-diffusion-gpu/"&gt;tutorial here&lt;/a&gt; if you want to learn to do that.&lt;br&gt;&lt;br&gt;
We can then run it with the Bacalhau CLI with just one line of code (after &lt;a href="https://docs.bacalhau.org/getting-started/installation"&gt;installing Bacalhau&lt;/a&gt; with another one-liner):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bacalhau docker run --gpu 1 ghcr.io/bacalhau-project/examples/stable-diffusion-gpu:0.0.1 -- python main.py --o ./outputs --p "Rainbow Unicorn"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--raAnxU5H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674830662856/3ead2e28-b2a7-4128-a770-bbe0284eed6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--raAnxU5H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674830662856/3ead2e28-b2a7-4128-a770-bbe0284eed6c.png" alt="" width="512" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example though, I'm going to use an HTTP endpoint that connects me to this dockerised stable diffusion script, which I'll show you in the Integrations section!&lt;/p&gt;

&lt;p&gt;I'll note here though, that this is a powerful and flexible way to run data computation processes that is also web3 friendly - we're not just limited to this one small model.&lt;/p&gt;

&lt;p&gt;Let's move on to the NFT script though! :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Building &amp;amp; Deploying the Solidity NFT Script
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Smart Contract&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The NFT Smart Contract is based on &lt;a href="https://docs.openzeppelin.com/contracts/4.x/erc721"&gt;Open Zeppelin's implementation of&lt;/a&gt; ERC721 but uses the ERC721URIStorage implementation, which includes the metadata standard extensions (so we can pass in our IPFS-addressed metadata - which we'll save on NFT.Storage, to the contract).&lt;/p&gt;

&lt;p&gt;This base contract additionally gives us the general functionality of an NFT contract with functions like mint() and transfer() already implemented for us.&lt;/p&gt;

&lt;p&gt;You'll notice I've also added a couple of getter functions to fetch data for my front end as well as an Event that will be emitted on-chain each time a new NFT is minted. This gives the ability to listen to on-chain events from the DApp.&lt;/p&gt;

&lt;p&gt;💡 &lt;a href="https://remix.ethereum.org/DeveloperAlly/bacalhau-fvm-nft/blob/main/pages/api/hardhat/contracts/BacalhauFRC721.sol"&gt;Try it out on remix and see all the available functions by clicking this link!&lt;/a&gt; 💡&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@hardhat/console.sol"; 

contract BacalhauFRC721 is ERC721URIStorage {
/** @notice Counter keeps track of the token ID number for each unique NFT minted in the NFT collection */
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

/** @notice This struct stores information about each NFT minted */
    struct bacalhauFRC721NFT {
        address owner;
        string tokenURI;
        uint256 tokenId;
    }

 /** @notice Keeping an array for each of the NFT's minted on this contract allows me to get information on them all with a read-only front end call */
    bacalhauFRC721NFT[] public nftCollection;
/** @notice The mapping allows me to find NFT's owned by a particular wallet address. I'm only handling the case where an NFT is minted to an owner in this contract - but you'd need to handle others in a mainnet contract like sending to other wallets */
    mapping(address =&amp;gt; bacalhauFRC721NFT[]) public nftCollectionByOwner;

/** @notice This event will be triggered (emitted) each time a new NFT is minted - which I will watch for on my front end in order to load new information that comes in about the collection as it happens */
    event NewBacalhauFRC721NFTMinted(
      address indexed sender,
      uint256 indexed tokenId,
      string tokenURI
    );

/** @notice Creates the NFT Collection Contract with a Name and Symbol */
    constructor() ERC721("Bacalhau NFTs", "BAC") {
      console.log("Hello Fil-ders! Now creating Bacalhau FRC721 NFT contract!");
    }

/** 
@notice The main function which will mint each NFT.
The ipfsURI is a link to the ipfs content identifier hash of the NFT metadata stored on NFT.Storage. This data minimally includes name, description and the image in a JSON.
*/
    function mintBacalhauNFT(address owner, string memory ipfsURI)
        public
        returns (uint256)
    {
        // get the tokenID for this new NFT
        uint256 newItemId = _tokenIds.current();

        // Format info for saving to our array
        bacalhauFRC721NFT memory newNFT = bacalhauFRC721NFT({
            owner: msg.sender,
            tokenURI: ipfsURI,
            tokenId: newItemId
        });

        //mint the NFT to the chain
        _mint(owner, newItemId);
        //Set the NFT Metadata for this NFT
        _setTokenURI(newItemId, ipfsURI);

        _tokenIds.increment();

        //Add it to our collection array &amp;amp; owner mapping
        nftCollection.push(newNFT);
        nftCollectionByOwner[owner].push(newNFT);

        // Emit an event on-chain to say we've minted an NFT
        emit NewBacalhauFRC721NFTMinted(
          msg.sender,
          newItemId,
          ipfsURI
        );

        return newItemId;
    }

    /**
     * @notice helper function to display NFTs for frontends
     */
    function getNFTCollection() public view returns (bacalhauFRC721NFT[] memory) {
        return nftCollection;
    }

    /**
     * @notice helper function to fetch NFT's by owner
     */
    function getNFTCollectionByOwner(address owner) public view returns (bacalhauFRC721NFT[] memory){
        return nftCollectionByOwner[owner];
    }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'll be deploying this contract to the &lt;a href="https://github.com/filecoin-project/testnet-hyperspace"&gt;Filecoin Virtual Machine Hyperspace Testnet&lt;/a&gt;, but you could deploy this contract to any EVM-compatible chain including Polygon, BSC, Optimism, Arbitrum, Avalanche and more. You could even tweak your front end to make a multi-chain NFT (hint: &lt;a href="https://github.com/DeveloperAlly/filecoin-expanded-nft-starter"&gt;this repo&lt;/a&gt;)!&lt;/p&gt;

&lt;p&gt;To deploy to Hyperspace Testnet we'll need to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.filecoin.io/developers/smart-contracts/how-tos/add-to-metamask/"&gt;Set up &amp;amp; connect&lt;/a&gt; Metamask Wallet to Hyperspace Testnet&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get some test tFIL funds from a faucet (&lt;a href="https://hyperspace.yoga/#faucet"&gt;Yoga&lt;/a&gt; or &lt;a href="https://beryx.zondax.ch/faucet"&gt;Zondax&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Deploying the Smart Contract with Hardhat&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm using hardhat to deploy this contract to the Hyperspace testnet.&lt;/p&gt;

&lt;p&gt;Hyperspace RPC &amp;amp; BlockExplorer Options:&lt;/p&gt;

&lt;p&gt;| Public RPC Endpoints | BlockExplorer's |&lt;br&gt;
| &lt;a href="https://filecoin-hyperspace.chainstacklabs.com/rpc/v0"&gt;https://filecoin-hyperspace.chainstacklabs.com/rpc/v0&lt;/a&gt; | &lt;a href="https://beryx.zondax.ch"&gt;https://beryx.zondax.ch/&lt;/a&gt; |&lt;br&gt;
| &lt;a href="https://hyperspace.filfox.info/rpc/v0"&gt;https://hyperspace.filfox.info/rpc/v0&lt;/a&gt; | &lt;a href="https://fvm.starboard.ventures/contracts/"&gt;https://fvm.starboard.ventures/contracts/&lt;/a&gt; |&lt;br&gt;
| &lt;a href="https://rpc.ankr.com/filecoin_testnet"&gt;https://rpc.ankr.com/filecoin_testnet&lt;/a&gt; | &lt;a href="https://explorer.glif.io/?network=hyperspacenet"&gt;https://explorer.glif.io/?network=hyperspacenet&lt;/a&gt; |&lt;br&gt;
| &lt;strong&gt;Open API&lt;/strong&gt; : &lt;a href="https://beryx.zondax.ch/"&gt;https://beryx.zondax.ch/&lt;/a&gt; | &lt;a href="https://hyperspace.filfox.info/en"&gt;https://hyperspace.filfox.info/en&lt;/a&gt; |&lt;/p&gt;

&lt;p&gt;For the config set-up, we can choose from any of the available public RPC endpoints.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hardhat.config.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import '@nomicfoundation/hardhat-toolbox';
import { config as dotenvConfig } from 'dotenv';
import { HardhatUserConfig } from 'hardhat/config';
import { resolve } from 'path';

//Import our customised tasks
// import './pages/api/hardhat/tasks';

const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || './.env';
dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) });

// Ensure that we have all the environment variables we need.
const walletPrivateKey: string | undefined = process.env.WALLET_PRIVATE_KEY;
if (!walletPrivateKey) {
  throw new Error('Please set your Wallet private key in a .env file');
}

const config: HardhatUserConfig = {
  solidity: '0.8.17',
  defaultNetwork: 'filecoinHyperspace',
  networks: {
    hardhat: {},
    filecoinHyperspace: {
      url: 'https://api.hyperspace.node.glif.io/rpc/v1',
      chainId: 3141,
      accounts: [process.env.WALLET_PRIVATE_KEY ?? 'undefined'],
    },
    // bleeding edge often-reset FVM testnet
    filecoinWallaby: {
      url: 'https://wallaby.node.glif.io/rpc/v0',
      chainId: 31415,
      accounts: [process.env.WALLET_PRIVATE_KEY ?? 'undefined'],
      //explorer: https://wallaby.filscan.io/ and starboard
    },
  },
// I am using the path mapping so I can keep my hardhat deployment within the /pages folder of my DApp and therefore access the contract ABI for use on my frontend
  paths: {
    root: './pages/api/hardhat',
    tests: './pages/api/hardhat/tests', //who names a directory in the singular?!!! Grammarly would not be happy
    cache: './pages/api/hardhat/cache',
  },
};

export default config;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to deploy the smart contract we created&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deploy/deployBacalhauFRC721.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import hre from 'hardhat';

import type { BacalhauFRC721 } from '../typechain-types/contracts/BacalhauFRC721';
import type { BacalhauFRC721 __factory } from '../typechain-types/factories/contracts/BacalhauFRC721__ factory';

async function main() {
  console.log('Bacalhau721 deploying....');

   // needed as hardhat's default does not map correctly to the FEVM
  const owner = new hre.ethers.Wallet(
    process.env.WALLET_PRIVATE_KEY || 'undefined',
    hre.ethers.provider
  );
  const bacalhauFRC721Factory: BacalhauFRC721__factory = &amp;lt;
    BacalhauFRC721__factory
  &amp;gt; await hre.ethers.getContractFactory('BacalhauFRC721', owner);

  const bacalhauFRC721: BacalhauFRC721 = &amp;lt;BacalhauFRC721&amp;gt;(
    await bacalhauFRC721Factory.deploy()
  );
  await bacalhauFRC721.deployed();
  console.log('bacalhauFRC721 deployed to ', bacalhauFRC721.address);
  // optionally log to a file here
}

main().catch((error) =&amp;gt; {
  console.error(error);
  process.exitCode = 1;
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To deploy, run the above script in the terminal by using the following code (NB: since we've set the default network to filecoinHyperspace in our config, it's not necessary to pass a flag for the network though this is shown below)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; cd ./pages/hardhat/deploy/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx hardhat run ./deployBacalhauFRC721.ts --network filecoinHyperspace

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Celebrate! We've just deployed our NFT contract to the Filecoin hyperspace testnet!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ksPFd6ir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media.tenor.com/MvvXjGVrnMQAAAAC/dancing-unicorn-unicorn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ksPFd6ir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media.tenor.com/MvvXjGVrnMQAAAAC/dancing-unicorn-unicorn.gif" alt="Dancing Unicorn GIFs | Tenor" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 Building the Front-End Interactions
&lt;/h2&gt;

&lt;p&gt;[coming soon]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NFT.Storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contract Interactions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bacalhau Interactions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creating the front-end API endpoint for Bacalhau is documented in &lt;a href="https://bacalhau.substack.com/p/bacalhau-project-report-jan-25-2022"&gt;this project report&lt;/a&gt; by engineer &lt;a href="https://twitter.com/lmarsden"&gt;Luke Marsden&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The API currently only directly hits the stable diffusion scripts documented in this blog, however, the team is in the process of extending it into a more generic API so that you can call any of the examples, and also your own deployed scripts from an HTTP REST API. Keep an eye on this &lt;a href="https://github.com/filecoin-project/bacalhau"&gt;here&lt;/a&gt; or in the #bacalhau channel in filecoinproject.slack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -XPOST -d '{"prompt": "rainbow unicorn"}' 'http://dashboard.bacalhau.org:1000/api/v1/stablediffusion';


import { CID } from 'multiformats/cid';

export const callBacalhauJob = async (promptInput: string) =&amp;gt; {
  //Bacalahau HTTP Stable Diffusion Endpoint
  const url = 'http://dashboard.bacalhau.org:1000/api/v1/stablediffusion';
  const headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
  };
  const data = {
    prompt: promptInput, //The user text prompt!
  };
  /* FETCH FROM BACALHAU ENDPOINT */
  const cid = await fetch(url, {
    method: 'POST',
    body: JSON.stringify(data),
    headers: headers,
  })
    .then(async (res) =&amp;gt; {
      let body = await res.json();
      if (body.cid) {
/* Bacalhau returns a V0 CID which we want to convert to a V1 CID for easier usage with http gateways (ie. displaying the image on web), so I'm using the IPFS multiformats package to convert it here */
        return CID.parse(body.cid).toV1().toString();
      }
    })
    .catch((err) =&amp;gt; {
      console.log('error in bac job', err);
    });
  return cid;
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This call will return an IPFS CID (content identifier) with a folder structure like the one below. The image can be found at &lt;code&gt;/outputs/image0.png&lt;/code&gt;. &lt;a href="https://bafybeicwzflyf5sole4itagpguf2oktscx3gtgoappmj3nqqqdhfrwzhle.ipfs.nftstorage.link/"&gt;See it for yourself by clicking here&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LLzKg7PU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674856969385/6b8d9f88-ac55-4565-bcf6-ac2173cb6dcd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LLzKg7PU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674856969385/6b8d9f88-ac55-4565-bcf6-ac2173cb6dcd.png" alt="" width="880" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H8LBv4__--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://bafybeicwzflyf5sole4itagpguf2oktscx3gtgoappmj3nqqqdhfrwzhle.ipfs.nftstorage.link/outputs/image0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H8LBv4__--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://bafybeicwzflyf5sole4itagpguf2oktscx3gtgoappmj3nqqqdhfrwzhle.ipfs.nftstorage.link/outputs/image0.png" alt="" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Deploying the front end to Fleek
&lt;/h2&gt;

&lt;p&gt;[coming soon]&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Final Thoughts: Possibilities for AI &amp;amp; Blockchain
&lt;/h2&gt;

&lt;p&gt;[coming soon]&lt;/p&gt;

&lt;h2&gt;
  
  
  🐠 The Bacalhau Roadmap
&lt;/h2&gt;

&lt;p&gt;We're currently building out a way for you to run Bacalhau directly from your smart contracts!!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep in touch!
&lt;/h2&gt;

&lt;p&gt;Congrats if you read all the way through!!!&lt;/p&gt;

&lt;p&gt;I'd appreciate a like, comment, follow or share if this was useful to you! &amp;lt;3&lt;/p&gt;

&lt;p&gt;Keep in touch with Bacalhau!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Twitter &lt;a href="https://twitter.com/BacalhauProject"&gt;@BacalhauProject&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;YouTube &lt;a href="https://www.youtube.com/@bacalhauproject/playlists"&gt;@BacalhauProject&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filecoin Project Slack #bacalhau &lt;a href="https://filecoinproject.slack.com"&gt;@filecoinproject&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Github @&lt;a href="http://bacalhau.org"&gt;bacalhau.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forum &lt;a href="https://github.com/filecoin-project/bacalhau/discussions"&gt;github.com/filecoin-project/bacalhau/discussions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JM7_gAIJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674791065491/9f66f9b5-858f-4db6-8ed7-83ffd0c63c80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JM7_gAIJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1674791065491/9f66f9b5-858f-4db6-8ed7-83ffd0c63c80.png" alt="" width="669" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/DeveloperAlly"&gt;@DeveloperAlly&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Is web3 business just web2 in disguise? Why importing web2 thinking is hurting our startups</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Fri, 14 Oct 2022 22:37:36 +0000</pubDate>
      <link>https://dev.to/developerally/is-web3-business-just-web2-in-disguise-why-importing-web2-thinking-is-hurting-our-startups-3bno</link>
      <guid>https://dev.to/developerally/is-web3-business-just-web2-in-disguise-why-importing-web2-thinking-is-hurting-our-startups-3bno</guid>
      <description>&lt;p&gt;Despite the technological advantages of blockchain giving us access to trustlessness, transparency and more fairness in our tech, it seems to me that many web3 companies are importing the cultures from web2 that do the exact opposite.&lt;/p&gt;

&lt;p&gt;This is a time to be rethinking how we are cooperating and collaborating as people and to be empowering new ways of working that include autonomy, fairness and transparent processes., Instead of importing the same problems that perpetuate lack of pay equality, unequal power dynamics and a lack of transparency and support, we should be embracing the benefits web3 gives us and the values it stands for.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>busines</category>
      <category>startup</category>
      <category>career</category>
    </item>
    <item>
      <title>Building &amp; Deploying Full Stack DApps</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Sat, 24 Sep 2022 07:23:28 +0000</pubDate>
      <link>https://dev.to/developerally/building-deploying-full-stack-dapps-epe</link>
      <guid>https://dev.to/developerally/building-deploying-full-stack-dapps-epe</guid>
      <description></description>
      <category>react</category>
      <category>blockchain</category>
      <category>ipfs</category>
      <category>filecoin</category>
    </item>
    <item>
      <title>Why I left leading the Filecoin Virtual Machine (FVM) DevRel Team</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Sat, 24 Sep 2022 06:16:50 +0000</pubDate>
      <link>https://dev.to/developerally/why-i-left-leading-the-filecoin-virtual-machine-fvm-devrel-team-nfp</link>
      <guid>https://dev.to/developerally/why-i-left-leading-the-filecoin-virtual-machine-fvm-devrel-team-nfp</guid>
      <description></description>
    </item>
    <item>
      <title>The Risks of Startup &amp; Scaleup Culture</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Thu, 22 Sep 2022 23:10:43 +0000</pubDate>
      <link>https://dev.to/developerally/the-risks-of-startup-culture-2jc2</link>
      <guid>https://dev.to/developerally/the-risks-of-startup-culture-2jc2</guid>
      <description>&lt;p&gt;Startups are great right? &lt;/p&gt;

&lt;p&gt;So fun and lively and autonomous.&lt;/p&gt;

&lt;p&gt;Unfortunately, there are also some very real risks to working for startups and startup cultures.&lt;/p&gt;

&lt;p&gt;Including&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lack of process&lt;/li&gt;
&lt;li&gt;Lack of support&lt;/li&gt;
&lt;li&gt;Lack of fairness&lt;/li&gt;
&lt;li&gt;Shifting expectations&lt;/li&gt;
&lt;li&gt;Victim blaming&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Unique challenges for women in crypto</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Thu, 22 Sep 2022 10:47:30 +0000</pubDate>
      <link>https://dev.to/developerally/unique-challenges-for-women-in-crypto-692</link>
      <guid>https://dev.to/developerally/unique-challenges-for-women-in-crypto-692</guid>
      <description>&lt;p&gt;Unique challenges: (let’s make this list, then let's make a list on how to combat them!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trad tech shade / hatred thrown at crypto.&lt;/strong&gt;&lt;br&gt;
This is tough to handle for anyone - but I’d posit it’s potentially even harder for women and minorities that may already feel like their voice is not heard or valued.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of a safe space and culture&lt;/strong&gt;&lt;br&gt;
The crypto world has a lot of cryptobros (but also increasingly a lot of awesome women and minority supporters - after all this is the place we are trying to make things fairer - we are in a unique position to understand what it’s like to be marginalised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of mentors&lt;/strong&gt;&lt;br&gt;
I put this one down to people being utterly time poor with one million different things on their plate at any one time! How do we solve this?&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>womenintech</category>
      <category>career</category>
    </item>
    <item>
      <title>Unseen Gender Discrimination in the Workplace &amp; it's effects [WIP]</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Thu, 22 Sep 2022 10:03:06 +0000</pubDate>
      <link>https://dev.to/developerally/unseen-gender-discrimination-in-the-workplace-its-effects-3e7k</link>
      <guid>https://dev.to/developerally/unseen-gender-discrimination-in-the-workplace-its-effects-3e7k</guid>
      <description>&lt;p&gt;Up until recently, I didn’t have much to say about the need for diversity pushes in the workplace, I understood their value and intent and could explain those initiatives to the male colleagues that asked, and yes, I’ve had some encounters with backwards people and bosses. &lt;/p&gt;

&lt;p&gt;It may also have helped that I was the eldest of 3 girls, went to an all-girls school, and was never told I was less than anyone. In fact, I was consistently told I could do anything I put my mind to by my father, who was a man that believed in education for girls and was ahead of his time, quite frankly. Another factor being that I ran my own business in my twenties and had plenty of life experience before I entered the world of tech and big corp's.&lt;/p&gt;

&lt;p&gt;Until recently. When I realised in the most awful way, the myriad of interconnected biases and treatments that can create a “death by 1000 cuts” scenario for underrepresented folks in the workplace. These stories are much harder to quantify. They are not as overt, they don’t evoke the same amount of outcry and they leave individuals feeling powerless to even bring the topic up.&lt;/p&gt;

&lt;p&gt;While men can be our best allies in the quest for workplace equality (and believe me I have had some amazing male mentors - shout out to you guys - you know who you are), they can also be the absolute worst offenders and gate-keepers to the male privilege of having it all.&lt;/p&gt;

&lt;p&gt;There’s a few things I want to make clear first, I am a person that will (barring a bad day) give everyone the benefit of best intentions. If someone is shocked I’m technical because I’m a woman, ok, it’s annoying that I have to play the role, but I will educate them that there are many smart and beautiful women doing amazing things in modern society. And they are not “women coders” or “women scientists” - they are just experts in their (non-gendered) field. When I see women’s groups who are just leveraging the movement for their own advantage or virtue signalling to get ahead, I am also absolutely furious. These women set things back 100 years.&lt;/p&gt;

&lt;p&gt;Basically, if you wanted a balanced, non-confrontational view on the issues, I was the person you might ask. Several times I was that person. Once on whether all-women hackathons should exists (shout out to the male that was curious enough to ask and felt safe enough to do so) - and the answer is yes, they should. Why? Because traditional underlying social roles crop up otherwise. A woman might be a great project lead, but she may also unconsciously just let a man on the team do it, for example.&lt;/p&gt;

&lt;p&gt;The problem isn’t with the broad strokes of things. The big issue lies in biases.&lt;/p&gt;

&lt;p&gt;These problems are much more insidious&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>career</category>
      <category>leadership</category>
      <category>culture</category>
    </item>
    <item>
      <title>How micromanagement &amp; low-trust environments are detrimental to productivity, project outcomes &amp; your business [WIP]</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Thu, 22 Sep 2022 10:01:09 +0000</pubDate>
      <link>https://dev.to/developerally/the-effects-of-micromanagement-low-trust-environments-on-productivity-project-outcomes-your-business-wip-1lni</link>
      <guid>https://dev.to/developerally/the-effects-of-micromanagement-low-trust-environments-on-productivity-project-outcomes-your-business-wip-1lni</guid>
      <description>&lt;p&gt;The Effects of micromanagement &amp;amp; low-trust environments on productivity, project outcomes &amp;amp; your business&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL:DR;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low-trust environments (at best) slow down productivity and outcomes&lt;/li&gt;
&lt;li&gt;Low-trust environments lead to stagnation, lack of original ideas and abandonment of innovation&lt;/li&gt;
&lt;li&gt;Low-trust environments produce lower levels of outcomes and lower quality of work&lt;/li&gt;
&lt;li&gt;Low-trust environments cause bottlenecks and blockers in achieving outcomes because even small decisions must be reviewed&lt;/li&gt;
&lt;li&gt;Low-trust environments are marked by an overabundance of checkin’s and meetings for no real purpose, breaking workflow and slowing down outcomes&lt;/li&gt;
&lt;li&gt;Low-trust environments are marked by fear and a lack of openness to feedback or different viewpoints, leading to a lack of collaboration, innovation or new ideas. Innovation requires an experimental attitude that embraces “mistakes” as a path to learning what works. In low-trust environments, making a mistake is fatal.&lt;/li&gt;
&lt;li&gt;Low-trust environments are run by mandate rather than consensus leading to resentment in employees&lt;/li&gt;
&lt;li&gt;Low-trust environments create cynical, disengaged employees&lt;/li&gt;
&lt;li&gt;Low-trust environments lead to higher levels of stress, and increased employee turnover.&lt;/li&gt;
&lt;li&gt;Low-trust environments cost a business in both time, innovation and money.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want to start out by saying I've worked for both great leaders, and appalling managers. And I use the two different terms, because a leader is a person who creates a high functioning, happy, healthy and innovative team and psychologically safe team environment that embraces differences and leverages them for constructive outcomes. A manager on the other hand, simply looks at day to day operational functions. They aren't inherently good or bad at their roles, but whether they are simply task managers or micromanagers creating unhealthy outcomes, they are never leaders.&lt;br&gt;
Leaders inspire, managers simply organise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Trust Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The role of trust in the workplace is essential. As Hungerford puts it - “Trust is an essential condition of human society, unifying families, communities, groups and countries.”&lt;/p&gt;

&lt;p&gt;The ILM defines trust in six dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ability&lt;/li&gt;
&lt;li&gt;Understanding&lt;/li&gt;
&lt;li&gt;Fairness&lt;/li&gt;
&lt;li&gt;Openness&lt;/li&gt;
&lt;li&gt;Integrity&lt;/li&gt;
&lt;li&gt;Consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rosenfeld likened leadership trust to the kind of trust that develops in families... “Their deeds have to match their words, because everyone is going to be watching,”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are these?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How are low-trust environments characterised?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low-trust environments are characterised by a const focus on the details, the "how" rather than on achieving outcomes&lt;/li&gt;
&lt;li&gt;Low-trust environments are characterised by one person bottlenecks &amp;amp; blockers&lt;/li&gt;
&lt;li&gt;Low-trust environments require constant review requirements leading to a break of workflow and slowing down of outcomes &lt;/li&gt;
&lt;li&gt;Low-trust environments are characterised by constant check in, communication and reporting requirements taking away the ability of the team to be innovative or to achieve tasks in a timely manner.&lt;/li&gt;
&lt;li&gt;Low-trust environments may engender a lack of support or praise for work&lt;/li&gt;
&lt;li&gt;Low-trust environments create and inability to give feedback, handle opposing opinions or to raise concerns and provide little or no support and a culture of fear.&lt;/li&gt;
&lt;li&gt;characterised by gaslighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What are their effects?&lt;/strong&gt;&lt;br&gt;
-on your business outcomes&lt;br&gt;
-on your employees&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you improve these?&lt;/strong&gt;&lt;br&gt;
-as a leader&lt;br&gt;
Leadership training&lt;br&gt;
Bias training&lt;br&gt;
Regular feedback processes &lt;br&gt;
A genuine commitment to constructive action on feedback and concerns&lt;br&gt;
People managers being distinct from up-line management&lt;br&gt;
Career coaching &amp;amp; support for those levelling up to new positions&lt;/p&gt;

&lt;p&gt;-as an individual&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you rectify issues?&lt;/strong&gt;&lt;br&gt;
-as a leader&lt;br&gt;
-as an individual&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What processes should be in place for concerns?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you rebuild trust in the workplace?&lt;/strong&gt;&lt;br&gt;
Most research agrees on the fundamentals of rebuilding trust in the workplace&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acknowledgement of what caused broken trust&lt;/li&gt;
&lt;li&gt;Permission and allowance for feelings and emotions to be discussed.&lt;/li&gt;
&lt;li&gt;Support processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Research articles&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.tandfonline.com/doi/abs/10.1080/01612840.2020.1822480?journalCode=imhn20"&gt;'High Trust’ and ‘Low Trust’ Workplace Settings: Implications for Our Mental Health and Wellbeing&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.researchgate.net/figure/Aspects-of-trust-as-characterized-in-low-and-high-trust-environments-for-assessment_tbl1_228870743"&gt;Characterising low &amp;amp; high trust environments&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/9-warning-signs-your-organization-low-trust-clifton-anderson/"&gt;Warning signs that your org is low-trust&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.shrm.org/resourcesandtools/hr-topics/employee-relations/pages/brokentrust.aspx"&gt;Broken Trust is Bad for Business&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"When employees do not trust managers and leaders, various forms of organizational fallout are likely, including low engagement, high turnover and reduced innovation" - Hastings (Broken Trust is Bad for Business).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.forbes.com/sites/forbescommunicationscouncil/2018/02/28/recognition-in-the-workplace-its-not-what-you-think-it-is/?sh=65650a333da5"&gt;Recognition in the workplace: Its Not What You Think It Is&lt;/a&gt;&lt;/p&gt;

</description>
      <category>culture</category>
      <category>leadership</category>
      <category>career</category>
      <category>team</category>
    </item>
    <item>
      <title>Want to learn Reactjs? Here's the 2020 resource list for you!</title>
      <dc:creator>Alison Haire</dc:creator>
      <pubDate>Thu, 08 Oct 2020 05:11:54 +0000</pubDate>
      <link>https://dev.to/developerally/want-to-learn-reactjs-here-s-the-2020-resource-list-for-you-3n57</link>
      <guid>https://dev.to/developerally/want-to-learn-reactjs-here-s-the-2020-resource-list-for-you-3n57</guid>
      <description>&lt;h1&gt;
  
  
  Hello 👋
&lt;/h1&gt;

&lt;p&gt;I’ve been a dev for a few years now, and one of the top things I get asked (after what language should I learn and where do I start) is where can I find some good resources for learning ‘x’. So here’s some of my fave resources for learning Reactjs🙂!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb9njd9pq7l26nvsgnlls.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb9njd9pq7l26nvsgnlls.jpg" alt="Learn All The Things Meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React is an open source javascript library originally developed by Facebook and released in May 2013. It continues to be developed &amp;amp; maintained by a core &lt;a href="https://reactjs.org/community/team.html" rel="noopener noreferrer"&gt;Facebook React team&lt;/a&gt; and the awesome open source &lt;a href="https://github.com/facebook/react/graphs/contributors" rel="noopener noreferrer"&gt;dev community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s also MIT licensed (as are all the React products including Jest, Flow, React Native &amp;amp; Immutable) which pretty much means you’re able to use it for private and commercial projects freely (thanks to the open source movement).&lt;/p&gt;

&lt;p&gt;If you’re just getting started in front end development, there are some key skills you want to have a decent idea of before you delve into a library like React. These include what the internet runs on at its most basic level - css, html and javascript and I’d also recommend knowing how to use git versioning. &lt;/p&gt;

&lt;p&gt;While these aren’t essential to know and you can learn them in combination, if you’re serious about your learning, that’s definitely the place I’d start. If you want a React learning pathway to map your studies you can check out this handy &lt;a href="https://roadmap.sh/react" rel="noopener noreferrer"&gt;React Roadmap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assuming you have some prior knowledge in these things though… here’s some of the best resources the interwebs has to offer (in my humble dev opinion) for learning React either for free (and one sneaky cheap one - because it's totally worth the dollarydoos) as well as some of the people and sites to subscribe to or follow to stay up to date on all things React.&lt;/p&gt;

&lt;h1&gt;
  
  
  Where to start
&lt;/h1&gt;

&lt;p&gt;The best idea when learning a new tech language, library&lt;br&gt;
or framework is to start with... Yep, the documentation. (Sorry not sorry)&lt;/p&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;br&gt;
😂😂😂 &lt;a href="https://t.co/EmImS4V2cO" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://t.co/EmImS4V2cO" rel="noopener noreferrer"&gt;https://t.co/EmImS4V2cO&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
— Ally Haire (&lt;a class="mentioned-user" href="https://dev.to/developerally"&gt;@developerally&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
&lt;a href="https://twitter.com/DeveloperAlly/status/1287985676646924290?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;July&lt;br&gt;&lt;br&gt;
28, 2020&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 

&lt;p&gt;We’re in luck here though, because &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt; is particularly good on documentation! It’s comprehensive, easy to read and well set out - hurrah. &lt;br&gt;
Even better - React has a complete beginners tutorial on their&lt;br&gt;
site and even &lt;a href="https://reactjs.org/community/courses.html" rel="noopener noreferrer"&gt;course recommendations&lt;/a&gt;&lt;br&gt;
(so I guess there’s no need for you to read the rest of this article now huh? 😜)&lt;/p&gt;

&lt;p&gt;As a quick aside - The React team is working on a major rewrite of the React docs site as we speak and looking for community feedback on how people currently use the docs and what improvements would be most helpful - you can help by taking this &lt;a href="https://www.surveymonkey.co.uk/r/T58DPNS" rel="noopener noreferrer"&gt;survey&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The React written walk-through tutorial is really the ultimate place for a beginner to start (can’t really beat something written by the developers themselves can you?!). You can find it &lt;a href="https://reactjs.org/tutorial/tutorial.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you prefer to learn via video or with step by step hand-ons&lt;br&gt;
interactions or want some social communities or mail-lists to subscribe to, then read on my friend 😃 !&lt;/p&gt;
&lt;h1&gt;
  
  
  Hands-on &amp;amp; Written Beginner’s Tutorials
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Codecademy&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Codecademy is one of the best free resources for those&lt;br&gt;
wanting hands-on learning all in one browser window. You get instant feedback on what’s right (or wrong) with your code and follow one-page tutorials.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Femat0cvvxe4mozgljkr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Femat0cvvxe4mozgljkr8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find it &lt;a href="https://www.codecademy.com/courses/react-101" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;W3schools&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;W3schools gets an honourable mention for being one of the&lt;br&gt;
oldest (but still relevant!) developer tutorial resources on the web.&lt;br&gt;
Founded in 1998, it focuses on being both a tutorial and resource and is continually adding languages and libraries to its site. It’s a great free resource if you prefer to read and run examples. &lt;/p&gt;

&lt;p&gt;Find it &lt;a href="https://www.w3schools.com/react/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Video courses
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Stephen Grider&lt;/strong&gt; &lt;br&gt;
One of my all-time favourite dev teachers is Stephen&lt;br&gt;
Grider. This guy has a way of explaining sometimes complex topics in a simple and easy to understand way.&lt;/p&gt;

&lt;p&gt;Not only is he a great teacher - but he’s very consistent at updating his content to make sure it’s keeping up with current React trends. This guy gets 5/5 hot dogs 🌭 from me (Stephen says this phrase a bit in his videos and I for one am good with it)&lt;/p&gt;

&lt;p&gt;My recommendation for starting is his 2020 updated “Modern React with Redux”. Once you’ve mastered that you can move on to his “Advanced React and Redux” course too (perk!).&lt;/p&gt;

&lt;p&gt;You can find his courses on Udemy, and while they aren’t entirely free - they are well worth the $10 you can get them for by going through his website for a discount coupon (or you can wait for a very frequent Udemy sale to happen).&lt;/p&gt;

&lt;p&gt;Find it &lt;a href="https://rallycoding.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FreeCodeCamp&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;FreeCodeCamp offers a free (obviously) 10 hour hands-on&lt;br&gt;
YouTube tutorial series which has recently been updated as of October 2020! This course will take you through the fundamentals of React including how to get setup and teach you modern React concepts (like Hooks - which were introduced in v16 in 2019). This is an awesome free development course and big kudo’s to freecodecamp for making coding accessible to all. &lt;/p&gt;

&lt;p&gt;Check it out &lt;a href="https://www.youtube.com/watch?v=4UZrsTqkcW4" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4UZrsTqkcW4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PluralSight&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;For a free video course that takes you through&lt;br&gt;
the essential React concepts while you code-along, try out “React: Getting Started” on PluralSight. This course is completely free and even includes a Javascript crash course if you’re a bit rusty or still learning. &lt;/p&gt;

&lt;p&gt;You’ll find it &lt;a href="https://www.pluralsight.com/courses/react-js-getting-started" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;h1&gt;
  
  
  React Development Social Communities
&lt;/h1&gt;

&lt;p&gt;Find peers, ask questions and get help in some of these awesome React Dev communities found on Reddit, Discord and Slack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discord&lt;/strong&gt;: The original React discord since 2015 is Reactiflux. Likely named when Flux was still the UI state management system of choice (things move fast in front-end development - which is why I’ve included a people and blogs to follow section!) &lt;/p&gt;

&lt;p&gt;Find it &lt;a href="https://www.reactiflux.com" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reddit&lt;/strong&gt;: &lt;br&gt;
This reddit even has a beginner’s thread - so don’t be afraid to ask any and all questions! Most dev’s I know are happy to help others - after all, we all started somewhere too!&lt;/p&gt;

&lt;p&gt;Find it &lt;a href="https://www.reddit.com/r/reactjs/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack&lt;/strong&gt;: &lt;br&gt;
You can find a lively community of react and react-native&lt;br&gt;
developers on slack too.&lt;/p&gt;

&lt;p&gt;Join the slack &lt;a href="https://reactjsnews.slack.com/#/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meetups&lt;/strong&gt;: &lt;br&gt;
Don’t forget about the awesome resource of Meetups! Meetups are often run by passionate developers, and given the popularity of Reactjs - you’re pretty likely to find a react meetup near you. It’s also an awesome way to meet other react developers and network.&lt;/p&gt;

&lt;p&gt;Check out your local groups &lt;a href="https://www.meetup.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  People &amp;amp; Blogs to follow
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Dan Abramov&lt;/strong&gt; &lt;br&gt;
Dan Abramov is the undisputed down-to-earth King of React (who probably would wince a bit at being called that). He’s so associated with React, that it’s a common misconception he created React (it was actually originally created by Jordan Walke). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy3j5g3u127x9kjzi4tit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy3j5g3u127x9kjzi4tit.png" alt="Dan Abramov Twitter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He did however develop Redux - which you can think of as a&lt;br&gt;
UI data storage system that keeps your data values synchronised &amp;amp; consistent and able to be connected to any React UI page. He also continues to be a core member of the React development team and runs the &lt;a href="https://overreacted.io/" rel="noopener noreferrer"&gt;overreacted.io&lt;/a&gt; blog.&lt;/p&gt;

&lt;p&gt;No React article would be complete without a hat-tip to Dan.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dan_abramov" rel="noopener noreferrer"&gt;@dan_abramov&lt;/a&gt; &lt;br&gt;
Github: @gaeron&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ryan Florence&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Creator of react router (basically used to give your react app the ability to move between pages) and founder of the &lt;a href="https://reacttraining.com/" rel="noopener noreferrer"&gt;reacttraining.com&lt;/a&gt; learning site.&lt;br&gt;
This guy does an awesome workshop and conference talk - check out his chat from &lt;a href="https://reactsummit.com/" rel="noopener noreferrer"&gt;ReactSummit&lt;/a&gt; - the official React Conference, this year on &lt;a href="https://www.youtube.com/watch?v=wXLf18DsV-I&amp;amp;t=1486s" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9c8kulertwlr1xayheb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9c8kulertwlr1xayheb1.png" alt="Ryan Florence Twitter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/ryanflorence" rel="noopener noreferrer"&gt;@ryanflorence&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh, and check out his tongue-in-check 90s &lt;a href="https://ryanflorence.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt; if you're after a chuckle too (Thanks Ryan 😂)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Robin Wieruch&lt;/strong&gt;&lt;br&gt;
This guy has been blogging and writing tutorials about React from nearly the start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fng97wb3mscyvhvytvbcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fng97wb3mscyvhvytvbcw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Web: &lt;a href="https://www.robinwieruch.de/learn-react-js" rel="noopener noreferrer"&gt;Robin Wieruch&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/rwieruch" rel="noopener noreferrer"&gt;@rwieruch&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Go use your new-found tech powers!
&lt;/h1&gt;

&lt;p&gt;If you're interested in hearing more about opensource or choosing a tech framework - check out &lt;a href="https://techjam.dev/" rel="noopener noreferrer"&gt;The TechJam podcast!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know if I’ve missed an awesome resource, great community or someone to follow and thanks for reading! 💙&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5ne0iblpfycohebnoj04.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5ne0iblpfycohebnoj04.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>development</category>
    </item>
  </channel>
</rss>
