<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: royson menezes</title>
    <description>The latest articles on DEV Community by royson menezes (@royson_menezes_479ed50941).</description>
    <link>https://dev.to/royson_menezes_479ed50941</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%2F2788630%2F831688dd-0954-4420-ab26-28d166da5998.png</url>
      <title>DEV Community: royson menezes</title>
      <link>https://dev.to/royson_menezes_479ed50941</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/royson_menezes_479ed50941"/>
    <language>en</language>
    <item>
      <title>How I integrated the blockchain donation feature in my Expo project</title>
      <dc:creator>royson menezes</dc:creator>
      <pubDate>Tue, 25 Nov 2025 17:08:49 +0000</pubDate>
      <link>https://dev.to/royson_menezes_479ed50941/how-i-integrated-the-blockchain-donation-feature-in-my-expo-project-3c9f</link>
      <guid>https://dev.to/royson_menezes_479ed50941/how-i-integrated-the-blockchain-donation-feature-in-my-expo-project-3c9f</guid>
      <description>&lt;p&gt;Hi! In this article, I’m going to walk you through how I integrated a blockchain-based donation system into my Expo project. I’ll explain everything step-by-step in a beginner-friendly way — why we need a global Web3 provider, how WalletConnect’s projectId and RPC URLs are created and used, and how the donation flow works in the app. I’ll also show minimal code snippets from my actual project files so you can easily follow along and implement the same setup in your own app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add a global Web3 provider so all screens can access wallet state (account, signer, network).&lt;/li&gt;
