<?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>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>
    <item>
      <title>What Is Lua AI? A Developer's Guide to Building AI Agents</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Wed, 01 Jul 2026 13:54:04 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/what-is-lua-ai-a-developers-guide-to-building-ai-agents-17ch</guid>
      <description>&lt;p&gt;There's no shortage of AI frameworks today. Every week, a new one promises to make building AI agents easier, so it's easy to dismiss another platform without looking into it. I thought the same until I spent some time going through Lua's documentation.&lt;/p&gt;

&lt;p&gt;What stood out to me wasn't that Lua helps you build AI applications; a lot of tools already do that. It's &lt;em&gt;where&lt;/em&gt; it tries to reduce the complexity.&lt;/p&gt;

&lt;p&gt;When most developers think about building an AI agent, they immediately think about choosing an LLM, writing prompts, connecting APIs, managing conversations, handling tool calls, deploying the application, and making everything work together reliably. Before long, you realize you're spending more time building the infrastructure around the agent than the actual solution you're trying to create.&lt;/p&gt;

&lt;p&gt;Lua takes a different approach. Instead of asking you to build all of that yourself, it lets you focus on the part that actually matters: the logic behind your application.&lt;/p&gt;

&lt;p&gt;Imagine you're building a customer support assistant for your product. The AI shouldn't just answer questions; it should also be able to check an order, reset a password, create a support ticket, or fetch account information. Traditionally, you'd spend a good amount of time wiring all these pieces together. With Lua, you simply expose those capabilities as TypeScript functions, and the agent can intelligently decide when to use them. You're writing code you already know how to write, while Lua handles much of the AI orchestration behind the scenes.&lt;/p&gt;

&lt;p&gt;As I explored further, I realized that the platform is built around just a few concepts, and once those click, everything else starts making sense.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Agent&lt;/strong&gt; is exactly what it sounds like: the brain of your application. It's where you define how your AI behaves, what it should know, and which capabilities it has access to.&lt;/p&gt;

&lt;p&gt;Then there are &lt;strong&gt;Skills&lt;/strong&gt;. I like to think of these as departments in a company. If your agent works for an e-commerce business, you might have one skill for customer support, another for payments, and another for inventory. Each skill groups together the tools related to that specific responsibility, making your agent easier to organize as it grows.&lt;/p&gt;

&lt;p&gt;Inside every skill are &lt;strong&gt;Tools&lt;/strong&gt;. These are simply TypeScript functions that perform real work. A tool might send an email, call your backend API, query a database, process a payment, or retrieve user information. If you've built APIs before, writing tools will probably feel very familiar because you're just writing functions that solve real problems.&lt;/p&gt;

&lt;p&gt;Lua also supports webhooks and scheduled jobs, which means your agent doesn't only respond when someone sends it a message. It can react to external events, like a successful payment or a GitHub webhook, or even perform scheduled tasks automatically, such as sending reminders or generating daily reports.&lt;/p&gt;

&lt;p&gt;One thing I genuinely appreciate is that Lua doesn't try to replace your existing backend. If you've already invested time building APIs or services, you don't have to throw them away. Your agent simply sits on top of what you've already built, giving users a more natural way to interact with your application.&lt;/p&gt;

&lt;p&gt;Getting started is also surprisingly straightforward. You install the CLI, authenticate, create a project, define your agent, build your tools, test everything locally using the built-in chat environment, and deploy when you're ready. The workflow feels familiar, especially if you're already comfortable working with TypeScript projects.&lt;/p&gt;

&lt;p&gt;The more I explored Lua, the more I realized that it's less about making AI "smarter" and more about making developers more productive. Instead of spending hours connecting different services and managing the plumbing around an AI application, you can spend that time building features users actually care about.&lt;/p&gt;

&lt;p&gt;That's probably my biggest takeaway. Good developer tools don't just help you write code faster; they remove unnecessary complexity so you can focus on solving real problems. From what I've seen so far, that's exactly the direction Lua is trying to take.&lt;/p&gt;

