<?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: Ladipo Samuel</title>
    <description>The latest articles on DEV Community by Ladipo Samuel (@ladipo_samuel_7cfaa827bf5).</description>
    <link>https://dev.to/ladipo_samuel_7cfaa827bf5</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg</url>
      <title>DEV Community: Ladipo Samuel</title>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ladipo_samuel_7cfaa827bf5"/>
    <language>en</language>
    <item>
      <title>My Turbin3 experience: What to Expect and How to Make the Most of It</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:08:25 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/my-turbin3-experience-what-to-expect-and-how-to-make-the-most-of-it-5d89</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/my-turbin3-experience-what-to-expect-and-how-to-make-the-most-of-it-5d89</guid>
      <description>&lt;p&gt;If you're reading this, firstly, welcome to my little talk about my experience at Turbin3! And if you've just joined the cohort, congratulations! I'm rooting for you to make it all the way to graduation.💜&lt;/p&gt;

&lt;h2&gt;
  
  
  The Classes and Instructors
&lt;/h2&gt;

&lt;p&gt;First off, I genuinely enjoyed the classes.&lt;/p&gt;

&lt;p&gt;Whenever Shrinath, Prince, or Glacier started teaching, you knew you were about to learn something. Sometimes you'd get lost halfway through an explanation 😂, but they're really good at breaking things down, and you can always ask questions.&lt;/p&gt;

&lt;p&gt;Then there were the office hours with the instructors and Meowy helped a lot, where you could revisit things you didn't fully understand, ask questions, and get insights with assignments.&lt;/p&gt;

&lt;p&gt;Big shoutout to Nate for his insights, Andreia for constantly checking up on us (her messages definitely kept my inbox busy 😂), and Varma too!&lt;/p&gt;

&lt;p&gt;At this point, you've probably met almost all the instructors through this article. And one thing I appreciated was how approachable everyone was. You didn't have to understand everything immediately. You just had to be willing to learn and ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Actually Learned
&lt;/h2&gt;

&lt;p&gt;Now, the technical side!&lt;/p&gt;

&lt;p&gt;We started by understanding how Solana works beyond simply sending transactions. We explored wallets, keypairs, transactions, accounts, and how data and programs actually live on-chain. Then we got into SPL tokens: creating token mints, working with Associated Token Accounts (ATAs), minting and transferring tokens, and creating NFTs with metadata.&lt;/p&gt;

&lt;p&gt;As we progressed, we worked with Rust and Anchor to understand how Solana programs are structured, how instructions interact with accounts, and how concepts like PDAs, account constraints, and signing fit into the bigger picture. And eventually, all that learning leads to the capstone, where you get to apply these concepts to something you're building yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My advice?&lt;/strong&gt; Prepare a little before classes, interact, and ask questions. Even if your question sounds basic, ask it. Someone else might be wondering the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Assignments (Yes, Those Assignments!!!!)
&lt;/h2&gt;

&lt;p&gt;I have to talk about these because, mehn, they can be a lot sometimes! But please, take them seriously.&lt;/p&gt;

&lt;p&gt;It's tempting to throw an assignment straight into AI and collect the solution, especially when you're stuck. But try to understand what you're building first. Read the code, experiment, break things, message your colleagues, debug, and figure out why something works.&lt;/p&gt;

&lt;p&gt;AI can help you learn faster, but don't let it do all the thinking for you.  Those assignments gradually build your problem-solving skills, and by the time you get to your capstone, you'll be glad you took them seriously. Some days will be overwhelming, but you're learning skills you'll actually need when building outside the cohort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WE'RE WAITING AND ROOTING FOR YOUUU!&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  The People You'll Meet
&lt;/h2&gt;

&lt;p&gt;This might genuinely be one of my favourite parts of the entire experience. I met some amazing people like Light, Nisarg, Hailey, Xelabyte, Sohum, and many others.&lt;/p&gt;

&lt;p&gt;Imagine being in Nigeria, wrapping up your day, while someone in another country is just getting started. Different time zones, backgrounds, experiences, and perspectives, but everyone is learning and building together.&lt;/p&gt;

&lt;p&gt;You get to hear how other people think, approach problems, and see opportunities you might never have considered. So please, don't just attend classes and disappear. Make friends, Talk to people, Collaborate, Ask what they're building. You never know where those connections might lead.&lt;/p&gt;

&lt;p&gt;And yes, &lt;strong&gt;your instructors can be your friends too!&lt;/strong&gt; They're approachable and genuinely willing to help. Just be polite, respectful, and don't be afraid to reach out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enrichment Week: Getting Closer to the Industry
&lt;/h2&gt;

&lt;p&gt;Then comes enrichment week!&lt;/p&gt;

&lt;p&gt;I like to think of this as the week where you get to connect with people already doing amazing things in the ecosystem. We had opportunities to learn from people connected to places like Superteam, the Solana Foundation, and other Web3 companies.&lt;/p&gt;

&lt;p&gt;You get to hear different perspectives on the industry, understand career opportunities, ask questions, and learn how people actually navigate the ecosystem. One piece of advice that stayed with me was to &lt;strong&gt;think about who needs what you're building before you start building it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's easy to get excited about an idea, but does it solve a problem people actually have? Is there an audience for it? That's just one of the many things I took away. Make sure you ask your own questions and collect your own lessons too, haha.&lt;/p&gt;

&lt;p&gt;Also, contribute whenever you can. Share your thoughts, participate in conversations, and don't assume your perspective doesn't matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Final Things
&lt;/h2&gt;

&lt;p&gt;Make good use of the Discord server!&lt;/p&gt;

&lt;p&gt;Seriously, don't underestimate it. Ask questions, join conversations, share your progress, help someone who's stuck, and make friends. You don't have to be the smartest person in the room. Be curious, consistent, respectful, and willing to contribute.&lt;/p&gt;

&lt;p&gt;I've summarised quite a bit here, but there's so much more you'll experience yourself, from the technical challenges to the random conversations and the excitement of finally getting something to work.&lt;/p&gt;

&lt;p&gt;And when it's time for your capstone, try to build something you're genuinely interested in, preferably something people actually need. That makes the entire experience even more rewarding.&lt;/p&gt;

