<?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>Forem: Opeyemi Stephen</title>
    <description>The latest articles on Forem by Opeyemi Stephen (@resourcefulmind).</description>
    <link>https://forem.com/resourcefulmind</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%2F435270%2Ff0a5f111-887d-43a4-b5f0-9194afa47032.jpg</url>
      <title>Forem: Opeyemi Stephen</title>
      <link>https://forem.com/resourcefulmind</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/resourcefulmind"/>
    <language>en</language>
    <item>
      <title>Compressed NFTs in Production: A Campus Tour Case Study</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Sat, 17 Jan 2026 22:03:18 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/compressed-nfts-in-production-a-campus-tour-case-study-51ef</link>
      <guid>https://forem.com/resourcefulmind/compressed-nfts-in-production-a-campus-tour-case-study-51ef</guid>
      <description>&lt;p&gt;520 students attended the Solana Students Africa Campus Tour. We visited five Nigerian universities (University of Lagos, Federal University of Agriculture Abeokuta, University of Uyo, Olabisi Onabanjo University, and University of Abuja) over several weeks in the last quarter of 2025. They learned to build on Solana. Some just attended. Others actually shipped programs on-chain.&lt;/p&gt;

&lt;p&gt;We wanted to give them something permanent. Not a PDF certificate that lives in a forgotten email folder. Not a LinkedIn badge. Real, on-chain credentials they own forever. Stored on Solana, verifiable by anyone, and portable to wherever they go next.&lt;/p&gt;

&lt;p&gt;Two tiers of recognition. A &lt;strong&gt;Participation POAP&lt;/strong&gt; for everyone who showed up and engaged. And a &lt;strong&gt;Builder POAP&lt;/strong&gt; for those who went further, who actually deployed a program on-chain during the tour. Proof of attendance is meaningful. Proof of execution opens doors.&lt;/p&gt;

&lt;p&gt;The Builder credential isn't just a collectible. It's a signal. It unlocks early access to SSA programs, eligibility for builder spotlights, and priority consideration for future opportunities. For students building their on-chain reputation from scratch, this matters.&lt;/p&gt;

&lt;p&gt;I minted 214 POAPs (109 Participation and 105 Builder) for a total cost of about 0.05 SOL. Roughly $7. About 6 hours of work.&lt;/p&gt;

&lt;p&gt;This is the story of how I built it, what broke along the way, and what I learned.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Credentials
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmnys3rpojaepy0fvo4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmnys3rpojaepy0fvo4e.png" alt="Participation POAP" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Participation POAP: awarded to everyone who attended and submitted a wallet address&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflxyenbl0ry3yz6x0epr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflxyenbl0ry3yz6x0epr.png" alt="Builder POAP" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Builder POAP: awarded to those who deployed a program on-chain during the tour&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Compressed NFTs?
&lt;/h2&gt;

&lt;p&gt;Regular NFTs on Solana cost around $2 each to mint. That's the account rent, the SOL you pay to store data on-chain. For 200 POAPs, that's $400. For a student organization running campus events, not viable.&lt;/p&gt;

&lt;p&gt;Compressed NFTs change the math entirely. Instead of storing each NFT as a separate on-chain account, they use a data structure called a Merkle tree to store ownership proofs. The actual NFT data lives on Arweave, a permanent storage network. The on-chain footprint shrinks to almost nothing.&lt;/p&gt;

&lt;p&gt;The result: minting drops from ~$2 per NFT to ~$0.0001. That's a 10,000x cost reduction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Regular NFTs&lt;/th&gt;
&lt;th&gt;Compressed NFTs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost per mint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$2.00&lt;/td&gt;
&lt;td&gt;~$0.0001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200 POAPs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$400&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On-chain account&lt;/td&gt;
&lt;td&gt;Arweave + Merkle proof&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Small collections, 1/1s&lt;/td&gt;
&lt;td&gt;Large-scale drops, credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The tradeoff is complexity. You need to create the Merkle tree upfront. You need to upload metadata to Arweave. You need to understand how Metaplex's Bubblegum protocol works. But for this use case (hundreds of POAPs on a tight budget) the tradeoff was obvious.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Stack
&lt;/h3&gt;

&lt;p&gt;Here's what I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developers.metaplex.com/bubblegum" rel="noopener noreferrer"&gt;Bubblegum&lt;/a&gt;&lt;/strong&gt;: The machine that mints cheap NFTs. It's Metaplex's protocol for compressed NFTs on Solana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://arweave.org" rel="noopener noreferrer"&gt;Arweave&lt;/a&gt;&lt;/strong&gt;: Where the images and data live forever. Think of it as a hard drive that never dies and no one controls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://irys.xyz" rel="noopener noreferrer"&gt;Irys&lt;/a&gt;&lt;/strong&gt;: The delivery truck that gets your files onto Arweave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developers.metaplex.com/umi" rel="noopener noreferrer"&gt;Umi&lt;/a&gt;&lt;/strong&gt;: The remote control. It's Metaplex's TypeScript library that lets your code talk to Bubblegum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No smart contract writing required. Bubblegum already exists on Solana. I just called it from Node.js scripts.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;I didn't build a frontend. This was an ops task, not a product. A CLI pipeline made more sense: no users to serve, just data to process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b34fo6vz7ofrxi9q6ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b34fo6vz7ofrxi9q6ql.png" alt="System Architecture" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system is six scripts, run in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Consolidate data&lt;/strong&gt;: Merge registration data (Luma) with wallet submissions (Google Sheets)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt;: Check wallet addresses, find duplicates, flag issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload&lt;/strong&gt;: Push POAP images and metadata to Arweave&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create trees&lt;/strong&gt;: Deploy Merkle trees on Solana&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mint&lt;/strong&gt;: Issue compressed NFTs to each wallet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: Notify participants with links to view their POAPs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each script reads from the previous script's output. Config and state live in JSON files. No database. No server. Just Node.js scripts and a funded wallet.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Data Problem
&lt;/h2&gt;

&lt;p&gt;This is where it gets messy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Who Opted In
&lt;/h3&gt;

&lt;p&gt;520 people attended across five campuses. We asked them to fill out a Google Form with their Solana wallet address. 122 did. After cleaning invalid entries, I had 109 usable records.&lt;/p&gt;

&lt;p&gt;109 of 520 attendees submitted valid wallet addresses. Those are the ones who received credentials. The rest either weren't ready for a wallet, didn't complete the form, or simply didn't opt in. And that's okay. On-chain credentials are opt-in by nature.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You can't airdrop recognition to someone who didn't raise their hand."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The lesson: on-chain credentials require off-chain onboarding. If you want more people to opt in, you need to meet them where they are. A Google Form asking for a base58-encoded address (Solana's wallet address format) creates unnecessary friction.&lt;/p&gt;
&lt;h3&gt;
  
  
  Two Sources, Zero Alignment
&lt;/h3&gt;

&lt;p&gt;I had two data sources that refused to talk to each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Luma&lt;/strong&gt; gave me registration data: names and email addresses for 379 people across all campuses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets&lt;/strong&gt; gave me wallet data: names, wallet addresses, Program IDs (for builders), and GitHub profiles for 122 people.&lt;/p&gt;

&lt;p&gt;The problem: names didn't match. Luma had "Oluwaseun Jolaoso." The spreadsheet had "Seun Jolaoso." Same person. Different strings.&lt;/p&gt;

&lt;p&gt;I built a fuzzy matching script using Levenshtein distance, a measure of how many edits it takes to turn one string into another. Names with 85%+ similarity matched automatically. Names between 70-85% went to a manual review queue. Below 70%, I assumed no match.&lt;/p&gt;

&lt;p&gt;This worked. Mostly. I still had to eyeball edge cases where someone registered with their full government name and submitted their wallet with a nickname.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Wallet Validation Nightmare
&lt;/h3&gt;

&lt;p&gt;122 wallet submissions. 5 were broken. That's a 4% error rate in "clean" user-submitted data.&lt;/p&gt;

&lt;p&gt;The failures were creative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solana Explorer URLs&lt;/strong&gt;: Someone pasted &lt;code&gt;https://solscan.io/account/7xKX...AsU&lt;/code&gt; instead of just the address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipboard artifacts&lt;/strong&gt;: One entry read &lt;code&gt;4nY...xyz copied!&lt;/code&gt; because they'd pasted the "copied" toast message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong length&lt;/strong&gt;: A 45-character address when the max valid length is 44&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invalid characters&lt;/strong&gt;: Base58 doesn't include &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;O&lt;/code&gt;, &lt;code&gt;I&lt;/code&gt;, or &lt;code&gt;l&lt;/code&gt;. One address had an &lt;code&gt;O&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built validation into the pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PublicKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@solana/web3.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isValidSolanaAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pubkey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PublicKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;PublicKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isOnCurve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBytes&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything that fails gets flagged, not silently dropped.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Never trust user-submitted wallet addresses. Validate before you mint."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Verification Pivot
&lt;/h2&gt;

&lt;p&gt;I wanted the Builder POAP to mean something. Not just "attended" but "shipped." The original plan was straightforward: query each wallet's on-chain history, look for program deployments or significant transactions during the tour dates.&lt;/p&gt;

&lt;p&gt;This worked for about 40 wallets. Then Solana's public RPC (the API endpoint you use to read blockchain data) started returning 429 errors. Too Many Requests. I was being rate-limited.&lt;/p&gt;

&lt;p&gt;I could have paid for a dedicated RPC endpoint. But I was already over budget in time, and the deadline was approaching.&lt;/p&gt;

&lt;p&gt;Then I looked at the spreadsheet again.&lt;/p&gt;

&lt;p&gt;The Google Form had a "Program ID" column. Students who'd deployed a program were asked to paste their Program ID as proof. I'd been ignoring it because I wanted to verify on-chain. But the data was already there. Self-reported, yes, but present.&lt;/p&gt;

&lt;p&gt;116 entries had a Program ID that wasn't empty or "Nil." Cross-referenced with my cleaned participant list, that gave me 105 verified builders.&lt;/p&gt;

&lt;p&gt;The pivot took ten minutes. The original approach would have taken hours of RPC wrangling and probably still failed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Sometimes the answer is in the data you already have."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Cost Optimization
&lt;/h2&gt;

&lt;p&gt;With data cleaned and builders identified, I was ready to create the Merkle trees. This is the upfront cost of compressed NFTs: you pay for the tree once, then minting is nearly free.&lt;/p&gt;

&lt;p&gt;I ran the tree creation script. Estimated cost: 7.70 SOL.&lt;/p&gt;

&lt;p&gt;My wallet had 0.50 SOL.&lt;/p&gt;

&lt;p&gt;The default Merkle tree depth is 14, which supports 16,384 NFTs (2^14). I needed capacity for maybe 300. I was paying for infrastructure sized for a protocol, not a campus tour.&lt;/p&gt;

&lt;p&gt;I reduced the tree depth to 9. That's 512 capacity, plenty of headroom for the 214 POAPs, with room for future events. The cost dropped to about 0.02 SOL per tree.&lt;/p&gt;

&lt;p&gt;Two trees (one for Participation, one for Builder) cost me roughly 0.04 SOL total. Add upload fees and minting costs, and the whole deployment came in under 0.05 SOL.&lt;/p&gt;

&lt;p&gt;The lesson: defaults are configured for scale you probably don't need. Right-size for your actual use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production Day
&lt;/h2&gt;

&lt;p&gt;Pre-flight checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switch &lt;code&gt;.env&lt;/code&gt; to &lt;code&gt;mainnet-beta&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fund the wallet with 0.5 SOL (more than enough with my optimized trees)&lt;/li&gt;
&lt;li&gt;Add myself to the participant list (dogfooding)&lt;/li&gt;
&lt;li&gt;Run the validation script one more time&lt;/li&gt;
&lt;li&gt;Deep breath&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ran the minting scripts. 109 Participation POAPs first. The terminal scrolled with wallet addresses and transaction confirmations. Around wallet 40, I hit rate limits again: 429 errors. But this time I had retry logic with exponential backoff. The script waited, retried, and kept going.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv65qiggses5fdu52vpq3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv65qiggses5fdu52vpq3.jpg" alt="Terminal output during minting" width="778" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;15 minutes later, 109 Participation POAPs minted. I ran the Builder script. 105 more POAPs in another 12 minutes.&lt;/p&gt;

&lt;p&gt;Then emails. I used Resend's free tier (100 emails per day). I had 106 to send, so I split across two days. Each email included the POAP image, a link to view it on Solscan, and instructions for finding it in their wallet.&lt;/p&gt;

&lt;p&gt;Final cost: ~0.05 SOL. About $7 at the time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bugs I Hit
&lt;/h2&gt;