&lt;p&gt;I'm still exploring the platform, but if you're interested in building AI agents that can do more than answer questions, Lua is definitely worth checking out. I'm looking forward to building with it and sharing what I learn along the way.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>if you want to understand docker, you should check this out</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 29 Jun 2026 16:36:59 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/if-you-want-to-understand-docker-you-should-check-this-out-4o1b</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/if-you-want-to-understand-docker-you-should-check-this-out-4o1b</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-1-understanding-docker-before-writing-your-first-command-3o0o" class="crayons-story__hidden-navigation-link"&gt;Docker Explained (Part 1): Understanding Docker Before Writing Your First Command&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-4023621" 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-1-understanding-docker-before-writing-your-first-command-3o0o" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 29&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-1-understanding-docker-before-writing-your-first-command-3o0o" id="article-link-4023621"&gt;
          Docker Explained (Part 1): Understanding Docker Before Writing Your First Command
        &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/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&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-1-understanding-docker-before-writing-your-first-command-3o0o" 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/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&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;6&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-1-understanding-docker-before-writing-your-first-command-3o0o#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&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>
    </item>
    <item>
      <title>if you want to understand docker and also want to follow along, you should check this out</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 29 Jun 2026 16:24:37 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/if-you-want-to-understand-docker-and-also-want-to-follow-along-you-should-check-this-out-19ke</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/if-you-want-to-understand-docker-and-also-want-to-follow-along-you-should-check-this-out-19ke</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-1-understanding-docker-before-writing-your-first-command-3o0o" class="crayons-story__hidden-navigation-link"&gt;Docker Explained (Part 1): Understanding Docker Before Writing Your First Command&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-4023621" 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-1-understanding-docker-before-writing-your-first-command-3o0o" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 29&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-1-understanding-docker-before-writing-your-first-command-3o0o" id="article-link-4023621"&gt;
          Docker Explained (Part 1): Understanding Docker Before Writing Your First Command
        &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/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&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-1-understanding-docker-before-writing-your-first-command-3o0o" 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/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&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;6&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-1-understanding-docker-before-writing-your-first-command-3o0o#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&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>
    </item>
    <item>
      <title>Docker Explained (Part 1): Understanding Docker Before Writing Your First Command</title>
      <dc:creator>Ladipo Samuel</dc:creator>
      <pubDate>Mon, 29 Jun 2026 16:16:40 +0000</pubDate>
      <link>https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-1-understanding-docker-before-writing-your-first-command-3o0o</link>
      <guid>https://dev.to/ladipo_samuel_7cfaa827bf5/docker-explained-part-1-understanding-docker-before-writing-your-first-command-3o0o</guid>
      <description>&lt;p&gt;Most Docker tutorials start by asking you to install Docker and run your first container. I don't think that's the best way to learn.&lt;/p&gt;

&lt;p&gt;If you've ever tried learning a new technology, you've probably experienced this before. You copy commands from a tutorial, everything works, but if someone asks you &lt;em&gt;why&lt;/em&gt; it works, you're stuck. You know the syntax, but you don't understand the concept.&lt;/p&gt;

&lt;p&gt;Docker deserves better than that.&lt;/p&gt;

&lt;p&gt;Before writing a single command, it's important to understand the problem Docker was built to solve. Once you understand the problem, every Docker command starts making sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Docker Changed Software Engineering
&lt;/h2&gt;

&lt;p&gt;Software engineering has always been about solving problems, but one problem managed to frustrate developers for years.&lt;/p&gt;

&lt;p&gt;Imagine you spend days building an application. You install all the required libraries, configure your environment, fix dependency issues, and finally everything works perfectly. You push your code to GitHub, feeling accomplished.&lt;/p&gt;

&lt;p&gt;A few minutes later, your teammate clones the project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They install the dependencies.&lt;/li&gt;
&lt;li&gt;Run the exact same command.&lt;/li&gt;
&lt;li&gt;And everything breaks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, you think they made a mistake. Then another teammate tries. Same result!!!!&lt;/p&gt;

&lt;p&gt;Eventually someone says the sentence almost every developer has heard at least once:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"It works on my machine."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That sentence became a running joke in software engineering, but behind the joke was a real problem.&lt;/p&gt;

&lt;p&gt;Every developer's computer is different; one person uses Windows; another uses macOS; someone else develops on Linux; one developer has Python 3.12 installed; another still has Python 3.10; someone upgraded Node.js yesterday; sllomeone else forgot to install PostgreSQL entirely.&lt;/p&gt;

&lt;p&gt;Even when everyone follows the same documentation, tiny differences between machines can produce completely different results. The application itself isn't always the problem—the environment is.&lt;/p&gt;

&lt;p&gt;As projects became larger and teams became more distributed, this problem became even more expensive. Developers spent hours debugging issues that had nothing to do with their code. Deployments became unpredictable, onboarding new engineers took longer, and production environments often behaved differently from development machines.&lt;/p&gt;

&lt;p&gt;Docker didn't just introduce another development tool.&lt;/p&gt;

&lt;p&gt;It introduced consistency.&lt;/p&gt;

&lt;p&gt;Instead of asking every developer to manually recreate the same environment, Docker packages everything an application needs to run into a portable, isolated environment. Whether it's running on your laptop, your teammate's computer, a CI pipeline, or a production server, the application behaves exactly the same.&lt;/p&gt;

&lt;p&gt;That simple idea changed how modern software is built, tested, deployed, and maintained.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Docker Actually Is?
&lt;/h2&gt;