&lt;p&gt;If you ever need advice or want to ask about my experience, feel free to DM me on X: &lt;a href="https://x.com/ladicodez" rel="noopener noreferrer"&gt;ladicodez&lt;/a&gt;. But remember, your instructors are also there to help you, so make good use of that access.&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;Ladipo Samuel&lt;/strong&gt;, a former Software Engineering Intern at Microsoft, 12x hackathon winner, DevRel Engineer, and now a proud Turbin3 graduate!&lt;/p&gt;

&lt;p&gt;Wishing you the very best throughout your journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good luck, and happy building! 💜&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>education</category>
      <category>learning</category>
      <category>web3</category>
    </item>
    <item>
      <title>really good read</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 05 Oct 2026 18:36:05 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/really-good-read-3bhh</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/really-good-read-3bhh</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl" class="crayons-story__hidden-navigation-link"&gt;Building an SPL Token on Solana: Minting Tokens and Understanding ATAs&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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" alt="ladipo_samuel_7cfaa827bf5 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ladipo_samuel_7cfaa827bf5" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ladipo Samuel
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ladipo Samuel
                
                
              
              &lt;div id="story-author-preview-content-4802909" 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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ladipo Samuel&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/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 5&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/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl" id="article-link-4802909"&gt;
          Building an SPL Token on Solana: Minting Tokens and Understanding ATAs
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devrel"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devrel&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>blockchain</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>Building an SPL Token on Solana: Minting Tokens and Understanding ATAs</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 05 Oct 2026 18:15:08 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-minting-tokens-and-understanding-atas-3hpl</guid>
      <description>&lt;p&gt;So far, our token has a Mint and metadata, but technically, nobody owns any of it yet. We haven't minted a single token, which means the supply is still zero.&lt;br&gt;
The next step seems obvious: mint some tokens. But while doing this, I ran into another question that helped me understand Solana better: when tokens are minted, where exactly do they go?&lt;br&gt;
&lt;strong&gt;Your tokens don't actually sit in your wallet&lt;/strong&gt;&lt;br&gt;
At first, it's easy to think of a wallet as one account containing everything you own. On Solana, SPL tokens work a little differently. Your wallet controls them, but the balances themselves live in separate Token Accounts.&lt;/p&gt;

&lt;p&gt;If I own three different tokens, I can picture it 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;My Wallet
│
├── Token Account for Token A → 50
├── Token Account for Token B → 100
└── Token Account for Token C → 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each Token Account is for one specific Mint. This means the account holding my balance of Token A isn't the same account holding my balance of Token B.&lt;br&gt;
This is where Associated Token Accounts, or ATAs, come in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding the ATA&lt;/strong&gt;&lt;br&gt;
An ATA is the standard Token Account for a specific wallet and Mint combination.&lt;br&gt;
I find it easier to think of it as answering this question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where should this wallet's balance of this particular token live?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Given the wallet and Mint, we can deterministically derive its ATA, meaning the same wallet and Mint will always lead us to the same ATA address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wallet + Mint
     ↓
    ATA
     ↓