&lt;p&gt;I caught most issues before mainnet. But not all.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bug&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;th&gt;Prevention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CSV parser&lt;/td&gt;
&lt;td&gt;&lt;code&gt;val.includes is not a function&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Library returned numbers, not strings&lt;/td&gt;
&lt;td&gt;Wrap value in &lt;code&gt;String()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Type-check CSV outputs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overwritten file&lt;/td&gt;
&lt;td&gt;Lost 30 min of manual edits&lt;/td&gt;
&lt;td&gt;Background process overwrote &lt;code&gt;builders.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Re-do the work&lt;/td&gt;
&lt;td&gt;Don't run competing processes on same file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing complex. Just the kind of things that happen when you're moving fast with real data.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Validate wallets at registration.&lt;/strong&gt; Don't let people submit invalid addresses. Use a library like &lt;code&gt;@solana/web3.js&lt;/code&gt; and check &lt;code&gt;PublicKey.isOnCurve()&lt;/code&gt; client-side. Show a red border and clear error message ("This doesn't look like a valid Solana address") before allowing submission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a dedicated RPC from day one.&lt;/strong&gt; Public endpoints are fine for testing. For production, the rate limits will bite you at the worst moment. Services like &lt;a href="https://helius.dev" rel="noopener noreferrer"&gt;Helius&lt;/a&gt; or &lt;a href="https://triton.one" rel="noopener noreferrer"&gt;Triton&lt;/a&gt; cost around $20/month and save hours of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a simple frontend for wallet collection.&lt;/strong&gt; A Google Form with a text field introduces multiple failure points: partial copies, clipboard artifacts, accidentally pasting Explorer URLs. A Connect Wallet button eliminates all of this. User clicks "Connect," approves the popup, and you capture the address directly from their wallet. Zero manual copying, guaranteed-valid address. This takes about 30 minutes to build. I built it after the fact. Should have done it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add idempotency checks.&lt;/strong&gt; If the script crashes mid-mint, you should be able to re-run it without double-minting. Store minted wallets in a JSON file and skip them on retry. I didn't build this. I got lucky and didn't need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total event attendees&lt;/td&gt;
&lt;td&gt;520&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wallet submissions&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Participation POAPs minted&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builder POAPs minted&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emails sent&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total cost&lt;/td&gt;
&lt;td&gt;~0.05 SOL (~$7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total build time&lt;/td&gt;
&lt;td&gt;~6 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to mint&lt;/td&gt;
&lt;td&gt;~30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What I Learned
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Compressed NFTs make at-scale credentials viable.&lt;/strong&gt; $7 for 214 on-chain credentials is a fundamentally different cost structure than $400+. This unlocks use cases that weren't economically possible before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data wrangling is 60% of the work.&lt;/strong&gt; I spent more time cleaning data, matching names, and validating wallets than I did on the actual blockchain integration. If you're building a similar system, budget accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right-size your infrastructure.&lt;/strong&gt; Don't pay for 16,384-NFT capacity when you need 300. Don't use a database when JSON files work. Don't build a frontend when a CLI will do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The data you need might already exist.&lt;/strong&gt; I almost burned hours on RPC calls when the Program ID column was sitting in the spreadsheet the whole time. Look at what you have before building what you think you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eliminate copy-paste errors.&lt;/strong&gt; Even experienced builders make mistakes when manually copying wallet addresses. A "Connect Wallet" button captures the address programmatically: no clipboard artifacts, no accidentally pasting Explorer URLs, no truncated strings.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;109 students now have on-chain proof they attended the SSA Campus Tour 2025. 105 have proof they shipped code. These aren't just collectibles. They're credentials that can unlock future opportunities: early access to SSA programs, builder spotlights, and priority consideration for grants and accelerators.&lt;/p&gt;

&lt;p&gt;These credentials live in their wallets, permanent, verifiable, and theirs. For some, this might be their first on-chain asset. For others, it's the start of a builder reputation that could open doors to opportunities we haven't even created yet. That's the point of on-chain credentials: they compound over time.&lt;/p&gt;

&lt;p&gt;The system I built is open source. The scripts, templates, and documentation are on GitHub. If you're running events, hackathons, or bootcamps and want to recognize your participants with credentials that actually mean something, not PDFs, not emails, fork it and adapt it.&lt;/p&gt;

&lt;p&gt;520 attendees. 109 opted in. 214 credentials minted. $7 spent.&lt;/p&gt;

&lt;p&gt;The infrastructure is built. The playbook exists. Next time, I'll make opting in even easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/resourcefulmind/ssa-poap-metaplex" rel="noopener noreferrer"&gt;github.com/resourcefulmind/ssa-poap-metaplex&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions? Reach out &lt;a href="https://twitter.com/devvgbg" rel="noopener noreferrer"&gt;@devvgbg&lt;/a&gt; on Twitter.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for &lt;a href="https://www.solanastudentsafrica.com" rel="noopener noreferrer"&gt;Solana Students Africa&lt;/a&gt;. Powered by &lt;a href="https://developers.metaplex.com/bubblegum" rel="noopener noreferrer"&gt;Metaplex Bubblegum&lt;/a&gt;, &lt;a href="https://developers.metaplex.com/umi" rel="noopener noreferrer"&gt;Umi&lt;/a&gt;, &lt;a href="https://irys.xyz" rel="noopener noreferrer"&gt;Irys&lt;/a&gt;, and &lt;a href="https://resend.com" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>node</category>
      <category>arweave</category>
    </item>
    <item>
      <title>When Payments Own the Base Layer: What Corporate L1s Mean for L2s, and for Africa v2.0</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Fri, 22 Aug 2025 17:40:58 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/when-payments-own-the-base-layer-what-corporate-l1s-mean-for-l2s-and-for-africa-v20-112l</link>
      <guid>https://forem.com/resourcefulmind/when-payments-own-the-base-layer-what-corporate-l1s-mean-for-l2s-and-for-africa-v20-112l</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;TL;DR&lt;/li&gt;
&lt;li&gt;The spark (and why I’m writing this)&lt;/li&gt;
&lt;li&gt;Baseline: what L2s actually do today (so we measure impact correctly)&lt;/li&gt;
&lt;li&gt;Why payments firms might go L1 (and not just “use an L2”)&lt;/li&gt;
&lt;li&gt;Africa lens: what could really change (and what won’t)&lt;/li&gt;
&lt;li&gt;Scenarios, not predictions (how big could the shift be?)&lt;/li&gt;
&lt;li&gt;Dollarization pressure vs domestic units (cNGN, etc.)&lt;/li&gt;
&lt;li&gt;Risks &amp;amp; trade-offs (clear-eyed, not alarmist)&lt;/li&gt;
&lt;li&gt;Who wins / who loses (by segment)&lt;/li&gt;
&lt;li&gt;What to watch (so this doesn’t devolve into vibes)&lt;/li&gt;
&lt;li&gt;90-day action plan (operators &amp;amp; builders)&lt;/li&gt;
&lt;li&gt;Pushback corner, quick answers to big doubts&lt;/li&gt;
&lt;li&gt;Conclusion: track the metrics, not the memes&lt;/li&gt;
&lt;li&gt;Sources &amp;amp; methods (selected)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Circle just announced &lt;strong&gt;Arc&lt;/strong&gt;, a stablecoin-native &lt;strong&gt;Layer-1&lt;/strong&gt; (USDC as gas; EVM-compatible) with &lt;strong&gt;private testnet in weeks&lt;/strong&gt;, &lt;strong&gt;public testnet this fall&lt;/strong&gt;, &lt;strong&gt;mainnet beta in 2026&lt;/strong&gt;. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Circle wants USDC to be the engine &lt;em&gt;and&lt;/em&gt; the fuel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fortune&lt;/strong&gt; reports &lt;strong&gt;Stripe is building “Tempo,”&lt;/strong&gt; a payments-first L1 with &lt;strong&gt;Paradigm&lt;/strong&gt;; it’s &lt;strong&gt;stealth&lt;/strong&gt; and &lt;strong&gt;Ethereum-compatible&lt;/strong&gt;. Not officially confirmed beyond the report and subsequent coverage. (&lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;, &lt;a href="https://www.coindesk.com/business/2025/08/12/stripe-building-payments-blockchain-tempo-with-paradigm-fortune?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;CoinDesk&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Stripe may move from using blockchains to &lt;em&gt;running&lt;/em&gt; one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Today, &lt;strong&gt;Ethereum L2s carry ~10× L1’s transaction throughput&lt;/strong&gt; by user-ops, with &lt;strong&gt;Base, Arbitrum, and OP&lt;/strong&gt;leading; &lt;strong&gt;Arbitrum ~$19.2B TVS, Base ~$15.8B&lt;/strong&gt;. (&lt;a href="https://l2beat.com/scaling/activity" rel="noopener noreferrer"&gt;L2BEAT&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Today’s crypto “busy streets” are L2s, not L1s.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stablecoins settled &amp;gt;$12T in 2024&lt;/strong&gt; and are on track for much more in 2025, the real prize isn’t “users” but &lt;strong&gt;dollar settlement at scale&lt;/strong&gt;. (&lt;a href="https://5264302.fs1.hubspotusercontent-na1.net/hubfs/5264302/special-insights/coin-metrics-2025-outlook-report.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;5264302.fs1.hubspotusercontent-na1.net&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For Africa: this could &lt;strong&gt;lower remittance and B2B costs&lt;/strong&gt; and normalize &lt;strong&gt;USD rails&lt;/strong&gt;—but raises &lt;strong&gt;centralization, compliance gating, and dollarization&lt;/strong&gt; risks. SSA’s average remittance cost is still &lt;strong&gt;~8.37%&lt;/strong&gt;; any new rail must beat that. (&lt;a href="https://africa.businessinsider.com/local/markets/remittances-to-sub-saharan-africa-remains-overpriced/dn0r47y?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Business Insider Africa&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Faster, cheaper money, if the rules and partners line up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxtmg4q9wf4tmkwhqebu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxtmg4q9wf4tmkwhqebu.png" alt="Average Remittance Cost - SSA vs Global" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The spark (and why I’m writing this)
&lt;/h2&gt;

&lt;p&gt;A founder described this event, when it was announced, as “9/11 for L2s.” I don’t endorse that phrasing, but I get the sentiment: when &lt;strong&gt;payments companies start owning the base layer&lt;/strong&gt;, incentives and gravity change. &lt;strong&gt;Circle&lt;/strong&gt; is bringing USDC into the substrate with &lt;strong&gt;Arc&lt;/strong&gt;; &lt;strong&gt;Fortune&lt;/strong&gt; says &lt;strong&gt;Stripe&lt;/strong&gt; is quietly building &lt;strong&gt;Tempo&lt;/strong&gt;. This isn’t “just another chain.” It’s a bid to &lt;strong&gt;vertically integrate settlement&lt;/strong&gt;, fees, FX, and compliance in one place. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;, &lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In other words, the companies that move money want to own the road, not just drive on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Baseline: what L2s actually do today (so we measure impact correctly)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Throughput:&lt;/strong&gt; Over the last year, &lt;strong&gt;L2 user-ops per second ≈ 10.2× Ethereum L1&lt;/strong&gt;. In plain English: most activity by &lt;em&gt;count&lt;/em&gt; has moved to L2s. &lt;strong&gt;Base&lt;/strong&gt; currently tops the board by activity. (&lt;a href="https://l2beat.com/scaling/activity" rel="noopener noreferrer"&gt;L2BEAT&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capital:&lt;/strong&gt; &lt;strong&gt;Arbitrum ≈ $19.18B TVS&lt;/strong&gt;, &lt;strong&gt;Base ≈ $15.76B&lt;/strong&gt;, &lt;strong&gt;OP Mainnet ≈ $3.89B&lt;/strong&gt; (rolling 1-year window). (&lt;a href="https://l2beat.com/scaling/tvs" rel="noopener noreferrer"&gt;L2BEAT&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz2dixv8112qoyib1985.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz2dixv8112qoyib1985.png" alt="L2 Total Value Secured (TVS)" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L2s exist to scale existing L1s: cheaper fees, higher throughput, and a familiar developer toolchain. This is why people are anxious: L2s are where devs ship and where users click, they are express lanes bolted onto a busy highway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why payments firms might go L1 (and not just “use an L2”)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Control and predictability.&lt;/strong&gt; If you run the &lt;strong&gt;base layer&lt;/strong&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compress the fee stack&lt;/strong&gt; (less paid “up the chain”).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ship &lt;strong&gt;native stablecoin gas&lt;/strong&gt; (Arc: USDC for fees) and &lt;strong&gt;sub-second finality&lt;/strong&gt; tuned for merchant UX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bake in &lt;strong&gt;compliance primitives and FX&lt;/strong&gt; (KYCable on/off-ramps, programmable rules, fiat pairs).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce &lt;strong&gt;vendor ambiguity&lt;/strong&gt; for enterprises (one throat to choke). (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stripe’s&lt;/strong&gt; reported &lt;strong&gt;Tempo&lt;/strong&gt; fits the same logic: own the moment of settlement for stablecoin payments instead of renting it. It’s cheaper, simpler, and safer (for them) if they run the whole stack. Depending solely on L2s means inheriting upstream fees, governance timelines, and bridge risks. A bespoke L1 reduces those dependencies. If you rent your rails, your landlord sets the rules.&lt;/p&gt;

&lt;p&gt;That said, it’s &lt;strong&gt;stealth&lt;/strong&gt;, we have a &lt;strong&gt;Fortune&lt;/strong&gt; report and secondary coverage, not official docs. Treat it as directional, not done. (&lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;, &lt;a href="https://www.coindesk.com/business/2025/08/12/stripe-building-payments-blockchain-tempo-with-paradigm-fortune?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;CoinDesk&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Africa lens: what could really change (and what won’t)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Let’s talk about costs and speed.&lt;/strong&gt; Sub-Saharan Africa remains the &lt;strong&gt;most expensive region&lt;/strong&gt; for remittances: &lt;strong&gt;~8.37%&lt;/strong&gt; average to send $200 (Q2 2024). If &lt;strong&gt;Arc&lt;/strong&gt; (and possibly &lt;strong&gt;Tempo&lt;/strong&gt;) land credible partners in-country and squeeze spreads with &lt;strong&gt;stablecoin-native FX&lt;/strong&gt;, corridors like &lt;strong&gt;NG↔UK/EU&lt;/strong&gt; or &lt;strong&gt;KE↔GCC&lt;/strong&gt; could finally see structural cost drops and near-instant settlement. That’s the bar. (&lt;a href="https://africa.businessinsider.com/local/markets/remittances-to-sub-saharan-africa-remains-overpriced/dn0r47y?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Business Insider Africa&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;You’ll see trials first, not instant miracles. If the pipes connect, sending money could get cheaper and quicker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As for Rails we already use.&lt;/strong&gt; Stablecoins are &lt;strong&gt;not theoretical&lt;/strong&gt; here. Nigeria alone saw &lt;strong&gt;≈$59B&lt;/strong&gt; in crypto inflows (Jul 2023–Jun 2024), with &lt;strong&gt;stablecoins&lt;/strong&gt; a top use case for remittances, savings, and commerce. Corporate L1s will try to &lt;strong&gt;formalize&lt;/strong&gt; what people already do informally. (&lt;a href="https://www.chainalysis.com/blog/subsaharan-africa-crypto-adoption-2024/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Chainalysis&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local infrastructure players.&lt;/strong&gt; Providers like &lt;strong&gt;Blockradar&lt;/strong&gt; (wallet-as-a-service for stablecoins) and &lt;strong&gt;Paycrest&lt;/strong&gt;(decentralized liquidity/payments network) are the last-mile glue. If Arc/Tempo become default rails, these players either (a) &lt;strong&gt;abstract and localize&lt;/strong&gt; them for banks/fintechs (KYC, payouts, reconciliation), or (b) get &lt;strong&gt;disintermediated&lt;/strong&gt; if corporate L1s ship turnkey SDKs plus local bank partnerships. My bet: Africa still needs &lt;strong&gt;local abstractions&lt;/strong&gt; to connect to &lt;strong&gt;Naira/KES/mobile-money&lt;/strong&gt; reality. (&lt;a href="https://www.blockradar.co/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blockradar.co&lt;/a&gt;, &lt;a href="https://www.mariblock.com/sidebar-why-africa-needs-its-own-stablecoins-paycrest-ceo/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Mariblock&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The winning play is being the easy adapter, not another chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy direction.&lt;/strong&gt; Nigeria has been signaling &lt;strong&gt;openness to regulated stablecoin businesses&lt;/strong&gt; under the new &lt;strong&gt;Investment and Securities Act 2025&lt;/strong&gt;; Kenya’s &lt;strong&gt;VASP Bill (2025)&lt;/strong&gt; is progressing in Parliament. Translation: on/off-ramps will tighten and formalize. That’s good for enterprise adoption, but it also raises the &lt;strong&gt;compliance bar&lt;/strong&gt; for users. (&lt;a href="https://cointelegraph.com/news/nigeria-opens-doors-to-stablecoin-firms-under-regulatory-oversight?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Cointelegraph&lt;/a&gt;, &lt;a href="https://www.parliament.go.ke/sites/default/files/2025-04/THE%20VIRTUAL%20ASSET%20SERVICE%20PROVIDERS%20BILL%2C%202025%20%282%29.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;parliament.go.ke&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenarios, not predictions (how big could the shift be?)
&lt;/h2&gt;

&lt;p&gt;The target isn’t “daily active users”, it’s &lt;strong&gt;settlement volume&lt;/strong&gt;. Stablecoins &lt;strong&gt;settled &amp;gt;$12T in 2024&lt;/strong&gt; across chains; 2025 is tracking higher. If &lt;strong&gt;Arc&lt;/strong&gt; (and later &lt;strong&gt;Tempo&lt;/strong&gt;) captured even a &lt;strong&gt;single-digit&lt;/strong&gt; share of settlement over time, that’s &lt;strong&gt;hundreds of billions&lt;/strong&gt; annually flowing on corporate L1s, with some of that &lt;strong&gt;migrating from L2s&lt;/strong&gt;, some from L1, and some from non-ETH chains. (Cannibalization won’t be L2-only.) (&lt;a href="https://5264302.fs1.hubspotusercontent-na1.net/hubfs/5264302/special-insights/coin-metrics-2025-outlook-report.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;5264302.fs1.hubspotusercontent-na1.net&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;A small slice of a huge pie is still enormous, and it won’t come only from L2s.&lt;/p&gt;

&lt;p&gt;In numbers, here’s a conservative scenario using a &lt;strong&gt;$12T&lt;/strong&gt; annual stablecoin-settlement baseline (2024).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: Global stablecoin settlement ≥ $12T in 2024 (Coin Metrics). This is scenario math, not a prediction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Share captured by corporate L1s&lt;/th&gt;
&lt;th&gt;Annual flow redirected&lt;/th&gt;
&lt;th&gt;Monthly flow redirected&lt;/th&gt;
&lt;th&gt;In plain terms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$600B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$50B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A sliver of a huge pie is still a big rail.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1.2T&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$100B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Starts to dent L2/L1 and non-ETH settlement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;20%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2.4T&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$200B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clear structural shift in where value settles.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What decides the number?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Who onboards the banks/PSPs/MTOs&lt;/strong&gt; in NG, KE, GH, ZA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FX quality&lt;/strong&gt; and &lt;strong&gt;fee transparency&lt;/strong&gt; (does it actually beat today’s ~8% benchmarks?).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exchange listings and market-maker depth&lt;/strong&gt; (liquidity follows incentives).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bridges and CCTP-like mechanisms&lt;/strong&gt; to move balances in/out safely. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Partners, prices, and liquidity decide winners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dollarization pressure vs domestic units (cNGN, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dollar rails are sticky&lt;/strong&gt; because they solve inflation and FX pain. But &lt;strong&gt;cNGN&lt;/strong&gt;, a &lt;strong&gt;Naira-pegged stablecoin&lt;/strong&gt; from the &lt;strong&gt;Africa Stablecoin Consortium&lt;/strong&gt; operating with &lt;strong&gt;CBN oversight via sandbox&lt;/strong&gt;, is an attempt to &lt;strong&gt;digitize NGN&lt;/strong&gt; and keep commerce in local units where appropriate. It can ease dollar pressure &lt;strong&gt;if&lt;/strong&gt; it achieves real acceptance, corridor liquidity, and easy conversion to/from USD stables in compliant venues. Otherwise, users default to USDC/USDT for depth. (&lt;a href="https://www.mariblock.com/naira-pegged-stablecoin-cngn-launches-lists-on-exchanges?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Mariblock&lt;/a&gt;, &lt;a href="https://sec.gov.ng/press-release-update-on-the-secs-accelerated-regulatory-incubation-program-and-regulatory-incubation-program/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Securities and Exchange Commission&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Net-net:&lt;/strong&gt; If Arc’s FX and partner stack support &lt;strong&gt;cNGN↔USDC&lt;/strong&gt; cleanly (and similarly for KES/ZAR-pegs), domestic units could &lt;strong&gt;coexist&lt;/strong&gt; with dollar rails instead of being crowded out. That’s a design choice, not a given. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Good plumbing lets naira and dollars live side by side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risks &amp;amp; trade-offs (clear-eyed, not alarmist)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Centralization &amp;amp; freezing risk.&lt;/strong&gt; Corporate L1s and centrally issued stablecoins can &lt;strong&gt;freeze or block addresses&lt;/strong&gt;under orders. That’s essential for compliance, but it’s also exclusion risk for high-friction jurisdictions. (You’re trading censorship-resistance for predictability.) Safer for institutions, but some users can be switched off.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Liquidity bootstrapping.&lt;/strong&gt; Even with USDC as gas, &lt;strong&gt;Arc&lt;/strong&gt; must win &lt;strong&gt;market-makers, listings, and DeFi venues&lt;/strong&gt;; &lt;strong&gt;Stripe’s Tempo&lt;/strong&gt; is even earlier. Until liquidity is deep, the UX won’t match the theory. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;, &lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Empty malls look great on paper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bridge and fragmentation risk.&lt;/strong&gt; Moving value across multiple chains creates attack surface. CCTP-style systems help, but operational risk doesn’t vanish. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Policy chokepoints.&lt;/strong&gt; Real benefit requires &lt;strong&gt;licensed on/off-ramps&lt;/strong&gt; in-country. Nigeria and Kenya are moving, but policy implementation matters more than headlines. Without legal doors in and out, the highway is a dead end. (&lt;a href="https://cointelegraph.com/news/nigeria-opens-doors-to-stablecoin-firms-under-regulatory-oversight?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Cointelegraph&lt;/a&gt;, &lt;a href="https://www.parliament.go.ke/sites/default/files/2025-04/THE%20VIRTUAL%20ASSET%20SERVICE%20PROVIDERS%20BILL%2C%202025%20%282%29.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;parliament.go.ke&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who wins / who loses (by segment)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise fintechs &amp;amp; banks in Africa:&lt;/strong&gt; Win &lt;strong&gt;if&lt;/strong&gt; they integrate early and pass savings to users; lose if they stall and let shadow channels own the rails. Move first, or play catch-up later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;L2s:&lt;/strong&gt; Lose some &lt;strong&gt;payments settlement&lt;/strong&gt; over time &lt;strong&gt;if&lt;/strong&gt; corporate L1s nail UX + compliance; still win on &lt;strong&gt;DeFi/experimentation&lt;/strong&gt; and as &lt;strong&gt;middleware&lt;/strong&gt; for other use cases. L2s won’t die; they’ll specialize.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Local infra (Blockradar, Paycrest, etc.):&lt;/strong&gt; Win by &lt;strong&gt;abstracting Arc/Tempo&lt;/strong&gt; for local compliance and payouts. Lose if they try to compete with base-layer SDKs instead of complementing them. (&lt;a href="https://www.blockradar.co/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blockradar.co&lt;/a&gt;, &lt;a href="https://www.mariblock.com/sidebar-why-africa-needs-its-own-stablecoins-paycrest-ceo/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Mariblock&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Be the plug, not the socket.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Users:&lt;/strong&gt; Win on &lt;strong&gt;speed and (hopefully) cost&lt;/strong&gt;; risk &lt;strong&gt;hard KYC gating&lt;/strong&gt; and &lt;strong&gt;freezing&lt;/strong&gt; in edge cases. Faster and cheaper, inside a tighter rulebook.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to watch (so this doesn’t devolve into vibes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Milestones:&lt;/strong&gt; Arc &lt;strong&gt;public testnet&lt;/strong&gt; (fall 2025), mainnet beta (2026); any &lt;strong&gt;named African partners&lt;/strong&gt; (banks, MTOs, PSPs). Official &lt;strong&gt;Stripe/Tempo&lt;/strong&gt; confirmation. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;, &lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dates and logos, not vibes.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Benchmarks:&lt;/strong&gt; &lt;strong&gt;World Bank RPW&lt;/strong&gt; for SSA corridors, we want sustained drops from &lt;strong&gt;~8%&lt;/strong&gt; toward &lt;strong&gt;&amp;lt;5%&lt;/strong&gt;. (&lt;a href="https://remittanceprices.worldbank.org/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Remittance Prices Worldwide&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If fees don’t drop, nothing changed.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Share shifts:&lt;/strong&gt; L2 &lt;strong&gt;activity share&lt;/strong&gt; and &lt;strong&gt;TVS&lt;/strong&gt; (L2BEAT), plus &lt;strong&gt;stablecoin settlement share&lt;/strong&gt; by chain (Coin Metrics / Visa Onchain). (&lt;a href="https://l2beat.com/scaling/activity" rel="noopener noreferrer"&gt;L2BEAT&lt;/a&gt;, &lt;a href="https://5264302.fs1.hubspotusercontent-na1.net/hubfs/5264302/special-insights/coin-metrics-2025-outlook-report.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;5264302.fs1.hubspotusercontent-na1.net&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow the money, not the tweets.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  90-day action plan (operators &amp;amp; builders)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pilot a corridor.&lt;/strong&gt; Pick one high-volume route (e.g., &lt;strong&gt;NG↔UK&lt;/strong&gt;) and run a &lt;strong&gt;sandbox&lt;/strong&gt;: stablecoin collection → FX → local payout. Measure &lt;strong&gt;all-in cost&lt;/strong&gt; (including spread), &lt;strong&gt;settlement time&lt;/strong&gt;, &lt;strong&gt;reconciliation errors&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Test a lane before rebuilding the highway.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Abstract the base layer.&lt;/strong&gt; Whether it’s &lt;strong&gt;Arc&lt;/strong&gt; or an L2, build behind a &lt;strong&gt;rail-agnostic&lt;/strong&gt; interface so you can swap infra as liquidity/fees change.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don’t hard-code a winner yet.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compliance first.&lt;/strong&gt; Align early with Nigeria’s SEC posture and Kenya’s VASP bill trajectory; secure &lt;strong&gt;KYC/AML&lt;/strong&gt;processes and audit trails now. (&lt;a href="https://cointelegraph.com/news/nigeria-opens-doors-to-stablecoin-firms-under-regulatory-oversight?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Cointelegraph&lt;/a&gt;, &lt;a href="https://www.parliament.go.ke/sites/default/files/2025-04/THE%20VIRTUAL%20ASSET%20SERVICE%20PROVIDERS%20BILL%2C%202025%20%282%29.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;parliament.go.ke&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paperwork first, then scale. You know what happens if you do not do so, ask those before you.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Merchant UX.&lt;/strong&gt; Don’t ship “crypto.” Ship &lt;strong&gt;predictable receipts&lt;/strong&gt;, &lt;strong&gt;chargeback policies&lt;/strong&gt;, &lt;strong&gt;support SLAs&lt;/strong&gt;, and &lt;strong&gt;Ledger-like&lt;/strong&gt; clarity on fees.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sell outcomes, not chains.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pushback corner, quick answers to big doubts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;“Will L2s die?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. They’ll likely lose &lt;em&gt;some&lt;/em&gt; payments settlement if corporate L1s deliver, but L2s still dominate on throughput and remain fertile ground for apps and experiments. Less Visa, more App Store, as at today. (&lt;a href="https://l2beat.com/scaling/activity" rel="noopener noreferrer"&gt;L2BEAT&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Isn’t this just marketing?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Arc has concrete timelines and design choices (USDC gas, FX, EVM). Tempo is still a &lt;strong&gt;reported&lt;/strong&gt; project; all of this as at press time, so treat it as speculative until Stripe goes on-record. Believe shipping code, not press. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;, &lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Will this actually help Africa’s costs?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only if licensed partners enable &lt;strong&gt;fiat legs&lt;/strong&gt; and FX spreads compress. The yardstick is the &lt;strong&gt;World Bank RPW&lt;/strong&gt;. Tech helps, policy and partners decide. (&lt;a href="https://remittanceprices.worldbank.org/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Remittance Prices Worldwide&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“What about cNGN?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s real and progressing under a &lt;strong&gt;sandbox/oversight&lt;/strong&gt; model; impact depends on acceptance and liquid FX paths with USD stables. Utility beats branding. (&lt;a href="https://www.mariblock.com/naira-pegged-stablecoin-cngn-launches-lists-on-exchanges?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Mariblock&lt;/a&gt;, &lt;a href="https://sec.gov.ng/press-release-update-on-the-secs-accelerated-regulatory-incubation-program-and-regulatory-incubation-program/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Securities and Exchange Commission&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: track the metrics, not the memes
&lt;/h2&gt;

&lt;p&gt;This isn’t an obituary for L2s; it’s a &lt;strong&gt;re-segmentation&lt;/strong&gt; of the stack. If &lt;strong&gt;payments giants&lt;/strong&gt; own the base layer for &lt;strong&gt;stablecoin settlement&lt;/strong&gt;, some flows will consolidate where &lt;strong&gt;fees, FX, and compliance&lt;/strong&gt; live natively. For Africa, that could mean &lt;strong&gt;cheaper, faster&lt;/strong&gt;, more predictable rails, or just &lt;strong&gt;new chokepoints&lt;/strong&gt; if execution and policy stall. The next 6–18 months will tell. I’ll be watching &lt;strong&gt;Arc’s partner map&lt;/strong&gt;, &lt;strong&gt;Tempo’s confirmation&lt;/strong&gt;, &lt;strong&gt;RPW costs&lt;/strong&gt;, and &lt;strong&gt;where stablecoin settlement actually lands&lt;/strong&gt;. This can be a win, but only if pipes, partners, and policy line up. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;, &lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;, &lt;a href="https://remittanceprices.worldbank.org/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Remittance Prices Worldwide&lt;/a&gt;, &lt;a href="https://5264302.fs1.hubspotusercontent-na1.net/hubfs/5264302/special-insights/coin-metrics-2025-outlook-report.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;5264302.fs1.hubspotusercontent-na1.net&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; methods
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Circle&lt;/strong&gt;: Arc announcement and timelines. (&lt;a href="https://www.circle.com/blog/introducing-arc-an-open-layer-1-blockchain-purpose-built-for-stablecoin-finance?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Circle&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stripe&lt;/strong&gt;/&lt;strong&gt;Tempo&lt;/strong&gt;: Fortune report; subsequent coverage. (&lt;a href="https://fortune.com/crypto/2025/08/11/stripe-blockchain-tempo-paradigm/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;, &lt;a href="https://www.coindesk.com/business/2025/08/12/stripe-building-payments-blockchain-tempo-with-paradigm-fortune?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;CoinDesk&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;L2 metrics&lt;/strong&gt;: L2BEAT activity (UOPS scaling factor) &amp;amp; value secured snapshots. (&lt;a href="https://l2beat.com/scaling/activity" rel="noopener noreferrer"&gt;L2BEAT&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stablecoin settlement&lt;/strong&gt;: Coin Metrics (&amp;gt;$12T in 2024; higher in 2025). (&lt;a href="https://5264302.fs1.hubspotusercontent-na1.net/hubfs/5264302/special-insights/coin-metrics-2025-outlook-report.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;5264302.fs1.hubspotusercontent-na1.net&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSA remittance costs&lt;/strong&gt;: World Bank RPW; Q2 2024 SSA average 8.37%. (&lt;a href="https://remittanceprices.worldbank.org/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Remittance Prices Worldwide&lt;/a&gt;, &lt;a href="https://africa.businessinsider.com/local/markets/remittances-to-sub-saharan-africa-remains-overpriced/dn0r47y?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Business Insider Africa&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nigeria adoption&lt;/strong&gt;: Chainalysis Nigeria ~$59B (’23–’24). (&lt;a href="https://www.chainalysis.com/blog/subsaharan-africa-crypto-adoption-2024/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Chainalysis&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Policy&lt;/strong&gt;: Nigeria SEC stance and ISA 2025 signals; Kenya VASP Bill (official PDF). (&lt;a href="https://cointelegraph.com/news/nigeria-opens-doors-to-stablecoin-firms-under-regulatory-oversight?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Cointelegraph&lt;/a&gt;, &lt;a href="https://www.parliament.go.ke/sites/default/files/2025-04/THE%20VIRTUAL%20ASSET%20SERVICE%20PROVIDERS%20BILL%2C%202025%20%282%29.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;parliament.go.ke&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local rails&lt;/strong&gt;: Blockradar (site); Paycrest (founder interview). (&lt;a href="https://www.blockradar.co/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blockradar.co&lt;/a&gt;, &lt;a href="https://www.mariblock.com/sidebar-why-africa-needs-its-own-stablecoins-paycrest-ceo/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Mariblock&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>web3</category>
      <category>stablecoins</category>
      <category>fintech</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Why Web3 Keeps Losing Users (And How We Actually Fix It in 2025)</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Tue, 08 Apr 2025 14:20:33 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/why-web3-keeps-losing-users-and-how-we-actually-fix-it-in-2025-12g</link>
      <guid>https://forem.com/resourcefulmind/why-web3-keeps-losing-users-and-how-we-actually-fix-it-in-2025-12g</guid>
      <description>&lt;p&gt;&lt;a id="intro"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction: The Promise and the Problem
&lt;/h3&gt;

&lt;p&gt;Web3 promises a decentralized future, blockchains, NFTs, DeFi, DAOs - they’re reshaping how we own, trade, and interact online.&lt;/p&gt;

&lt;p&gt;Yet most projects do “absolutely everything but tell the user at a base level what to do.”&lt;/p&gt;

&lt;p&gt;Need examples?&lt;/p&gt;

&lt;p&gt;Take MetaMask’s cryptic setup. Or OpenSea’s infamous wallet wall during the NFT boom. Newcomers get lost in the maze. The fallout? High drop-off, niche users, and Twitter posts calling Web3 “too hard” or “a scam.”&lt;/p&gt;

&lt;p&gt;The tech’s revolutionary, but if no one can use it, what’s the point?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wbx6fv7y1unmxvwe80q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wbx6fv7y1unmxvwe80q.png" alt="A conceptual digital artwork showing a confused user standing in front of a futuristic, complex blockchain interface filled with icons like wallets, NFTs, and smart contracts. The user is small, standing under a massive interface wall with floating UI elements, unclear instructions, and cryptic pop-ups. The background includes Web3 logos and glowing decentralized network nodes. The scene evokes frustration and confusion but with a futuristic, neon-lit tone. Style is modern, clean, and semi-abstract, like a tech product illustration" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a call to action. Web3’s adoption hinges on fixing onboarding. It should be on a T-shirt by now…“Onboarding matters” - and sold out already. But there’s still no real headway.&lt;/p&gt;

&lt;p&gt;In this piece, I talk about why MetaMask(wallet) confusion, NFT churn, and DeFi drop-offs aren’t bugs, but signals we need to fix onboarding at the root. With 3 fixes grounded in 2025 reality. Here’s why it’s broken, who’s stumbling, and how to get it right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction: The Promise and the Problem&lt;/li&gt;
&lt;li&gt;The State of Web3 Onboarding: A Few Ugly Truths&lt;/li&gt;
&lt;li&gt;The Founder Factor: Caught in the Builders’ Trap&lt;/li&gt;
&lt;li&gt;The Stakes: Adoption or Bust&lt;/li&gt;
&lt;li&gt;
Ideas to Fix It: A Blueprint for Better Onboarding

&lt;ul&gt;
&lt;li&gt;Fix 1: Reverse Onboarding, “Experience First, Wallet Later”&lt;/li&gt;
&lt;li&gt;Fix 2: Web3-Wide User DAOs — “Onboarding as an Incentivized Coalition”&lt;/li&gt;
&lt;li&gt;Fix 3: Persistent AI Concierges, “Web3’s UX Co-Pilot”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;The Payoff: Web3 for Everyone&lt;/li&gt;

&lt;li&gt;

Counterpoints: The Pushbacks You’ll Hear (and How They Fall Apart)

&lt;ul&gt;
&lt;li&gt;1. &lt;strong&gt;“Onboarding’s a Feature, Not a Bug, Web3’s Meant to Be Hard”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;2. &lt;strong&gt;“We’re Still Early”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;3. &lt;strong&gt;“Builders First, Users Come Later”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;4. &lt;strong&gt;“Decentralization Means No One Owns Onboarding”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;5. &lt;strong&gt;“Focusing on Newbies Slows Innovation”&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusion: Founders, Break the Bubble&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a id="state"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The State of Web3 Onboarding: A Few Ugly Truths
&lt;/h3&gt;

&lt;p&gt;Web3 projects consistently botch the basics. Real examples tell the tale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MetaMask&lt;/strong&gt;: Install it, get a seed phrase, then…silence. No nudge to buy ETH, no gas primer. X users ask, “Set it up, now what?”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenSea&lt;/strong&gt;: No wallet? No help. Got one? Here’s a flood of listings, no guide. DappRadar’s 2023 stats show most first-timers never buy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniswap&lt;/strong&gt;: “Liquidity pools” and “slippage” with zero context. Twitter threads: “Tried swapping, gave up.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Many devs assume blockchain fluency. Rushed launches favor hype over UX. The “community will sort it out” mindset skips design. But the root runs deeper, I would know as I have been in these “war rooms” a few times myself.&lt;/p&gt;

&lt;p&gt;&lt;a id="founder-factor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Founder Factor: Caught in the Builders’ Trap
&lt;/h3&gt;

&lt;p&gt;Founders drive Web3’s vision, but they’re tangled in a double bind.&lt;/p&gt;

&lt;p&gt;UX pros, product leads, and designers push for onboarding: “Users need this, or they’ll bounce!” Yet founders often lean on speed, ship the MVP, hype the token, patch later.&lt;/p&gt;

&lt;p&gt;“Early adopters get it,” they say. It’s a startup reflex: move fast, fix on the fly. Understandable, but it’s not the full picture.&lt;/p&gt;

&lt;p&gt;Too many founders build ecosystems, not for end users, but for other builders, caught in a recursive loop where focus where the focus never leaves the mirror.&lt;/p&gt;

&lt;p&gt;FUEL kicked off as an Ethereum rollup, now a modular layer with FuelVM and Sway, parallel processing and dev-friendly tools galore. It’s a builder’s dream, but onboarding’s a slog for normies; Twitter posts in 2024 ask, “Cool tech, but how do I use it?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polkadot&lt;/strong&gt; offers a “blockchain of blockchains” for devs to plug in parachains, yet its wallet and docs stump regular folks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Sandbox&lt;/strong&gt; hands creators a metaverse toolkit, but casual players drown in NFT jargon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimism&lt;/strong&gt; scales Ethereum for dApps, but “rollups” mean nothing without a lifeline.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Builders build for builders who build for more builders, who then build for even more builders while they all promise the next builder will bring in the users, users get left behind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s not malice though, it’s perspective. Founders swim in Web3’s bubble…crypto X, Discord, meetups, where everyone’s a coder or speculator. They assume that’s the crowd, so dev tools and “ecosystem potential” outrank entry points. A certain Layer 2’s $81.5M raise hyped scalability, not usability.&lt;/p&gt;

&lt;p&gt;UX gets sidelined. Onboarding is seen as grunt work, not a VC dazzler. Failed 2022 NFT drops show the cost: dead not from bad tech, but from stranding users.&lt;/p&gt;

&lt;p&gt;The crypto-nerd pool’s drying up, mass adoption won’t wait for insiders to pivot.&lt;/p&gt;

&lt;p&gt;&lt;a id="the-stakes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Stakes: Adoption or Bust
&lt;/h3&gt;

&lt;p&gt;This isn’t nitpicking, it’s make-or-break. DappRadar pegs Web3’s daily active wallets at an average of ~26.4 million in 2024 year-end. (We all know what those wallets really are). Web3’s complexity isn’t the hurdle; its refusal to bridge the gap is. Somehow, we keep refusing to meet users halfway. And the longer it ignores onboarding, the more glaring the fallout becomes.&lt;/p&gt;

&lt;p&gt;Nowhere is this clearer than in the NFT space.&lt;/p&gt;

&lt;p&gt;Despite early hype, &lt;strong&gt;NFT trading volume in 2024 saw its weakest performance since 2020&lt;/strong&gt;. According to DappRadar’s quarterly breakdown, volumes surged in Q1 to over &lt;strong&gt;$5.3 billion&lt;/strong&gt;, only to &lt;strong&gt;plummet to $1.5 billion in Q3&lt;/strong&gt;, before rebounding slightly in Q4.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fog48zfouldc4r78okypu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fog48zfouldc4r78okypu.png" alt="Quaterly NFT Trading Volume and Sales Count" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sales count tells a deeper story. Even when volume rose in Q4, &lt;strong&gt;sales continued to decline&lt;/strong&gt;, indicating fewer users transacting and NFTs becoming pricier—likely due to ETH’s price hike. The result? Newcomers saw a confusing, expensive market with little help navigating it.&lt;/p&gt;

&lt;p&gt;Zooming out to the yearly view, 2024 recorded a &lt;strong&gt;19% drop in trading volume&lt;/strong&gt; and an &lt;strong&gt;18% decline in NFT sales&lt;/strong&gt; compared to 2023. It marked one of the worst years since the NFT boom began.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpzi8tev81euztf0ki9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpzi8tev81euztf0ki9y.png" alt="Yearly NFT Trading Volume and Sales Count" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The message is clear: with the current systems of onboarding, even the most hyped verticals bleed users.&lt;/p&gt;

&lt;p&gt;&lt;a id="ideas-to-fix-it"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ideas to Fix It: A Blueprint for Better Onboarding
&lt;/h3&gt;

&lt;p&gt;Documentation’s a start, but users won’t read it. Web3 needs active, intuitive solutions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Guided Onboarding Flows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UI steps, “connect wallet here,” “fund it this way.” MetaMask could prompt ETH buys; OpenSea could demo an NFT purchase. The things the “gigabrains” think are not needed are actually very much needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smart Defaults&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pre-set gas or slippage for beginners. Uniswap’s “safe swap” mode; OpenSea’s affordable NFT nudge. Ease in, don’t overwhelm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;In-App Education&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tooltips (“gas pays for this”), quick videos, gamified tasks like “swap your first token, earn a badge.” Active learning trumps passive docs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Seamless Wallets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One-click setups could actually help. Imagine OpenSea bundling MetaMask with $5 in ETH. One click, zero friction. Cut friction, keep users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feedback Loops&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“I don’t get this” buttons for real-time fixes. DAOs fund what users flag. Decentralized doesn’t mean clueless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Concierge Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI is all the rave now and rightly so. Why not temporary chatbots “how do I buy this?” Phase it out as tech and user matures.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The usual advice above - better docs, smart defaults, cleaner UIs, is of course table stakes by now. Those aren’t strategies. They’re hygiene.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have always maintained that if Web3 wants to escape its own echo chamber and onboard millions, it needs to stop iterating on dev-first workflows and start designing for &lt;strong&gt;human-first experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here are three &lt;strong&gt;deep, Web3-native fixes,&lt;/strong&gt; not based on hope, but built from what’s live and loud in April 2025. They reflect the actual friction, tools, and behavior happening right now across DeFi, DAOs, gaming, NFTs, and infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a id="fix-one"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 1: Reverse Onboarding, “Experience First, Wallet Later”
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;My Premise?&lt;/strong&gt; Right now, onboarding starts with what users &lt;em&gt;hate&lt;/em&gt;: wallet setup, seed phrases, network switches, gas fees. The friction hits &lt;em&gt;before&lt;/em&gt; they’ve felt any value.&lt;/p&gt;

&lt;p&gt;So let’s flip it.&lt;/p&gt;

&lt;p&gt;Instead of forcing new users to configure crypto tools upfront, they first &lt;strong&gt;play in a safe, sandboxed version&lt;/strong&gt; of your product — with &lt;strong&gt;no wallets, no real tokens, no cost or commitment&lt;/strong&gt;. Think of it like a simulation that’s fun and frictionless, where the value is felt immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works(Ideally):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Projects launch &lt;em&gt;experience-first sandboxes&lt;/em&gt; on testnets. A user enters without connecting anything. They’re assigned a temporary “shadow wallet” and fake tokens (e.g. test ETH, FuelCoins, etc). They can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swap tokens on a mock Uniswap&lt;/li&gt;
&lt;li&gt;Mint and trade NFTs with no gas fees&lt;/li&gt;
&lt;li&gt;Cast votes in DAO simulations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only once they’ve completed a few actions does the product say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Looks like you’re ready. Want to keep your progress and go live?”&lt;/p&gt;

&lt;p&gt;One tap bridges the sandbox wallet to mainnet, seeds it with a starter amount via LayerZero or Alchemy Pay, and boom, they’re active Web3 users!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’re not asking users to read before they ride. You’re letting them feel the power of Web3 &lt;em&gt;before&lt;/em&gt; asking for trust. It’s UX-as-a-hook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Signals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Axie Infinity proved “play-first” onboarding can bring in millions—then lost them to wallet friction.&lt;/li&gt;
&lt;li&gt;Sandbox Metaverse has a $1B valuation but onboarding still kills retention.&lt;/li&gt;
&lt;li&gt;Testnets are developer tools today. We make them user gateways.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Impact?&lt;/strong&gt; Even a 10% stick rate from sandbox-to-mainnet could mean &lt;strong&gt;millions&lt;/strong&gt; of new users.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;From “Sign up to learn DeFi” → “Play DeFi and learn by doing.”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="fix-two"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 2: Web3-Wide User DAOs — “Onboarding as an Incentivized Coalition”
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;My Premise?&lt;/strong&gt; No single dApp owns onboarding, but every dApp suffers when it’s ignored. So instead of scattered, siloed efforts, imagine a cross-project, token-incentivized &lt;strong&gt;User DAO&lt;/strong&gt; model, funded and governed by the protocols that benefit from adoption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works(Ideally):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Web3-native onboarding DAOs, let’s call them &lt;strong&gt;uDAOs,&lt;/strong&gt; form to coordinate onboarding across ecosystems. Aave, Polkadot and others pool a small slice of treasury (~1%) to fund them. In return:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New users get a pre-linked wallet&lt;/li&gt;
&lt;li&gt;They complete a chain of onboarding tasks (e.g., swap, mint, stake)&lt;/li&gt;
&lt;li&gt;They earn a utility token, say, $USER, that unlocks vesting rewards over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Participation is on-chain, gamified, and visible. uDAOs collect user friction points, push product feedback upstream, and manage mentorships or tutorials &lt;em&gt;like an L2 support layer, but decentralized&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn’t a loyalty program. It’s a &lt;strong&gt;coalition for collective onboarding&lt;/strong&gt;, backed by incentives and shared governance. It creates an entry layer &lt;strong&gt;built by users, for users&lt;/strong&gt;, but &lt;strong&gt;funded by protocols&lt;/strong&gt; that depend on adoption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Signals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MakerDAO partnered with Huntingdon Valley Bank (HVB). DAOs aren’t toys anymore.&lt;/li&gt;
&lt;li&gt;Aave’s $27.45B TVL shows liquidity flows to where users are incentivized.&lt;/li&gt;
&lt;li&gt;Polkadot and Axelar’s multichain infra can handle cross-ecosystem rewards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Impact?&lt;/strong&gt; Even 100 projects contributing can fund 1M+ new wallets a year.&lt;/p&gt;

&lt;p&gt;It’s the Web3 version of shared infrastructure, &lt;strong&gt;but for people instead of data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="fix-three"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 3: Persistent AI Concierges, “Web3’s UX Co-Pilot”
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;My Premise?&lt;/strong&gt; Wallet UX hasn’t fundamentally changed in years. Every app assumes the user understands gas, L2 bridging, asset security, slippage, transaction history… the list goes on.&lt;/p&gt;

&lt;p&gt;But what if &lt;strong&gt;an AI agent embedded in every major dApp could act as your co-pilot&lt;/strong&gt;—learning how you use Web3, explaining actions in plain language, and even executing low-risk commands for you?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Call it a &lt;strong&gt;Web3 Concierge Agent,&lt;/strong&gt; an AI layer that lives inside MetaMask, OpenSea,  Axelar, Uniswap or any other protocol/project. It’s personalized. It has memory. It reads your wallet and the current app context.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Gas is 0.013 ETH right now. Want me to submit the transaction when it drops to 0.009?”&lt;/li&gt;
&lt;li&gt;“You’re swapping ETH for USDC. Want me to confirm the slippage is safe?”&lt;/li&gt;
&lt;li&gt;“Need help? You tried this 3 times, want a walkthrough?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn’t just explain, it &lt;strong&gt;takes action&lt;/strong&gt; with permission. All interactions are logged transparently. These agents could be open-source and deployed via Optimism’s sequencer model or similar trustless infra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters?&lt;/strong&gt; Even experienced users lose money to gas mistakes and bridging errors. For beginners, this AI layer is the difference between &lt;strong&gt;"I gave up" and "I got through."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Signals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chainlink’s oracles have exploded in AI-integrated data services.&lt;/li&gt;
&lt;li&gt;SingularityNET and Fetch.ai already explore autonomous agents.&lt;/li&gt;
&lt;li&gt;Wallets like Rabby and OKX are toying with UX nudges—but lack true AI memory/context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Impact?&lt;/strong&gt; An AI concierge could reduce onboarding friction by 70%+.&lt;/p&gt;

&lt;p&gt;You don’t need to read another tutorial, you just need someone (or something) that &lt;em&gt;knows what you’re doing&lt;/em&gt; and &lt;em&gt;helps you do it better.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a id="the-payoff"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Payoff: Web3 for Everyone
&lt;/h3&gt;

&lt;p&gt;These aren’t tweaks, they’re &lt;strong&gt;trajectories&lt;/strong&gt;. They don’t require centralization. They require creativity, coordination, and courage.&lt;/p&gt;

&lt;p&gt;This flips Twitter posts from “impossible” to “Web3 finally gets it.” Newbies stay, pros thrive, Web3 grows. It’s not dumbing down, it’s opening the door.&lt;/p&gt;

&lt;p&gt;&lt;a id="counterpoints"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Counterpoints: The Pushbacks You’ll Hear (and How They Fall Apart)
&lt;/h3&gt;

&lt;p&gt;No good critique lands clean without acknowledging the friction. Web3 folks will have rebuttals, and some of them are valid. Let’s walk through the most common ones.&lt;/p&gt;

&lt;p&gt;&lt;a id="onboarding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;“Onboarding’s a Feature, Not a Bug, Web3’s Meant to Be Hard”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pyza0u3asxwjmykjph1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pyza0u3asxwjmykjph1.gif" alt="are you kidding me" width="292" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some will argue that complexity filters for commitment. “Early Bitcoin adopters didn’t need step-by-step guides, they figured it out”. Builders say ease-of-use risks watering down the ethos. Sway, FuelVM, or parachains? They're not for casuals, they're for the technically curious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why It Comes Up?&lt;/strong&gt; The DIY, cypherpunk roots of crypto treat accessibility as an afterthought. You’ll see this sentiment on X:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If you can’t figure out MetaMask, you don’t deserve DeFi.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gatekeeping mindset made sense in 2013, not in 2025. Bitcoin didn’t scale because it got harder, it scaled because wallets got easier.&lt;/p&gt;

&lt;p&gt;Complexity for builders is fine. But users? They need a ramp, not a wall.&lt;/p&gt;

&lt;p&gt;&lt;a id="early"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;“We’re Still Early”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Everything's still experimental. Expecting polish during infrastructure phase is premature. Ethereum was rough at launch too, look where it is now.&lt;/p&gt;

&lt;p&gt;It’s our default cop-out. “It’s early” is used to deflect critiques and buy time.&lt;/p&gt;

&lt;p&gt;Early was 2017. It’s been a decade. The space has matured, funding has flowed, is flowing and will still flow(maybe not as much), and users expect more. Web2 doesn’t wait, and users won’t either. Mass adoption won’t happen while we act like it’s still day one.&lt;/p&gt;

&lt;p&gt;&lt;a id="builder-first"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;“Builders First, Users Come Later”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Our current 2024 and 2025 mantra. Prioritize devs. Nail the tools, stack the ecosystem, and users will follow. MetaMask didn’t show up on day one, Ethereum still flourished.&lt;/p&gt;

&lt;p&gt;Why? VCs fund protocols, not UI. Founders are told to scale infra first, UX later. “L2s are infra, not apps” is a common refrain.&lt;/p&gt;

&lt;p&gt;That playbook worked &lt;em&gt;once&lt;/em&gt;. The space is too crowded now for “build it and they will come.” Look at Arbitrum’s growth, strong onboarding brought TVL and developers. Good UX isn’t the opposite of good tech, it &lt;em&gt;accelerates&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;&lt;a id="decentralization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;“Decentralization Means No One Owns Onboarding”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There’s also the argument that in Web3, no one’s supposed to own the funnel. Let wallets, DAOs, or the community do the lifting. If a dApp takes over onboarding, it risks becoming Web2 again.&lt;/p&gt;

&lt;p&gt;The truth as to why that comes up is not far fetched. Decentralization is the hill many will die on, anything that smells like “top-down” draws fire.&lt;/p&gt;

&lt;p&gt;Guidance isn’t centralization. UX doesn’t mean giving up control, it means giving people &lt;em&gt;clarity&lt;/em&gt;. The idea that “the community will figure it out” is great until no one actually does. Even in a trustless system, users still trust &lt;em&gt;someone&lt;/em&gt; to show them the front door.&lt;/p&gt;

&lt;p&gt;&lt;a id="focusing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;“Focusing on Newbies Slows Innovation”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Heard this at an offsite last year, and it floored me. Time spent making Web3 easier is time lost from cutting-edge tech, ZK-rollups, modular execution, parallelism and every other lingo we can think about. Onboarding is busywork for interns.&lt;/p&gt;

&lt;p&gt;There’s a cultural divide: builders vs. UX folks. Twitter is full of devs lamenting time “wasted” on education when they could be shipping.&lt;/p&gt;

&lt;p&gt;What good is innovation no one uses? Onboarding isn’t dilution, it’s acceleration. If you want 100x adoption, you need more users.&lt;/p&gt;

&lt;p&gt;More users = more builders = more feedback = better protocols.&lt;/p&gt;

&lt;p&gt;Ethereum didn’t explode because of cryptography, it exploded because people &lt;em&gt;could use it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tech is mature. The excuses aren’t.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don’t lose decentralization by helping people onboard.&lt;/p&gt;

&lt;p&gt;You lose users by leaving them in the dark and calling it “freedom.”&lt;/p&gt;

&lt;p&gt;Purists might cry “centralization!” Concierges and defaults lean that way, sure. But it’s a stepping stone, early help fades as users learn. The alternative? Stay niche while Web2 tears us a new one with each passing day.&lt;/p&gt;

&lt;p&gt;&lt;a id="conclusion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion: Founders, Break the Bubble
&lt;/h3&gt;

&lt;p&gt;Web3’s potential is massive, but its onboarding is a chokehold. Projects doing “everything but the basics” aren’t quirky, they’re floundering.&lt;/p&gt;

&lt;p&gt;Founders, you’re not villains, you’re just stuck in a trap. The builders-only lens and shifting focus to doing what everyone else in the herd is doing - chasing every flashy trend. It doesn’t scale with the vision&lt;/p&gt;

&lt;p&gt;Listen to your pros, prioritize users, and build for people, not just blueprints. With guided flows, smart design, and pragmatism, Web3 can onboard the masses without losing its soul.&lt;/p&gt;

&lt;p&gt;The tools are here. The stakes are clear.&lt;/p&gt;

&lt;p&gt;Stop chasing the echo chamber—start welcoming the world.&lt;/p&gt;

&lt;p&gt;Web3 has the tools.&lt;/p&gt;

&lt;p&gt;It has the capital.&lt;/p&gt;

&lt;p&gt;It has the builders.&lt;/p&gt;

&lt;p&gt;It just needs to stop leaving its users at the door.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>ux</category>
      <category>onboarding</category>
    </item>
    <item>
      <title>Late to React 18? My Top 4 awesome features and real-use examples.</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Fri, 08 Jul 2022 17:23:17 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/late-to-react-18-my-top-4-awesome-features-and-real-use-examples-23ln</link>
      <guid>https://forem.com/resourcefulmind/late-to-react-18-my-top-4-awesome-features-and-real-use-examples-23ln</guid>
      <description>&lt;p&gt;Reading this, you probably know what React is and might have upgraded to React 18. This article is aimed at informing code newbies in detail and increasing beginner understanding of the awesome feature updates of React v18.0 which I discovered while using it myself.&lt;/p&gt;

&lt;p&gt;First up, what is React? &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;React is an open-source, JavaScript front-end library for building user interfaces. It works fast, is easy to learn, and is efficient, especially in creating scalable and reusable UI components.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back in March, the React team announced the release plan for the upcoming stable version of React. With that being said, let’s explore...&lt;/p&gt;

&lt;p&gt;You might have to upgrade to React 18 if you haven't already done that. &lt;/p&gt;

&lt;h3&gt;
  
  
  How to upgrade to React 18.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install React and react-dom. You can use &lt;a href="https://www.npmjs.com/package/react" rel="noopener noreferrer"&gt;npm&lt;/a&gt; and then create a react application &lt;a href="https://create-react-app.dev/docs/getting-started/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change ReactDOM.render to ReactDOM.createRoot. Do this by finding the index.js file in the root and changing accordingly:   &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create root with&lt;br&gt;
&lt;code&gt;const root = ReactDOM.createRoot(container);&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Render app to root with&lt;br&gt;
&lt;code&gt;root.render(&amp;lt;App /&amp;gt;);&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Root is how React updates the DOM tree. It makes all of the new features such as concurrent rendering and automatic batching available to the developer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New features and concurrent rendering will be turned off if the root isn’t added. The app will behave like it’s on React 17.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So what changed?
&lt;/h2&gt;

&lt;p&gt;With React 18, the concept of Concurrency/ concurrent React is no longer all-in or nothing as you can pick wherever you want to have the concurrency feature enabled. It doesn’t have to be bound to the entire app&lt;br&gt;
The new features of v18 include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic Batching&lt;/li&gt;
&lt;li&gt;Transitions &lt;/li&gt;
&lt;li&gt;Suspense on the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Automatic Batching:
&lt;/h3&gt;

&lt;p&gt;This is simply making a list of items so you can perform a list of micro-tasks at once. React does not have to spend time re-rendering the same work over and over again when it can do it at the end of the micro task.&lt;/p&gt;

&lt;p&gt;Take a look at the code block of the event handler with 3 set states below;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleClick() { 
  setIsFetching(false); 
  setError(null);
  setFormStatus(‘success’);
 };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React could batch all three, look at them one by one and re-render them in the previous version. What React couldn’t do was batch and re-render anything that wasn’t an event handler like an async callback or a promise. &lt;br&gt;
React 18 fixes that as all updates, even within promises, the function will be batched which will improve the performance of the app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Concurrency:
&lt;/h3&gt;

&lt;p&gt;It is a feature by which React can pause and resume rendering events to improve performance. &lt;br&gt;
For instance, say you have a work call with a teammate in your team and your wife calls you while on the call for an urgent conversation. You can leave the call with your teammate, go on to speak to your wife, and then come back to the call. That is Concurrent rendering. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is the ability for React18 to interrupt, pause or abandon a render in order to improve performance or perform urgent updates. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Rendering was a single synchronous task that could not be interrupted once started before React 18.&lt;/li&gt;
&lt;li&gt;Concurrent rendering can be said to be a technical foundation that most features of React18 are built upon.&lt;/li&gt;
&lt;li&gt;It happens behind the scenes and the dev doesn’t need to bother about it.&lt;/li&gt;
&lt;li&gt;It enables React to prepare multiple new screens.&lt;/li&gt;
&lt;li&gt;It also enables reusable state, such that sections of UI from the screen can be removed and added back later while reusing the previous state, for example, tabbing away and coming back to the screen.&lt;/li&gt;
&lt;li&gt;Concurrent mode before React 18 usually meant that concurrency was used in all of the app but now it is used in only the parts the dev wants. Cool right?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Transitions:
&lt;/h3&gt;

&lt;p&gt;This simply means how you as a dev instructs React to prioritize certain updates and mark non-urgent updates as transitions. &lt;br&gt;
Take a random google search for instance, two feedbacks from character and population of the query are two different experiences a user would have. &lt;br&gt;
Transitions will help to prioritize the display of characters typed in by the user as urgent and then the query as a non-urgent priority. &lt;br&gt;
This can be quite helpful for people with slow computers or slow internet connections.   Anything that is an urgent state is put in a normal state and anything that is not urgent is put in a &lt;code&gt;startTransition&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 { startTransition } from ‘react’;

// Urgent: show what was typed
setInputValue(input);  // Mark any state updates as transitions

startTransition(() =&amp;gt; {
   // Transition: Show the results    
   setSearchQuery(input);
});

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

&lt;/div&gt;



&lt;p&gt;This means that if a user for instance is searching for the term “Soccer”, the transition will prioritize displaying the letter “s” and other letters after every keystroke before querying the search parameters.&lt;/p&gt;

&lt;p&gt;And if you want to do something while transition is happening, you can use a hook called &lt;code&gt;useTransition&lt;/code&gt; that gives access to two parameters, &lt;code&gt;isPending&lt;/code&gt; and &lt;code&gt;startTransition&lt;/code&gt;. Real-life use cases?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;isPending&lt;/code&gt; can be used for loader states &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startTransition&lt;/code&gt; can be used when there is a slow rendering from maybe a heavy data app like Slack or Jira, &lt;code&gt;startTransition&lt;/code&gt; can help. &lt;code&gt;startTransition&lt;/code&gt; can also be used in cases where the network is slow but with libraries like Relay which has it in-built because it needs Suspense.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suspense on the Server
&lt;/h3&gt;

&lt;p&gt;In React 18, it is now powered by code-splitting too. What this means is that, take, for instance, you have an app and certain parts of your app are really slow, in the other versions of React, you had to wait for the app to finish loading completely before the HTML could be shipped. (before the entire rendering process could be done and shipped to the client-side).&lt;br&gt;
Recall that server rendering is simply when HTML is created on the server and sent over to the client. It helps end-users in the sense that they can see at least a UI much faster than any other thing like JS has been loaded as opposed to rendering on the client-side.&lt;/p&gt;

&lt;p&gt;However, despite that seeming improvement brought, certain components could not be isolated/split, and the rest "server-rendered" separately. It was all or nothing.&lt;br&gt;
With React 18, if one part of your app is slowing down the rest of the app, you can put that component in suspense and tell React to load that particular component separately and send the rest of the page to the user while that isolated part can get a loader or spinner state.&lt;/p&gt;

&lt;p&gt;When that part is ready, React 18 will send the HTML in the same stream and it all happens before any JS is loaded so it is pretty fast for the user and decreases the time it takes for the user to see the first page. Do not forget images to represent server rendering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimfmk7apei5zk98zx9hz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimfmk7apei5zk98zx9hz.png" alt="An image demonstrating server side rendering" width="800" height="789"&gt;&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;&amp;lt;Suspense fallback={&amp;lt;Spinner /&amp;gt;}&amp;gt;
   &amp;lt;Comments /&amp;gt;
&amp;lt;/Suspense&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In summary, suspense on a server will make sure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;one slow part of an app or page doesn’t slow down the whole page&lt;/li&gt;
&lt;li&gt;to show initial HTML early and stream the rest&lt;/li&gt;
&lt;li&gt;code splitting fully integrated with server rendering is achieved&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Other awesome changes of React 18 include:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Client-side features include changes from &lt;code&gt;render&lt;/code&gt; to &lt;code&gt;createRoot&lt;/code&gt;, &lt;code&gt;unmountComponentAtNode&lt;/code&gt; to &lt;code&gt;root.unmount&lt;/code&gt; and &lt;code&gt;ReactDOM.Hydrate&lt;/code&gt; to &lt;code&gt;hydrateRoot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;React 18 also has hooks like &lt;code&gt;useId&lt;/code&gt;, &lt;code&gt;useDeferredValue&lt;/code&gt;, &lt;code&gt;useSyncExternalStore&lt;/code&gt;, &lt;code&gt;useInsertionEffect&lt;/code&gt; which are new Library APIs.&lt;/li&gt;
&lt;li&gt;Server API changes include &lt;code&gt;renderToPipeableStream(Node)&lt;/code&gt; and &lt;code&gt;renderToReadableStream.(edge env)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Updates have also been made to strict mode &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ReactDOM.render&lt;/code&gt; and &lt;code&gt;renderToString&lt;/code&gt; have been deprecated.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How does it affect the codebase when updated? The React team has stated that;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The code should work just fine.&lt;/li&gt;
&lt;li&gt;Some components might behave slightly differently with concurrent rendering.&lt;/li&gt;
&lt;li&gt;Some components may require migration efforts.&lt;/li&gt;
&lt;li&gt;New rendering behavior is only enabled in parts of your app that use new features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Strategy to update when upgrading to React 18?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Upgrade to React 18 without breaking code.&lt;/li&gt;
&lt;li&gt;Gradually start adding concurrent features. Use a library that powers concurrent features&lt;/li&gt;
&lt;li&gt;Use StrictMode to surface concurrency-related bugs in the dev environment.&lt;/li&gt;
&lt;li&gt;Start using concurrent features after upgrading to React 18.
Overall, most apps should work fine after the upgrade without too many issues.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Edge cases to watch out for
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;StrictMode is stricter but can be disabled&lt;/li&gt;
&lt;li&gt;flushSync() will disable automatic batching&lt;/li&gt;
&lt;li&gt;Concurrent features might require library updates.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's all for now. I hope this helps a newbie get comfortable with React 18. &lt;br&gt;
So I decided to do this thing where I refer you to a song at the end of every article because what's coding without a little music. Others give lofi, I recommend Afrobeats. For this article's edition, I recommend listening to the new Burna Boy album titled &lt;strong&gt;Love, Damini&lt;/strong&gt;. &lt;br&gt;
&lt;em&gt;PS: These things are not sponsored, I just want to share good music while giving you great articles.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Level Up Your Skills By Mastering Git, Github, and The Terminal.</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Sun, 05 Jun 2022 23:34:20 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/level-up-your-skills-by-mastering-git-github-and-the-terminal-1h6</link>
      <guid>https://forem.com/resourcefulmind/level-up-your-skills-by-mastering-git-github-and-the-terminal-1h6</guid>
      <description>&lt;p&gt;This article is intended for beginners and for those who want to get started on learning about Git technology. &lt;/p&gt;

&lt;p&gt;I could have made a title like &lt;strong&gt;"Learn Git in 5 minutes"&lt;/strong&gt; but nobody can really understand the basics of Git at that time. &lt;/p&gt;

&lt;p&gt;Git can be really scary for new developers and many make the mistake of trying to learn/cram the syntax instead of first understanding the Git technology and workflow.&lt;/p&gt;

&lt;p&gt;I will break Git down into the simplest terms I know and in the end, you will have more confidence in using Git, whether through the terminal or using a GUI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s get started!
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What is the Terminal? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;It is a place where you type commands on the computer that cause actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a CLI? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;It is short for Command Line Interface. It is the actual place where you type the commands to use the computer. What you see in most Sci-Fi movies like The Matrix. A good example is the Apple II&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a GUI?
&lt;/h2&gt;

&lt;p&gt;It is short for the Graphical User Interface. That is tech jargon for the computer with the screens that you see these days with the beautiful folders and screens and stuff.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For macOS, you probably already have a &lt;strong&gt;Terminal&lt;/strong&gt; on your system. (Applications --&amp;gt; Terminal)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For Linux, you can download it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For Windows, you can download &lt;a href="https://gitforwindows.org" rel="noopener noreferrer"&gt;GitBash&lt;/a&gt; and later on you can use &lt;strong&gt;WSL (Windows Subsystem for Linux)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Commands On The Terminal
&lt;/h3&gt;

&lt;p&gt;Some common commands on the Terminal are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;pwd&lt;/code&gt; stands for "Print Working Directory" and it will show the user where they are inclusive of the path. A directory simply means folder as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt; stands for "Make Directory" and will create a folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; means "create directory" and enables a user to open a new folder. eg &lt;code&gt;cd Desktop&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd ..&lt;/code&gt; will make the user go up a level in the directory path. It's like going from a child-folder to the immediate parent-folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; will take you inside a folder and &lt;code&gt;cd ..&lt;/code&gt; will take you out one level from child to immediate parent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd ~&lt;/code&gt; will take you all the way back to the home folder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd &amp;lt;folder&amp;gt;/&amp;lt;subfolder&amp;gt;/&lt;/code&gt; is used when you want to proceed to a specific path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;clear&lt;/code&gt; will clear the terminal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;touch &amp;lt;name-of-file&amp;gt;&lt;/code&gt; will create a new file eg &lt;code&gt;touch index.html&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ls&lt;/code&gt; will show you a list of all the files contained in the current folder at any given time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ls -l&lt;/code&gt; will give us the list and more information like the name, the date of creation, and permissions on the file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ls -la&lt;/code&gt; will show you the list and all the information about the files including the hidden stuff.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;rm &amp;lt;name-of-file&amp;gt;&lt;/code&gt; will remove a file. eg &lt;code&gt;rm index.html&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;rm -r &amp;lt;folder&amp;gt;&lt;/code&gt; will remove/delete a folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;rm -rf &amp;lt;folder&amp;gt;&lt;/code&gt; will remove forcefully/permanently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;code &amp;lt;filename&amp;gt;&lt;/code&gt; will open a file in VScode.&lt;br&gt;
The user has to go to the command palette in their VS code --&amp;gt; View --&amp;gt; Install code command with PATH  and then they can use this if they are using macOS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Now that we know some commands on the CLI, let's talk about GIT.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Why is GIT important?
&lt;/h4&gt;

&lt;p&gt;Recall that before the advent of modern technology as we know it, saving documents on your computer, say a Micorsoft Word file would have been done via the following ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Floppy Disks&lt;/li&gt;
&lt;li&gt;Flash and sometimes hard drives depending on your level of paranoia, lol.&lt;/li&gt;
&lt;li&gt;Saving it and e-mailing it to yourself and sometimes to others because you know your computer might be bad or because you want to collaborate with them.&lt;/li&gt;
&lt;li&gt;Other ways which I am sure you are thinking about in your mind now.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The above ways were the early days of what we know now as &lt;strong&gt;"Version Control".&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; solves this version control problem for our codes and right now some people like myself even keep my notes on there too. Other types of version control are Google Drive, etc&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Git work?
&lt;/h3&gt;

&lt;p&gt;Git is a version control system that gives a user the ability to make &lt;strong&gt;"save points"&lt;/strong&gt; and track changes to code that you or your team members make.&lt;br&gt;
Save points are snapshots of your code at different times while you are working.&lt;/p&gt;

&lt;p&gt;A more concise definition would be that &lt;strong&gt;Git&lt;/strong&gt; is a distributed version control system (DVCS) that allows multiple developers or other contributors to work on a project. It provides a way to work with one or more local branches and push them to a remote repository. Git is responsible for everything GitHub-related that happens locally on your computer. Key features provided by Git include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's installed and used on your local machine&lt;/li&gt;
&lt;li&gt;Handles version control&lt;/li&gt;
&lt;li&gt;Supports branching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;WHILE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; is a cloud platform that uses Git as its core technology. It simplifies the process of collaborating on projects and provides a website, command-line tools, and overall flow that allows developers and users to work together. GitHub acts as the "remote repository" mentioned previously in the Git section.&lt;br&gt;
Key features provided by GitHub include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues&lt;/li&gt;
&lt;li&gt;Discussions&lt;/li&gt;
&lt;li&gt;Pull requests&lt;/li&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Labels&lt;/li&gt;
&lt;li&gt;Actions&lt;/li&gt;
&lt;li&gt;Forks&lt;/li&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Git makes it possible to make those save points and to also place those save points on servers like Github so you can share your code with everyone for easy collaboration.&lt;/p&gt;

&lt;p&gt;Git also enables the user to be able to backup these save points on the cloud in case the user somehow loses access to all the data and files on their local machine.&lt;/p&gt;

&lt;p&gt;Git also enables you to rollback your code to previous versions. Say you wrote a bunch of code and you want to take it back because you have sort of written rubbish (we all do that, you are not alone), Git gives you this power.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some Git Terminologies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;commit&lt;/code&gt; is what enables the user to make that snapshot(create that save point). Sort of the same thing like the user zipping up the file and emailing it to themselves back in the day.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;branch&lt;/code&gt; is like a bus-stop that leads to a street. You are on a journey on the main road for instance, a git branch is the bus-stop you get down and start walking into the street...You can always get back to the main road if you hit a dead end at the street or you can always discover a new path and add it to your map(merging the branch with the main file).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;repository&lt;/code&gt; is the special folder that holds all of your snapshots(commits). There is a local repository which is the folder on your PC(local machine) and then there is the remote repository which is going to be in the clouds, i.e on Github and where your codes are going to live. Also called &lt;strong&gt;repo&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How To Install Git
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For Windows, visit &lt;a href="https://gitforwindows.org" rel="noopener noreferrer"&gt;Git Bash&lt;/a&gt; or WSL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For mac OS, you can first install &lt;strong&gt;homebrew&lt;/strong&gt; by entering this in your command line when you open your terminal&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And then install Git using&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ brew install git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB: take note that you are not to use the $ sign when you see it in a code entered. The $ sign is simply telling you to enter the code after it and not before it.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For Linux
If you want to install the basic Git tools on Linux via a binary installer, you can generally do so through the package management tool that comes with your distribution. If you’re on Fedora (or any closely-related RPM-based distribution, such as RHEL or CentOS), you can use dnf:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;$ sudo dnf install git-all&lt;/code&gt;&lt;br&gt;
If you’re on a Debian-based distribution, such as Ubuntu, try apt:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt install git-all&lt;/code&gt;&lt;br&gt;
For more options, there are instructions for installing on several different Unix distributions on the &lt;a href="https://git-scm.com/download/linux" rel="noopener noreferrer"&gt;Git website&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to do after git is installed;
&lt;/h3&gt;

&lt;p&gt;Enter this in your command line almost immediately after Git has been installed&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global user.name "&amp;lt;your name&amp;gt;"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git config --global user.email "&amp;lt;preferably the email you used in signing up for github&amp;gt;"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The above commands will be able to place a tag of your identity whenever you make a commit and tell anyone looking at the code where you have made a commit or written a piece of code.&lt;/p&gt;

&lt;p&gt;Also, you can see other people's commits too so it helps when you are in a team as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Git Commands
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;It is important to note that these are not all the commands but will get you on your merry way into the exciting journey of Git.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git init&lt;/code&gt; will create that special folder to hold all your snapshots and if you check with &lt;code&gt;ls -la&lt;/code&gt; you can see the folder along with other folders in your repo.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt; will add whatever file you want to take a snapshot of to what is called a staging area. Think of a staging area as you putting all your files in one file jacket first before putting it in the special folder(repository) and sending it to your safety deposit box(Github). Kindly note that you can add these files one after the other or you can use &lt;code&gt;git add .&lt;/code&gt; to add all of the files at once.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git status&lt;/code&gt; will show you the items that are in the staging area and ready to be committed(ready to have their snapshots taken). Items highlighted in green are the ones in the staging area and ready for a commit while the ones in red are the ones still on the local machine that haven't been added to the staging area yet.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git rm --cached &amp;lt;file name&amp;gt;&lt;/code&gt; will enable a user to remove a file from the staging area.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit&lt;/code&gt; is used to take the snapshot of everything that's in the staging area. &lt;br&gt;
Ideally commits should always have a message which would inform anyone reading about the code on what has been done so you will often see something like this;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit -m "&amp;lt;add text&amp;gt;"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Make sure to always use the &lt;strong&gt;Ideal&lt;/strong&gt; so you don't get stuck in the terminal's editor. If you get stuck there however(by typing just git commit), use the steps below&lt;/p&gt;

&lt;p&gt;&lt;code&gt;i --&amp;gt; &amp;lt;type commit message&amp;gt; --&amp;gt; escape --&amp;gt; type :wq --&amp;gt; Hit Enter&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once you hit enter after that, you just successfully took your first snapshot. It's like checkpoints in a game. When the power goes out or you get tired, you can always come back to meet your code at the last point you were. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether you are adding more changes to the new file or creating a new file all together, you just have to repeat the process again to make a new commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why is this important?
&lt;/h3&gt;

&lt;p&gt;This is important because as a developer, you need to have a last saved point before you tackle a new and almost always more difficult feature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github typically expects a user to be on the branch "main" instead of the old "master" version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can do that by entering the following command to switch from "master" to "main"&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git branch -M main&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  More on Branches
&lt;/h3&gt;

&lt;p&gt;Sometimes, you don't want to roll back your code but you want to try a feature that might be risky or mess up the code.&lt;/p&gt;

&lt;p&gt;This is where the &lt;strong&gt;branch&lt;/strong&gt; comes in. You can move away from your code with a copy of everything intact and work on something else so even if you make a mistake, it does not affect the original version of the code.&lt;/p&gt;

&lt;p&gt;If it works out well, you can &lt;strong&gt;merge&lt;/strong&gt; that branch with the original code and if it does not, then you can just delete the branch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To create a new branch,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git branch &amp;lt;name of new branch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After creating this branch, then you have to move it to where you can make changes without affecting the rest of the code. This is what "checkout" does as shown below;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git checkout &amp;lt;branch name that was just created&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When you do a git status, it shows you that you are this new branch you have just created so you can keep working for as long as you want and make your changes without affecting the original code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now you add and commit as usual.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But let's say those changes you were trying to make turned out to be a dead-end and you just want to go back to the original code, all you have to do is type the code below to take you back to where you were before&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git checkout &amp;lt;name of branch you want to go back to&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can do stuff you want to do and if you do not like it, you can just go back to where you started.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let's say that you were successful with your new feature or changes you were trying to make and want to add the new branch to the original code, you do the below;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git merge &amp;lt;name of branch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ideally, as a junior engineer, you might only get to do this when you are working alone and on your personal projects. You will usually be required to push your changes/features of the new branch to the repo and open up a &lt;strong&gt;Pull Request&lt;/strong&gt; where a senior will review your changes and then do the merging.&lt;/p&gt;

&lt;h3&gt;
  
  
  What next after the commits?
&lt;/h3&gt;

&lt;p&gt;After saving your snapshots, it is always advisable to take those snapshots and put them in the remote repository which is on Github. Github makes collaboration easier with other engineers.&lt;/p&gt;

&lt;p&gt;Make this a rule&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"ANYTIME YOU MAKE A CHANGE, PUSH YOUR CHANGES TO YOUR REMOTE REPOSITORY"&lt;/strong&gt;*&lt;/p&gt;

&lt;h3&gt;
  
  
  So how to push?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to your &lt;a href="https://www.github.com" rel="noopener noreferrer"&gt;Github&lt;/a&gt; and create a new repository (Look for the plus sign)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the sake of convention, make sure the name of this Github repository is the same as the one on your local machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After naming, you can add a README.md to give a description of what happens in the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then you add remote (where you want to send it in the clouds on Github) by using:&lt;br&gt;
&lt;code&gt;git remote add origin &amp;lt;link to repo&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After this, input the below command to make the first git push to the online repository.&lt;br&gt;
&lt;code&gt;git push -u origin main&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Subsequent file pushes can only then be made for that repo by just using &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want to host your new code online for free, open a new branch on the online repo called &lt;strong&gt;gh-pages&lt;/strong&gt; and then you can view your live link by entering this in your browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;.github.io//index.html&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure it is the exact same name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Just like that ladies and gentlemen, your code has been stored safely in the cloud, it is in public and can be seen. I bet you feel like a hacker now right? You are no longer a beginner, lol.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When you create a pull request, include a summary of the changes and what problem they solve. You can include images, links, and tables to help convey this information. If your pull request addresses an issue, link the issue so that issue stakeholders are aware of the pull request and vice versa. If you link with a keyword, the issue will close automatically when the pull request merges. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are two primary ways people collaborate on GitHub:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Shared repository&lt;/li&gt;
&lt;li&gt;Fork and pull&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With a shared repository, individuals and teams are explicitly designated as contributors with read, write, or administrator access. You most likely achieve this by cloning the repo.&lt;/p&gt;

&lt;p&gt;For an open source project, or for projects to which anyone can contribute, managing individual permissions can be challenging, but a fork and pull model allows anyone who can view the project to contribute.&lt;br&gt;
A fork is a copy of a project under a developer's personal account. Every developer has full control of their fork and is free to implement a fix or a new feature.&lt;br&gt;
Work completed in forks is either kept separate or is surfaced back to the original project via a pull request. There, maintainers can review the suggested changes before they're merged.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can find a full &lt;strong&gt;git cheatsheet&lt;/strong&gt; &lt;a href="https://training.github.com/downloads/github-git-cheat-sheet.pdf" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What are Issues?
&lt;/h3&gt;

&lt;p&gt;Issues are where most of the communication between a project's consumers and the development team occurs. An issue can be created to discuss a broad set of topics, including bug reports, feature requests, documentation clarifications, and more. Once an issue has been created, it can be assigned to owners, labels, projects, and milestones. You can also associate issues with pull requests and other GitHub items to provide future traceability.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are Pull Requests?
&lt;/h3&gt;

&lt;p&gt;A pull request is a mechanism used to alert that the commits from one branch are ready to be merged into another branch. The developer submitting the pull request will often request one or more reviewers/maintainers to verify the code and approve the merge. These reviewers have the opportunity to comment on changes, add their own, or use the pull request itself for further discussion. Once the changes have been approved (if approval is required), the pull request's source branch (the compare branch) may be merged in to the base branch&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are labels? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Labels provide a way to categorize and organize issues and pull requests in a repository. As you create a GitHub repository several labels will automatically be added for you and new ones can also be created.&lt;/p&gt;

&lt;p&gt;Examples of Labels include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bug&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;duplicate&lt;/li&gt;
&lt;li&gt;help wanted&lt;/li&gt;
&lt;li&gt;enhancement&lt;/li&gt;
&lt;li&gt;question&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can take Microsoft's short course on Github to really finetune your Github skills by following this &lt;a href="https://docs.microsoft.com/en-us/learn/modules/introduction-to-github/1-introduction" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules to live by for commit messages:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Don’t end your commit message with a period.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep your commit messages to 50 characters or less.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add extra detail in the extended description window if necessary. This is located just below the subject line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use active voice. For example, "add" instead of "added" and "merge" instead of "merged".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Think of your commit as expressing intent to introduce a change.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>github</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Do Not Know Object Oriented Programming!</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Thu, 30 Dec 2021 19:29:08 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/i-do-not-know-object-oriented-programming-1bim</link>
      <guid>https://forem.com/resourcefulmind/i-do-not-know-object-oriented-programming-1bim</guid>
      <description>&lt;p&gt;If you are a beginner who is currently getting their butts whooped by JavaScript or swimming in tutorial hell, I'm quite sure you must have read the title of this article and given me an imaginary hug because you can also resonate. Truth is, I do not have a ready made blueprint to help you understand OOPs, but as I once read somewhere that the best way to learn is to teach...so here I am, Fun and Janae Monelle's "We Are Young" playing in the background, about to share my own personal notes about Object Oriented Programming. I hope this helps a newbie somewhere. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS: I would welcome contributions, resources and comments that would help other newbies. We can burn brighter than the sun if we all help each other.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the first thing we all need to know is the conventional definition...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Object-oriented programming combines a group of data attributes with functions or methods into a unit called an "object. Multiple independent objects may also be instantiated—or represented—from the same class and interact with each other in complex ways.&lt;/em&gt;&lt;/strong&gt;" &lt;/p&gt;

&lt;p&gt;Typically, OOP is class-based, which means that a class defines the data attributes and functions as a blueprint for creating objects, which are instances of the class. &lt;/p&gt;

&lt;p&gt;I happen to love cars alot so my first simple example would be to consider a class representing a car. The "car" class will contain  attributes to represent information such as the car's name, model, number of wheels, color, etc. Maybe this would be more familiar;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let car = {
     name: "Mercedes Benz",
     model: "CLA 4DR Coupe", 
     numOfWheels: 4, 
     chassisNum: 0123456789, 
     color: "white"
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;I'd like to go on and talk about what everyone refers to as the 4 basics of Object Oriented Programming which would be Encapsulation, Abstraction, Inheritance and Polymorphism...but before I start throwing these words around, wouldn't it be better if we really understood how to use OOPs and then saw these 4 basics in action for ourselves?&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;We already successfully created our first class with their different properties and values. We can access the properties and subsequently, the values in our "car" object using the &lt;strong&gt;Dot Notation&lt;/strong&gt;. Take a look at the code below;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.log(car.model); //"CLA 4DR Coupe"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In the code above, we used the &lt;strong&gt;dot notation&lt;/strong&gt; on the object named &lt;strong&gt;"car"&lt;/strong&gt; and then followed by the property &lt;strong&gt;"model"&lt;/strong&gt; to access the value which is &lt;strong&gt;"CLA 4DR Coupe"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cool right?&lt;/em&gt;  We might have private data in the class, such as "chassisNum" that should not be exposed to other objects in the program. By encapsulating this data member as a private variable in the class, outside code would not have direct access to it, and it would remain safe within that person’s object. &lt;/p&gt;

&lt;p&gt;In OOP, we encapsulate by binding the data and functions which operate on that data into a single unit, the class. &lt;/p&gt;

&lt;p&gt;By doing so, we can hide private details of a class from the outside world and only expose functionality that is important for interfacing with it. When a class does not allow calling code access to its private data directly, we say that it is well encapsulated. &lt;strong&gt;There there, you just understood Encapsulation.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;It will be pointless to learn about OOPs without knowing what &lt;strong&gt;METHODS&lt;/strong&gt; are. &lt;strong&gt;Methods&lt;/strong&gt; are a special type of property that objects have. They are simply properties that are functions. They add a different behavior to an object. I like to think that they make objects a little more flexible in doing stuff. For instance,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let car = {
  name: "Range Rover Evogue", 
  price: 70000, 
  describeCar: function() {
    return "That car speeding on the highway is a " + car.name + " and it costs " + car.price + " USD.";}
};

car.describeCar(); //"That car speeding on the highway is a Range Rover Evogue and it costs 70000 USD."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The block of code above has a method &lt;code&gt;describeCar&lt;/code&gt; which is a function and returns a statement telling us the name and Price of the car.(BTW, I have no idea about the price of the Range Rover).&lt;br&gt;
Notice that the method accessed the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;price&lt;/code&gt; property in the return statement using the &lt;code&gt;car.name&lt;/code&gt; and &lt;code&gt;car.price&lt;/code&gt;. Now think about the many awesome things you can do with Methods...sweet right? &lt;/p&gt;



&lt;p&gt;There is another way to access the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;price&lt;/code&gt; properties though...yeah, you probably heard about it...the &lt;strong&gt;"this"&lt;/strong&gt; keyword (At this poin, you're probably like...who was behind naming these coding concepts, because what is literally "this" right? lol)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"this"&lt;/strong&gt; in my own opinion, which I would like to think is shared by others, exists to make code reusable and very much easier to read.&lt;/p&gt;

&lt;p&gt;In the last example, we had a method &lt;code&gt;describeCar&lt;/code&gt; which used &lt;code&gt;car.name&lt;/code&gt; and &lt;code&gt;car.price&lt;/code&gt; dot notation to access the values for the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;price&lt;/code&gt; property within the return statement.&lt;br&gt;
Recall,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; describeCar: function() {
    return "That car speeding on the highway is a " + car.name + " and it costs " + car.price + " USD.";}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although, it is a very correct way of accessing the object &lt;em&gt;"car"&lt;/em&gt; 's property, have you ever asked yourself what happens when you have accessed this object and its properties on lines 235, 410, 720, 850, 1100, 1425, 1658, 1780 and 3800 of your codebase and for some reason, the variable name changes from &lt;code&gt;"car"&lt;/code&gt; to &lt;code&gt;"automobile"&lt;/code&gt; while working for a large company such as Mercedes?&lt;/p&gt;

&lt;p&gt;Your work gets extra stressful as you have to update all those lines of code which references the original name that was changed and we both know how stressful that can get. This is where the &lt;strong&gt;&lt;code&gt;this&lt;/code&gt;&lt;/strong&gt; keyword comes in. You can have your initial code in our last example re-written like this;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let car = {
  name: "Range Rover Evogue", 
  price: 70000, 
  describeCar: function() {
    return "That car speeding on the highway is a " + this.name + " and it costs " + this.price + " USD.";}
};

car.describeCar();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we have barely scratched the surface and &lt;code&gt;this&lt;/code&gt; is a very deep and sometimes complicated subject and the above is definitely not the only way it can be used. Here, we just used &lt;code&gt;this&lt;/code&gt; in referring to the object that the method &lt;code&gt;describeCar&lt;/code&gt; is associated with, which is &lt;code&gt;car&lt;/code&gt;. By virtue of this, if the object variable &lt;code&gt;car&lt;/code&gt; is changed to &lt;code&gt;automobile&lt;/code&gt; or even  &lt;code&gt;locomotive&lt;/code&gt;, it is not necessary to find all the references to &lt;code&gt;car&lt;/code&gt; in the code. There you go...easier and reusable across board. &lt;/p&gt;

&lt;p&gt;Now that we have got that out of the way, let's be civil engineers for a bit and talk about Constructor Functions(this is me trying to make a joke that's not funny btw)...&lt;/p&gt;




&lt;p&gt;Now, imagine that you are seeing the function below for the first time as a beginner...which is probably what's happening right now;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Truck() {
  this.name = "Ford Ranger 2018";
  this.color = "Black";
  this.price = 100000;
  this.numWheels = 4;
  this.yearOfProduction = 2018;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks weird right? Because it did look weird to me when I looked at it for the first time ever too. Functions are supposed to return a statement or value or whatever else you read up yeah? It also looks like an object or even a method but methods ar always inside the object and this isn't how "normal" objects are written...Don't fret, &lt;strong&gt;this is a Constructor Function&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Constructors are functions that create new objects.&lt;/em&gt;&lt;/strong&gt; They define properties and behaviors that will belong to the new object. What this means is that like the example above, functions written that way will create a new object called &lt;strong&gt;"Truck"&lt;/strong&gt; and append the &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;numOfWheels&lt;/code&gt; and &lt;code&gt;yearOfProduction&lt;/code&gt; properties and their corresponding values to the object. The &lt;code&gt;this&lt;/code&gt; refers to the new object that has been created.&lt;/p&gt;

&lt;p&gt;Take note that the &lt;code&gt;Truck&lt;/code&gt; object was defined with a &lt;em&gt;capital letter&lt;/em&gt;. Constructors are defined this way to differentiate them from other functions that are not constructors and will not return values like other functions would. &lt;/p&gt;

&lt;p&gt;And as usual, a new problem will always arise from an existing one...what if we want to create a new object which will have the same properties as our initial &lt;code&gt;"Truck"&lt;/code&gt; constructor from the our previous example? We simply add the following line of code beneath the previous code block like so;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;let fordTruck = new Truck();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;new&lt;/code&gt;&lt;/strong&gt; operator will instruct JavaScript to create a new copy of the &lt;strong&gt;&lt;code&gt;Truck&lt;/code&gt;&lt;/strong&gt; object called &lt;strong&gt;&lt;code&gt;fordTruck&lt;/code&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take note that if you do now include **&lt;code&gt;new&lt;/code&gt;&lt;/strong&gt;, you will not get the result as no new object will be created even if you troubleshoot and console.log from here to Bethlehem** &lt;/p&gt;

&lt;p&gt;So ultimately, if you type &lt;code&gt;fordTruck.name&lt;/code&gt; in your console, the result will give the value of our initial Truck's &lt;code&gt;this.name&lt;/code&gt; because &lt;code&gt;fordTruck&lt;/code&gt; now has all the properties of &lt;code&gt;Truck&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Now you know what constructors do, but if you are the obsrvant genius I know you are, then you would notice that when we created the new constructor &lt;code&gt;fordTruck&lt;/code&gt;, it took the &lt;code&gt;name&lt;/code&gt; property along with the other properties such as &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;numOfWheels&lt;/code&gt; and yearOfProduction. We can keep changing the names as we go by if you want different values for each new &lt;code&gt;Truck&lt;/code&gt; but supposing you are in charge of keeping track of hundreds of thousands of trucks produced at the Ford Plant? &lt;/p&gt;

&lt;p&gt;You can change or easily create new instances of the Trucks by designing the initial &lt;code&gt;Truck&lt;/code&gt; constructor to accept whatever parameters might need to be changed like the name of the truck, the price, the color and still leave the other values to remain the same if you want. &lt;strong&gt;So we re-write the original constructors to accept arguments as shown below;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Truck(name, price, color) {
   this.name = name;
   this.color = color;
   this.price = price;
   this.numWheels = 4;
   this.yearOfProduction = 2018;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then we can say;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;let fourWheel = new Truck("Ranger", 175000, "gray");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When you do this, you create a new instance of &lt;code&gt;Truck&lt;/code&gt; which will be named &lt;code&gt;fourWheel&lt;/code&gt; and will set the properties to the new properties of the new &lt;code&gt;fourWheel&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;With the above, the constructor function is now very flexible as it can accept parameters and we can define new properties for each truck when they are created. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always keep in mind that constructor functions group objects together based on shared characteristics and behavior and define a blueprint that automates their creation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to check if the new object you created is an instance of the constructor, use the &lt;code&gt;instanceof&lt;/code&gt; operator.&lt;/p&gt;

&lt;p&gt;For instance, in our last example above, &lt;/p&gt;

&lt;p&gt;&lt;code&gt;fourWheel instanceof Truck;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It will return &lt;code&gt;true&lt;/code&gt; because the &lt;code&gt;fourWheel&lt;/code&gt; object was created using the &lt;code&gt;Truck&lt;/code&gt; constructor.&lt;/p&gt;

&lt;p&gt;But if we say,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let saloonCar = {
   name: "Ford Focus", 
   color: "white", 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then we check the same &lt;code&gt;saloonCar instanceof Truck;&lt;/code&gt;, it will return &lt;code&gt;false&lt;/code&gt; because &lt;code&gt;saloonCar&lt;/code&gt; was not created using the &lt;code&gt;Truck&lt;/code&gt; constructor.&lt;/p&gt;

&lt;p&gt;Also, the &lt;code&gt;Truck&lt;/code&gt; constructor defines five properties (name, color, price, numOfWheels, yearOfProduction) which are defined directly inside it. These properties are called &lt;em&gt;"Own Properties"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let's assume we are setting up 3 new instances of &lt;code&gt;Truck&lt;/code&gt; called &lt;code&gt;firstCar&lt;/code&gt;, &lt;code&gt;secondCar&lt;/code&gt; and &lt;code&gt;thirdCar&lt;/code&gt; respectively, we would have something like this;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let firstCar = new Truck("edge", "red", 30000);
let secondCar = new Truck("broncos", "black", 120000);
let thirdCar = new Truck("focus", "blue", 65000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The other two properties &lt;code&gt;numOfWheels&lt;/code&gt; and &lt;code&gt;yearOfProduction&lt;/code&gt; will remain unchanged as no new parameters were passed in for those. &lt;/p&gt;

&lt;p&gt;All 5 properties are referred to as &lt;strong&gt;Own Properties&lt;/strong&gt; because they are defined directly on the instance object &lt;code&gt;Truck&lt;/code&gt;. This means that &lt;code&gt;firstCar&lt;/code&gt;, &lt;code&gt;secondCar&lt;/code&gt; and &lt;code&gt;thirdCar&lt;/code&gt; all have their own separate copy of these properties and every other instance of &lt;code&gt;Truck&lt;/code&gt; will also have their own copy of these properties.&lt;/p&gt;

&lt;p&gt;What is the essence of all of this and what might we do with the Own Property you might ask...well we could push them to an empty array while writing our code like so;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let ownProps = [];
for(let property in secondCar) {
   if(secondCar.hasOwnProperty(property)) {
       ownProps.push(property);
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that when we &lt;code&gt;console.log(ownProps)&lt;/code&gt;, it will print the different properties from &lt;code&gt;secondCar&lt;/code&gt; into the empty &lt;code&gt;ownProps&lt;/code&gt; array.&lt;/p&gt;




&lt;p&gt;If you take a close look at our code, you should definitely see that &lt;code&gt;numOfWheels&lt;/code&gt; has the same value for all instances of &lt;code&gt;Truck&lt;/code&gt;. In other words, it is sort of a duplicated variable. &lt;/p&gt;

&lt;p&gt;It is not much of a problem if you have only a couple of instances or say 5 instances of the original car object...but...you will likely be working at the Ford HQ and using your code to keep track of millions of 4-wheeelers which means millions of instances. &lt;/p&gt;

&lt;p&gt;In situations like the above-listed, a &lt;strong&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;/strong&gt; comes in very handy. What does the prototype do you might ask? Simple..A &lt;strong&gt;prototype&lt;/strong&gt; shares a particular property amongst all instances of the original object.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Truck.prototype.numOfWheels = 4;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now all instances of &lt;code&gt;Truck&lt;/code&gt; will have the &lt;code&gt;numOfWheels&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;prototype&lt;/code&gt; for &lt;code&gt;firstCar&lt;/code&gt; and &lt;code&gt;secondCar&lt;/code&gt; is part of the &lt;code&gt;Truck&lt;/code&gt; constructor as &lt;code&gt;Truck.prototype&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In summary, when it comes to properties, own properties will always be defined directly on the object itself while prototype properties will be defined on the prototype.&lt;/p&gt;

&lt;p&gt;So what if we have to add more than one property to our prototype? You already know that would be very cumbersome of we had to do that one after another. A more efficient way would be to set the prototype to a new object that already contains the properties. We have this below;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Truck.prototype = {
   numOfWheels: 4, 
   sound: function() {
     console.log("Vroom! Vroom!!")
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then we want to add a &lt;code&gt;quality&lt;/code&gt; method to the prototype. All the properties can be added at once in this manner like so;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Truck.prototype = {
   numOfWheels: 4, 
   sound: function() {
     console.log("Vroom! Vroom!!")
   },  
   sound: quality() {
     console.log("It is a super fast " + this.name);
   }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NEVER FORGET&lt;/strong&gt; to always define the constructor property whenever a prototype is manually set to a new object. Why? Well the reason is quite simple, it is beacuse when you set the prototype manually, it will erase the constructor property and if you check which constructor function created the instance, the results will be false.&lt;/p&gt;

&lt;p&gt;Summarily, for a better understanding of the prototype chain, you need to always take note of the following;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;All objects in JavaScript have a prototype(save for a few exceptions).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The prototype of an object is an object. If this confuses you, you can bet it confused me too. You should check out &lt;a href="https://javascript.info/search/?query=prototype&amp;amp;type=article" rel="noopener noreferrer"&gt;Javascript.info&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A prototype can also have its own prototype because a prototype is an object. For instance;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Car(name) {
  this.name = name;
}

typeof Car.prototype; //the result for this will be "object"

let bugatti = new Car("Veyron");
    bugatti.hasOwnProperty("name");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the above, &lt;br&gt;
&lt;code&gt;Car&lt;/code&gt; = supertype for &lt;code&gt;bugatti&lt;/code&gt;&lt;br&gt;
&lt;code&gt;bugatti&lt;/code&gt; = subtype for &lt;code&gt;Car&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Car&lt;/code&gt; = supertype for &lt;code&gt;bugatti&lt;/code&gt;&lt;br&gt;
Object is a supertype for both &lt;code&gt;Car&lt;/code&gt; and &lt;code&gt;bugatti&lt;/code&gt;&lt;br&gt;
Object is a supertype for all objects in JavaScript, therefore, any object can use the &lt;code&gt;hasOwnProperty&lt;/code&gt; method.&lt;/p&gt;



&lt;p&gt;There's another important principle to be observed before I take a pause on this is the principle of &lt;strong&gt;Inheritance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Repeated code is usually a problem because any change in one place requires fixing the code in multiple placesbwhich would just give devs more work and make them more likely to make errors. Now let's say we have two constructor functions which I will name after two of the biggest artistes in Africa(just because I can and we don't have to always be boring);&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wizkid.prototype = {
   constructor: Wizkid, 
   describe: function() {
      console.log("My name is " + this.name +  " and I always come late to my concerts in Nigeria");
  }
};

Davido.prototype = {
   constructor: Davido, 
   describe: function() {
      console.log("My name is " + this.name + " and I always come late to my concerts in Nigeria");
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see, the &lt;code&gt;describe&lt;/code&gt; method is repeated in two places and we can use what we call the &lt;strong&gt;DRY principle&lt;/strong&gt; (Don't Repeat Yourself) to refine this code by creating a supertype called &lt;code&gt;**Artistes**&lt;/code&gt; like so;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Artiste() {};

Artiste.prototype = {
    constructor: Artiste, 
    describe: function() {
       console.log("My name is " + this.name + " and I always come late to my concerts in Nigeria");
   }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since you have the above supertype &lt;code&gt;Artiste&lt;/code&gt; which includes the &lt;code&gt;describe&lt;/code&gt; method, you can then remove the &lt;code&gt;describe&lt;/code&gt; method from &lt;code&gt;Wizkid&lt;/code&gt; and &lt;code&gt;Davido&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;Wizkid.prototype = {
  constructor: Wizkid
};

Davido.prototype = {
  constructor: Davido
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There you go, you just successfully created a supertype called &lt;code&gt;Artiste&lt;/code&gt; that defined behaviors shared by all musicians/artistes.&lt;/p&gt;

&lt;p&gt;I will stop here for now...you can learn more about the basics of Object Oriented Programming as well as advanced concepts on &lt;a href="https://javascript.info/search/?query=object+oriented+programming&amp;amp;type=article" rel="noopener noreferrer"&gt;Javascript.info&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also chip in via the comments for other newbies to learn more as I have barely even scratched the surface. Godspeed and Happy New Year in advance to you and yours.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>HNG Internship 8.0</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Mon, 16 Aug 2021 19:42:32 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/hng-internship-8-0-39cf</link>
      <guid>https://forem.com/resourcefulmind/hng-internship-8-0-39cf</guid>
      <description>&lt;p&gt;Hotels.ng Internship, partnered by Ingressive For Good have thrown the gates wide open for the 8th edition of the HNG Internship 8.0.&lt;/p&gt;

&lt;p&gt;The Mark Essien and Seyi Onifade-led internship has proven time and again to be one of Nigeria's best accelerator programs for tech geniuses all over Africa to showcase their skill and hopefully get absorbed into a full time role when they apply for jobs after the 8 week program. &lt;/p&gt;

&lt;p&gt;For a lot of rookie and even expert developers, this internship offers the opportunity of improving their collaborative skills in the tech ecosystem, building lifelong friendships and networks as well as the invaluable experience of realtime work environment simulations. Applications to join the internship will be closing on Tuesday and prospective applicants can join &lt;a href="https://internship.zuri.team" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am currently trying to advance my skills as an expert Frontend developer and I have decided to join this internship with the aim of achieving the following goals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;To attract valuable work contacts and hopefully get an important stepping-stone to securing a job and climbing the first rung on my career ladder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To develop critical and requisite work skills and get the edge over competition in the industry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I would also like to get even further out of "tutorial hell", gain experience beyond the books and explore unexpected avenues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To work on exciting work projects and have valuable experiences to talk about with future recruiters at interviews.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;At the end of 8 weeks, I want to have attained a level of independence in starting out my own major projects. Taking away lots of experience is really key for me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you somehow stumbled on this article and want to make a quick transition into tech, you can take a refresher course to get familiar with the following links to help you kickstart your journey. &lt;/p&gt;

&lt;p&gt;TAKE NOTE THAT THE FOLLOWING LINKS ARE TO GET YOU FAMILIAR WITH THE SPACE. &lt;/p&gt;

&lt;p&gt;I recommend starting with HTML and CSS &lt;br&gt;
&lt;strong&gt;HTML AND CSS&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/mU6anWqZJcc" rel="noopener noreferrer"&gt;https://youtu.be/mU6anWqZJcc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You could then have a look at JavaScript or a programming language like python. It all really depends on which appeals to you but I took the liberty of adding JavaScript and Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full Javascript course for beginners&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/jS4aFq5-91M" rel="noopener noreferrer"&gt;https://youtu.be/jS4aFq5-91M&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python for beginners&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/_uQrJ0TkZlc" rel="noopener noreferrer"&gt;https://youtu.be/_uQrJ0TkZlc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should also learn version control because you would need it every other time for collaborating with other developers in building projects.&lt;br&gt;
&lt;strong&gt;Getting started with GIT&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/8JJ101D3knE" rel="noopener noreferrer"&gt;https://youtu.be/8JJ101D3knE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should also check out this refresher to know how to implement pixel perfect designs from Figma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figma tutorial for beginners&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/Gu1so3pz4bA" rel="noopener noreferrer"&gt;https://youtu.be/Gu1so3pz4bA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If backend is more like your thing, you could check this out too&lt;br&gt;
&lt;strong&gt;Backend with Node.js&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/Oe421EPjeBE" rel="noopener noreferrer"&gt;https://youtu.be/Oe421EPjeBE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you like Mobile Development, you could start here as well.&lt;br&gt;
&lt;strong&gt;Mobile development with Flutter&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://youtu.be/pTJJsmejUOQ" rel="noopener noreferrer"&gt;https://youtu.be/pTJJsmejUOQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a fast-paced internship but I will do my best to share my experiences. Ciao.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Learn to code using FreeCodeCamp Especially If You Do Not Have 24/7 Internet Access</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Thu, 03 Jun 2021 18:19:37 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/learn-to-code-using-freecodecamp-especially-if-you-do-not-have-24-7-internet-access-101e</link>
      <guid>https://forem.com/resourcefulmind/learn-to-code-using-freecodecamp-especially-if-you-do-not-have-24-7-internet-access-101e</guid>
      <description>&lt;p&gt;My previous post was supposed to be a rant...a way of releasing my pent-up anger and frustration at the system and the very scarce resources it was swallowing, with little returns and immense presure all because I wanted to make a difference. The reception and similar experiences I read in the comments section is a source of motivation I will never take for granted. &lt;/p&gt;

&lt;p&gt;I am working with a few people to build solutions which would help the average developer and while that would take some level of planning, implementation and even donations, I thought of other non-monetary(if there's a word like that) ways of helping newbies.&lt;/p&gt;

&lt;p&gt;So...lots of research, a bout of serious typhoid fever, speaking with awesome developers including Jay, Trevor and Sebastian and my laptop getting spoilt by a power surge on the very day I wanted to POST this later, I was able to come up with this...now ask yourself...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HOW WOULD YOU LIKE TO BE ABLE TO USE FREECODECAMP AND ITS AMAZING LEARNING RESOURCES AND CERTIFICATIONS WITHOUT THE INTERNET?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Awesome yeah? Check out FreeCodeCamp here &lt;a href="https://www.freecodecamp.org" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You're probably thinking this is hard and it might take a long time to set up, well it isn't. You should be done in an hour or less.&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First you need to have a working computer/laptop.(Thankfully I was able to get this post compiled before mine got spoilt).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You would also need initial internet connectivity.(This is so you can download the necessary FreeCodeCamp files from GitHub).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lastly, you would need a resilience like no other. This is because it is one thing to download and set this up and it's a whole different thing to actually PUT THESE RESOURCES TO USE AND LEARN. Do not procastinate, start learning!&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  First Step: Setting Up Your Database On Your Local Machine
&lt;/h2&gt;

&lt;p&gt;We will be making use of a document-oriented database called MongoDB. To learn more about MongoDB and why it is used, i have a helpful article here &lt;a href="https://www.dotnettricks.com/learn/mongodb/what-is-mongodb-and-why-to-use-it" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's go on and install MongoDB. You can find the necessary documentation to install on all supported Operating Systems here &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.mongodb.com/manual/installation/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will be using Windows 10 so kindly follow the steps below if you use windows 10 as well.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download&lt;/strong&gt; the latest version(mine was 4.4.6) at &lt;a href="https://www.mongodb.com/try/download/community" rel="noopener noreferrer"&gt;Link&lt;/a&gt; (make sure to select "On-Premises MongooDB locally" and on the right-hand side select "msi" as Package. Learn more about "msi" here &lt;a href="https://whatis.techtarget.com/fileformat/MSI-Installer-package-Microsoft-Windows" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufoityrfmwchz1ukz02r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufoityrfmwchz1ukz02r.png" alt="The user interface of the MongoDB download page" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After the Download is complete, navigate to your file location and install.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you get to the prompt that says &lt;strong&gt;"Custom SetUp"&lt;/strong&gt;, make sure all features are selected and the "Server" is set to &lt;strong&gt;"install on the local hard drive, C:".&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcnrk52scwcz9ico7ews.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcnrk52scwcz9ico7ews.png" alt="Custom Setup" width="613" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;em&gt;"Next"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should be in &lt;strong&gt;"Service Configuration"&lt;/strong&gt; now. &lt;em&gt;Unselect&lt;/em&gt; the checkbox which says &lt;strong&gt;"Install MongoDB as a service"&lt;/strong&gt;. We are doing this so MongoDB doesn't use up all your computer's memory and we will only run it before starting up FreeCodeCamp. You are not Google or Netflix my friend, winks. Click &lt;em&gt;"Next"&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo3hcgrcb5wk8rjo7jxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo3hcgrcb5wk8rjo7jxn.png" alt="Service Configuration" width="617" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep Clicking &lt;em&gt;"Next"&lt;/em&gt; to complete the rest of the installation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Second Step:  Setting Up Node.js and NPM
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt; is an open-source, cross-platform, back-end JavaScript runtime environment that runs on the V8 engine and executes JavaScript code outside a web browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPM&lt;/strong&gt; stands for Node Package Manager and is always installed with Node.js&lt;/p&gt;

&lt;p&gt;To learn more about NPM, you can check this resource &lt;a href="https://www.w3schools.com/whatis/whatis_npm.asp" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To learn more about node.js, you can check this resource &lt;a href="https://www.w3schools.com/nodejs/nodejs_intro.asp" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download and install node.js by clicking &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Make sure to download the recommended msi version (14.17.0 LTS).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When this prompt below comes up, &lt;strong&gt;select the checkbox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxzmasfy0tiqklu3yiji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxzmasfy0tiqklu3yiji.png" alt="Select the Check Box To Download Other Dependencies" width="617" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will enable your system to also install additional packages and dependencies when you need them and build stuff on FreeCodeCamp as well. Chocolately, Python and other packages will also be  installed with this step&lt;/p&gt;

&lt;h2&gt;
  
  
  Third Step: Cloning FreeCodeCamp From GitHub
&lt;/h2&gt;

&lt;p&gt;First thing to do is to install Git using your computer's package manager.&lt;/p&gt;

&lt;p&gt;You can type &lt;code&gt;"choco install git"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you still do not know how, you can install normally here &lt;a href="https://git-scm.com/download/win" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a new folder titled "FreeCodeCamp" on your computer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then Open your terminal or Windows Powershell and follow the following sub-steps;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Using &lt;code&gt;"cd"&lt;/code&gt; and &lt;code&gt;"ls"&lt;/code&gt; commands, navigate to the FreeCodeCamp folder(directory) which you opened in 1.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clone FreeCodeCamp and its necessary accompanying files using git by typing the following command in your Powershell or Terminal&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;git clone --depth=1 https://github.com/freeCodeCamp/freeCodeCamp&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Fourth Step: SetUp and Install FreeCodeCamp On Your Local Machine
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;"cd"&lt;/code&gt; to navigate into the FreeCodeCamp directory you just cloned and then type the command below to begin installation(might take a while but you've already come this far so be patient my friend)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"npm ci"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DO NOT CLOSE THIS POWERSHELL/TERMINAL WINDOW YET&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fifth Step: Starting Up The MongoDB Database
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You will need to always start the service in 2 below before you can run FreeCodeCamp everytime so you can do well to note it down somewhere.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open up a new window in your terminal or Powershell while waiting for the installation in the Fourth Step above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can start up the MongoDB database by following the steps below:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Windows Users: Navigate as seen below and then type in the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe" --dbpath=/path/to/freeCodeCamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux Users: Navigate as seen below and then type in the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongod --dbpath=/path/to/freeCodeCamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DO NOT CLOSE THIS POWERSHELL/TERMINAL WINDOW YET&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sixth Step: Seeding the MongoDB Database
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Remember the installation in Step 4? It should be completed by now. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go back to that Powershell or Terminal window and then type in the command below just once;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;"npm run seed"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: In subsequent times, you do not have to run the above command again because your would have already been initialized.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7th Step: Start FreeCodeCamp
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go back to the Powershell terminal in the Sixth Step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run this command to start FreeCodeCamp&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;"npm run develop"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It might take an awful lot of time but as long as you have a stable internet connection, trust the process and let the building sun its full course. it took about 8 minutes on my end.&lt;/p&gt;

&lt;p&gt;How do i know it's done? You should see this line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;success Building development bundle - 497.330s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 8:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open up your preferred browser and type in [Link}(&lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;"Get Started Now, It's Free!"&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should see &lt;strong&gt;" Welcome back, development user".&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Congratulations, you can access all the courses now without the internet. Your progress will be saved in the MongoDB commands run in Step 5.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; What I want to start FreeCodeCamp later, do i need to go through all the steps again? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Of course not, next time you can do so without the internet by following the instructions on Step 5 and 8 in two different terminals/powershells.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;May The Stars Align For You Fellow Dev....Major shoutouts to every resource I previously read and a few blogs that already did something like this. I hope this helps us all.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A beginner’s journey into software development in Nigeria.</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Thu, 29 Apr 2021 07:36:32 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/a-beginner-s-journey-into-software-development-in-nigeria-86b</link>
      <guid>https://forem.com/resourcefulmind/a-beginner-s-journey-into-software-development-in-nigeria-86b</guid>
      <description>&lt;p&gt;No one really writes about the pain involved in learning to code in Nigeria and I don’t know why.&lt;/p&gt;

&lt;p&gt;First of all, peep the the cover picture on this post, it represents an art-work for a song by a music artiste in Nigeria titled “Thunder Fire You” by Ric Hassani. Literal meaning...may thunder strike a person dead. &lt;/p&gt;

&lt;p&gt;It was sung as a song for a heartbroken man but I put that up there because there’s a lot of forces designed to frustrate the average young Nigerian mind by the Government.&lt;/p&gt;

&lt;p&gt;I started my developer journey, no prior computer science degree, delving into a new career because well, there are simply not enough jobs. I said what I said.&lt;/p&gt;

&lt;p&gt;And now, it has only gotten worse...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Laptop prices have doubled and are now tripling due to the weak strength of the Naira against the dollar. Some developer advocates like Hack Sultan, Prosper Otemuyiwa and Adora Nwodo have been doing their best to help the Nigerian community but for how long? Trust the government to try and take the plaudits when a Nigerian dev builds a world class product tho.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data!!!! A successful developer needs to learn to know how to ask the right questions on Google and StackOverflow yeah? &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you see,in order to use Google, you actually have to be connected to the internet...Now the average Nigerian earns 2000 naira daily and the least internet plans go for half that price!&lt;br&gt;
Funny story? Many people do not even earn that...tell me again how it’s supposed to be easy to just be in the “zone” to code? &lt;/p&gt;

&lt;p&gt;The way I see it, to use YouTube and the plenty resources available online for self-study, you’ve got to have access to the internet and how are you supposed to cope with spending at least 12-20 thousand naira on data monthly when you haven’t even started getting paid? And to plunge you into further depression, you’re given an option of “borrowing” data...sighs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now to the most annoying part...EPILEPTIC...nah scratch that...NO POWER SUPPLY!!! Paint this scenario in your head...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Young and defiant newbie dev who is trying their best to scale through, has been able to get a laptop, buy/borrow data and joined a free boot camp or tried to do some self study. This young developer wants to maximize their time and draws up a study schedule so they can also get their tasks and assignments submitted early enough. &lt;br&gt;
There’s a problem tho...”PHCN”(the corrupt organization in charge of supplying power) only gives them electricity 3 hours(phased irregularly) daily and coupled with that, they still have to “share” light in their street because the transformer is not powerful enough to supply the 12 streets using it.&lt;br&gt;
Their street uses the epileptic power for two days and there’s a total blackout for the third day. &lt;br&gt;
In total they have +/- 6 hours of a possible 72hours to power their devices, get studies in and also do their assignments. Then you find them at Bet9ja shops (sports betting kiosks) trying to charge and learning to code with street kings(agbero and urchins) shouting in the background trying to stake bets on virtual football games.&lt;/p&gt;

&lt;p&gt;That is just a peek into the life of most newbie Nigerian developers. I just thought you should know. I deliberately excluded some parts because it gets ugly as you go. Feel free to add your experiences and draw strength from each other. Selah.&lt;/p&gt;

&lt;p&gt;Despite all this, we still do our best yeah? But think of the talents being wasted because they do not have the psychological capacity to cope with these kinds of problems...just think about it for a minute?&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Thank You! Feeling Good This Morning</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Thu, 19 Nov 2020 08:11:44 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/thank-you-feeling-good-this-morning-5a8b</link>
      <guid>https://forem.com/resourcefulmind/thank-you-feeling-good-this-morning-5a8b</guid>
      <description>&lt;p&gt;I made a post yesterday and I can honestly say I am overwhelmed by the amount of support and encouragement I received. &lt;/p&gt;

&lt;p&gt;I woke up feeling good about myself and willing to go even harder this time. I love this community.&lt;/p&gt;

&lt;p&gt;Might just make this my personal blog where I write my feelings as regards being a programmer each day. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>programming</category>
    </item>
    <item>
      <title>It is hard.</title>
      <dc:creator>Opeyemi Stephen</dc:creator>
      <pubDate>Wed, 18 Nov 2020 10:27:57 +0000</pubDate>
      <link>https://forem.com/resourcefulmind/it-is-hard-21mg</link>
      <guid>https://forem.com/resourcefulmind/it-is-hard-21mg</guid>
      <description>&lt;p&gt;I started coding sometime in February. I was in a really bad place, depressed and almost suicidal. I tried to find purpose in my previous career, Structural Engineering but it just wasn't for me.&lt;/p&gt;

&lt;p&gt;I met my mentor through a mutual friend and he put me on the right path.&lt;/p&gt;

&lt;p&gt;I don't know if I am going to be a good developer. I find myself forgetting things and feeling like there is so much to catch up on and study on and it makes me feel like I am not doing enough. &lt;/p&gt;

&lt;p&gt;I cannot seem to understand JavaScript and how to apply it. Been studying JavaScript since march and it just seems like I am moving around in circles. I get the hang of it right away when I study and then I forget the next day.&lt;/p&gt;

&lt;p&gt;Coding is hard!!!!&lt;/p&gt;

&lt;p&gt;But with the right experience and mentorship...I will touch the clouds.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