&lt;p&gt;You'll often hear Docker described as &lt;em&gt;"a containerization platform."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's technically correct.&lt;/p&gt;

&lt;p&gt;It's also not particularly helpful if you're learning Docker for the first time.&lt;/p&gt;

&lt;p&gt;Here's a much simpler way to think about it.&lt;/p&gt;

&lt;p&gt;Imagine you're speaking at a conference.&lt;/p&gt;

&lt;p&gt;Instead of carrying your script in one place, your slides somewhere else, your notes in another folder, and your examples on a flash drive, you put everything into one notebook.&lt;/p&gt;

&lt;p&gt;Wherever you go, everything you need goes with you.&lt;/p&gt;

&lt;p&gt;Docker does something very similar.&lt;/p&gt;

&lt;p&gt;It packages your application together with everything it 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;The runtime (like Node.js or Python)&lt;/li&gt;
&lt;li&gt;Libraries and dependencies&lt;/li&gt;
&lt;li&gt;Environment configuration&lt;/li&gt;
&lt;li&gt;System packages required by the application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of depending on whatever already exists on another computer, Docker brings its own environment along.&lt;/p&gt;

&lt;p&gt;That's why the same application behaves consistently whether it's running on your machine, your teammate's laptop, or a production server.&lt;/p&gt;

&lt;p&gt;Docker isn't replacing your application.&lt;/p&gt;

&lt;p&gt;It's making sure your application always has everything it needs to run successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Containers Explained Properly
&lt;/h2&gt;

&lt;p&gt;The word &lt;strong&gt;container&lt;/strong&gt; is probably the first Docker term you'll hear, and it's also one of the most misunderstood. Many tutorials describe a container as "a lightweight virtual machine."&lt;/p&gt;

&lt;p&gt;While that comparison helps initially, it's not actually what a container is. A container is simply an isolated environment where your application runs.&lt;/p&gt;

&lt;p&gt;Think of it as giving your application its own workspace.&lt;/p&gt;

&lt;p&gt;Inside that workspace are all the tools your application needs, but it's isolated from other applications running on the same computer.&lt;/p&gt;

&lt;p&gt;That isolation is important.&lt;/p&gt;

&lt;p&gt;If one application requires Python 3.12 and another still depends on Python 3.10, they can both run on the same machine without interfering with each other because each container carries its own environment.&lt;/p&gt;

&lt;p&gt;Containers are also designed to be temporary. You don't usually modify a running container forever. Instead, if your application changes, you create a new container from an updated image. This makes deployments predictable because every new container starts from the same clean state.&lt;/p&gt;

&lt;p&gt;This idea of treating containers as disposable is one of the biggest mindset shifts Docker introduces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker vs Virtual Machines
&lt;/h2&gt;

&lt;p&gt;One of the first comparisons people make is between Docker and Virtual Machines. They solve similar problems, but they solve them very differently.&lt;/p&gt;

&lt;p&gt;A Virtual Machine creates an entirely new computer inside your computer.&lt;br&gt;
It includes its own operating system, its own kernel, its own system resources, and everything required to behave like a completely separate machine.&lt;/p&gt;

&lt;p&gt;That makes Virtual Machines incredibly powerful, but also heavier. They consume more storage, take longer to start, and require more system resources.&lt;/p&gt;

&lt;p&gt;Docker containers take a different approach.&lt;/p&gt;

&lt;p&gt;Instead of creating a completely new operating system, containers share the host operating system's kernel while keeping applications isolated from one another.&lt;/p&gt;

&lt;p&gt;The result is a much lighter environment that starts in seconds, uses fewer resources, and is easier to distribute.&lt;/p&gt;

&lt;p&gt;A simple way to picture it is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Virtual Machine&lt;/strong&gt; is like building a completely separate house on its own piece of land.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Docker Container&lt;/strong&gt; is like living in your own apartment inside a modern building. You have your own private space, but some infrastructure is shared, making it far more efficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's one of the reasons Docker became so popular. Developers could run multiple isolated applications on the same machine without the overhead of multiple operating systems.&lt;/p&gt;

&lt;p&gt;At this point, you should understand &lt;strong&gt;why Docker exists&lt;/strong&gt;, &lt;strong&gt;what problem it solves&lt;/strong&gt;, &lt;strong&gt;what a container really is&lt;/strong&gt;, and &lt;strong&gt;why containers became the preferred approach over traditional Virtual Machines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Part 2, we'll go one level deeper by exploring Docker's architecture, understanding Images and Containers in depth, and explaining one of the concepts that confuses almost every beginner: &lt;strong&gt;what's the real difference between a Docker Image and a Docker Container?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>docker</category>
      <category>softwareengineering</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