Balance of that token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So my wallet can have one ATA for the token we're building, while another wallet will have a different ATA for the exact same token.&lt;br&gt;
In the code, we derive ours like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const [ata] = await findAssociatedTokenPda({&lt;br&gt;
  mint,&lt;br&gt;
  owner: signer.address,&lt;br&gt;
  tokenProgram: TOKEN_PROGRAM_ADDRESS,&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Something from the architecture article shows up again here: finding an address doesn't necessarily mean an account exists there yet. We know where our ATA should be, but if it hasn't been created on-chain, we still need to create it.&lt;br&gt;
Once that account exists, we finally have somewhere to send our tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now we can actually mint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Minting means creating new units of our token and sending them to a Token Account.&lt;br&gt;
So underneath the SDK functions, what we're really asking the Token Program to do is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Our Mint
   │
   │ create new token units
   ▼
Our ATA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But we can't just mint tokens whenever we want. When we initialized the Mint earlier, we assigned a mint authority. That authority is what gives our wallet permission to create new units of the token. Knowing the Mint address alone isn't enough to increase its supply.&lt;br&gt;
Decimals matter here too. Our Mint uses 6 decimals, so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 token = 1,000,000 base units
100 tokens = 100,000,000 base units
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What actually changed?&lt;/strong&gt;&lt;br&gt;
This is probably the simplest way to see what minting did. Once the ATA has been created, but before minting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mint Account
Supply: 0

ATA
Balance: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We mint 100 tokens into our ATA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mint Account
Supply: 100
      │
      │ mint
      ▼
ATA
Balance: 100

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

&lt;/div&gt;



&lt;p&gt;Two pieces of state changed. The Mint's total supply increased because 100 new tokens now exist, and our ATA's balance increased because that's where those tokens were sent.&lt;br&gt;
That distinction ties everything together for me where the Mint keeps track of the token itself and its overall supply, while Token Accounts keep track of who holds how much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where we are now&lt;/strong&gt;&lt;br&gt;
We've gradually moved from defining a token to actually having tokens that can be used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create Mint
     ↓
Add Metadata
     ↓
Derive/Create ATA
     ↓
Mint Tokens
     ↓
Our ATA now holds them
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, we finally have actual token units sitting in an account controlled by our wallet.&lt;br&gt;
But tokens become more interesting when they can move. So the next question is: if I want to send some of these tokens to another wallet, what exactly happens to my ATA, their ATA and the Mint's total supply?&lt;br&gt;
That's where we'll pick up with SPL token transfers.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>solana</category>
    </item>
    <item>
      <title>Building an SPL Token on Solana: Adding Metadata</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Sat, 03 Oct 2026 17:08:59 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-adding-metadata-e5f</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-on-solana-adding-metadata-e5f</guid>
      <description>&lt;p&gt;In the previous part, we created and initialized an SPL Token Mint on Solana Devnet. At that point, the Mint existed on-chain with its decimals and authorities configured, but we hadn't really given it an identity yet.&lt;br&gt;
That brings us to metadata. When we see a token with a name, symbol and other descriptive information, where does that information come from? Before jumping into the code, I wanted to understand where all of that information actually lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Mint and its metadata are not the same thing&lt;/strong&gt;&lt;br&gt;
One thing that helped me understand this was separating the Mint Account from the metadata attached to it. The Mint Account handles the token itself. It stores information such as the token’s decimals, supply, mint authority and freeze authority. It does not directly store things like the token’s name, symbol or image.&lt;br&gt;
That information lives separately as metadata. In our case, we use the Metaplex Token Metadata program, a Solana program for creating and managing metadata for tokens and NFTs. So instead of adding a name or symbol directly to the Mint Account, we create another account that holds this information and connects it back to the Mint.&lt;br&gt;
I like to picture it this way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mint Account
├── Supply
├── Decimals
├── Mint Authority
└── Freeze Authority

        ↓ associated with

Metadata Account
├── Name
├── Symbol
└── URI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Mint is still the identity of the token on Solana. The metadata simply gives applications and people more useful information about what that token represents.&lt;br&gt;
This also explains why we needed the Mint address from the previous part. When creating the metadata, we have to tell the metadata program exactly which Mint this information belongs to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the URI actually point to?&lt;/strong&gt;&lt;br&gt;
The metadata account can store information like the token's name and symbol, but we don't want to put every piece of information directly on-chain. Things like an image, description, or other details can be stored elsewhere and referenced through a URI.&lt;br&gt;
Think of the URI as a link pointing to another metadata file that contains more information about the token. That file can look something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My Token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MTK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A token created while learning SPL tokens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Adding the metadata&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With that in mind, the code started making a lot more sense to me. We already have the Mint address from the previous part, so the first thing we do is reference that same Mint and load our wallet as the signer.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_MINT_ADDRESS&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;umi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUmi&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://api.devnet.solana.com&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;keypair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eddsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createKeypairFromSecretKey&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;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&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;signer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSignerFromKeypair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;signerIdentity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, Umi is the toolkit we're using to interact with Metaplex. We connect it to Devnet, reconstruct our signer from the wallet we already have, and tell Umi to use that signer for the operations we're about to perform.&lt;br&gt;
We then define which Mint the metadata belongs to and provide the information we want associated with it: things like the token's name, symbol and URI. The important part for me was understanding what we were asking the program to do: create metadata for this specific Mint, with its mint authority authorizing the operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually changed?&lt;/strong&gt;&lt;br&gt;
After the transaction is sent and confirmed, we haven't created any new tokens. Our Mint still represents the same token, and this operation doesn't suddenly increase its supply.&lt;br&gt;
What we've done is associate a metadata account with it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mint
│
├── decimals
├── supply
└── authorities
        │
        └── associated Metadata
              ├── name
              ├── symbol
              └── URI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We aren't modifying the Mint to squeeze a name, image and description into it. The Mint and its metadata have different responsibilities, but they are connected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where we are now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So far, we've created the Mint and added metadata to give it a recognizable identity. But there is still one important thing missing: we haven't actually minted any token units yet. Which leaves us with the next question: &lt;strong&gt;when we mint tokens, where do they actually go?&lt;/strong&gt;&lt;br&gt;
That takes us into Token Accounts and Associated Token Accounts (ATAs), which is what we'll look at next.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Building an SPL Token: Creating the Mint</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Sat, 05 Sep 2026 15:30:18 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-creating-the-mint-gi7</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/building-an-spl-token-creating-the-mint-gi7</guid>
      <description>&lt;p&gt;Now that we have a mental model of how Solana works, it’s time to actually use it.&lt;/p&gt;

&lt;p&gt;We’ve talked about accounts holding state, programs containing the logic, instructions telling those programs what to do, and transactions bringing those instructions together. Creating an SPL Token Mint is a good place to see all of those concepts working together.&lt;/p&gt;

&lt;p&gt;In this part, we’ll create and initialize an SPL Token Mint on Solana Devnet, but more importantly, we’ll break down what is actually happening underneath the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, what exactly is a Mint?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I tell Solana to give someone 100 of a particular token, Solana first needs to know what that token is. What defines it? How divisible is it? How many units currently exist? Who has the authority to create more? That is where the Mint Account comes in.&lt;/p&gt;

&lt;p&gt;A Mint Account represents a particular type of token on Solana. It stores information about that token such as its current supply, decimals, mint authority and optional freeze authority. It does not store how many tokens I personally own. That belongs somewhere else, which we’ll get to when we talk about Token Accounts and ATAs.&lt;/p&gt;

&lt;p&gt;A simple way to separate the two is this: the Mint tells us what token exists, while a Token Account tells us how much of that token a particular owner holds. Before looking at any code, the complete process for creating our Mint looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to Solana Devnet&lt;/li&gt;
&lt;li&gt;Load our wallet&lt;/li&gt;
&lt;li&gt;Generate a new keypair for the Mint&lt;/li&gt;
&lt;li&gt;Calculate how much space a Mint Account needs&lt;/li&gt;
&lt;li&gt;Calculate the lamports required for the account&lt;/li&gt;
&lt;li&gt;Ask the System Program to create the account&lt;/li&gt;
&lt;li&gt;Ask the Token Program to initialize it as a Mint&lt;/li&gt;
&lt;li&gt;Put both instructions inside a transaction&lt;/li&gt;
&lt;li&gt;Sign the transaction&lt;/li&gt;
&lt;li&gt;Send and confirm it on Solana&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are quite a few SDK functions involved when implementing this, but underneath all that syntax, this is really what the entire spl_init.ts file is doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting with the wallet and Mint address&lt;/strong&gt;&lt;br&gt;
We first load our wallet and turn it into a signer. The wallet is important because someone has to pay the transaction fee and authorize the operations that require a signature.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createKeyPairSignerFromBytes&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;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wallet&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;The exact SDK function isn't the important part here. What matters is that we now have a signer that represents our wallet and can be used when constructing the transaction.&lt;br&gt;
Next, we generate a new keypair for the Mint.&lt;/p&gt;

&lt;p&gt;const mint = await generateKeyPairSigner();&lt;/p&gt;

&lt;p&gt;There is an important distinction here. Generating this keypair does not create anything on Solana. At this point, we simply have a new keypair locally and a public address that we intend to use for our Mint. Solana does not have an account at that address yet. We still have to create one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating the account before creating the Mint&lt;/strong&gt;&lt;br&gt;
This is where Solana's account model becomes important. Programs contain the logic, while accounts hold state. Since a Mint needs to store information like supply, decimals and authorities, that information needs somewhere to live.&lt;/p&gt;

&lt;p&gt;Before creating the account, we calculate how much storage a Mint requires and how many lamports are needed for an account of that size.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mintSpace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getMintSize&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;rent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMinimumBalanceForRentExemption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mintSpace&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we know the amount of space to allocate and how much to fund the account with.&lt;br&gt;
The next instruction asks the System Program to create the account.&lt;/p&gt;

&lt;p&gt;const createAccountIx = getCreateAccountInstruction({&lt;br&gt;
  payer: signer,&lt;br&gt;
  newAccount: mint,&lt;br&gt;
  lamports: rent,&lt;br&gt;
  space: mintSpace,&lt;br&gt;
  programAddress: TOKEN_PROGRAM_ADDRESS,&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;Reading this without focusing too much on the syntax makes it fairly straightforward. Our wallet is paying, mint is the new account we want to create, lamports funds it, space determines how much storage it gets, and TOKEN_PROGRAM_ADDRESS says that the Token Program will own the account.&lt;br&gt;
That last part is important because on Solana, an account's owner is a program, not necessarily the person we might casually describe as owning something. The owner program is the program allowed to modify that account's data according to its rules.&lt;/p&gt;

&lt;p&gt;At this stage, however, we have only described how the account should be created. We still haven't told the Token Program that this account should behave as a Mint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turning the account into a Mint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where the second instruction comes in.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initializeMintIx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getInitializeMintInstruction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mint&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="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;mintAuthority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;signer&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="na"&gt;freezeAuthority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;signer&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first instruction says, “create this account.” The second says, “initialize this account as a Mint.”&lt;/p&gt;

&lt;p&gt;This is also where we configure some of the Mint's properties. With decimals: 6, one whole token can be represented as 1,000,000 base units. We also set our wallet as the mintAuthority, which gives it the authority to create new units of this token.&lt;/p&gt;

&lt;p&gt;One distinction worth understanding here is Token Program ownership versus mint authority. The Token Program owns the Mint Account and enforces the rules around how its data can change. Our wallet being the mint authority simply means it has permission, under those rules, to authorize the creation of new token units. They are two completely different responsibilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instructions are not transactions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another useful distinction is that creating these instruction objects has still not changed anything on-chain.&lt;br&gt;
An instruction is essentially a description of an operation we want a Solana program to perform. At this point, we have prepared two of them: one for the System Program to create the account and another for the Token Program to initialize it.&lt;br&gt;
We then put both into a transaction, and their order matters. The System Program has to create the account before the Token Program can initialize it as a Mint.&lt;/p&gt;

&lt;p&gt;Conceptually, the transaction looks like this:&lt;br&gt;
Transaction&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Instruction 1
  System Program → Create Account

  Instruction 2
  Token Program → Initialize Mint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The transaction also needs a fee payer and a recent blockhash. The fee payer is the account paying the network fee, while the recent blockhash gives the transaction a validity window and helps prevent old transactions from being replayed indefinitely.&lt;br&gt;
Once everything is assembled, the required signers sign the transaction. Signing is essentially authorization. It proves that the required keys approved the transaction.&lt;/p&gt;

&lt;p&gt;Only after we send that signed transaction to Solana does the work we've been preparing actually happen on-chain.&lt;br&gt;
The System Program creates the account first, then the Token Program initializes it as a Mint. Once the transaction is confirmed, we get our Mint address and transaction signature. The Mint address identifies our newly created token Mint, while the transaction signature identifies the transaction and can be used to inspect what happened on-chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have we created any tokens yet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and this is probably the most important distinction in the entire process.&lt;/p&gt;

&lt;p&gt;Creating a Mint is not the same thing as minting tokens.&lt;br&gt;
At this point, we have defined a token on Solana. It has an address, decimals and authorities, but its supply is still zero. We haven't created any actual token units or given them to anyone yet.&lt;br&gt;
The way I like to think about the state we're currently in is:&lt;br&gt;
Mint Account&lt;br&gt;
What token exists? → Done&lt;/p&gt;

&lt;p&gt;Token Supply&lt;br&gt;
How many tokens have been created? → 0&lt;/p&gt;

&lt;p&gt;Token Account&lt;br&gt;
Who holds how many tokens? → Not created yet&lt;br&gt;
So if I had to explain the whole spl_init.ts file in one sentence, it would be this:&lt;/p&gt;

&lt;p&gt;We generated an address for our Mint, asked the System Program to create an account there, asked the Token Program to initialize that account as a Mint, then packaged those instructions into a transaction, signed it and sent it to Solana.&lt;br&gt;
We now have the foundation for our token, but an address alone isn't very descriptive. We still need a way to associate information like a name, symbol and URI with it.&lt;br&gt;
That is what we will treat next with &lt;strong&gt;metadata.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>crypto</category>
      <category>tutorial</category>
      <category>web3</category>
    </item>
    <item>
      <title>Building on Solana with Turbin3: Understanding the Architecture First</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Fri, 04 Sep 2026 17:37:56 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/building-on-solana-with-turbin3-understanding-the-architecture-first-2fm8</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/building-on-solana-with-turbin3-understanding-the-architecture-first-2fm8</guid>
      <description>&lt;p&gt;I recently started building with Turbin3, and before getting deeper into SPL tokens, NFTs and Anchor, I wanted to properly understand what is actually happening underneath the code.&lt;/p&gt;

&lt;p&gt;I’ve worked with other ecosystems before, including Sui and Cardano, and one thing I’ve noticed is that every blockchain has its own way of structuring things. With Solana, concepts like accounts, programs, instructions, transactions, PDAs and CPI come up almost everywhere. Once I started seeing how they connect instead of learning each one separately, the architecture became much easier to understand.&lt;/p&gt;

&lt;p&gt;So before getting into tokens and writing more code, I wanted to start with the mental model I currently use for Solana.&lt;/p&gt;

&lt;h2&gt;
  
  
  The simplest way I understand Solana
&lt;/h2&gt;

&lt;p&gt;When I perform an action on Solana, I picture the flow like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wallet
   ↓
Transaction
   ↓
Instruction(s)
   ↓
Program
   ↓
Accounts
   ↓
State changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;My wallet signs a transaction. That transaction contains one or more instructions, and each instruction tells a particular program what action I want it to perform and which accounts are involved. The program processes that instruction, and if everything is valid, the relevant accounts are updated.&lt;/p&gt;

&lt;p&gt;That simple flow helped me connect most of the concepts I was learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programs contain logic, accounts contain state
&lt;/h2&gt;

&lt;p&gt;This was one of the first distinctions that made Solana easier for me to reason about.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;program&lt;/strong&gt; contains the logic and rules for what can happen, while &lt;strong&gt;accounts&lt;/strong&gt; are where data or state lives.&lt;/p&gt;

&lt;p&gt;For example, imagine I’m building an escrow. The program could contain the rules for depositing, releasing and refunding funds, while an account could store information such as the sender, receiver, amount and current status of that escrow.&lt;/p&gt;

&lt;p&gt;Coming from backend development, I loosely think about it like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program ≈ backend logic
Account ≈ stored state/data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It’s not a perfect comparison, but it gives me a useful starting point.&lt;/p&gt;

&lt;p&gt;Another thing that initially needed some clarification was &lt;strong&gt;account ownership&lt;/strong&gt;. When we say an account is owned by a program, we are not talking about the person who controls a wallet. The owner is the program that has authority to modify that account’s data according to Solana’s rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instructions tell programs what to do
&lt;/h2&gt;

&lt;p&gt;Once programs and accounts make sense, instructions become much easier to understand.&lt;/p&gt;

&lt;p&gt;An instruction is basically a request for a specific program to perform an action. For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System Program → Create an account
Token Program  → Mint tokens
Token Program  → Transfer tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;An instruction needs to identify the &lt;strong&gt;program being called&lt;/strong&gt;, the &lt;strong&gt;accounts involved&lt;/strong&gt;, and the &lt;strong&gt;data describing what should happen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I think about an instruction as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program  → Who should execute this?
Accounts → What accounts are involved?
Data     → What should the program do?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The accounts passed into an instruction can also have different roles. A &lt;strong&gt;signer&lt;/strong&gt; means authorization from that account is required, while a &lt;strong&gt;writable&lt;/strong&gt; account is one whose state may be changed by the instruction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transactions bring instructions together
&lt;/h2&gt;

&lt;p&gt;An instruction describes an action, but a &lt;strong&gt;transaction&lt;/strong&gt; is what packages one or more of those actions together and sends them to Solana.&lt;/p&gt;

&lt;p&gt;For example, when we create an SPL Token Mint later, one transaction can contain:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction
   │
   ├── Instruction 1
   │      System Program → Create Account
   │
   └── Instruction 2
          Token Program → Initialize Mint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is something I found useful to understand early: &lt;strong&gt;creating the account and initializing it as a Mint are actually two different operations&lt;/strong&gt;, even though we can put both instructions inside the same transaction.&lt;/p&gt;

&lt;p&gt;The transaction also contains things like the required signatures, a fee payer and a recent blockhash. The fee payer pays for the transaction, while the recent blockhash helps keep the transaction fresh and prevents old transactions from being reused indefinitely.&lt;/p&gt;

&lt;p&gt;Once the required signatures are there, the transaction is sent to the network, validators process its instructions, and the state of the relevant accounts can change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where do PDAs fit into this?
&lt;/h2&gt;

&lt;p&gt;PDAs, or &lt;strong&gt;Program Derived Addresses&lt;/strong&gt;, sounded more complicated to me at first than they actually turned out to be.&lt;/p&gt;

&lt;p&gt;A PDA is an address derived from:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program ID + Seeds + Bump → PDA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Unlike a normal wallet address, a PDA has &lt;strong&gt;no private key&lt;/strong&gt;. It is derived to be off the Ed25519 curve, so there isn’t a normal keypair sitting somewhere that can sign for it.&lt;/p&gt;

&lt;p&gt;Instead, the Solana runtime allows the program associated with that PDA to act with its authority when the correct seeds and bump are provided.&lt;/p&gt;

&lt;p&gt;This makes PDAs useful for things like program state, vaults and escrows.&lt;/p&gt;

&lt;p&gt;For example, an escrow program could derive an address using:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"escrow" + user wallet + escrow id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Because the derivation is deterministic, the same inputs will always lead to the same PDA.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;bump&lt;/strong&gt; is an extra byte used during this process to find a valid off-curve PDA.&lt;/p&gt;

&lt;p&gt;One distinction I also found important is that &lt;strong&gt;deriving a PDA does not create an account&lt;/strong&gt;. Derivation only gives us an address. If we want an actual account there to hold data or lamports, that account still needs to be created.&lt;/p&gt;

&lt;h2&gt;
  
  
  CPI is how programs work with other programs
&lt;/h2&gt;

&lt;p&gt;The last piece of this mental model is &lt;strong&gt;CPI&lt;/strong&gt;, or Cross Program Invocation.&lt;/p&gt;

&lt;p&gt;CPI simply means one Solana program calling another program.&lt;/p&gt;

&lt;p&gt;Suppose I build an escrow program that needs to transfer tokens. My program doesn’t need to implement the Token Program’s functionality itself. It can invoke the Token Program:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Escrow Program
      ↓ CPI
Token Program
      ↓
Transfer tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That ability for programs to invoke other programs is a big part of how programs compose on Solana.&lt;/p&gt;

&lt;p&gt;PDAs also become useful here. If a PDA needs to act as an authority during a CPI, the program can provide the PDA’s seeds and bump, allowing the runtime to verify that the PDA was derived by that program.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I approach Solana code now
&lt;/h2&gt;

&lt;p&gt;One thing I’m trying to avoid while learning Solana is memorizing SDK functions without understanding why I’m calling them.&lt;/p&gt;

&lt;p&gt;Instead, when I see a piece of Solana code, I first try to figure out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What program am I calling?&lt;/li&gt;
&lt;li&gt;What accounts does it need?&lt;/li&gt;
&lt;li&gt;Which accounts need to sign?&lt;/li&gt;
&lt;li&gt;Which accounts can change?&lt;/li&gt;
&lt;li&gt;What instruction am I asking the program to perform?&lt;/li&gt;
&lt;li&gt;Is another program being called through CPI?&lt;/li&gt;
&lt;li&gt;Is there a PDA involved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I can answer those questions, the SDK functions start to feel more like tools for expressing something I already understand rather than random functions I need to memorize.&lt;/p&gt;

&lt;p&gt;So the mental model I’m taking forward is still:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wallet
   ↓
Transaction
   ↓
Instruction(s)
   ↓
Program
   ↓
Accounts
   ↓
State changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;With two important additions:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program A → CPI → Program B

Program ID + Seeds + Bump → PDA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That’s the foundation I wanted to get right before moving deeper into SPL tokens and NFTs.&lt;/p&gt;

&lt;p&gt;In the next part, we’ll put this architecture into practice by creating an &lt;strong&gt;SPL Token Mint on Solana Devnet&lt;/strong&gt;. That’s where we’ll see the System Program, Token Program, accounts, instructions, signers and transactions actually come together in code.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>dockerizing your fastapi application</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Thu, 16 Jul 2026 09:30:20 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/dockerizing-your-fastapi-application-4hi9</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/dockerizing-your-fastapi-application-4hi9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6" class="crayons-story__hidden-navigation-link"&gt;Docker Series Part 3: Dockerizing Your First Application.&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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" alt="ladipo_samuel_7cfaa827bf5 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ladipo_samuel_7cfaa827bf5" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ladipo Samuel
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ladipo Samuel
                
              
              &lt;div id="story-author-preview-content-4157029" 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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ladipo Samuel&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/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 16&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/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6" id="article-link-4157029"&gt;
          Docker Series Part 3: Dockerizing Your First Application.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>api</category>
      <category>docker</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Docker Series Part 3: Dockerizing Your First Application.</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Thu, 16 Jul 2026 09:30:02 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/docker-series-part-3dockerizing-your-first-application-1ji6</guid>
      <description>&lt;p&gt;In the first two parts of this series, we focused on understanding Docker.&lt;/p&gt;

&lt;p&gt;We talked about why Docker was created, why the infamous "works on my machine" problem existed for years, and how Docker solved it. We also looked behind the scenes at Docker's architecture and understood the relationship between the Docker Client, Docker Engine, Docker Hub, Images, and Containers.&lt;/p&gt;

&lt;p&gt;Now it's time to put all of that knowledge into practice.&lt;/p&gt;

&lt;p&gt;Today, we'll take a simple FastAPI project and package it into a Docker Image that can run consistently across different environments. The project itself is intentionally small because the goal isn't to learn FastAPI: it's to understand how Docker packages applications.&lt;/p&gt;

&lt;p&gt;I'll also attach the GitHub repository used in this article so you can clone it and follow along.&lt;/p&gt;

&lt;p&gt;github link: &lt;a href="https://github.com/ladicodes/docker-demo" rel="noopener noreferrer"&gt;https://github.com/ladicodes/docker-demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our Project&lt;/p&gt;

&lt;p&gt;Before introducing Docker, our project looks like this:&lt;/p&gt;

&lt;p&gt;docker-workshop-api/&lt;br&gt;
│&lt;br&gt;
├── main.py&lt;br&gt;
├── requirements.txt&lt;br&gt;
└── README.md&lt;/p&gt;

&lt;p&gt;At this stage, it's just another Python application.&lt;/p&gt;

&lt;p&gt;It works because our machine already has Python installed, along with every dependency the project requires.&lt;/p&gt;

&lt;p&gt;But if we send this same project to another developer, they may run into completely different problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different Python versions&lt;/li&gt;
&lt;li&gt;Missing dependencies&lt;/li&gt;
&lt;li&gt;Different operating systems&lt;/li&gt;
&lt;li&gt;Different environment configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly the kind of inconsistency Docker was designed to eliminate. Instead of sending just our source code, Docker allows us to package the entire runtime environment alongside the application.&lt;/p&gt;

&lt;p&gt;The Dockerfile: Docker's Instruction Manual&lt;br&gt;
Docker doesn't magically understand how to package your application. You have to tell it exactly what to do: that's where the Dockerfile comes in.&lt;/p&gt;

&lt;p&gt;A Dockerfile is simply a text file containing step-by-step instructions Docker follows to build an Image.&lt;/p&gt;

&lt;p&gt;Let's build ours one instruction at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Choosing a Base Image&lt;/strong&gt;&lt;br&gt;
FROM python:3.12-slim&lt;/p&gt;

&lt;p&gt;Every Docker Image starts from another Image. Instead of installing Python ourselves, we're using the official Python Image published on Docker Hub.&lt;br&gt;
You'll also notice we're using python:3.12-slim instead of the regular Python Image.&lt;/p&gt;

&lt;p&gt;The slim variant removes unnecessary packages while keeping everything needed to run Python applications. This produces smaller Images, which means faster downloads, quicker deployments, and lower storage usage. We'll go much deeper into Image optimization in Part 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Setting the Working Directory&lt;/strong&gt;&lt;br&gt;
WORKDIR /app&lt;/p&gt;

&lt;p&gt;Think of this as running:&lt;/p&gt;

&lt;p&gt;cd /app&lt;/p&gt;

&lt;p&gt;inside the container.&lt;/p&gt;

&lt;p&gt;From this point onward, every instruction in the Dockerfile executes relative to this directory. Having a dedicated working directory keeps the Image organized and prevents files from being scattered throughout the filesystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Copying Dependencies First&lt;/strong&gt;&lt;br&gt;
COPY requirements.txt .&lt;/p&gt;

&lt;p&gt;This line copies only the dependency file into the Image. You might be wondering: Why not copy everything immediately?&lt;br&gt;
The answer is Docker Layers. Docker builds Images layer by layer.&lt;/p&gt;

&lt;p&gt;If your dependencies rarely change but your application code changes frequently, Docker can reuse the dependency layer during future builds instead of reinstalling everything from scratch. That dramatically speeds up build times. It's a small decision now that saves minutes later in larger projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Installing Dependencies&lt;/strong&gt;&lt;br&gt;
RUN pip install --no-cache-dir -r requirements.txt&lt;/p&gt;

&lt;p&gt;The RUN instruction executes commands while the Image is being built. Here, Docker installs every package listed in requirements.txt.&lt;/p&gt;

&lt;p&gt;The --no-cache-dir flag tells pip not to keep unnecessary installation cache files, helping reduce the final Image size. Every instruction like this becomes part of the final Image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Copying the Application&lt;/strong&gt;&lt;br&gt;
COPY . .&lt;/p&gt;

&lt;p&gt;Now that our dependencies are installed, we copy the rest of the project into the Image. At this point, Docker has everything it needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application code&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Runtime environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application has officially been packaged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Documenting the Application Port&lt;/strong&gt;&lt;br&gt;
EXPOSE 8000&lt;/p&gt;

&lt;p&gt;This tells anyone using the Image that the application is expected to listen on port 8000. It's worth noting that EXPOSE doesn't automatically make the application accessible from your computer. It simply documents which port the application uses inside the container.&lt;/p&gt;

&lt;p&gt;We'll map that port when we actually run the container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Starting the Application&lt;/strong&gt;&lt;br&gt;
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]&lt;/p&gt;

&lt;p&gt;This instruction defines what should happen whenever a container starts from this Image. In our case, Docker launches the FastAPI application using Uvicorn.&lt;/p&gt;

&lt;p&gt;You may notice the application listens on:&lt;/p&gt;

&lt;p&gt;0.0.0.0&lt;br&gt;
This often confuses beginners. 0.0.0.0 isn't the address you'll open in your browser. Instead, it tells the application to listen on all available network interfaces inside the container.&lt;/p&gt;

&lt;p&gt;From your own computer, you'll access the application through:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;, by entering uvicorn main:app --reload&lt;/p&gt;

&lt;p&gt;because Docker maps your computer's port to the container's port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building Our First Docker Image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that our Dockerfile is complete, it's time to package the application.&lt;/p&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;docker build -t docker-workshop-api .&lt;/p&gt;

&lt;p&gt;Let's quickly break this command down.&lt;/p&gt;

&lt;p&gt;docker build: Builds a Docker Image.&lt;/p&gt;

&lt;p&gt;-t: Assigns a name (tag) to the Image.&lt;/p&gt;

&lt;p&gt;docker-workshop-api: The name we'll use whenever we want to create containers from this Image.&lt;/p&gt;

&lt;p&gt;dot(.): Perhaps the most overlooked part of the command. The dot tells Docker to use the current folder as the build context, allowing it to locate the Dockerfile and every file referenced by COPY.&lt;br&gt;
Once the build completes, you can confirm the Image exists by running: docker images&lt;/p&gt;

&lt;p&gt;You'll now see your newly created Image listed locally. At this point, nothing is running yet. You've simply created the package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating a Running Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we can create a running application from that Image.&lt;/p&gt;

&lt;p&gt;docker run -p 8000:8000 docker-workshop-api&lt;/p&gt;

&lt;p&gt;This is where many beginners accidentally mix up Images and Containers.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;p&gt;An Image is the package. A Container is the running instance of that package.&lt;/p&gt;

&lt;p&gt;The docker run command creates a brand-new Container from the Image before starting the application.&lt;/p&gt;

&lt;p&gt;The -p 8000:8000 flag maps:&lt;/p&gt;

&lt;p&gt;Your Computer (8000)&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Container (8000)&lt;/p&gt;

&lt;p&gt;This allows your browser to communicate with the application running inside Docker.&lt;/p&gt;

&lt;p&gt;If everything goes well, you'll see something similar to:&lt;/p&gt;

&lt;p&gt;INFO: Uvicorn running on &lt;a href="http://0.0.0.0:8000" rel="noopener noreferrer"&gt;http://0.0.0.0:8000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although the application listens on 0.0.0.0 inside the container, you should open:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:8000/docs" rel="noopener noreferrer"&gt;http://localhost:8000/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there, FastAPI's interactive documentation lets you test every endpoint and confirm your application is running successfully inside Docker.&lt;/p&gt;

&lt;p&gt;Where We Go From Here&lt;/p&gt;

&lt;p&gt;Congratulations.&lt;/p&gt;

&lt;p&gt;You've just Dockerized your first application.&lt;/p&gt;

&lt;p&gt;More importantly, you've connected the concepts we've covered throughout this series:&lt;/p&gt;

&lt;p&gt;Python Project&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Dockerfile&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
docker build&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Docker Image&lt;br&gt;
        │&lt;br&gt;
docker run&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Docker Container&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Running Application&lt;/p&gt;

&lt;p&gt;Understanding this flow is far more valuable than memorizing commands because every Docker project, whether it's a personal project or a production system follows this same journey.&lt;/p&gt;

&lt;p&gt;But we're not done yet. Our application works, but there are still important questions to answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why are some Docker Images over 1GB, while others are only a few hundred megabytes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do some projects rebuild in 5 seconds, while others take 5 minutes?&lt;br&gt;
How do production teams build Images that are smaller, faster, and more secure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's exactly what we'll explore in Part 4, where we'll dive into Docker layers, caching, .dockerignore, base Images, and practical techniques for optimizing Docker Images like experienced engineers.&lt;/p&gt;

&lt;p&gt;See you in the next part.🚀&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>docker</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>part 2 on understanding docker</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 06 Jul 2026 17:53:03 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/part-2-on-understanding-docker-4c3k</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/part-2-on-understanding-docker-4c3k</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop" class="crayons-story__hidden-navigation-link"&gt;Docker Explained (Part 2): Understanding Docker's Architecture, Images &amp;amp; Containers&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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" alt="ladipo_samuel_7cfaa827bf5 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ladipo_samuel_7cfaa827bf5" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ladipo Samuel
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ladipo Samuel
                
              
              &lt;div id="story-author-preview-content-4081746" 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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ladipo Samuel&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/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 6&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/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop" id="article-link-4081746"&gt;
          Docker Explained (Part 2): Understanding Docker's Architecture, Images &amp;amp; Containers
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Docker Explained (Part 2): Understanding Docker's Architecture, Images &amp; Containers</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 06 Jul 2026 17:29:51 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-2-understanding-dockers-architecture-images-containers-1fop</guid>
      <description>&lt;p&gt;One of the biggest mistakes people make when learning Docker is jumping straight into commands without understanding what's happening behind the scenes.&lt;br&gt;
You'll see people type commands like:&lt;br&gt;
&lt;strong&gt;docker run nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application starts, everyone is happy, and they move on. But have you ever stopped to ask yourself: &lt;strong&gt;what actually happens after I press Enter&lt;/strong&gt;?&lt;br&gt;
It might seem like Docker is magically running your application, but it's actually following a simple process every single time.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;br&gt;
You&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Docker Client&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Docker Engine&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Docker Hub (if needed)&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Docker Image&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Docker Container&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Running Application&lt;/p&gt;

&lt;p&gt;Let's break this down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Client&lt;/strong&gt;&lt;br&gt;
The first component your command interacts with is the Docker Client.&lt;br&gt;
Think of it as the messenger between you and Docker.&lt;/p&gt;

&lt;p&gt;When you type: &lt;strong&gt;docker run nginx&lt;/strong&gt;&lt;br&gt;
The Docker Client doesn't create containers or download images. Its only responsibility is to receive your command and send it to the Docker Engine. A simple example is ordering food through an app. You place your order using the app, but the app doesn't prepare your meal. It simply sends your request to the restaurant: the Docker Client works exactly the same way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Engine&lt;/strong&gt;&lt;br&gt;
Once the Docker Client receives your command, it forwards it to the Docker Engine. If the Docker Client is the messenger, then Docker Engine is the brain. This is where the work happens.&lt;/p&gt;

&lt;p&gt;The Docker Engine is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building Docker Images&lt;/li&gt;
&lt;li&gt;Creating and starting Containers&lt;/li&gt;
&lt;li&gt;Managing Docker Networks&lt;/li&gt;
&lt;li&gt;Managing Docker Volumes&lt;/li&gt;
&lt;li&gt;Pulling Images from Docker Registries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without the Docker Engine, Docker simply cannot function. The first thing the Engine asks itself is: "&lt;strong&gt;Do I already have this image&lt;/strong&gt;?"&lt;br&gt;
If the answer is yes, Docker continues. If the answer is no, Docker needs somewhere to download it from. That's where Docker Hub comes in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Registry (Docker Hub)&lt;/strong&gt;&lt;br&gt;
A Docker Registry is simply a place where Docker Images are stored. The most popular registry is Docker Hub. Think of Docker Hub as GitHub but instead of hosting source code, it hosts Docker Images.&lt;br&gt;
If Docker Engine can't find an image locally, it automatically reaches out to Docker Hub, downloads the image, stores it on your computer, and then continues the process. The nice thing is that Docker only downloads an image once.&lt;/p&gt;

&lt;p&gt;The next time you run the same image, Docker simply uses the local copy, making the process much faster. Understanding this explains why your very first Docker command usually takes longer than every command after it.&lt;/p&gt;

&lt;p&gt;Docker Images != Just a Blueprint&lt;br&gt;
One of the most common explanations you'll hear is: "A Docker Image is a blueprint."&lt;br&gt;
While that's true, it doesn't tell the whole story. A Docker Image is a complete, read-only package that contains everything your application needs to run.&lt;/p&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your application code&lt;/li&gt;
&lt;li&gt;Runtime (Python, Node.js, Java, etc.)&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Required libraries&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Operating system packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as a snapshot of your application at a particular point in time. Once an image is built, Docker treats it as immutable, meaning it doesn't change. If you modify your application, Docker doesn't update the existing image. Instead, it creates a completely new image.&lt;br&gt;
At first, this might sound inefficient. In reality, it's one of Docker's biggest strengths. Because Images never change, every developer, testing environment, CI/CD pipeline, and production server runs exactly the same package.&lt;br&gt;
That's one of the biggest reasons Docker became so popular: It removed the uncertainty of different environments.&lt;br&gt;
Another important thing to know is that Images are not running. They simply exist, waiting to be used. You can think of an Image as a packaged application that's ready to be launched whenever you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Containers: Where Your Application Comes Alive&lt;/strong&gt;&lt;br&gt;
Here's something many beginners don't realize: docker never runs an Image directly. Instead, it creates a Container from that Image. A Container is simply the running instance of a Docker Image. Unlike Images, Containers are alive; they consume CPU; they use memory; they process requests; they respond to users.&lt;br&gt;
They are the part that's actually executing your application. One of Docker's biggest advantages is that a single Image can create multiple Containers.&lt;/p&gt;

&lt;p&gt;For example:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpg6335cpb4ezdl04zy9i.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpg6335cpb4ezdl04zy9i.png" alt=" " width="421" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every container starts from the exact same Image. That's why Docker delivers consistency. Instead of creating three different applications, Docker simply creates three running instances from the same package.&lt;br&gt;
Containers are also designed to be temporary. If a container crashes, becomes corrupted, or is deleted, Docker doesn't expect you to repair it. You simply create another container from the original Image.&lt;br&gt;
Since the Image never changed, the new Container behaves exactly like the previous one. This idea of treating containers as disposable is one of the biggest mindsets shifts Docker introduces. Instead of fixing running environments, you recreate them.&lt;/p&gt;

&lt;p&gt;It's faster, cleaner and far more predictable.&lt;br&gt;
&lt;strong&gt;Developer Tip: If there's one thing to remember from this section, let it be this:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Images are packages. Containers are running applications.&lt;/li&gt;
&lt;li&gt;Docker never runs an Image directly; it always creates a Container from it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why Understanding These Concepts Matters Before Writing Your First Command&lt;/strong&gt;&lt;br&gt;
You may have noticed that we still haven't written a single Docker command and that's by design.&lt;br&gt;
Learning Docker isn't about memorizing commands; it's about understanding what's happening every time you run one.&lt;br&gt;
Once you understand how the Docker Client, Docker Engine, Docker Hub, Images, and Containers work together, Docker stops feeling complicated. The commands become logical because you know what's happening behind the scenes.&lt;/p&gt;

&lt;p&gt;That's the purpose of this series: not just to teach you how to use Docker, but to help you understand why it works the way it does.&lt;br&gt;
Now that we've built that foundation, it's time to put it into practice. In the next part, we'll build our first Docker Image and learn how a Dockerfile brings everything together.&lt;br&gt;
.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What Is Lua AI? A Simple Developer's Guide to Building AI Agents</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Wed, 01 Jul 2026 13:55:51 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-simple-developers-guide-to-building-ai-agents-oba</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-simple-developers-guide-to-building-ai-agents-oba</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" class="crayons-story__hidden-navigation-link"&gt;What Is Lua AI? A Developer's Guide to Building AI Agents&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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" alt="ladipo_samuel_7cfaa827bf5 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ladipo_samuel_7cfaa827bf5" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ladipo Samuel
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ladipo Samuel
                
              
              &lt;div id="story-author-preview-content-4042129" 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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ladipo Samuel&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/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 1&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/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" id="article-link-4042129"&gt;
          What Is Lua AI? A Developer's Guide to Building AI Agents
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A Developer's Guide to Building AI Agents</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Wed, 01 Jul 2026 13:54:27 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/a-developers-guide-to-building-ai-agents-3li5</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/a-developers-guide-to-building-ai-agents-3li5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" class="crayons-story__hidden-navigation-link"&gt;What Is Lua AI? A Developer's Guide to Building AI Agents&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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" alt="ladipo_samuel_7cfaa827bf5 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ladipo_samuel_7cfaa827bf5" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ladipo Samuel
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ladipo Samuel
                
              
              &lt;div id="story-author-preview-content-4042129" 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="/ladipo_samuel_7cfaa827bf5" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667792%2F9b60d3c4-48b5-4943-a8e1-0c1e2da4b290.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ladipo Samuel&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/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 1&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/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" id="article-link-4042129"&gt;
          What Is Lua AI? A Developer's Guide to Building AI Agents
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
