<?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: Promise Ihunna</title>
    <description>The latest articles on Forem by Promise Ihunna (@promise111).</description>
    <link>https://forem.com/promise111</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%2F612835%2F69564f54-41f3-496a-ac06-057a15bc33ec.jpeg</url>
      <title>Forem: Promise Ihunna</title>
      <link>https://forem.com/promise111</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/promise111"/>
    <language>en</language>
    <item>
      <title>Understanding Pointers in Go (Especially If You’re Coming from JavaScript)</title>
      <dc:creator>Promise Ihunna</dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:55:10 +0000</pubDate>
      <link>https://forem.com/promise111/understanding-pointers-in-go-especially-if-youre-coming-from-javascript-329a</link>
      <guid>https://forem.com/promise111/understanding-pointers-in-go-especially-if-youre-coming-from-javascript-329a</guid>
      <description>&lt;p&gt;If you are coming from JavaScript or Typescript, pointers in Go can seem overwhelming or unnecessary at first. Not because they are hard, but because it's not obvious why they matter. In JavaScript, you don't think about memory management. You just pass objects around, and voilà, everything works. So when you start seeing &lt;code&gt;*&lt;/code&gt; and &lt;code&gt;&amp;amp;&lt;/code&gt; everywhere in Go, it can start to feel a bit extra and intimidating. This was my experience too. I had a good understanding of what pointers are, but I never really got why I should care.&lt;/p&gt;