&lt;li&gt;Use WalletConnect (mobile) via a projectId and RPC endpoints (Alchemy/Infura or public RPC) to talk to an Ethereum testnet/mainnet.&lt;/li&gt;
&lt;li&gt;On the donation screen user:
&lt;strong&gt;Connect wallet → select fund → enter ETH → Send transaction → wait for confirmation.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node / npm installed.&lt;/li&gt;
&lt;li&gt;Expo project (your Frontend folder).&lt;/li&gt;
&lt;li&gt;Install required packages (run in Frontend folder):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install wagmi viem @reown/appkit-wagmi-react-native @walletconnect/client 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why a global provider?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Centralizes wallet state (&lt;code&gt;useAccount&lt;/code&gt;, &lt;code&gt;useSigner&lt;/code&gt;, &lt;code&gt;useBalance&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Lets components call &lt;code&gt;sendTransaction&lt;/code&gt; / &lt;code&gt;useSendTransaction&lt;/code&gt; without reimplementing connectors.&lt;/li&gt;
&lt;li&gt;Handles: autoConnect, network switching, multiple connectors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create WalletConnect Project ID
&lt;/h2&gt;

&lt;p&gt;WalletConnect v2 uses a cloud &lt;strong&gt;projectId&lt;/strong&gt; that enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the WalletConnect modal
&lt;/li&gt;
&lt;li&gt;mobile deep-linking
&lt;/li&gt;
&lt;li&gt;session management
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without projectId, wallet connection won’t work on mobile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;&lt;a href="https://cloud.walletconnect.com" rel="noopener noreferrer"&gt;https://cloud.walletconnect.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Sign up or log in
&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Project&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;Project ID&lt;/strong&gt; (a long string)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This becomes your &lt;code&gt;PROJECT_ID&lt;/code&gt;, used by the Wagmi + WalletConnect connector.&lt;/p&gt;

&lt;p&gt;Store it in &lt;code&gt;.env&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get RPC URLs
&lt;/h2&gt;

&lt;p&gt;Wallet connectors need an RPC endpoint to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read blockchain state
&lt;/li&gt;
&lt;li&gt;get balance
&lt;/li&gt;
&lt;li&gt;simulate transactions
&lt;/li&gt;
&lt;li&gt;broadcast ETH transactions
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to get RPC&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Infura
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Create a project
&lt;/li&gt;
&lt;li&gt;Choose the network
&lt;/li&gt;
&lt;li&gt;Copy the RPC URL using your Infura project ID&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add to &lt;code&gt;.env&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WALLETCONNECT_PROJECT_ID=your_project_id_here
RPC_GOERLI=https://eth-goerli.g.alchemy.com/v2/yourKey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Web3 Provider (create file)
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/Web3Provider.tsx&lt;/code&gt; and configure chains/connectors.&lt;br&gt;&lt;br&gt;
Replace your &lt;code&gt;.env&lt;/code&gt; values where needed.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;app/Web3Provider.tsx&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;WagmiConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;configureChains&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="s2"&gt;wagmi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;publicProvider&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="s2"&gt;wagmi/providers/public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;goerli&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mainnet&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="s2"&gt;wagmi/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;WalletConnectConnector&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="s2"&gt;wagmi/connectors/walletConnect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;InjectedConnector&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="s2"&gt;wagmi/connectors/injected&lt;/span&gt;&lt;span class="dl"&gt;"&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;WALLETCONNECT_PROJECT_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WALLETCONNECT_PROJECT_ID&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;YOUR_PROJECT_ID&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&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;RPC_GOERLI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RPC_GOERLI&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.ankr.com/eth_goerli&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// configure chains &amp;amp; provider (use publicProvider or custom RPCs)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureChains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;goerli&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mainnet&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;publicProvider&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="c1"&gt;// or add jsonRpcProvider with RPC_GOERLI&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// create client with connectors&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;autoConnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;connectors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InjectedConnector&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;goerli&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mainnet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="c1"&gt;// MetaMask web&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WalletConnectConnector&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WALLETCONNECT_PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SmartVillageApp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Donate via Wallet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Web3Provider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;WagmiConfig&lt;/span&gt; &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;WagmiConfig&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use your RPC URLs if you want guaranteed RPC access.&lt;/li&gt;
&lt;li&gt;For React Native + Expo, WalletConnect deep linking behavior may need additional config; &lt;strong&gt;AppKit&lt;/strong&gt; helps simplify this.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Wrap the app root with the provider
&lt;/h2&gt;

&lt;p&gt;Edit &lt;code&gt;app/_layout.tsx&lt;/code&gt; (root layout) to include &lt;code&gt;Web3Provider&lt;/code&gt; so Wagmi hooks work everywhere.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;app/_layout.tsx&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Web3Provider&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Web3Provider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Slot&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="s2"&gt;expo-router&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Web3Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Slot&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Web3Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h2&gt;
  
  
  How donation flow works in the frontend (user steps)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;User opens &lt;strong&gt;Donation screen&lt;/strong&gt; (&lt;code&gt;app/(tabs)/villager/donation.tsx&lt;/code&gt;).&lt;br&gt;&lt;br&gt;
The app shows a &lt;strong&gt;Connect&lt;/strong&gt; button (&lt;code&gt;AppKitButton&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User taps &lt;strong&gt;Connect&lt;/strong&gt; → WalletConnect modal / MetaMask opens → user approves the connection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wagmi updates the following hooks with active wallet data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useAccount&lt;/code&gt; → wallet address
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useSigner&lt;/code&gt; → signer for sending transactions
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useBalance&lt;/code&gt; → account balance
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User selects a fund (e.g., &lt;strong&gt;education&lt;/strong&gt; or &lt;strong&gt;infrastructure&lt;/strong&gt;) and enters the donation amount.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the user clicks &lt;strong&gt;Donate&lt;/strong&gt;, the frontend sends a transaction using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;to: recipientAddress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value: parseEther(donationAmount)&lt;/code&gt; → returns a &lt;code&gt;bigint&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UI displays: &lt;strong&gt;"Waiting for Wallet..."&lt;/strong&gt; while the transaction is pending.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After the transaction is mined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;show &lt;strong&gt;Success&lt;/strong&gt; message
&lt;/li&gt;
&lt;li&gt;display &lt;strong&gt;transaction hash&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exam&lt;br&gt;
ple donate call&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;parseEther&lt;/code&gt; and &lt;code&gt;sendTransaction&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
This snippet is similar to what already exists in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// excerpt from donation.tsx (already present in your project)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valueInWei&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseEther&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;donationAmount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;sendTransaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;recipientAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;valueInWei&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;h2&gt;
  
  
  Testing locally
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use Ethereum &lt;strong&gt;testnets&lt;/strong&gt; such as &lt;strong&gt;Goerli&lt;/strong&gt; or &lt;strong&gt;Sepolia&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Postman note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You can test your backend REST APIs, but &lt;strong&gt;on-chain blockchain transactions cannot be triggered via Postman&lt;/strong&gt; because they require a wallet provider for signing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security &amp;amp; UX tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never store private keys&lt;/strong&gt; — the wallet app signs transactions securely.&lt;/li&gt;
&lt;li&gt;Validate user-entered amounts before sending the transaction.&lt;/li&gt;
&lt;li&gt;Show &lt;strong&gt;gas estimate&lt;/strong&gt; or at least inform users that gas fees exist.&lt;/li&gt;
&lt;li&gt;Disable the &lt;strong&gt;Donate&lt;/strong&gt; button while the transaction is pending.&lt;/li&gt;
&lt;li&gt;Display a &lt;strong&gt;network mismatch warning&lt;/strong&gt; if the user is connected to the wrong chain.&lt;/li&gt;
&lt;li&gt;Always develop and test on &lt;strong&gt;testnets&lt;/strong&gt;, not Mainnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If &lt;code&gt;AppKitButton&lt;/code&gt; doesn’t open WalletConnect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check if your &lt;code&gt;PROJECT_ID&lt;/code&gt; is correct.&lt;/li&gt;
&lt;li&gt;Make sure &lt;strong&gt;Expo deep linking&lt;/strong&gt; is properly configured.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;If transactions fail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify the &lt;strong&gt;RPC URL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the &lt;strong&gt;chainId&lt;/strong&gt; matches your configured chain.&lt;/li&gt;
&lt;li&gt;Ensure the signer is connected to the &lt;strong&gt;same network&lt;/strong&gt; as your contract.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;For &lt;strong&gt;Expo SDK mismatches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update your Expo version or install a matching Expo Go build.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Database Setup for Smart Village Project: A Complete Windows Guide</title>
      <dc:creator>royson menezes</dc:creator>
      <pubDate>Sat, 16 Aug 2025 14:43:12 +0000</pubDate>
      <link>https://dev.to/royson_menezes_479ed50941/database-setup-for-smart-village-project-a-complete-windows-guide-45m0</link>
      <guid>https://dev.to/royson_menezes_479ed50941/database-setup-for-smart-village-project-a-complete-windows-guide-45m0</guid>
      <description>&lt;p&gt;As a student working on the Smart Village project at St. Joseph Engineering College, Mangalore, I wanted to share my experience setting up a cloud database with PostgreSQL and integrating it with Django. This guide will walk you through the entire process I followed, from creating a cloud database to verifying the connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose a Cloud Database?
&lt;/h2&gt;

&lt;p&gt;Before diving into the setup, let me explain why I opted for a cloud database solution. A cloud-hosted database eliminates the need for local database installations, provides better accessibility across different environments, and ensures your data is available from anywhere. For this project, I chose PostgreSQL hosted on Neon.tech due to its robust features and free tier availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Creating a Cloud Database with Neon.tech
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Setting up your Neon account:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;a href="https://neon.tech" rel="noopener noreferrer"&gt;neon.tech&lt;/a&gt; and create a free account&lt;/li&gt;
&lt;li&gt;Once logged in, click on "Create Project"&lt;/li&gt;
&lt;li&gt;Enter your project name: "smart-village" (or your preferred name)&lt;/li&gt;
&lt;li&gt;Select your preferred region (choose the closest one for better performance)&lt;/li&gt;
&lt;li&gt;Choose PostgreSQL version (latest stable version recommended)&lt;/li&gt;
&lt;li&gt;Click "Create Project"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Getting your database credentials:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After project creation, Neon will provide you with connection details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt;: Your database endpoint URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database name&lt;/strong&gt;: Usually matches your project name&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: Generated automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: Provided during setup (save this securely!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port&lt;/strong&gt;: Default is 5432&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to copy and store these credentials safely as you'll need them in the following steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Local Setup with Docker and Adminer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Installing Docker Desktop:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit the &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;Docker Desktop website&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download the version compatible with your Windows system&lt;/li&gt;
&lt;li&gt;Run the installer and follow the setup wizard&lt;/li&gt;
&lt;li&gt;During installation, Docker may prompt you to enable WSL 2 (Windows Subsystem for Linux)&lt;/li&gt;
&lt;li&gt;Allow the WSL 2 update when prompted&lt;/li&gt;
&lt;li&gt;Restart your computer if required&lt;/li&gt;
&lt;li&gt;Launch Docker Desktop and wait for it to start completely&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Running Adminer with Docker:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once Docker is running, open Command Prompt or PowerShell as administrator and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -p 8080:8080 adminer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the Adminer image (if not already present)&lt;/li&gt;
&lt;li&gt;Run Adminer on port 8080&lt;/li&gt;
&lt;li&gt;Make it accessible via your web browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Accessing your database through Adminer:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your web browser and navigate to &lt;code&gt;http://localhost:8080&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You'll see the Adminer login interface&lt;/li&gt;
&lt;li&gt;Fill in your Neon database credentials:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System&lt;/strong&gt;: PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: Your Neon host URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: Your Neon username&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: Your Neon password&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Your database name&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click "Login"&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Connecting Database to Django Backend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Installing required packages:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, ensure you have the PostgreSQL adapter for Django:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install psycopg2-binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configuring Django settings:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your Django project's &lt;code&gt;settings.py&lt;/code&gt; file, update the DATABASES configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASES = {
 'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'your_database_name',
    'USER': 'your_username',
    'PASSWORD': 'your_password',
    'HOST': 'your_neon_host_url',
    'PORT': '5432',
    'OPTIONS': {
        'sslmode': 'require',
     },
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Environment variables (recommended approach):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For better security, create a &lt;code&gt;.env&lt;/code&gt; file in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_NAME=your_database_name
DB_USER=your_username
DB_PASSWORD=your_password
DB_HOST=your_neon_host_url
DB_PORT=5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update your &lt;code&gt;settings.py&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 os
load_dotenv()

DATABASES = {
 'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': os.getenv('DB_NAME'),
    'USER': os.getenv('DB_USER'),
    'PASSWORD': os.getenv('DB_PASSWORD'),
    'HOST': os.getenv('DB_HOST'),
    'PORT': os.getenv('DB_PORT'),
    'OPTIONS': {
        'sslmode': 'require',
    },
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Verifying the Database Connection
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Creating a test model:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a simple model in your Django app to test the connection. In your &lt;code&gt;models.py&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;from django.db import models

class TestModel(models.Model):
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
    return self.name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Running migrations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Execute the following commands in your project directory:&lt;/p&gt;

&lt;p&gt;Create migration files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py makemigrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply migrations to database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verifying in Adminer:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Return to Adminer in your browser (&lt;code&gt;http://localhost:8080&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Refresh the database connection&lt;/li&gt;
&lt;li&gt;Navigate to the tables section&lt;/li&gt;
&lt;li&gt;You should see your newly created tables, including the &lt;code&gt;TestModel&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;Click on the table to view its structure and confirm it matches your Django model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Additional verification steps:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run Django's database check command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py check --database default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test the connection programmatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py shell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Django shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT version()")
print(cursor.fetchone())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This setup provides a robust foundation for your  project with a cloud-hosted PostgreSQL database that's accessible from anywhere. The combination of Neon.tech's reliable hosting, Docker's containerized Adminer interface, and Django's powerful ORM creates an efficient development environment.&lt;/p&gt;

&lt;p&gt;Remember to keep your database credentials secure, regularly backup your data, and monitor your usage to stay within the free tier limits. As your project grows, you can easily scale your database resources through Neon's dashboard.&lt;/p&gt;

&lt;p&gt;The cloud-based approach ensures that team members can collaborate effectively, and the setup remains consistent across different development environments. Hope this post helped  you to setup your database requirement.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>royson menezes</dc:creator>
      <pubDate>Sun, 23 Feb 2025 14:35:27 +0000</pubDate>
      <link>https://dev.to/royson_menezes_479ed50941/-34bp</link>
      <guid>https://dev.to/royson_menezes_479ed50941/-34bp</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg" class="crayons-story__hidden-navigation-link"&gt;How I did the setup for my mobile app project (ReactNative &amp;amp; Expo)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/royson_menezes_479ed50941" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2788630%2F831688dd-0954-4420-ab26-28d166da5998.png" alt="royson_menezes_479ed50941 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/royson_menezes_479ed50941" class="crayons-story__secondary fw-medium m:hidden"&gt;
              royson menezes
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                royson menezes
                
              
              &lt;div id="story-author-preview-content-2290097" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/royson_menezes_479ed50941" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2788630%2F831688dd-0954-4420-ab26-28d166da5998.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;royson menezes&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 20 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg" id="article-link-2290097"&gt;
          How I did the setup for my mobile app project (ReactNative &amp;amp; Expo)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;12&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>development</category>
    </item>
    <item>
      <title>How I did the setup for my mobile app project (ReactNative &amp; Expo)</title>
      <dc:creator>royson menezes</dc:creator>
      <pubDate>Thu, 20 Feb 2025 15:46:50 +0000</pubDate>
      <link>https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg</link>
      <guid>https://dev.to/royson_menezes_479ed50941/how-i-did-the-setup-for-my-mobile-app-project-reactnative-expo-1icg</guid>
      <description>&lt;p&gt;Recently, I started working on a project to develop a mobile application using &lt;a href="https://reactnative.dev/docs/getting-started" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; and Expo. Since I already have some experience with these technologies, I preferred them over Flutter and Dart.&lt;/p&gt;

&lt;p&gt;In this guide, I'll walk you through the setup process, the tools required, and some common errors I encountered along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;br&gt;
Before getting started, ensure you have the following installed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Node.js &amp;amp; NVM (Node Version Manager)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Download and install Node.js from the &lt;a href="https://nodejs.org/en" rel="noopener noreferrer"&gt;official website&lt;/a&gt;. To manage multiple Node.js versions, install NVM (useful for switching versions).&lt;br&gt;
Verify the installations&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```shell
node -v    # Check Node.js version  
nvm -v     # Check NVM version  
```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Git (Optional, but Recommended)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install Git for version control and collaboration.&lt;br&gt;
Useful for pushing code to platforms like GitHub or GitLab.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a New Expo Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a new &lt;a href="https://docs.expo.dev/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt; project, run the following command and also install the required packages inside the project directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-expo-app MyReactNativeApp     #to create project
cd MyReactNativeApp    # get into project folder
npm install       # to install dependencies for the project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will generate the project directory structure and essential files like App.js and installs required packages. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Install Expo CLI Tools (optional)&lt;/strong&gt; &lt;br&gt;
Navigate to your project directory and install Expo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install expo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expo -v # Check Expo version  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Start the Project and Run It&lt;/strong&gt;&lt;br&gt;
To start your project, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expo start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx expo start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will launch Expo’s development server, allowing you to test your app on a physical device (via the Expo Go app) or an emulator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding difference with npm ,npx nvm, node etc.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;It's not a new programming language or framework—it’s simply the runtime environment that lets you run JavaScript on any machine, whether it’s a server, desktop, or even an embedded system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NPM (Node Package Manager)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;This is your go-to tool bundled with Node.js for installing and managing JavaScript packages, making it one of the largest software repositories available.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NPX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Similar to NPM, NPX comes bundled with it, but instead of just installing packages, it lets you execute them directly without needing a global install.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVM (Node Version Manager)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A handy tool that allows you to switch between different versions of Node.js easily, helping you manage compatibility without any hassle.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Errors I Encountered:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;NVM Setup:&lt;br&gt;
I experienced issues during the NVM setup due to a conflict with another version manager called Volta. If you run into similar problems, check whether Volta is interfering with your NVM installation. Alternatively, if you prefer, you can opt to use Volta instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node.js Installation Issues:&lt;br&gt;
I also encountered problems installing Node.js, which were linked to an incorrect NVM configuration. Make sure that NVM is properly set up in your environment variables—for example, ensure that your PATH includes the correct NVM directories. This setup is crucial for a smooth Node.js installation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope this guide helps you kickstart your React Native journey. Follow for more tips, tutorials, and updates on mobile app development!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Explored Python Frameworks -Here’s What Stood Out</title>
      <dc:creator>royson menezes</dc:creator>
      <pubDate>Sun, 02 Feb 2025 14:39:38 +0000</pubDate>
      <link>https://dev.to/royson_menezes_479ed50941/i-explored-python-frameworks-heres-what-stood-out-2iig</link>
      <guid>https://dev.to/royson_menezes_479ed50941/i-explored-python-frameworks-heres-what-stood-out-2iig</guid>
      <description>&lt;p&gt;If you're confused about which lightweight framework to choose for your next project, we've got you covered. Discover lightweight alternatives that pack powerful features using minimal code, helping you build efficient web applications faster.&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%2Fpbueefvqj5dbzvpaumuw.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%2Fpbueefvqj5dbzvpaumuw.png" alt="Copy of Falcon (2)" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When starting a new project, one of the biggest questions that comes to mind is: &lt;em&gt;What framework should I use?&lt;/em&gt; Each framework has its pros and cons, and in this article, we’ll dive into those to help you make an informed choice.&lt;/p&gt;

&lt;p&gt;The project I’m currently working on is called &lt;a href="https://hexmos.com/liveapi/" rel="noopener noreferrer"&gt;LiveAPI&lt;/a&gt; a super-convenient tool designed to generate API documentation at scale. We aim to make LiveAPI compatible with all web frameworks, so developers can easily create API documentation regardless of their tech stack. To achieve this, we’ve been digging deep into how various frameworks work: from how routes are managed, to the files and dependencies they rely on.&lt;/p&gt;

&lt;p&gt;Through this process, I’ve learned a lot, and I want to share those insights in this comparison article. Whether you're trying to pick the right framework for your SaaS project or want to learn something new about frameworks you haven’t explored yet, this guide has you covered.&lt;/p&gt;

&lt;p&gt;Now, let’s shift our focus to minimalist frameworks—those lightweight, no-frills tools that prioritize simplicity while still getting the job done.&lt;/p&gt;

&lt;h4&gt;
  
  
  What Are Minimalist Frameworks?
&lt;/h4&gt;

&lt;p&gt;Minimalist frameworks really cut out the unnecessary stuff and focus on the basics, making it easier and faster for you to build applications. They skip all the extra overhead that comes with larger frameworks, focusing instead on flexibility and performance. This makes them great for projects where you need to get things done quickly and efficiently.&lt;/p&gt;

&lt;p&gt;Take Bottle, Tornado, and Falcon, for example. If you want something lightweight and fast, Bottle’s single-file design is a dream. Need to handle real-time applications? Tornado has your back with its non-blocking I/O. And for blazing-fast APIs, Falcon shines with its minimal overhead—ideal for microservices. These frameworks let you focus on what truly matters, cutting out the noise.&lt;/p&gt;

&lt;p&gt;Ready to dive deeper? Let’s break them down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diving deep into Bottle, Tornado, and Falcon
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Bottle:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://bottlepy.org/docs/dev/" rel="noopener noreferrer"&gt;Bottle&lt;/a&gt;’s biggest strength lies in its simplicity and single-file deployment, making it one of the easiest frameworks to get started with. Its minimalism allows developers to focus on writing core logic without getting bogged down in configuration. Bottle integrates well with WSGI, enabling flexible routing and templating. You can quickly build small-scale applications or lightweight APIs with just the basics like request handling and templates.&lt;/p&gt;

&lt;h4&gt;
  
  
  Routing and Views in Bottle
&lt;/h4&gt;

&lt;p&gt;In Bottle, routes are just the URLs users hit to interact with your app. Super simple—just use @app.route() to define them and specify the HTTP method (GET, POST, etc.). That’s it!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/user/&amp;lt;username&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# URL pattern with a dynamic parameter
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;# Displays the username
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Bottle, you can create web pages using templates. These templates let you add dynamic content easily. Bottle has its own template engine, but you can also use Jinja2 if you want more features.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/posts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Post 1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Post 2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Post 3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;h1&amp;gt;Posts&amp;lt;/h1&amp;gt;&amp;lt;ul&amp;gt;{{!posts}}&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, {{!posts}} is a placeholder in the template that will be replaced with the list of posts.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Features of Bottle:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Simplicity and Single-File Deployment:&lt;/strong&gt; Build applications with just one file, making it quick and easy to get started without complex setups.&lt;br&gt;
&lt;strong&gt;WSGI Compatibility:&lt;/strong&gt; Easily integrates with WSGI(Web Server Gateway Interface), offering flexible routing and template management with compatibility across various web servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sotong Kitchen&lt;/strong&gt; and &lt;strong&gt;Scommerce&lt;/strong&gt; use the Bottle framework for lightweight APIs and rapid development. Its minimal footprint makes it ideal for small to medium-scale projects. For more &lt;a href="https://stackshare.io/bottle" rel="noopener noreferrer"&gt;insights&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re working on a project where speed, simplicity, and a low learning curve are key priorities, Bottle is a fantastic choice.&lt;br&gt;
For example, you could build a simple microblog application in just one file.    Continue reading the full article &lt;a href="https://journal.hexmos.com/minimalist-python-frameworks/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