&lt;p&gt;So in this article, I’ll walk through what pointers are, how they work, and when they actually make sense to use, in a simple and easy-to-follow way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s start with a simple struct&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
    &lt;span class="n"&gt;Age&lt;/span&gt;  &lt;span class="kt"&gt;int&lt;/span&gt;  &lt;span class="s"&gt;`json:"age"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;persons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"5f919d2c-3536-4c44-8f45-ab420e089827"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Promise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"dcb70a59-2eb2-4bd4-a1e9-d7fcc089bfeb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Ben"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"f73dd3c8-5cf4-4075-b65e-1b19991fdb4f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Korede"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;18&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;We'll use this as our example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a pointer?&lt;/strong&gt;&lt;br&gt;
A pointer is just a variable that stores the memory address of another variable. Instead of holding a value itself, it holds the memory address of another variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;amp;x&lt;/code&gt; returns the address of x.&lt;/p&gt;

&lt;p&gt;So now p is pointing to where x is stored.&lt;/p&gt;

&lt;p&gt;To get the value of x back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 21&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*p&lt;/code&gt; means “go to that address and give me the value”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applying this to our struct&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;persons&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;p&lt;/code&gt; is pointing to the &lt;code&gt;persons&lt;/code&gt; slice in memory&lt;/p&gt;

&lt;p&gt;If you do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get the value sitting in that address (the actual slice)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why pointers matter&lt;/strong&gt;&lt;br&gt;
This was the part that did not click for me initially.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoiding unnecessary copying&lt;/strong&gt;&lt;br&gt;
In Go, when you pass data into a function, it gets copied. For small data, this is fine. For larger struct, it can become inefficient.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;persons&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// this works on a copy&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the slice is large, you are copying it every time.&lt;/p&gt;

&lt;p&gt;With a pointer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;persons&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// this works on the same data&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You are not copying the slice now. You are working with the same data in memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple efficiency example&lt;/strong&gt;&lt;br&gt;
Let’s say you have a large struct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;VeryLargeData&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Values&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now compare this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;VeryLargeData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time you call this function, Go copies the entire struct.&lt;/p&gt;

&lt;p&gt;Now with a pointer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;VeryLargeData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No copying. You are modifying the original data.&lt;/p&gt;

&lt;p&gt;This is one of the main reasons pointers matter in Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing state&lt;/strong&gt;&lt;br&gt;
Pointers also make it possible to work on the same data across different parts of your code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;updateAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This updates the original struct.&lt;/p&gt;

&lt;p&gt;Without a pointer, you would only modify a copy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allowing nil values&lt;/strong&gt;&lt;br&gt;
Pointers can also be nil, which is useful when a value is optional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No person yet"&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;&lt;strong&gt;Understanding &lt;code&gt;*&lt;/code&gt; and &lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
This part looks confusing at first, but it’s simple.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; means “give me the address”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;persons&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*&lt;/code&gt; means “give me the value at this address.”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One important thing&lt;/strong&gt;&lt;br&gt;
Slices in Go already behave like references in many cases. So you don’t always need a pointer to a slice. &lt;br&gt;
But you might still use one if you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modify the slice itself.&lt;/li&gt;
&lt;li&gt;make it clear you are sharing data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use pointers&lt;/strong&gt;&lt;br&gt;
A simple way to think about it:&lt;/p&gt;

&lt;p&gt;Use pointers when you are dealing with larger data or need to share state.&lt;br&gt;
For smaller values, you really do not need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final mental model&lt;/strong&gt;&lt;br&gt;
If you remember one thing, let it be this:&lt;/p&gt;

&lt;p&gt;Variables store values.&lt;br&gt;
Pointers store where those values live (memory address).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; gets the address.&lt;br&gt;
&lt;code&gt;*&lt;/code&gt; gets the value at that address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Pointers are not hard. They just feel unnecessary until you understand what problems they solve. Once that clicks, they start to make sense.&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>pointers</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Blending Supabase with Node.js &amp; React: The Ultimate Stack for Full-Stack Devs</title>
      <dc:creator>Promise Ihunna</dc:creator>
      <pubDate>Sun, 24 Aug 2025 12:20:58 +0000</pubDate>
      <link>https://forem.com/promise111/blending-supabase-with-nodejs-react-the-ultimate-stack-for-full-stack-devs-2bel</link>
      <guid>https://forem.com/promise111/blending-supabase-with-nodejs-react-the-ultimate-stack-for-full-stack-devs-2bel</guid>
      <description>&lt;p&gt;If you're building a modern web application, you've probably heard about Supabase - the open-source Firebase alternative. But have you considered how beautifully it blends with a Node.js backend and React frontend? Let me show you why this combination is a game-changer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power Trio: React + Node.js + Supabase
&lt;/h2&gt;

&lt;p&gt;Supabase provides an incredible suite of backend services that perfectly complement a React frontend and Node.js backend:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔐 Authentication Made Simple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supabase Auth integrates seamlessly with both React and Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// React component
const { user, session } = useSupabaseUser();

// Node.js middleware
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
const { data: { user } } = await supabase.auth.getUser(req.headers.authorization);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🗄️ Instant Database with Real-time Magic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL database with real-time subscriptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// React component
useEffect(() =&amp;gt; {
  const subscription = supabase
    .from('messages')
    .on('INSERT', payload =&amp;gt; {
      setMessages(messages =&amp;gt; [...messages, payload.new]);
    })
    .subscribe();

  return () =&amp;gt; supabase.removeSubscription(subscription);
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;📁 Storage Simplified&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Handle file uploads and downloads with ease:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// React file upload
const { data, error } = await supabase
  .storage
  .from('avatars')
  .upload('public/avatar1.png', file);

// Node.js serving protected files
const { data } = supabase
  .storage
  .from('bucket')
  .getPublicUrl('file-path');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⚡ Edge Functions &amp;amp; Triggers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Extend your backend logic with Supabase Functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Database trigger (via Supabase dashboard)
create function public.handle_new_user() 
returns trigger as $$
begin
  insert into public.profiles (id, username)
  values (new.id, new.raw_user_meta_data-&amp;gt;&amp;gt;username);
  return new;
end;
$$ language plpgsql security definer;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This Stack Rocks&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Reduced Backend Complexity&lt;/em&gt; - Supabase handles the heavy lifting&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Real-time Out of the Box&lt;/em&gt; - No need to set up WebSocket servers&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Scalable Architecture&lt;/em&gt; - From MVP to production with minimal changes&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Open Source&lt;/em&gt; - No vendor lock-in worries&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;TypeScript Ready&lt;/em&gt; - Excellent type support across all layers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new Supabase project &lt;/li&gt;
&lt;li&gt;Set up your React app with @supabase/supabase-js &lt;/li&gt;
&lt;li&gt;Build your Node.js API with Supabase integration &lt;/li&gt;
&lt;li&gt;Enjoy building features instead of infrastructure!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The React + Node.js + Supabase combo provides an incredibly productive environment for full-stack developers. You get all the benefits of a robust backend without the operational overhead.&lt;/p&gt;

&lt;p&gt;What's your experience been with Supabase? Share your thoughts below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>supabase</category>
      <category>node</category>
      <category>fullstack</category>
    </item>
  </channel>
</rss>
